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.

remove unused code and improve object creation

+28 -98
-1
include/ant.h
··· 52 52 jsval_t js_glob(struct js *); 53 53 jsval_t js_eval(struct js *, const char *, size_t); 54 54 55 - void js_dump(struct js *); 56 55 void js_destroy(struct js *); 57 56 void js_mkscope(struct js *); 58 57 void js_delscope(struct js *);
-1
include/internal.h
··· 5 5 6 6 struct js { 7 7 jsoff_t css; // max observed C stack size 8 - jsoff_t lwm; // JS ram low watermark: min free ram observed 9 8 const char *code; // currently parsed code snippet 10 9 char *errmsg; // dynamic error message buffer 11 10 size_t errmsg_size; // size of error message buffer
+2
include/modules/io.h
··· 1 1 #ifndef IO_H 2 2 #define IO_H 3 3 4 + #include "ant.h" 4 5 #include <stdio.h> 5 6 #include <stdbool.h> 6 7 ··· 8 9 9 10 void init_console_module(void); 10 11 void print_value_colored(const char *str, FILE *stream); 12 + void console_print(struct js *js, jsval_t *args, int nargs, const char *color, FILE *stream); 11 13 12 14 #endif
+1 -1
include/utils.h
··· 1 1 #ifndef ANT_UTILS_H 2 2 #define ANT_UTILS_H 3 - #define ARGTABLE_COUNT 11 3 + #define ARGTABLE_COUNT 10 4 4 5 5 #include <stdlib.h> 6 6 #include <stdint.h>
-1
meson.build
··· 195 195 build_include = include_directories('.') 196 196 197 197 add_project_arguments( 198 - '-D JS_DUMP', 199 198 '-D NO_EXECUTE_PERMISSION', 200 199 '-Wno-unused-function', 201 200 '-Wno-deprecated-declarations',
+4 -51
src/ant.c
··· 1148 1148 static jsval_t resume_coroutine_wrapper(struct js *js, jsval_t *args, int nargs); 1149 1149 static jsval_t reject_coroutine_wrapper(struct js *js, jsval_t *args, int nargs); 1150 1150 1151 - static void setlwm(struct js *js) { 1152 - jsoff_t n = 0, css = 0; 1153 - if (js->brk < js->size) n = js->size - js->brk; 1154 - if (js->lwm > n) js->lwm = n; 1155 - if ((char *) js->cstk > (char *) &n) 1156 - css = (jsoff_t) ((char *) js->cstk - (char *) &n); 1157 - if (css > js->css) js->css = css; 1158 - } 1159 - 1160 1151 static size_t cpy(char *dst, size_t dstlen, const char *src, size_t srclen) { 1161 - size_t i = 0; 1162 - for (i = 0; i < dstlen && i < srclen && src[i] != 0; i++) dst[i] = src[i]; 1163 - if (dstlen > 0) dst[i < dstlen ? i : dstlen - 1] = '\0'; 1164 - return i; 1152 + if (dstlen == 0) return 0; 1153 + size_t len = srclen < dstlen - 1 ? srclen : dstlen - 1; 1154 + memcpy(dst, src, len); dst[len] = '\0'; 1155 + return len; 1165 1156 } 1166 1157 1167 1158 static inline size_t uint_to_str(char *buf, size_t bufsize, unsigned int val) { ··· 5625 5616 js->this_val = peek_this(); 5626 5617 res = fn(js, argv, argc); 5627 5618 js->this_val = saved_this; 5628 - setlwm(js); 5629 5619 5630 5620 utarray_free(args); 5631 5621 return res; ··· 6338 6328 6339 6329 jsval_t *argv = (jsval_t *)utarray_front(args); 6340 6330 res = ffi_call_by_index(js, func_index, argv, argc); 6341 - setlwm(js); 6342 6331 6343 6332 utarray_free(args); 6344 6333 return res; ··· 6439 6428 js->this_val = peek_this(); 6440 6429 res = ((jsval_t(*)(struct js *, jsval_t *, int)) vdata(cfunc_slot))(js, argv, total_argc); 6441 6430 js->this_val = saved_this; 6442 - setlwm(js); 6443 6431 utarray_free(args_arr); 6444 6432 } 6445 6433 ··· 6732 6720 6733 6721 jsval_t l = is_assign(op) ? lhs : resolveprop(js, lhs); 6734 6722 jsval_t r = resolveprop(js, rhs); 6735 - setlwm(js); 6736 6723 6737 6724 if (is_err(l)) return l; 6738 6725 if (is_err(r)) return r; ··· 8025 8012 8026 8013 static jsval_t js_literal(struct js *js) { 8027 8014 next(js); 8028 - setlwm(js); 8029 8015 if (js->maxcss > 0 && js->css > js->maxcss) return js_mkerr(js, "C stack"); 8030 8016 js->consumed = 1; 8031 8017 ··· 20762 20748 js->size = (jsoff_t) (len - sizeof(*js)); 20763 20749 js->scope = mkobj(js, 0); 20764 20750 js->size = js->size / 8U * 8U; 20765 - js->lwm = js->size; 20766 20751 js->this_val = js->scope; 20767 20752 js->super_val = js_mkundef(); 20768 20753 js->new_target = js_mkundef(); ··· 21513 21498 return js_type(val); 21514 21499 } 21515 21500 21516 - void js_stats(struct js *js, size_t *total, size_t *lwm, size_t *css) { 21517 - if (total) *total = js->size; 21518 - if (lwm) *lwm = js->lwm; 21519 - if (css) *css = js->css; 21520 - } 21521 - 21522 21501 #define FWD_OFF(off) ((off) ? ((off) = fwd_off(ctx, off)) : 0) 21523 21502 #define FWD_VAL(val) ((val) = fwd_val(ctx, val)) 21524 21503 #define UTARRAY_EACH(arr, type, var) if (arr) for (type *var = (type *)utarray_front(arr), *_end = var + utarray_len(arr); var < _end; var++) ··· 21919 21898 bool js_is_slot_prop(jsoff_t header) { return is_slot_prop(header); } 21920 21899 jsoff_t js_next_prop(jsoff_t header) { return next_prop(header); } 21921 21900 jsoff_t js_loadoff(struct js *js, jsoff_t off) { return loadoff(js, off); } 21922 - 21923 - #ifdef JS_DUMP 21924 - void js_dump(struct js *js) { 21925 - jsoff_t off = 0, v; 21926 - printf("JS size %u, brk %u, lwm %u, css %u, nogc %u\n", js->size, js->brk, js->lwm, (unsigned) js->css, js->nogc); 21927 - while (off < js->brk) { 21928 - memcpy(&v, &js->mem[off], sizeof(v)); 21929 - printf(" %5u: ", off); 21930 - jsoff_t cleaned = v & ~FLAGMASK; 21931 - if ((cleaned & 3U) == T_OBJ) { 21932 - printf("OBJ %u %u%s\n", cleaned & ~3U, loadoff(js, (jsoff_t) (off + sizeof(off))), (v & CONSTMASK) ? " [CONST]" : ""); 21933 - } else if ((cleaned & 3U) == T_PROP) { 21934 - jsoff_t koff = loadoff(js, (jsoff_t) (off + sizeof(v))); 21935 - jsval_t val = loadval(js, (jsoff_t) (off + sizeof(v) + sizeof(v))); 21936 - printf("PROP next %u, koff %u vtype %d vdata %lu%s%s\n", cleaned & ~3U, koff, vtype(val), (unsigned long) vdata(val), (v & CONSTMASK) ? " [CONST]" : "", (v & SLOTMASK) ? " [SLOT]" : ""); 21937 - } else if ((cleaned & 3) == T_STR) { 21938 - jsoff_t len = offtolen(cleaned); 21939 - printf("STR %u [%.*s]\n", len, (int) len, js->mem + off + sizeof(v)); 21940 - } else { 21941 - printf("???\n"); 21942 - break; 21943 - } 21944 - off += esize(v & ~FLAGMASK); 21945 - } 21946 - } 21947 - #endif 21948 21901 21949 21902 void js_set_getter(struct js *js, jsval_t obj, js_getter_fn getter) { 21950 21903 if (vtype(obj) != T_OBJ) return;
-5
src/gc.c
··· 395 395 } 396 396 } 397 397 398 - jsoff_t free_space = js->size - js->brk; 399 - if (free_space < js->lwm || js->lwm == 0) { 400 - js->lwm = free_space; 401 - } 402 - 403 398 free(mark_bits); 404 399 fwd_free(&ctx.fwd); 405 400 ANT_GC_COLLECT();
+4 -10
src/main.c
··· 157 157 return EXIT_SUCCESS; 158 158 } 159 159 160 - int main(int argc, char *argv[]) { 161 - char dump = 0; 162 - 160 + int main(int argc, char *argv[]) { 163 161 struct arg_lit *help = arg_lit0("h", "help", "display this help and exit"); 164 162 struct arg_lit *version = arg_lit0("v", "version", "display version information and exit"); 165 - struct arg_lit *debug = arg_litn("d", "debug", 0, 10, "dump VM state (can be repeated for more detail)"); 166 163 struct arg_lit *no_color = arg_lit0(NULL, "no-color", "disable colored output"); 167 164 struct arg_str *eval = arg_str0("e", "eval", "<script>", "evaluate script"); 168 165 struct arg_lit *print = arg_lit0("p", "print", "evaluate script and print result"); ··· 173 170 struct arg_end *end = arg_end(20); 174 171 175 172 void *argtable[] = { 176 - help, version, debug, no_color, 177 - eval, print, initial_mem, max_mem, 173 + help, version, no_color, eval, 174 + print, initial_mem, max_mem, 178 175 localstorage_file, file, end 179 176 }; 180 177 ··· 201 198 202 199 bool repl_mode = (file->count == 0 && eval->count == 0); 203 200 const char *module_file = repl_mode ? NULL : (file->count > 0 ? file->filename[0] : NULL); 204 - dump = debug->count; 205 201 206 202 if (no_color->count > 0) io_no_color = true; 207 203 ··· 274 270 275 271 if (resolved_file) free(resolved_file); 276 272 } 277 - 278 - if (dump) js_dump(js); 279 - 273 + 280 274 js_destroy(js); 281 275 arg_freetable(argtable, ARGTABLE_COUNT); 282 276
+7 -11
src/modules/builtin.c
··· 7 7 #include <time.h> 8 8 #include <errno.h> 9 9 10 - #include "ant.h" 11 10 #include "gc.h" 12 11 #include "runtime.h" 12 + #include "internal.h" 13 13 #include "modules/builtin.h" 14 14 15 15 static struct { ··· 61 61 size_t used_after = GC_get_heap_size() - GC_get_free_bytes(); 62 62 size_t freed = (used_before > used_after) ? (used_before - used_after) : 0; 63 63 64 - jsval_t result = js_mkobj(js); 64 + jsval_t result = js_newobj(js); 65 65 js_set(js, result, "heapBefore", js_mknum((double)heap_before)); 66 66 js_set(js, result, "heapAfter", js_mknum((double)heap_after)); 67 67 js_set(js, result, "usedBefore", js_mknum((double)used_before)); ··· 78 78 static jsval_t js_alloc(struct js *js, jsval_t *args, int nargs) { 79 79 (void) args; (void) nargs; 80 80 81 - jsval_t result = js_mkobj(js); 81 + jsval_t result = js_newobj(js); 82 82 size_t arena_size = js_getbrk(js); 83 83 84 84 js_set(js, result, "arenaSize", js_mknum((double)arena_size)); ··· 126 126 // Ant.stats() 127 127 static jsval_t js_stats_fn(struct js *js, jsval_t *args, int nargs) { 128 128 (void) args; (void) nargs; 129 - 130 - size_t arena_total = 0, arena_lwm = 0, cstack = 0; 131 - js_stats(js, &arena_total, &arena_lwm, &cstack); 132 - jsval_t result = js_mkobj(js); 129 + jsval_t result = js_newobj(js); 133 130 134 - js_set(js, result, "arenaUsed", js_mknum((double)arena_total)); 135 - js_set(js, result, "arenaLwm", js_mknum((double)arena_lwm)); 136 - js_set(js, result, "cstack", js_mknum((double)cstack)); 131 + js_set(js, result, "arenaUsed", js_mknum((double)js->size)); 132 + js_set(js, result, "cstack", js_mknum((double)js->css)); 137 133 138 134 js_set(js, result, "gcHeapSize", js_mknum((double)GC_get_heap_size())); 139 135 js_set(js, result, "gcFreeBytes", js_mknum((double)GC_get_free_bytes())); ··· 154 150 js_set(js, ant_obj, "msleep", js_mkfun(js_msleep)); 155 151 js_set(js, ant_obj, "usleep", js_mkfun(js_usleep)); 156 152 157 - jsval_t raw_obj = js_mkobj(js); 153 + jsval_t raw_obj = js_newobj(js); 158 154 js_set(js, raw_obj, "typeof", js_mkfun(js_raw_typeof)); 159 155 js_set(js, ant_obj, "raw", raw_obj); 160 156 }
+1 -1
src/modules/io.c
··· 241 241 #undef KEYWORD 242 242 #undef EMIT_UNTIL 243 243 244 - static void console_print(struct js *js, jsval_t *args, int nargs, const char *color, FILE *stream) { 244 + void console_print(struct js *js, jsval_t *args, int nargs, const char *color, FILE *stream) { 245 245 if (color && !io_no_color) io_puts(color, stream); 246 246 247 247 for (int i = 0; i < nargs; i++) {
+6 -9
src/repl.c
··· 146 146 } 147 147 148 148 static cmd_result_t cmd_gc(struct js *js, history_t *history, const char *arg) { 149 - (void)js; (void)history; (void)arg; 150 - printf("Garbage collection complete\n"); 149 + jsval_t gc_fn = js_get(js, rt->ant_obj, "gc"); 150 + jsval_t result = js_call(js, gc_fn, NULL, 0); 151 + console_print(js, &result, 1, NULL, stdout); 151 152 return CMD_OK; 152 153 } 153 154 154 155 static cmd_result_t cmd_stats(struct js *js, history_t *history, const char *arg) { 155 - (void)history; (void)arg; 156 - size_t total, min, cstack; 157 - js_stats(js, &total, &min, &cstack); 158 - printf("Memory stats:\n"); 159 - printf(" Total: %zu bytes\n", total); 160 - printf(" Free: %zu bytes\n", min); 161 - printf(" C Stack: %zu bytes\n", cstack); 156 + jsval_t stats_fn = js_get(js, rt->ant_obj, "stats"); 157 + jsval_t result = js_call(js, stats_fn, NULL, 0); 158 + console_print(js, &result, 1, NULL, stdout); 162 159 return CMD_OK; 163 160 } 164 161
+3 -3
src/runtime.c
··· 8 8 9 9 struct ant_runtime *ant_runtime_init(struct js *js, int argc, char **argv, struct arg_file *ls_p) { 10 10 runtime.js = js; 11 - runtime.ant_obj = js_mkobj(js); 11 + runtime.ant_obj = js_newobj(js); 12 12 runtime.flags = 0; 13 13 14 14 runtime.argc = argc; 15 15 runtime.argv = argv; 16 16 runtime.ls_fp = ls_p->count > 0 ? ls_p->filename[0] : NULL; 17 17 18 - js_set(js, js_glob(js), "Ant", runtime.ant_obj); 19 18 js_set(js, js_glob(js), "global", js_glob(js)); 20 19 js_set(js, js_glob(js), "window", js_glob(js)); 21 20 js_set(js, js_glob(js), "globalThis", js_glob(js)); 22 - 21 + js_set(js, js_glob(js), "Ant", runtime.ant_obj); 22 + 23 23 return &runtime; 24 24 }
-1
src/types/ant.d.ts
··· 55 55 56 56 interface AntStatsResult { 57 57 arenaUsed: number; 58 - arenaLwm: number; 59 58 cstack: number; 60 59 gcHeapSize: number; 61 60 gcFreeBytes: number;
-3
tests/test_gc.js
··· 24 24 let stats1 = Ant.stats(); 25 25 console.log('Memory stats:'); 26 26 console.log(' arenaUsed:', stats1.arenaUsed); 27 - console.log(' arenaLwm:', stats1.arenaLwm); 28 27 console.log(' cstack:', stats1.cstack); 29 28 console.log(' gcHeapSize:', stats1.gcHeapSize); 30 29 console.log(' gcUsedBytes:', stats1.gcUsedBytes); ··· 48 47 let stats2 = Ant.stats(); 49 48 console.log('Memory stats:'); 50 49 console.log(' arenaUsed:', stats2.arenaUsed); 51 - console.log(' arenaLwm:', stats2.arenaLwm); 52 50 console.log(' cstack:', stats2.cstack); 53 51 console.log(' gcHeapSize:', stats2.gcHeapSize); 54 52 console.log(' gcUsedBytes:', stats2.gcUsedBytes); ··· 81 79 let stats3 = Ant.stats(); 82 80 console.log('Memory stats:'); 83 81 console.log(' arenaUsed:', stats3.arenaUsed); 84 - console.log(' arenaLwm:', stats3.arenaLwm); 85 82 console.log(' cstack:', stats3.cstack); 86 83 console.log(' gcHeapSize:', stats3.gcHeapSize); 87 84 console.log(' gcUsedBytes:', stats3.gcUsedBytes);