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.

use getters for process.env instead of dumping entire object

+64 -21
+4 -1
include/ant.h
··· 79 79 void js_setup_import_meta(struct js *js, const char *filename); 80 80 81 81 typedef jsval_t (*ant_library_init_fn)(struct js *js); 82 - void ant_register_library(const char *name, ant_library_init_fn init_fn); 82 + void ant_register_library(const char *name, ant_library_init_fn init_fn); 83 + 84 + typedef jsval_t (*js_getter_fn)(struct js *js, jsval_t obj, const char *key, size_t key_len); 85 + void js_set_getter(struct js *js, jsval_t obj, js_getter_fn getter);
+1 -1
meson.build
··· 67 67 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 68 68 69 69 version_conf = configuration_data() 70 - version_conf.set('ANT_VERSION', '0.0.6.39') 70 + version_conf.set('ANT_VERSION', '0.0.6.40') 71 71 version_conf.set('ANT_GIT_HASH', git_hash) 72 72 version_conf.set('ANT_BUILD_DATE', build_date) 73 73
+42 -3
src/ant.c
··· 1451 1451 return 0; 1452 1452 } 1453 1453 1454 + static jsval_t try_dynamic_getter(struct js *js, jsval_t obj, const char *key, size_t key_len) { 1455 + if (streq(key, key_len, "__getter", 8)) return js_mkundef(); 1456 + 1457 + jsoff_t getter_off = lkp(js, obj, "__getter", 8); 1458 + if (getter_off == 0) return js_mkundef(); 1459 + 1460 + jsval_t getter_val = resolveprop(js, mkval(T_PROP, getter_off)); 1461 + if (vtype(getter_val) != T_CFUNC) return js_mkundef(); 1462 + 1463 + js_getter_fn getter = (js_getter_fn)(void *)vdata(getter_val); 1464 + jsval_t result = getter(js, obj, key, key_len); 1465 + 1466 + if (vtype(result) != T_UNDEF) { 1467 + jsval_t key_str = js_mkstr(js, key, key_len); 1468 + setprop(js, obj, key_str, result); 1469 + } 1470 + 1471 + return result; 1472 + } 1473 + 1454 1474 static jsval_t lookup(struct js *js, const char *buf, size_t len) { 1455 1475 if (js->flags & F_NOEXEC) return 0; 1456 1476 ··· 1703 1723 if (vtype(l) != T_OBJ && vtype(l) != T_ARR) return js_mkerr(js, "lookup in non-obj"); 1704 1724 jsoff_t off = lkp(js, l, ptr, codereflen(r)); 1705 1725 if (off == 0) { 1726 + jsval_t result = try_dynamic_getter(js, l, ptr, codereflen(r)); 1727 + if (vtype(result) != T_UNDEF) { 1728 + off = lkp(js, l, ptr, codereflen(r)); 1729 + if (off != 0) return mkval(T_PROP, off); 1730 + } 1706 1731 jsval_t key = js_mkstr(js, ptr, codereflen(r)); 1707 1732 jsval_t prop = setprop(js, l, key, js_mkundef()); 1708 1733 return prop; ··· 7786 7811 } 7787 7812 7788 7813 jsval_t js_get(struct js *js, jsval_t obj, const char *key) { 7814 + size_t key_len = strlen(key); 7815 + 7789 7816 if (vtype(obj) == T_FUNC) { 7790 7817 jsval_t func_obj = mkval(T_OBJ, vdata(obj)); 7791 - jsoff_t off = lkp(js, func_obj, key, strlen(key)); 7818 + jsoff_t off = lkp(js, func_obj, key, key_len); 7792 7819 return off == 0 ? js_mkundef() : resolveprop(js, mkval(T_PROP, off)); 7793 7820 } 7794 7821 7795 7822 if (vtype(obj) == T_ARR) { 7796 7823 jsval_t arr_obj = mkval(T_OBJ, vdata(obj)); 7797 - jsoff_t off = lkp(js, arr_obj, key, strlen(key)); 7824 + jsoff_t off = lkp(js, arr_obj, key, key_len); 7798 7825 return off == 0 ? js_mkundef() : resolveprop(js, mkval(T_PROP, off)); 7799 7826 } 7800 7827 7801 7828 if (vtype(obj) != T_OBJ) return js_mkundef(); 7802 - jsoff_t off = lkp(js, obj, key, strlen(key)); 7829 + jsoff_t off = lkp(js, obj, key, key_len); 7830 + 7831 + if (off == 0) { 7832 + jsval_t result = try_dynamic_getter(js, obj, key, key_len); 7833 + if (vtype(result) != T_UNDEF) return result; 7834 + } 7835 + 7803 7836 return off == 0 ? js_mkundef() : resolveprop(js, mkval(T_PROP, off)); 7804 7837 } 7805 7838 ··· 8096 8129 } 8097 8130 } 8098 8131 #endif 8132 + 8133 + void js_set_getter(struct js *js, jsval_t obj, js_getter_fn getter) { 8134 + if (vtype(obj) != T_OBJ) return; 8135 + jsval_t getter_val = mkval(T_CFUNC, (size_t)(void *)getter); 8136 + js_set(js, obj, "__getter", getter_val); 8137 + }
+17 -16
src/modules/process.c
··· 8 8 9 9 extern char **environ; 10 10 11 + static jsval_t env_getter(struct js *js, jsval_t obj, const char *key, size_t key_len) { 12 + (void)obj; 13 + 14 + char *key_str = (char *)malloc(key_len + 1); 15 + if (!key_str) return js_mkundef(); 16 + 17 + memcpy(key_str, key, key_len); 18 + key_str[key_len] = '\0'; 19 + 20 + char *value = getenv(key_str); 21 + free(key_str); 22 + 23 + if (value == NULL) return js_mkundef(); 24 + return js_mkstr(js, value, strlen(value)); 25 + } 26 + 11 27 static void load_dotenv_file(struct js *js, jsval_t env_obj) { 12 28 FILE *fp = fopen(".env", "r"); 13 29 if (fp == NULL) return; ··· 80 96 js_set(js, process_obj, "env", env_obj); 81 97 js_set(js, process_obj, "exit", js_mkfun(process_exit)); 82 98 83 - for (char **env = environ; *env != NULL; env++) { 84 - char *env_copy = strdup(*env); 85 - if (env_copy == NULL) continue; 86 - 87 - char *equals = strchr(env_copy, '='); 88 - if (equals != NULL) { 89 - *equals = '\0'; 90 - char *key = env_copy; 91 - char *value = equals + 1; 92 - 93 - js_set(js, env_obj, key, js_mkstr(js, value, strlen(value))); 94 - } 95 - 96 - free(env_copy); 97 - } 98 - 99 99 load_dotenv_file(js, env_obj); 100 + js_set_getter(js, env_obj, env_getter); 100 101 }