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.

array comp

+90 -7
+1 -1
meson.build
··· 68 68 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 69 69 70 70 version_conf = configuration_data() 71 - version_conf.set('ANT_VERSION', '0.0.7.8') 71 + version_conf.set('ANT_VERSION', '0.0.7.9') 72 72 version_conf.set('ANT_GIT_HASH', git_hash) 73 73 version_conf.set('ANT_BUILD_DATE', build_date) 74 74
+77 -6
src/ant.c
··· 736 736 return n; 737 737 } 738 738 739 + static size_t array_to_string(struct js *js, jsval_t obj, char *buf, size_t len) { 740 + if (is_circular(obj)) return cpy(buf, len, "", 0); 741 + 742 + push_stringify(obj); 743 + size_t n = 0; 744 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK); 745 + jsoff_t length = 0; 746 + jsoff_t scan = next; 747 + 748 + while (scan < js->brk && scan != 0) { 749 + jsoff_t koff = loadoff(js, scan + (jsoff_t) sizeof(scan)); 750 + jsoff_t klen = offtolen(loadoff(js, koff)); 751 + const char *key = (char *) &js->mem[koff + sizeof(koff)]; 752 + 753 + if (streq(key, klen, "length", 6)) { 754 + jsval_t val = loadval(js, scan + (jsoff_t) (sizeof(scan) + sizeof(koff))); 755 + if (vtype(val) == T_NUM) length = (jsoff_t) tod(val); 756 + break; 757 + } 758 + scan = loadoff(js, scan) & ~(3U | CONSTMASK); 759 + } 760 + 761 + for (jsoff_t i = 0; i < length; i++) { 762 + if (i > 0) n += cpy(buf + n, len - n, ",", 1); 763 + char idx[16]; 764 + snprintf(idx, sizeof(idx), "%u", (unsigned) i); 765 + 766 + jsoff_t idxlen = (jsoff_t) strlen(idx); 767 + jsoff_t prop = next; 768 + jsval_t val = js_mkundef(); 769 + 770 + bool found = false; 771 + 772 + while (prop < js->brk && prop != 0) { 773 + jsoff_t koff = loadoff(js, prop + (jsoff_t) sizeof(prop)); 774 + jsoff_t klen = offtolen(loadoff(js, koff)); 775 + const char *key = (char *) &js->mem[koff + sizeof(koff)]; 776 + if (streq(key, klen, idx, idxlen)) { 777 + val = loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff))); 778 + found = true; 779 + break; 780 + } 781 + prop = loadoff(js, prop) & ~(3U | CONSTMASK); 782 + } 783 + 784 + if (found) { 785 + n += tostr(js, val, buf + n, len - n); 786 + } else { 787 + n += cpy(buf + n, len - n, "", 0); 788 + } 789 + } 790 + 791 + pop_stringify(); 792 + return n; 793 + } 794 + 739 795 static size_t strdate(struct js *js, jsval_t obj, char *buf, size_t len) { 740 796 jsoff_t time_off = lkp(js, obj, "__time", 6); 741 797 if (time_off == 0) return cpy(buf, len, "Invalid Date", 12); ··· 1210 1266 memcpy(buf, &koff, sizeof(koff)); 1211 1267 memcpy(buf + sizeof(koff), &v, sizeof(v)); 1212 1268 jsoff_t brk = js->brk | T_OBJ; 1269 + 1213 1270 if (is_const) brk |= CONSTMASK; 1214 1271 memcpy(&js->mem[head], &brk, sizeof(brk)); 1215 - 1216 - // Invalidate property cache for this object when a new property is added 1217 1272 invalidate_obj_cache(head); 1218 1273 1219 1274 return mkentity(js, (b & ~(3U | CONSTMASK)) | T_PROP, buf, sizeof(buf)); ··· 2566 2621 } 2567 2622 return mkval(T_BOOL, op == TOK_EQ ? eq : !eq); 2568 2623 } 2569 - if (op == TOK_PLUS && (vtype(l) == T_STR || vtype(r) == T_STR)) { 2624 + if (op == TOK_PLUS && (vtype(l) == T_STR || vtype(r) == T_STR || vtype(l) == T_ARR || vtype(r) == T_ARR)) { 2570 2625 jsval_t l_str = l, r_str = r; 2571 - if (vtype(l) != T_STR) { 2626 + 2627 + if (vtype(l) == T_ARR) { 2628 + char buf[1024]; 2629 + size_t len = array_to_string(js, l, buf, sizeof(buf)); 2630 + l_str = js_mkstr(js, buf, len); 2631 + if (is_err(l_str)) return l_str; 2632 + } else if (vtype(l) != T_STR) { 2572 2633 const char *str = js_str(js, l); 2573 2634 l_str = js_mkstr(js, str, strlen(str)); 2574 2635 if (is_err(l_str)) return l_str; 2575 2636 } 2576 - if (vtype(r) != T_STR) { 2637 + 2638 + if (vtype(r) == T_ARR) { 2639 + char buf[1024]; 2640 + size_t len = array_to_string(js, r, buf, sizeof(buf)); 2641 + r_str = js_mkstr(js, buf, len); 2642 + if (is_err(r_str)) return r_str; 2643 + } else if (vtype(r) != T_STR) { 2577 2644 const char *str = js_str(js, r); 2578 2645 r_str = js_mkstr(js, str, strlen(str)); 2579 2646 if (is_err(r_str)) return r_str; 2580 2647 } 2648 + 2581 2649 return do_string_op(js, op, l_str, r_str); 2582 2650 } 2583 2651 if (vtype(l) == T_STR && vtype(r) == T_STR) { 2584 - // Fast path for string+string without type coercion 2585 2652 return do_string_op(js, op, l, r); 2586 2653 } 2587 2654 ··· 2604 2671 a = 0.0; 2605 2672 } else if (vtype(l) == T_UNDEF) { 2606 2673 a = NAN; 2674 + } else if (vtype(l) == T_ARR) { 2675 + a = NAN; 2607 2676 } else { 2608 2677 a = NAN; 2609 2678 } ··· 2624 2693 } else if (vtype(r) == T_NULL) { 2625 2694 b = 0.0; 2626 2695 } else if (vtype(r) == T_UNDEF) { 2696 + b = NAN; 2697 + } else if (vtype(r) == T_ARR) { 2627 2698 b = NAN; 2628 2699 } else { 2629 2700 b = NAN;
+12
test_array_comprehensive.js
··· 1 + console.log([] + []); 2 + console.log([] + [1]); 3 + console.log([1] + [1]); 4 + console.log([1,2] + [3]); 5 + console.log([1,2,3] + []); 6 + console.log([1,2] + "test"); 7 + console.log("test" + [1,2]); 8 + console.log([1,2] + 5); 9 + console.log(5 + [1,2]); 10 + console.log([1,2] * 3); 11 + console.log([1,2] - 1); 12 + console.log([1,2] / 2);