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.

runtime check for 53-bit NaN-boxing

+79 -74
+71 -70
include/ant.h
··· 25 25 26 26 struct js; 27 27 28 + typedef struct js ant_t; 28 29 typedef uint32_t jsoff_t; 29 30 typedef uint64_t jsval_t; 30 31 31 32 #define ANT_LIMIT_SIZE_CACHE 16384 32 33 #define GC_FWD_ARGS jsval_t (*fwd_val)(void *ctx, jsval_t old), void *ctx 33 - #define GC_UPDATE_ARGS struct js *js, jsoff_t (*fwd_off)(void *ctx, jsoff_t old), GC_FWD_ARGS 34 + #define GC_UPDATE_ARGS ant_t *js, jsoff_t (*fwd_off)(void *ctx, jsoff_t old), GC_FWD_ARGS 34 35 35 36 enum { 36 37 JS_UNDEF, JS_NULL, JS_TRUE, JS_FALSE, JS_STR, JS_NUM, ··· 56 57 #define js_mkerr(js, ...) js_create_error(js, JS_ERR_TYPE, js_mkundef(), __VA_ARGS__) 57 58 #define js_mkerr_typed(js, err_type, ...) js_create_error(js, err_type, js_mkundef(), __VA_ARGS__) 58 59 #define js_mkerr_props(js, err_type, props, ...) js_create_error(js, err_type, props, __VA_ARGS__) 59 - jsval_t js_create_error(struct js *js, js_err_type_t err_type, jsval_t props, const char *fmt, ...); 60 + jsval_t js_create_error(ant_t *js, js_err_type_t err_type, jsval_t props, const char *fmt, ...); 60 61 61 - struct js *js_create(void *buf, size_t len); 62 - struct js *js_create_dynamic(size_t initial_size, size_t max_size); 62 + ant_t *js_create(void *buf, size_t len); 63 + ant_t *js_create_dynamic(size_t initial_size, size_t max_size); 63 64 64 - jsval_t js_glob(struct js *); 65 - jsval_t js_mkscope(struct js *); 66 - jsval_t js_getscope(struct js *); 67 - jsval_t js_eval(struct js *, const char *, size_t); 65 + jsval_t js_glob(ant_t *); 66 + jsval_t js_mkscope(ant_t *); 67 + jsval_t js_getscope(ant_t *); 68 + jsval_t js_eval(ant_t *, const char *, size_t); 68 69 69 - void js_destroy(struct js *); 70 - void js_delscope(struct js *); 71 - bool js_truthy(struct js *, jsval_t); 72 - void js_setmaxcss(struct js *, size_t); 70 + void js_destroy(ant_t *); 71 + void js_delscope(ant_t *); 72 + bool js_truthy(ant_t *, jsval_t); 73 + void js_setmaxcss(ant_t *, size_t); 73 74 74 75 uint32_t js_to_uint32(double d); 75 76 int32_t js_to_int32(double d); 76 77 77 78 bool js_chkargs(jsval_t *, int, const char *); 78 - void js_set_filename(struct js *, const char *); 79 - void js_stats(struct js *, size_t *total, size_t *min, size_t *cstacksize); 80 - size_t js_getbrk(struct js *); 79 + void js_set_filename(ant_t *, const char *); 80 + void js_stats(ant_t *, size_t *total, size_t *min, size_t *cstacksize); 81 + size_t js_getbrk(ant_t *); 81 82 82 83 jsval_t js_mkundef(void); 83 84 jsval_t js_mknull(void); ··· 85 86 jsval_t js_mkfalse(void); 86 87 jsval_t js_mknum(double); 87 88 88 - jsval_t js_getthis(struct js *); 89 - void js_setthis(struct js *, jsval_t); 89 + jsval_t js_getthis(ant_t *); 90 + void js_setthis(ant_t *, jsval_t); 90 91 91 - jsval_t js_getcurrentfunc(struct js *); 92 - jsval_t js_get(struct js *, jsval_t, const char *); 93 - jsval_t js_getprop_proto(struct js *, jsval_t, const char *); 94 - bool js_iter(struct js *js, jsval_t iterable, bool (*callback)(struct js *js, jsval_t value, void *udata), void *udata); 92 + jsval_t js_getcurrentfunc(ant_t *); 93 + jsval_t js_get(ant_t *, jsval_t, const char *); 94 + jsval_t js_getprop_proto(ant_t *, jsval_t, const char *); 95 + bool js_iter(ant_t *js, jsval_t iterable, bool (*callback)(ant_t *js, jsval_t value, void *udata), void *udata); 95 96 96 97 uint64_t js_sym_id(jsval_t sym); 97 - const char *js_sym_desc(struct js *js, jsval_t sym); 98 + const char *js_sym_desc(ant_t *js, jsval_t sym); 98 99 99 - jsval_t js_mksym_for(struct js *, const char *key); 100 + jsval_t js_mksym_for(ant_t *, const char *key); 100 101 const char *js_sym_key(jsval_t sym); 101 102 102 - jsval_t js_mkobj(struct js *); 103 - jsval_t js_newobj(struct js *); 104 - jsval_t js_mkarr(struct js *); 105 - void js_arr_push(struct js *, jsval_t arr, jsval_t val); 106 - jsval_t js_mkstr(struct js *, const void *, size_t); 107 - jsval_t js_mksym(struct js *, const char *desc); 108 - jsval_t js_mkfun(jsval_t (*fn)(struct js *, jsval_t *, int)); 109 - jsval_t js_heavy_mkfun(struct js *js, jsval_t (*fn)(struct js *, jsval_t *, int), jsval_t data); 110 - jsval_t js_mkprop_fast(struct js *js, jsval_t obj, const char *key, size_t len, jsval_t v); 103 + jsval_t js_mkobj(ant_t *); 104 + jsval_t js_newobj(ant_t *); 105 + jsval_t js_mkarr(ant_t *); 106 + void js_arr_push(ant_t *, jsval_t arr, jsval_t val); 107 + jsval_t js_mkstr(ant_t *, const void *, size_t); 108 + jsval_t js_mksym(ant_t *, const char *desc); 109 + jsval_t js_mkfun(jsval_t (*fn)(ant_t *, jsval_t *, int)); 110 + jsval_t js_heavy_mkfun(ant_t *js, jsval_t (*fn)(ant_t *, jsval_t *, int), jsval_t data); 111 + jsval_t js_mkprop_fast(ant_t *js, jsval_t obj, const char *key, size_t len, jsval_t v); 111 112 112 - jsval_t js_call(struct js *js, jsval_t func, jsval_t *args, int nargs); 113 - jsval_t js_call_with_this(struct js *js, jsval_t func, jsval_t this_val, jsval_t *args, int nargs); 113 + jsval_t js_call(ant_t *js, jsval_t func, jsval_t *args, int nargs); 114 + jsval_t js_call_with_this(ant_t *js, jsval_t func, jsval_t this_val, jsval_t *args, int nargs); 114 115 115 - void js_set(struct js *, jsval_t, const char *, jsval_t); 116 - bool js_del(struct js *, jsval_t obj, const char *key); 117 - void js_merge_obj(struct js *, jsval_t dst, jsval_t src); 116 + void js_set(ant_t *, jsval_t, const char *, jsval_t); 117 + bool js_del(ant_t *, jsval_t obj, const char *key); 118 + void js_merge_obj(ant_t *, jsval_t dst, jsval_t src); 118 119 119 - jsval_t js_setprop(struct js *, jsval_t obj, jsval_t key, jsval_t val); 120 - jsval_t js_setprop_nonconfigurable(struct js *, jsval_t obj, const char *key, size_t keylen, jsval_t val); 121 - void js_set_proto(struct js *, jsval_t obj, jsval_t proto); 120 + jsval_t js_setprop(ant_t *, jsval_t obj, jsval_t key, jsval_t val); 121 + jsval_t js_setprop_nonconfigurable(ant_t *, jsval_t obj, const char *key, size_t keylen, jsval_t val); 122 + void js_set_proto(ant_t *, jsval_t obj, jsval_t proto); 122 123 123 - jsval_t js_get_proto(struct js *, jsval_t obj); 124 - jsval_t js_get_ctor_proto(struct js *, const char *name, size_t len); 125 - jsval_t js_tostring_val(struct js *js, jsval_t value); 124 + jsval_t js_get_proto(ant_t *, jsval_t obj); 125 + jsval_t js_get_ctor_proto(ant_t *, const char *name, size_t len); 126 + jsval_t js_tostring_val(ant_t *js, jsval_t value); 126 127 127 128 int js_type(jsval_t val); 128 - int js_type_ex(struct js *js, jsval_t val); 129 + int js_type_ex(ant_t *js, jsval_t val); 129 130 130 131 int js_getbool(jsval_t val); 131 132 uint8_t vtype(jsval_t val); 132 133 size_t vdata(jsval_t val); 133 134 134 135 double js_getnum(jsval_t val); 135 - char *js_getstr(struct js *js, jsval_t val, size_t *len); 136 + char *js_getstr(ant_t *js, jsval_t val, size_t *len); 136 137 137 - const char *js_str(struct js *, jsval_t val); 138 + const char *js_str(ant_t *, jsval_t val); 138 139 139 140 typedef struct { 140 141 jsval_t obj; ··· 142 143 void *js_internal; 143 144 } js_prop_iter_t; 144 145 145 - js_prop_iter_t js_prop_iter_begin(struct js *js, jsval_t obj); 146 + js_prop_iter_t js_prop_iter_begin(ant_t *js, jsval_t obj); 146 147 bool js_prop_iter_next(js_prop_iter_t *iter, const char **key, size_t *key_len, jsval_t *value); 147 148 void js_prop_iter_end(js_prop_iter_t *iter); 148 149 149 150 jsval_t js_obj_to_func(jsval_t obj); 150 - jsval_t js_mkpromise(struct js *js); 151 + jsval_t js_mkpromise(ant_t *js); 151 152 152 153 jsval_t js_mktypedarray(void *data); 153 154 void *js_gettypedarray(jsval_t val); ··· 155 156 jsval_t js_mkffi(unsigned int index); 156 157 int js_getffi(jsval_t val); 157 158 158 - void js_resolve_promise(struct js *js, jsval_t promise, jsval_t value); 159 - void js_reject_promise(struct js *js, jsval_t promise, jsval_t value); 160 - void js_check_unhandled_rejections(struct js *js); 161 - void js_process_promise_handlers(struct js *js, uint32_t promise_id); 159 + void js_resolve_promise(ant_t *js, jsval_t promise, jsval_t value); 160 + void js_reject_promise(ant_t *js, jsval_t promise, jsval_t value); 161 + void js_check_unhandled_rejections(ant_t *js); 162 + void js_process_promise_handlers(ant_t *js, uint32_t promise_id); 162 163 163 - void js_run_event_loop(struct js *js); 164 - void js_poll_events(struct js *js); 165 - void js_setup_import_meta(struct js *js, const char *filename); 164 + void js_run_event_loop(ant_t *js); 165 + void js_poll_events(ant_t *js); 166 + void js_setup_import_meta(ant_t *js, const char *filename); 166 167 167 - typedef jsval_t (*ant_library_init_fn)(struct js *js); 168 + typedef jsval_t (*ant_library_init_fn)(ant_t *js); 168 169 void ant_register_library(ant_library_init_fn init_fn, const char *name, ...); 169 170 170 171 #define ant_standard_library(name, lib) \ 171 172 ant_register_library(lib, name, "ant:" name, "node:" name, NULL) 172 173 173 - typedef jsval_t (*js_getter_fn)(struct js *js, jsval_t obj, const char *key, size_t key_len); 174 - typedef bool (*js_setter_fn)(struct js *js, jsval_t obj, const char *key, size_t key_len, jsval_t value); 174 + typedef jsval_t (*js_getter_fn)(ant_t *js, jsval_t obj, const char *key, size_t key_len); 175 + typedef bool (*js_setter_fn)(ant_t *js, jsval_t obj, const char *key, size_t key_len, jsval_t value); 175 176 176 - void js_set_getter(struct js *js, jsval_t obj, js_getter_fn getter); 177 - void js_set_setter(struct js *js, jsval_t obj, js_setter_fn setter); 177 + void js_set_getter(ant_t *js, jsval_t obj, js_getter_fn getter); 178 + void js_set_setter(ant_t *js, jsval_t obj, js_setter_fn setter); 178 179 179 - void js_set_descriptor(struct js *js, jsval_t obj, const char *key, size_t klen, int flags); 180 - void js_set_getter_desc(struct js *js, jsval_t obj, const char *key, size_t klen, jsval_t getter, int flags); 181 - void js_set_setter_desc(struct js *js, jsval_t obj, const char *key, size_t klen, jsval_t setter, int flags); 182 - void js_set_accessor_desc(struct js *js, jsval_t obj, const char *key, size_t klen, jsval_t getter, jsval_t setter, int flags); 180 + void js_set_descriptor(ant_t *js, jsval_t obj, const char *key, size_t klen, int flags); 181 + void js_set_getter_desc(ant_t *js, jsval_t obj, const char *key, size_t klen, jsval_t getter, int flags); 182 + void js_set_setter_desc(ant_t *js, jsval_t obj, const char *key, size_t klen, jsval_t setter, int flags); 183 + void js_set_accessor_desc(ant_t *js, jsval_t obj, const char *key, size_t klen, jsval_t getter, jsval_t setter, int flags); 183 184 184 - jsval_t js_get_slot(struct js *js, jsval_t obj, internal_slot_t slot); 185 - void js_set_slot(struct js *js, jsval_t obj, internal_slot_t slot, jsval_t value); 185 + jsval_t js_get_slot(ant_t *js, jsval_t obj, internal_slot_t slot); 186 + void js_set_slot(ant_t *js, jsval_t obj, internal_slot_t slot, jsval_t value); 186 187 187 188 bool js_is_slot_prop(jsoff_t header); 188 189 jsoff_t js_next_prop(jsoff_t header); 189 - jsoff_t js_loadoff(struct js *js, jsoff_t off); 190 + jsoff_t js_loadoff(ant_t *js, jsoff_t off); 190 191 191 192 void js_print_stack_trace(FILE *stream); 192 - void js_set_needs_gc(struct js *js, bool needs); 193 - void js_set_gc_suppress(struct js *js, bool suppress); 193 + void js_set_needs_gc(ant_t *js, bool needs); 194 + void js_set_gc_suppress(ant_t *js, bool suppress); 194 195 195 - size_t js_gc_compact(struct js *js); 196 + size_t js_gc_compact(ant_t *js); 196 197 197 198 #endif
+8 -4
src/ant.c
··· 56 56 _Static_assert(sizeof(double) == 8, "NaN-boxing requires 64-bit IEEE 754 doubles"); 57 57 _Static_assert(sizeof(uint64_t) == 8, "NaN-boxing requires 64-bit integers"); 58 58 _Static_assert(sizeof(double) == sizeof(uint64_t), "double and uint64_t must have same size"); 59 - _Static_assert(sizeof(void*) <= 8 && (sizeof(void*) < 8 || 1), "ANT_PTR: pointers must fit in 53-bit double mantissa"); 60 59 61 60 #if defined(__STDC_IEC_559__) || defined(__GCC_IEC_559) 62 61 #elif defined(__FAST_MATH__) ··· 21924 21923 return mkval(T_BOOL, 0); 21925 21924 } 21926 21925 21927 - struct js *js_create(void *buf, size_t len) { 21926 + ant_t *js_create(void *buf, size_t len) { 21927 + assert( 21928 + (uintptr_t)buf <= ((1ULL << 53) - 1) && 21929 + "ANT_PTR: pointer exceeds 53-bit NaN-boxing limit" 21930 + ); 21931 + 21928 21932 ANT_GC_INIT(); 21929 21933 intern_init(); 21930 - 21931 - struct js *js = NULL; 21934 + 21935 + ant_t *js = NULL; 21932 21936 if (len < sizeof(*js) + esize(T_OBJ)) return js; 21933 21937 memset(buf, 0, len); 21934 21938