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.

correctness fixes for wrapped math values

+34 -25
+2 -2
src/ant.c
··· 361 361 } 362 362 363 363 ant_value_t unwrap_primitive(ant_t *js, ant_value_t val) { 364 - if (vtype(val) != T_OBJ) return val; 364 + if (__builtin_expect(vtype(val) != T_OBJ, 1)) return val; 365 365 ant_value_t prim = get_slot(js, val, SLOT_PRIMITIVE); 366 - if (vtype(prim) == T_UNDEF) return val; 366 + if (__builtin_expect(vtype(prim) == T_UNDEF, 1)) return val; 367 367 return prim; 368 368 } 369 369
+32 -23
src/silver/ops/arithmetic.h
··· 25 25 if (vtype(lu) == T_BIGINT || vtype(ru) == T_BIGINT) { 26 26 return js_mkerr(js, "Cannot mix BigInt value and other types"); 27 27 } 28 - if (is_non_numeric(lu) || is_non_numeric(ru) || 29 - (vtype(lu) == T_STR && vtype(ru) == T_STR)) { 28 + if (is_non_numeric(lu) || is_non_numeric(ru)) { 30 29 ant_value_t l_str = coerce_to_str_concat(js, l); 31 30 if (is_err(l_str)) return l_str; 32 31 ant_handle_t lh = js_root(js, l_str); ··· 37 36 vm->stack[vm->sp++] = res; 38 37 return res; 39 38 } 40 - vm->stack[vm->sp++] = tov(js_to_number(js, l) + js_to_number(js, r)); 39 + vm->stack[vm->sp++] = tov(js_to_number(js, lu) + js_to_number(js, ru)); 41 40 return tov(0); 42 41 } 43 42 ··· 48 47 vm->stack[vm->sp++] = tov(tod(l) - tod(r)); 49 48 return tov(0); 50 49 } 51 - if (vtype(l) == T_BIGINT && vtype(r) == T_BIGINT) { 52 - ant_value_t res = bigint_sub(js, l, r); 50 + ant_value_t lu = unwrap_primitive(js, l); 51 + ant_value_t ru = unwrap_primitive(js, r); 52 + if (vtype(lu) == T_BIGINT && vtype(ru) == T_BIGINT) { 53 + ant_value_t res = bigint_sub(js, lu, ru); 53 54 vm->stack[vm->sp++] = res; 54 55 return res; 55 56 } 56 - if (vtype(l) == T_BIGINT || vtype(r) == T_BIGINT) 57 + if (vtype(lu) == T_BIGINT || vtype(ru) == T_BIGINT) 57 58 return js_mkerr(js, "Cannot mix BigInt value and other types"); 58 - vm->stack[vm->sp++] = tov(js_to_number(js, l) - js_to_number(js, r)); 59 + vm->stack[vm->sp++] = tov(js_to_number(js, lu) - js_to_number(js, ru)); 59 60 return tov(0); 60 61 } 61 62 ··· 66 67 vm->stack[vm->sp++] = tov(tod(l) * tod(r)); 67 68 return tov(0); 68 69 } 69 - if (vtype(l) == T_BIGINT && vtype(r) == T_BIGINT) { 70 - ant_value_t res = bigint_mul(js, l, r); 70 + ant_value_t lu = unwrap_primitive(js, l); 71 + ant_value_t ru = unwrap_primitive(js, r); 72 + if (vtype(lu) == T_BIGINT && vtype(ru) == T_BIGINT) { 73 + ant_value_t res = bigint_mul(js, lu, ru); 71 74 vm->stack[vm->sp++] = res; 72 75 return res; 73 76 } 74 - if (vtype(l) == T_BIGINT || vtype(r) == T_BIGINT) 77 + if (vtype(lu) == T_BIGINT || vtype(ru) == T_BIGINT) 75 78 return js_mkerr(js, "Cannot mix BigInt value and other types"); 76 - vm->stack[vm->sp++] = tov(js_to_number(js, l) * js_to_number(js, r)); 79 + vm->stack[vm->sp++] = tov(js_to_number(js, lu) * js_to_number(js, ru)); 77 80 return tov(0); 78 81 } 79 82 ··· 84 87 vm->stack[vm->sp++] = tov(tod(l) / tod(r)); 85 88 return tov(0); 86 89 } 87 - if (vtype(l) == T_BIGINT && vtype(r) == T_BIGINT) { 88 - ant_value_t res = bigint_div(js, l, r); 90 + ant_value_t lu = unwrap_primitive(js, l); 91 + ant_value_t ru = unwrap_primitive(js, r); 92 + if (vtype(lu) == T_BIGINT && vtype(ru) == T_BIGINT) { 93 + ant_value_t res = bigint_div(js, lu, ru); 89 94 vm->stack[vm->sp++] = res; 90 95 return res; 91 96 } 92 - if (vtype(l) == T_BIGINT || vtype(r) == T_BIGINT) 97 + if (vtype(lu) == T_BIGINT || vtype(ru) == T_BIGINT) 93 98 return js_mkerr(js, "Cannot mix BigInt value and other types"); 94 - vm->stack[vm->sp++] = tov(js_to_number(js, l) / js_to_number(js, r)); 99 + vm->stack[vm->sp++] = tov(js_to_number(js, lu) / js_to_number(js, ru)); 95 100 return tov(0); 96 101 } 97 102 ··· 102 107 vm->stack[vm->sp++] = tov(fmod(tod(l), tod(r))); 103 108 return tov(0); 104 109 } 105 - if (vtype(l) == T_BIGINT && vtype(r) == T_BIGINT) { 106 - ant_value_t res = bigint_mod(js, l, r); 110 + ant_value_t lu = unwrap_primitive(js, l); 111 + ant_value_t ru = unwrap_primitive(js, r); 112 + if (vtype(lu) == T_BIGINT && vtype(ru) == T_BIGINT) { 113 + ant_value_t res = bigint_mod(js, lu, ru); 107 114 vm->stack[vm->sp++] = res; 108 115 return res; 109 116 } 110 - if (vtype(l) == T_BIGINT || vtype(r) == T_BIGINT) 117 + if (vtype(lu) == T_BIGINT || vtype(ru) == T_BIGINT) 111 118 return js_mkerr(js, "Cannot mix BigInt value and other types"); 112 - vm->stack[vm->sp++] = tov(fmod(js_to_number(js, l), js_to_number(js, r))); 119 + vm->stack[vm->sp++] = tov(fmod(js_to_number(js, lu), js_to_number(js, ru))); 113 120 return tov(0); 114 121 } 115 122 ··· 120 127 vm->stack[vm->sp++] = tov(pow(tod(l), tod(r))); 121 128 return tov(0); 122 129 } 123 - if (vtype(l) == T_BIGINT && vtype(r) == T_BIGINT) { 124 - ant_value_t res = bigint_exp(js, l, r); 130 + ant_value_t lu = unwrap_primitive(js, l); 131 + ant_value_t ru = unwrap_primitive(js, r); 132 + if (vtype(lu) == T_BIGINT && vtype(ru) == T_BIGINT) { 133 + ant_value_t res = bigint_exp(js, lu, ru); 125 134 vm->stack[vm->sp++] = res; 126 135 return res; 127 136 } 128 - if (vtype(l) == T_BIGINT || vtype(r) == T_BIGINT) 137 + if (vtype(lu) == T_BIGINT || vtype(ru) == T_BIGINT) 129 138 return js_mkerr(js, "Cannot mix BigInt value and other types"); 130 - vm->stack[vm->sp++] = tov(pow(js_to_number(js, l), js_to_number(js, r))); 139 + vm->stack[vm->sp++] = tov(pow(js_to_number(js, lu), js_to_number(js, ru))); 131 140 return tov(0); 132 141 } 133 142