MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

support spread operator in array literals

+46 -9
+1 -1
meson.build
··· 74 74 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 75 75 76 76 version_conf = configuration_data() 77 - version_conf.set('ANT_VERSION', '0.1.1.10') 77 + version_conf.set('ANT_VERSION', '0.1.1.11') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+45 -8
src/ant.c
··· 4888 4888 uint8_t exe = !(js->flags & F_NOEXEC); 4889 4889 jsval_t arr = exe ? mkarr(js) : js_mkundef(); 4890 4890 if (is_err(arr)) return arr; 4891 - 4891 + 4892 4892 js->consumed = 1; 4893 4893 jsoff_t idx = 0; 4894 4894 while (next(js) != TOK_RBRACKET) { 4895 + bool is_spread = (next(js) == TOK_REST); 4896 + if (is_spread) js->consumed = 1; 4897 + 4895 4898 jsval_t val = js_expr(js); 4896 - if (exe) { 4897 - if (is_err(val)) return val; 4899 + if (!exe) goto next_elem; 4900 + if (is_err(val)) return val; 4901 + 4902 + jsval_t resolved = resolveprop(js, val); 4903 + if (!is_spread) { 4898 4904 char idxstr[16]; 4899 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 4905 + snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)idx); 4900 4906 jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 4901 - jsval_t res = setprop(js, arr, key, resolveprop(js, val)); 4907 + jsval_t res = setprop(js, arr, key, resolved); 4902 4908 if (is_err(res)) return res; 4909 + idx++; 4910 + goto next_elem; 4903 4911 } 4904 - idx++; 4912 + 4913 + uint8_t t = vtype(resolved); 4914 + if (t != T_ARR && t != T_STR) goto next_elem; 4915 + 4916 + if (t == T_STR) { 4917 + jsoff_t slen, soff = vstr(js, resolved, &slen); 4918 + for (jsoff_t i = 0; i < slen; i++) { 4919 + char idxstr[16]; 4920 + snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)idx); 4921 + jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 4922 + jsval_t ch = js_mkstr(js, (char *)&js->mem[soff + i], 1); 4923 + setprop(js, arr, key, ch); 4924 + idx++; 4925 + } 4926 + goto next_elem; 4927 + } 4928 + 4929 + jsoff_t len = arr_length(js, resolved); 4930 + for (jsoff_t i = 0; i < len; i++) { 4931 + char src_idx[16], dst_idx[16]; 4932 + snprintf(src_idx, sizeof(src_idx), "%u", (unsigned)i); 4933 + snprintf(dst_idx, sizeof(dst_idx), "%u", (unsigned)idx); 4934 + jsval_t key = js_mkstr(js, src_idx, strlen(src_idx)); 4935 + jsoff_t prop_off = lkp(js, resolved, (char *)&js->mem[(jsoff_t)vdata(key) + sizeof(jsoff_t)], strlen(src_idx)); 4936 + jsval_t elem = (prop_off != 0) ? resolveprop(js, mkval(T_PROP, prop_off)) : js_mkundef(); 4937 + setprop(js, arr, js_mkstr(js, dst_idx, strlen(dst_idx)), elem); 4938 + idx++; 4939 + } 4940 + 4941 + next_elem: 4905 4942 if (next(js) == TOK_RBRACKET) break; 4906 4943 EXPECT(TOK_COMMA, ); 4907 4944 } 4908 - 4945 + 4909 4946 EXPECT(TOK_RBRACKET, ); 4910 4947 if (exe) { 4911 4948 jsval_t len_key = js_mkstr(js, "length", 6); 4912 - jsval_t len_val = tov((double) idx); 4949 + jsval_t len_val = tov((double)idx); 4913 4950 jsval_t res = setprop(js, arr, len_key, len_val); 4914 4951 if (is_err(res)) return res; 4915 4952 arr = mkval(T_ARR, vdata(arr));