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.

reduce nesting

+68 -13
+68 -13
src/ant.c
··· 6923 6923 jsoff_t var_name_len; 6924 6924 bool is_const_var; 6925 6925 uint8_t flags; 6926 - } for_of_ctx_t; 6926 + } for_iter_ctx_t; 6927 6927 6928 - static jsval_t for_of_bind_var(struct js *js, for_of_ctx_t *ctx, jsval_t value) { 6928 + static jsval_t for_iter_bind_var(struct js *js, for_iter_ctx_t *ctx, jsval_t value) { 6929 6929 const char *var_name = &js->code[ctx->var_name_off]; 6930 6930 jsoff_t existing = lkp(js, js->scope, var_name, ctx->var_name_len); 6931 6931 if (existing > 0) { ··· 6935 6935 return mkprop(js, js->scope, js_mkstr(js, var_name, ctx->var_name_len), value, ctx->is_const_var); 6936 6936 } 6937 6937 6938 - static jsval_t for_of_exec_body(struct js *js, for_of_ctx_t *ctx) { 6938 + static jsval_t for_iter_exec_body(struct js *js, for_iter_ctx_t *ctx) { 6939 6939 js->pos = ctx->body_start; 6940 6940 js->consumed = 1; 6941 6941 js->flags = (ctx->flags & ~F_NOEXEC) | F_LOOP; 6942 6942 return js_block_or_stmt(js); 6943 6943 } 6944 6944 6945 - static jsval_t for_of_iter_array(struct js *js, for_of_ctx_t *ctx, jsval_t iterable) { 6945 + static bool for_in_should_skip_key(struct js *js, jsval_t obj, const char *key, jsoff_t klen) { 6946 + if (streq(key, klen, "__proto__", 9)) return true; 6947 + 6948 + if ( 6949 + klen > 7 && key[0] == '_' && 6950 + key[1] == '_' && key[2] == 'd' 6951 + && key[3] == 'e' && key[4] == 's' 6952 + && key[5] == 'c' && key[6] == '_' 6953 + ) return true; 6954 + 6955 + char desc_key[128]; 6956 + snprintf(desc_key, sizeof(desc_key), "__desc_%.*s", (int)klen, key); 6957 + jsoff_t desc_off = lkp(js, obj, desc_key, strlen(desc_key)); 6958 + if (desc_off == 0) return false; 6959 + 6960 + jsval_t desc_obj = resolveprop(js, mkval(T_PROP, desc_off)); 6961 + if (vtype(desc_obj) != T_OBJ) return false; 6962 + 6963 + jsoff_t enumerable_off = lkp(js, desc_obj, "enumerable", 10); 6964 + if (enumerable_off == 0) return false; 6965 + 6966 + jsval_t enumerable_val = resolveprop(js, mkval(T_PROP, enumerable_off)); 6967 + return !js_truthy(js, enumerable_val); 6968 + } 6969 + 6970 + static jsval_t for_in_iter_object(struct js *js, for_iter_ctx_t *ctx, jsval_t obj) { 6971 + jsval_t iter_obj = (vtype(obj) == T_FUNC) ? mkval(T_OBJ, vdata(obj)) : obj; 6972 + jsoff_t prop_off = loadoff(js, (jsoff_t) vdata(iter_obj)) & ~(3U | CONSTMASK); 6973 + 6974 + while (prop_off < js->brk && prop_off != 0) { 6975 + jsoff_t koff = loadoff(js, prop_off + (jsoff_t) sizeof(prop_off)); 6976 + jsoff_t klen = offtolen(loadoff(js, koff)); 6977 + const char *key = (char *) &js->mem[koff + sizeof(koff)]; 6978 + 6979 + if (!for_in_should_skip_key(js, iter_obj, key, klen)) { 6980 + jsval_t key_str = js_mkstr(js, key, klen); 6981 + 6982 + jsval_t err = for_iter_bind_var(js, ctx, key_str); 6983 + if (is_err(err)) return err; 6984 + 6985 + jsval_t v = for_iter_exec_body(js, ctx); 6986 + if (is_err(v)) return v; 6987 + if (js->flags & F_BREAK) break; 6988 + if (js->flags & F_RETURN) return v; 6989 + } 6990 + 6991 + prop_off = loadoff(js, prop_off) & ~(3U | CONSTMASK); 6992 + } 6993 + 6994 + return js_mkundef(); 6995 + } 6996 + 6997 + static jsval_t for_of_iter_array(struct js *js, for_iter_ctx_t *ctx, jsval_t iterable) { 6946 6998 jsoff_t next_prop = loadoff(js, (jsoff_t) vdata(iterable)) & ~(3U | CONSTMASK); 6947 6999 jsoff_t length = 0, scan = next_prop; 6948 7000 ··· 6976 7028 prop = loadoff(js, prop) & ~(3U | CONSTMASK); 6977 7029 } 6978 7030 6979 - jsval_t err = for_of_bind_var(js, ctx, val); 7031 + jsval_t err = for_iter_bind_var(js, ctx, val); 6980 7032 if (is_err(err)) return err; 6981 7033 6982 - jsval_t v = for_of_exec_body(js, ctx); 7034 + jsval_t v = for_iter_exec_body(js, ctx); 6983 7035 if (is_err(v)) return v; 6984 7036 if (js->flags & F_BREAK) break; 6985 7037 if (js->flags & F_RETURN) return v; 6986 7038 } 7039 + 6987 7040 return js_mkundef(); 6988 7041 } 6989 7042 6990 - static jsval_t for_of_iter_string(struct js *js, for_of_ctx_t *ctx, jsval_t iterable) { 7043 + static jsval_t for_of_iter_string(struct js *js, for_iter_ctx_t *ctx, jsval_t iterable) { 6991 7044 jsoff_t slen, soff = vstr(js, iterable, &slen); 6992 7045 const char *str = (char *) &js->mem[soff]; 6993 7046 6994 7047 for (jsoff_t i = 0; i < slen; i++) { 6995 7048 jsval_t char_str = js_mkstr(js, &str[i], 1); 6996 7049 6997 - jsval_t err = for_of_bind_var(js, ctx, char_str); 7050 + jsval_t err = for_iter_bind_var(js, ctx, char_str); 6998 7051 if (is_err(err)) return err; 6999 7052 7000 - jsval_t v = for_of_exec_body(js, ctx); 7053 + jsval_t v = for_iter_exec_body(js, ctx); 7001 7054 if (is_err(v)) return v; 7002 7055 if (js->flags & F_BREAK) break; 7003 7056 if (js->flags & F_RETURN) return v; 7004 7057 } 7058 + 7005 7059 return js_mkundef(); 7006 7060 } 7007 7061 7008 - static jsval_t for_of_iter_object(struct js *js, for_of_ctx_t *ctx, jsval_t iterable) { 7062 + static jsval_t for_of_iter_object(struct js *js, for_iter_ctx_t *ctx, jsval_t iterable) { 7009 7063 const char *iter_key = get_iterator_sym_key(); 7010 7064 jsoff_t iter_prop = iter_key ? lkp_proto(js, iterable, iter_key, strlen(iter_key)) : 0; 7011 7065 if (iter_prop == 0) return js_mkerr(js, "for-of requires iterable"); ··· 7046 7100 jsoff_t value_off = lkp(js, result, "value", 5); 7047 7101 jsval_t value = value_off ? loadval(js, value_off + sizeof(jsoff_t) * 2) : js_mkundef(); 7048 7102 7049 - jsval_t err = for_of_bind_var(js, ctx, value); 7103 + jsval_t err = for_iter_bind_var(js, ctx, value); 7050 7104 if (is_err(err)) return err; 7051 7105 7052 - jsval_t v = for_of_exec_body(js, ctx); 7106 + jsval_t v = for_iter_exec_body(js, ctx); 7053 7107 if (is_err(v)) return v; 7054 7108 if (js->flags & F_BREAK) break; 7055 7109 if (js->flags & F_RETURN) return v; 7056 7110 } 7111 + 7057 7112 return js_mkundef(); 7058 7113 } 7059 7114 ··· 7244 7299 if (exe) { 7245 7300 jsval_t iterable = resolveprop(js, iter_expr); 7246 7301 uint8_t itype = vtype(iterable); 7247 - for_of_ctx_t ctx = { body_start, body_end, var_name_off, var_name_len, is_const_var, flags }; 7302 + for_iter_ctx_t ctx = { body_start, body_end, var_name_off, var_name_len, is_const_var, flags }; 7248 7303 7249 7304 if (itype == T_ARR) res = for_of_iter_array(js, &ctx, iterable); 7250 7305 else if (itype == T_STR) res = for_of_iter_string(js, &ctx, iterable);