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.

proper name operators

+30 -7
+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.0.36') 77 + version_conf.set('ANT_VERSION', '0.1.0.37') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+29 -6
src/ant.c
··· 264 264 TOK_TYPEOF, TOK_UPLUS, TOK_UMINUS, TOK_EXP, TOK_MUL, TOK_DIV, TOK_REM, 265 265 TOK_OPTIONAL_CHAIN, TOK_REST, 266 266 TOK_PLUS, TOK_MINUS, TOK_SHL, TOK_SHR, TOK_ZSHR, TOK_LT, TOK_LE, TOK_GT, 267 - TOK_GE, TOK_EQ, TOK_NE, TOK_AND, TOK_XOR, TOK_OR, TOK_LAND, TOK_LOR, TOK_NULLISH, 267 + TOK_GE, TOK_EQ, TOK_NE, TOK_SEQ, TOK_SNE, TOK_AND, TOK_XOR, TOK_OR, TOK_LAND, TOK_LOR, TOK_NULLISH, 268 268 TOK_COLON, TOK_Q, TOK_ASSIGN, TOK_PLUS_ASSIGN, TOK_MINUS_ASSIGN, 269 269 TOK_MUL_ASSIGN, TOK_DIV_ASSIGN, TOK_REM_ASSIGN, TOK_SHL_ASSIGN, 270 270 TOK_SHR_ASSIGN, TOK_ZSHR_ASSIGN, TOK_AND_ASSIGN, TOK_XOR_ASSIGN, ··· 306 306 static const char *typestr(uint8_t t) { 307 307 if (t == T_CFUNC) return "function"; 308 308 if (t == T_ARR) return "object"; 309 + if (t == T_NULL) return "object"; 309 310 return typestr_raw(t); 310 311 } 311 312 ··· 2944 2945 case ']': TOK(TOK_RBRACKET, 1); 2945 2946 case ';': TOK(TOK_SEMICOLON, 1); 2946 2947 case ',': TOK(TOK_COMMA, 1); 2947 - case '!': if (LOOK(1, '=') && LOOK(2, '=')) TOK(TOK_NE, 3); if (LOOK(1, '=')) TOK(TOK_NE, 2); TOK(TOK_NOT, 1); 2948 + case '!': if (LOOK(1, '=') && LOOK(2, '=')) TOK(TOK_SNE, 3); if (LOOK(1, '=')) TOK(TOK_NE, 2); TOK(TOK_NOT, 1); 2948 2949 case '.': if (LOOK(1, '.') && LOOK(2, '.')) TOK(TOK_REST, 3); TOK(TOK_DOT, 1); 2949 2950 case '~': TOK(TOK_TILDA, 1); 2950 2951 case '-': if (LOOK(1, '-')) TOK(TOK_POSTDEC, 2); if (LOOK(1, '=')) TOK(TOK_MINUS_ASSIGN, 2); TOK(TOK_MINUS, 1); ··· 2954 2955 case '%': if (LOOK(1, '=')) TOK(TOK_REM_ASSIGN, 2); TOK(TOK_REM, 1); 2955 2956 case '&': if (LOOK(1, '&')) TOK(TOK_LAND, 2); if (LOOK(1, '=')) TOK(TOK_AND_ASSIGN, 2); TOK(TOK_AND, 1); 2956 2957 case '|': if (LOOK(1, '|')) TOK(TOK_LOR, 2); if (LOOK(1, '=')) TOK(TOK_OR_ASSIGN, 2); TOK(TOK_OR, 1); 2957 - case '=': if (LOOK(1, '=') && LOOK(2, '=')) TOK(TOK_EQ, 3); if (LOOK(1, '=')) TOK(TOK_EQ, 2); if (LOOK(1, '>')) TOK(TOK_ARROW, 2); TOK(TOK_ASSIGN, 1); 2958 + case '=': if (LOOK(1, '=') && LOOK(2, '=')) TOK(TOK_SEQ, 3); if (LOOK(1, '=')) TOK(TOK_EQ, 2); if (LOOK(1, '>')) TOK(TOK_ARROW, 2); TOK(TOK_ASSIGN, 1); 2958 2959 case '<': if (LOOK(1, '<') && LOOK(2, '=')) TOK(TOK_SHL_ASSIGN, 3); if (LOOK(1, '<')) TOK(TOK_SHL, 2); if (LOOK(1, '=')) TOK(TOK_LE, 2); TOK(TOK_LT, 1); 2959 - case '>': if (LOOK(1, '>') && LOOK(2, '=')) TOK(TOK_SHR_ASSIGN, 3); if (LOOK(1, '>')) TOK(TOK_SHR, 2); if (LOOK(1, '=')) TOK(TOK_GE, 2); TOK(TOK_GT, 1); 2960 + case '>': if (LOOK(1, '>') && LOOK(2, '>') && LOOK(3, '=')) TOK(TOK_ZSHR_ASSIGN, 4); if (LOOK(1, '>') && LOOK(2, '>')) TOK(TOK_ZSHR, 3); if (LOOK(1, '>') && LOOK(2, '=')) TOK(TOK_SHR_ASSIGN, 3); if (LOOK(1, '>')) TOK(TOK_SHR, 2); if (LOOK(1, '=')) TOK(TOK_GE, 2); TOK(TOK_GT, 1); 2960 2961 case '^': if (LOOK(1, '=')) TOK(TOK_XOR_ASSIGN, 2); TOK(TOK_XOR, 1); 2961 2962 case '`': 2962 2963 js->tlen++; ··· 4328 4329 break; 4329 4330 } 4330 4331 if (is_assign(op)) return do_assign_op(js, op, lhs, r); 4332 + if (op == TOK_SEQ || op == TOK_SNE) { 4333 + bool eq = false; 4334 + if (vtype(l) == vtype(r)) { 4335 + if (vtype(l) == T_STR) { 4336 + jsoff_t n1, off1 = vstr(js, l, &n1); 4337 + jsoff_t n2, off2 = vstr(js, r, &n2); 4338 + eq = n1 == n2 && memcmp(&js->mem[off1], &js->mem[off2], n1) == 0; 4339 + } else if (vtype(l) == T_NUM) { 4340 + eq = tod(l) == tod(r); 4341 + } else if (vtype(l) == T_BOOL) { 4342 + eq = vdata(l) == vdata(r); 4343 + } else if (vtype(l) == T_BIGINT) { 4344 + eq = bigint_compare(js, l, r) == 0; 4345 + } else { 4346 + eq = vdata(l) == vdata(r); 4347 + } 4348 + } 4349 + return mkval(T_BOOL, op == TOK_SEQ ? eq : !eq); 4350 + } 4331 4351 if (op == TOK_EQ || op == TOK_NE) { 4332 4352 bool eq = false; 4333 - if (vtype(l) == vtype(r)) { 4353 + if ((vtype(l) == T_UNDEF && vtype(r) == T_NULL) || (vtype(l) == T_NULL && vtype(r) == T_UNDEF)) { 4354 + eq = true; 4355 + } else if (vtype(l) == vtype(r)) { 4334 4356 if (vtype(l) == T_STR) { 4335 4357 jsoff_t n1, off1 = vstr(js, l, &n1); 4336 4358 jsoff_t n2, off2 = vstr(js, r, &n2); ··· 4471 4493 case TOK_TILDA: return tov((double)(~(long) b)); 4472 4494 case TOK_SHL: return tov((double)((long) a << (long) b)); 4473 4495 case TOK_SHR: return tov((double)((long) a >> (long) b)); 4496 + case TOK_ZSHR: return tov((double)(((uint32_t)(int32_t) a) >> ((uint32_t)(int32_t) b & 0x1f))); 4474 4497 case TOK_DOT: return do_dot_op(js, l, r); 4475 4498 case TOK_OPTIONAL_CHAIN: return do_optional_chain_op(js, l, r); 4476 4499 case TOK_LT: return mkval(T_BOOL, a < b); ··· 5796 5819 } 5797 5820 5798 5821 static jsval_t js_equality(struct js *js) { 5799 - LTR_BINOP(js_comparison, (next(js) == TOK_EQ || next(js) == TOK_NE)); 5822 + LTR_BINOP(js_comparison, (next(js) == TOK_EQ || next(js) == TOK_NE || next(js) == TOK_SEQ || next(js) == TOK_SNE)); 5800 5823 } 5801 5824 5802 5825 static jsval_t js_bitwise_and(struct js *js) {