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.

stop storing pointers in SLOT_DATA

+72 -58
+2 -2
include/ant.h
··· 114 114 ant_value_t js_mkfun_meta(const ant_cfunc_meta_t *meta); 115 115 ant_value_t js_mkfun_dyn(ant_cfunc_t fn); 116 116 117 - ant_value_t js_heavy_mkfun(ant_t *js, ant_value_t (*fn)(ant_t *, ant_value_t *, int), ant_value_t data); 118 - ant_value_t js_heavy_mkfun_native(ant_t *js, ant_value_t (*fn)(ant_t *, ant_value_t *, int), void *ptr, uint32_t tag); 117 + ant_value_t js_heavy_mkfun(ant_t *js, ant_value_t (*fn)(ant_params_t), ant_value_t data); 118 + ant_value_t js_heavy_mkfun_native(ant_t *js, ant_value_t (*fn)(ant_params_t), void *ptr, uint32_t tag); 119 119 ant_value_t js_mkprop_fast(ant_t *js, ant_value_t obj, const char *key, size_t len, ant_value_t v); 120 120 121 121 // TODO: deprecate
+24 -21
src/streams/codec.c
··· 86 86 } 87 87 88 88 static ant_value_t tes_transform(ant_t *js, ant_value_t *args, int nargs) { 89 - ant_value_t wrapper = js_get_slot(js->current_func, SLOT_DATA); 89 + tes_state_t *st = js_check_native_tag(js->current_func, TES_NATIVE_TAG) 90 + ? (tes_state_t *)js_get_native_ptr(js->current_func) 91 + : NULL; 90 92 91 - tes_state_t *st = (tes_state_t *)js_get_native_ptr(wrapper); 93 + if (!st) return js_mkerr_typed(js, JS_ERR_TYPE, "Invalid TextEncoderStream"); 92 94 ant_value_t ctrl_obj = codec_transform_controller(args, nargs); 93 95 ant_value_t chunk = (nargs > 0) ? args[0] : js_mkundef(); 94 96 ··· 171 173 } 172 174 173 175 static ant_value_t tes_flush(ant_t *js, ant_value_t *args, int nargs) { 174 - ant_value_t wrapper = js_get_slot(js->current_func, SLOT_DATA); 175 - tes_state_t *st = (tes_state_t *)js_get_native_ptr(wrapper); 176 + tes_state_t *st = js_check_native_tag(js->current_func, TES_NATIVE_TAG) 177 + ? (tes_state_t *)js_get_native_ptr(js->current_func) 178 + : NULL; 179 + 180 + if (!st) return js_mkerr_typed(js, JS_ERR_TYPE, "Invalid TextEncoderStream"); 176 181 ant_value_t ctrl_obj = codec_flush_controller(args, nargs); 177 182 178 183 if (st->pending_len > 0) { ··· 220 225 js_set_native(obj, st, TES_NATIVE_TAG); 221 226 js_set_finalizer(obj, tes_state_finalize); 222 227 223 - ant_value_t wrapper = js_mkobj(js); 224 - js_set_native(wrapper, st, TES_NATIVE_TAG); 225 - 226 228 ant_value_t transformer = js_mkobj(js); 227 - ant_value_t transform_fn = js_heavy_mkfun(js, tes_transform, wrapper); 228 - ant_value_t flush_fn = js_heavy_mkfun(js, tes_flush, wrapper); 229 + ant_value_t transform_fn = js_heavy_mkfun_native(js, tes_transform, st, TES_NATIVE_TAG); 230 + ant_value_t flush_fn = js_heavy_mkfun_native(js, tes_flush, st, TES_NATIVE_TAG); 229 231 js_set(js, transformer, "transform", transform_fn); 230 232 js_set(js, transformer, "flush", flush_fn); 231 233 ··· 240 242 241 243 if (is_err(ts_obj)) { free(st); return ts_obj; } 242 244 js_set_slot(obj, SLOT_ENTRIES, ts_obj); 243 - js_set_slot(wrapper, SLOT_ENTRIES, ts_obj); 244 245 245 246 return obj; 246 247 } 247 248 248 249 static ant_value_t tds_transform(ant_t *js, ant_value_t *args, int nargs) { 249 - ant_value_t wrapper = js_get_slot(js->current_func, SLOT_DATA); 250 - td_state_t *st = (td_state_t *)js_get_native_ptr(wrapper); 250 + td_state_t *st = js_check_native_tag(js->current_func, TDS_NATIVE_TAG) 251 + ? (td_state_t *)js_get_native_ptr(js->current_func) 252 + : NULL; 253 + 254 + if (!st) return js_mkerr_typed(js, JS_ERR_TYPE, "Invalid TextDecoderStream"); 251 255 ant_value_t ctrl_obj = codec_transform_controller(args, nargs); 252 256 253 257 ant_value_t chunk = (nargs > 0) ? args[0] : js_mkundef(); ··· 272 276 } 273 277 274 278 static ant_value_t tds_flush(ant_t *js, ant_value_t *args, int nargs) { 275 - ant_value_t wrapper = js_get_slot(js->current_func, SLOT_DATA); 276 - td_state_t *st = (td_state_t *)js_get_native_ptr(wrapper); 279 + td_state_t *st = js_check_native_tag(js->current_func, TDS_NATIVE_TAG) 280 + ? (td_state_t *)js_get_native_ptr(js->current_func) 281 + : NULL; 282 + 283 + if (!st) return js_mkerr_typed(js, JS_ERR_TYPE, "Invalid TextDecoderStream"); 277 284 ant_value_t ctrl_obj = codec_flush_controller(args, nargs); 278 285 279 286 ant_value_t result = td_decode(js, st, NULL, 0, false); ··· 394 401 js_set_native(obj, st, TDS_NATIVE_TAG); 395 402 js_set_finalizer(obj, tds_state_finalize); 396 403 397 - ant_value_t wrapper = js_mkobj(js); 398 - js_set_native(wrapper, st, TDS_NATIVE_TAG); 399 - 400 404 ant_value_t transformer = js_mkobj(js); 401 - ant_value_t transform_fn = js_heavy_mkfun(js, tds_transform, wrapper); 402 - ant_value_t flush_fn = js_heavy_mkfun(js, tds_flush, wrapper); 405 + ant_value_t transform_fn = js_heavy_mkfun_native(js, tds_transform, st, TDS_NATIVE_TAG); 406 + ant_value_t flush_fn = js_heavy_mkfun_native(js, tds_flush, st, TDS_NATIVE_TAG); 407 + 403 408 js_set(js, transformer, "transform", transform_fn); 404 409 js_set(js, transformer, "flush", flush_fn); 405 410 ··· 415 420 js->this_val = saved_this; 416 421 417 422 if (is_err(ts_obj)) { free(st); return ts_obj; } 418 - 419 423 js_set_slot(obj, SLOT_ENTRIES, ts_obj); 420 - js_set_slot(wrapper, SLOT_ENTRIES, ts_obj); 421 424 422 425 return obj; 423 426 }
+46 -35
src/streams/compression.c
··· 58 58 return js_get_slot(obj, SLOT_ENTRIES); 59 59 } 60 60 61 - static zformat_t get_wrapper_format(ant_value_t wrapper) { 62 - ant_value_t fmt = js_get_slot(wrapper, SLOT_CTOR); 63 - return (zformat_t)(int)js_getnum(fmt); 64 - } 65 - 66 61 bool cs_is_stream(ant_value_t obj) { 67 62 return is_object_type(obj) 68 63 && (js_check_native_tag(obj, CS_Z_NATIVE_TAG) || js_check_native_tag(obj, CS_BROTLI_NATIVE_TAG)) ··· 132 127 #define ZCHUNK_SIZE 16384 133 128 134 129 static ant_value_t cs_transform(ant_t *js, ant_value_t *args, int nargs) { 135 - ant_value_t wrapper = js_get_slot(js->current_func, SLOT_DATA); 130 + uint32_t tag = js_get_native_tag(js->current_func); 131 + zstate_t *st = (zstate_t *)js_get_native_ptr(js->current_func); 136 132 137 - zstate_t *st = (zstate_t *)js_get_native_ptr(wrapper); 138 133 ant_value_t ctrl_obj = (nargs > 1) ? args[1] : js_mkundef(); 139 134 ant_value_t chunk = (nargs > 0) ? args[0] : js_mkundef(); 140 135 ··· 146 141 147 142 if (!input || input_len == 0) return js_mkundef(); 148 143 149 - if (get_wrapper_format(wrapper) == ZFMT_BROTLI) { 150 - brotli_stream_state_t *brotli_st = (brotli_stream_state_t *)js_get_native_ptr(wrapper); 144 + if (tag == CS_BROTLI_NATIVE_TAG) { 145 + brotli_stream_state_t *brotli_st = (brotli_stream_state_t *)js_get_native_ptr(js->current_func); 151 146 return brotli_stream_transform(js, brotli_st, ctrl_obj, input, input_len); 152 147 } 148 + 149 + if (tag != CS_Z_NATIVE_TAG || !st) 150 + return js_mkerr_typed(js, JS_ERR_TYPE, "Invalid CompressionStream"); 153 151 154 152 st->strm.next_in = (Bytef *)input; 155 153 st->strm.avail_in = (uInt)input_len; ··· 172 170 } 173 171 174 172 static ant_value_t cs_flush(ant_t *js, ant_value_t *args, int nargs) { 175 - ant_value_t wrapper = js_get_slot(js->current_func, SLOT_DATA); 173 + uint32_t tag = js_get_native_tag(js->current_func); 176 174 ant_value_t ctrl_obj = (nargs > 0) ? args[0] : js_mkundef(); 177 175 178 - if (get_wrapper_format(wrapper) == ZFMT_BROTLI) { 179 - brotli_stream_state_t *brotli_st = (brotli_stream_state_t *)js_get_native_ptr(wrapper); 176 + if (tag == CS_BROTLI_NATIVE_TAG) { 177 + brotli_stream_state_t *brotli_st = (brotli_stream_state_t *)js_get_native_ptr(js->current_func); 180 178 return brotli_stream_flush(js, brotli_st, ctrl_obj); 181 179 } 182 - zstate_t *st = (zstate_t *)js_get_native_ptr(wrapper); 180 + 181 + zstate_t *st = (zstate_t *)js_get_native_ptr(js->current_func); 182 + if (tag != CS_Z_NATIVE_TAG || !st) return js_mkerr_typed(js, JS_ERR_TYPE, "Invalid CompressionStream"); 183 183 184 184 st->strm.next_in = NULL; 185 185 st->strm.avail_in = 0; ··· 240 240 ant_value_t obj = js_mkobj(js); 241 241 ant_value_t proto = js_instance_proto_from_new_target(js, g_cs_proto); 242 242 if (is_object_type(proto)) js_set_proto_init(obj, proto); 243 + 243 244 js_set_native(obj, fmt == ZFMT_BROTLI ? (void *)brotli : (void *)st, fmt == ZFMT_BROTLI ? CS_BROTLI_NATIVE_TAG : CS_Z_NATIVE_TAG); 244 245 js_set_finalizer(obj, fmt == ZFMT_BROTLI ? brotli_state_finalize : zstate_finalize); 245 246 246 - ant_value_t wrapper = js_mkobj(js); 247 - js_set_native(wrapper, fmt == ZFMT_BROTLI ? (void *)brotli : (void *)st, fmt == ZFMT_BROTLI ? CS_BROTLI_NATIVE_TAG : CS_Z_NATIVE_TAG); 248 - js_set_slot(wrapper, SLOT_CTOR, js_mknum((double)fmt)); 249 - 250 247 ant_value_t transformer = js_mkobj(js); 251 - ant_value_t transform_fn = js_heavy_mkfun(js, cs_transform, wrapper); 252 - ant_value_t flush_fn = js_heavy_mkfun(js, cs_flush, wrapper); 248 + 249 + ant_value_t transform_fn = js_heavy_mkfun_native(js, cs_transform, fmt == ZFMT_BROTLI 250 + ? (void *)brotli : (void *)st, fmt == ZFMT_BROTLI 251 + ? CS_BROTLI_NATIVE_TAG : CS_Z_NATIVE_TAG 252 + ); 253 + 254 + ant_value_t flush_fn = js_heavy_mkfun_native(js, cs_flush, fmt == ZFMT_BROTLI 255 + ? (void *)brotli : (void *)st, fmt == ZFMT_BROTLI 256 + ? CS_BROTLI_NATIVE_TAG : CS_Z_NATIVE_TAG 257 + ); 258 + 253 259 js_set(js, transformer, "transform", transform_fn); 254 260 js_set(js, transformer, "flush", flush_fn); 255 261 ··· 268 274 return ts_obj; 269 275 } 270 276 js_set_slot(obj, SLOT_ENTRIES, ts_obj); 271 - js_set_slot(wrapper, SLOT_ENTRIES, ts_obj); 272 277 273 278 return obj; 274 279 } 275 280 276 281 static ant_value_t ds_transform(ant_t *js, ant_value_t *args, int nargs) { 277 - ant_value_t wrapper = js_get_slot(js->current_func, SLOT_DATA); 278 - zstate_t *st = (zstate_t *)js_get_native_ptr(wrapper); 282 + uint32_t tag = js_get_native_tag(js->current_func); 283 + zstate_t *st = (zstate_t *)js_get_native_ptr(js->current_func); 279 284 ant_value_t ctrl_obj = (nargs > 1) ? args[1] : js_mkundef(); 280 285 281 286 ant_value_t chunk = (nargs > 0) ? args[0] : js_mkundef(); ··· 286 291 return js_mkerr_typed(js, JS_ERR_TYPE, "The provided value is not of type '(ArrayBuffer or ArrayBufferView)'"); 287 292 288 293 if (!input || input_len == 0) return js_mkundef(); 289 - if (get_wrapper_format(wrapper) == ZFMT_BROTLI) { 290 - brotli_stream_state_t *brotli_st = (brotli_stream_state_t *)js_get_native_ptr(wrapper); 294 + if (tag == DS_BROTLI_NATIVE_TAG) { 295 + brotli_stream_state_t *brotli_st = (brotli_stream_state_t *)js_get_native_ptr(js->current_func); 291 296 return brotli_stream_transform(js, brotli_st, ctrl_obj, input, input_len); 292 297 } 298 + 299 + if (tag != DS_Z_NATIVE_TAG || !st) 300 + return js_mkerr_typed(js, JS_ERR_TYPE, "Invalid DecompressionStream"); 293 301 294 302 st->strm.next_in = (Bytef *)input; 295 303 st->strm.avail_in = (uInt)input_len; ··· 313 321 } 314 322 315 323 static ant_value_t ds_flush(ant_t *js, ant_value_t *args, int nargs) { 316 - ant_value_t wrapper = js_get_slot(js->current_func, SLOT_DATA); 324 + uint32_t tag = js_get_native_tag(js->current_func); 317 325 ant_value_t ctrl_obj = (nargs > 0) ? args[0] : js_mkundef(); 318 - if (get_wrapper_format(wrapper) == ZFMT_BROTLI) { 319 - brotli_stream_state_t *st = (brotli_stream_state_t *)js_get_native_ptr(wrapper); 326 + if (tag == DS_BROTLI_NATIVE_TAG) { 327 + brotli_stream_state_t *st = (brotli_stream_state_t *)js_get_native_ptr(js->current_func); 320 328 return brotli_stream_flush(js, st, ctrl_obj); 321 329 } 322 330 return js_mkundef(); ··· 361 369 ant_value_t obj = js_mkobj(js); 362 370 ant_value_t proto = js_instance_proto_from_new_target(js, g_ds_proto); 363 371 if (is_object_type(proto)) js_set_proto_init(obj, proto); 372 + 364 373 js_set_native(obj, fmt == ZFMT_BROTLI ? (void *)brotli : (void *)st, fmt == ZFMT_BROTLI ? DS_BROTLI_NATIVE_TAG : DS_Z_NATIVE_TAG); 365 374 js_set_finalizer(obj, fmt == ZFMT_BROTLI ? brotli_state_finalize : zstate_inflate_finalize); 366 - 367 - ant_value_t wrapper = js_mkobj(js); 368 - js_set_native(wrapper, fmt == ZFMT_BROTLI ? (void *)brotli : (void *)st, fmt == ZFMT_BROTLI ? DS_BROTLI_NATIVE_TAG : DS_Z_NATIVE_TAG); 369 - js_set_slot(wrapper, SLOT_CTOR, js_mknum((double)fmt)); 370 375 371 376 ant_value_t transformer = js_mkobj(js); 372 - ant_value_t transform_fn = js_heavy_mkfun(js, ds_transform, wrapper); 373 - ant_value_t flush_fn = js_heavy_mkfun(js, ds_flush, wrapper); 377 + 378 + ant_value_t transform_fn = js_heavy_mkfun_native(js, ds_transform, fmt == ZFMT_BROTLI 379 + ? (void *)brotli : (void *)st, fmt == ZFMT_BROTLI 380 + ? DS_BROTLI_NATIVE_TAG : DS_Z_NATIVE_TAG 381 + ); 382 + 383 + ant_value_t flush_fn = js_heavy_mkfun_native(js, ds_flush, fmt == ZFMT_BROTLI 384 + ? (void *)brotli : (void *)st, fmt == ZFMT_BROTLI 385 + ? DS_BROTLI_NATIVE_TAG : DS_Z_NATIVE_TAG 386 + ); 374 387 375 388 js_set(js, transformer, "transform", transform_fn); 376 389 js_set(js, transformer, "flush", flush_fn); ··· 391 404 } 392 405 393 406 js_set_slot(obj, SLOT_ENTRIES, ts_obj); 394 - js_set_slot(wrapper, SLOT_ENTRIES, ts_obj); 395 - 396 407 return obj; 397 408 } 398 409