diff --git a/src/modules/buffer.c b/src/modules/buffer.c index c425929..8d33617 100644 --- a/src/modules/buffer.c +++ b/src/modules/buffer.c @@ -473,6 +473,12 @@ static ant_value_t js_arraybuffer_detached_getter(ant_t *js, ant_value_t *args, return js_bool(data->is_detached); } +// ArrayBuffer.isView(value) +static ant_value_t js_arraybuffer_isView(ant_t *js, ant_value_t *args, int nargs) { + if (nargs < 1) return js_false; + return js_bool(buffer_is_dataview(args[0]) || buffer_get_typedarray_data(args[0]) != NULL); +} + static ant_value_t typedarray_index_getter(ant_t *js, ant_value_t obj, const char *key, size_t key_len) { if (key_len == 0 || key_len > 10) return js_mkundef(); @@ -2566,6 +2572,7 @@ void init_buffer_module() { js_mkprop_fast(js, arraybuffer_ctor_obj, "prototype", 9, arraybuffer_proto); js_mkprop_fast(js, arraybuffer_ctor_obj, "name", 4, ANT_STRING("ArrayBuffer")); js_set_descriptor(js, arraybuffer_ctor_obj, "name", 4, 0); + js_set(js, arraybuffer_ctor_obj, "isView", js_mkfun(js_arraybuffer_isView)); js_define_species_getter(js, arraybuffer_ctor_obj); ant_value_t arraybuffer_ctor = js_obj_to_func(arraybuffer_ctor_obj); js_set(js, arraybuffer_proto, "constructor", arraybuffer_ctor); diff --git a/src/silver/ops/async.h b/src/silver/ops/async.h index ea748c2..e54a59b 100644 --- a/src/silver/ops/async.h +++ b/src/silver/ops/async.h @@ -100,6 +100,19 @@ static inline void sv_async_unlink_activation(ant_t *js, coroutine_t *coro) { coro->active_parent = NULL; } +static inline coroutine_t *sv_async_get_active_coro_for_vm(ant_t *js, sv_vm_t *vm) { + if (!js || !js->active_async_coro) return NULL; + + coroutine_t *fallback = js->active_async_coro; + if (!vm) return fallback; + + for (coroutine_t *it = fallback; it; it = it->active_parent) { + if (it->owner_vm == vm) return it; + } + + return fallback; +} + static inline void sv_async_init_activation( coroutine_t *coro, ant_t *js, sv_vm_t *owner_vm, ant_value_t promise, ant_value_t this_val, ant_value_t super_val, ant_value_t new_target, @@ -614,6 +627,8 @@ static inline ant_value_t sv_start_async_closure( return promise; } + + static inline ant_value_t sv_await_value(sv_vm_t *vm, ant_t *js, ant_value_t value) { value = js_promise_assimilate_awaitable(js, value); if (is_err(value)) return value; @@ -626,7 +641,7 @@ static inline ant_value_t sv_await_value(sv_vm_t *vm, ant_t *js, ant_value_t val if (current_mco) { sv_coro_header_t *hdr = (sv_coro_header_t *)mco_get_user_data(current_mco); if (hdr) coro = hdr->coro; - } else if (js->active_async_coro) coro = js->active_async_coro; + } else coro = sv_async_get_active_coro_for_vm(js, vm); if (!coro) return js_mkerr(js, "await can only be used inside async functions"); diff --git a/tests/test_arraybuffer_isview.cjs b/tests/test_arraybuffer_isview.cjs new file mode 100644 index 0000000..e2e7370 --- /dev/null +++ b/tests/test_arraybuffer_isview.cjs @@ -0,0 +1,16 @@ +const assert = require('assert'); + +assert.equal(typeof ArrayBuffer.isView, 'function'); + +const buffer = new ArrayBuffer(16); +const u8 = new Uint8Array(buffer); +const dv = new DataView(buffer); + +assert.equal(ArrayBuffer.isView(u8), true); +assert.equal(ArrayBuffer.isView(dv), true); +assert.equal(ArrayBuffer.isView(buffer), false); +assert.equal(ArrayBuffer.isView({}), false); +assert.equal(ArrayBuffer.isView(null), false); +assert.equal(ArrayBuffer.isView(undefined), false); + +console.log('ArrayBuffer.isView regression checks passed');