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 'this' scoping for with

+42 -14
+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.0.8.10') 77 + version_conf.set('ANT_VERSION', '0.0.8.11') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+41 -13
src/ant.c
··· 2581 2581 if (js->flags & F_NOEXEC) return 0; 2582 2582 2583 2583 for (jsval_t scope = js->scope;;) { 2584 + jsoff_t with_marker_off = lkp(js, scope, "__with_object__", 15); 2585 + if (with_marker_off != 0) { 2586 + jsval_t with_obj_val = resolveprop(js, mkval(T_PROP, with_marker_off)); 2587 + 2588 + jsval_t with_obj = ( 2589 + vtype(with_obj_val) == T_OBJ || 2590 + vtype(with_obj_val) == T_ARR || 2591 + vtype(with_obj_val) == T_FUNC) ? 2592 + with_obj_val : mkval(T_OBJ, vdata(with_obj_val) 2593 + ); 2594 + 2595 + jsoff_t prop_off = lkp(js, with_obj, buf, len); 2596 + if (prop_off != 0) { 2597 + jsval_t key = js_mkstr(js, buf, len); 2598 + if (is_err(key)) return key; 2599 + return mkpropref((jsoff_t)vdata(with_obj), (jsoff_t)vdata(key)); 2600 + } 2601 + } 2602 + 2584 2603 jsoff_t off = lkp(js, scope, buf, len); 2585 2604 if (off != 0) return mkval(T_PROP, off); 2586 2605 if (vdata(scope) == 0) break; ··· 2613 2632 } 2614 2633 2615 2634 static jsval_t resolveprop(struct js *js, jsval_t v) { 2616 - if (vtype(v) == T_PROPREF) return js_mkundef(); 2635 + if (vtype(v) == T_PROPREF) { 2636 + jsoff_t obj_off = propref_obj(v); 2637 + jsoff_t key_off = propref_key(v); 2638 + jsval_t obj = mkval(T_OBJ, obj_off); 2639 + jsval_t key = mkval(T_STR, key_off); 2640 + jsoff_t len; 2641 + const char *key_str = (const char *)&js->mem[vstr(js, key, &len)]; 2642 + jsoff_t prop_off = lkp(js, obj, key_str, len); 2643 + if (prop_off == 0) return js_mkundef(); 2644 + return resolveprop(js, mkval(T_PROP, prop_off)); 2645 + } 2617 2646 if (vtype(v) != T_PROP) return v; 2618 2647 return resolveprop(js, loadval(js, (jsoff_t) (vdata(v) + sizeof(jsoff_t) * 2))); 2619 2648 } ··· 4623 4652 } 4624 4653 } else if (js->tok == TOK_LBRACKET) { 4625 4654 js->consumed = 1; 4626 - if (vtype(res) != T_PROP) { 4655 + if (vtype(res) != T_PROP && vtype(res) != T_PROPREF) { 4627 4656 obj = res; 4628 4657 } else { 4629 4658 obj = resolveprop(js, res); ··· 4634 4663 js->consumed = 1; 4635 4664 res = do_op(js, TOK_BRACKET, res, idx); 4636 4665 } else { 4637 - jsval_t func_this = (vtype(obj) != T_UNDEF) ? obj : js->this_val; 4666 + jsval_t func_this = obj; 4667 + if (vtype(obj) == T_UNDEF) { 4668 + if (vtype(res) == T_PROPREF) { 4669 + jsoff_t obj_off = propref_obj(res); 4670 + func_this = mkval(T_OBJ, obj_off); 4671 + } else func_this = js->this_val; 4672 + } 4638 4673 push_this(func_this); 4639 4674 jsval_t params = js_call_params(js); 4640 4675 if (is_err(params)) { ··· 6323 6358 utarray_push_back(global_scope_stack, &parent_scope_offset); 6324 6359 jsval_t with_scope = mkentity(js, 0 | T_OBJ, &parent_scope_offset, sizeof(parent_scope_offset)); 6325 6360 6326 - jsoff_t prop_off = loadoff(js, (jsoff_t) vdata(with_obj)) & ~(3U | CONSTMASK); 6327 - while (prop_off < js->brk && prop_off != 0) { 6328 - jsoff_t koff = loadoff(js, prop_off + (jsoff_t) sizeof(prop_off)); 6329 - jsval_t val = loadval(js, prop_off + (jsoff_t) (sizeof(prop_off) + sizeof(koff))); 6330 - 6331 - jsval_t new_prop = mkprop(js, with_scope, mkval(T_STR, koff), val, false); 6332 - if (is_err(new_prop)) return new_prop; 6333 - 6334 - prop_off = loadoff(js, prop_off) & ~(3U | CONSTMASK); 6335 - } 6361 + jsval_t with_marker = js_mkstr(js, "__with_object__", 15); 6362 + jsval_t with_ref = mkprop(js, with_scope, with_marker, with_obj, false); 6363 + if (is_err(with_ref)) return with_ref; 6336 6364 6337 6365 jsval_t saved_scope = js->scope; 6338 6366 js->scope = with_scope;