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.

add TypedArray.from

+108 -3
+3 -3
examples/results.txt
··· 1061 1061 compat-table/es6/typed-arrays.constructor-iterables.js: OK 1062 1062 compat-table/es6/typed-arrays.constructor-requires-new.js: OK 1063 1063 compat-table/es6/typed-arrays.correct-prototype-chains.js: failed 1064 - compat-table/es6/typed-arrays.from.js: failed 1064 + compat-table/es6/typed-arrays.from.js: OK 1065 1065 compat-table/es6/typed-arrays.of.js: failed 1066 1066 compat-table/es6/typed-arrays.prototype.Symbol.iterator.js: OK 1067 1067 compat-table/es6/typed-arrays.prototype.copyWithin.js: OK ··· 1249 1249 compat-table/es2020/DataView.prototype.getBigInt64.js: TypeError: undefined is not a function 1250 1250 compat-table/es2020/DataView.prototype.getBigUint64.js: TypeError: undefined is not a function 1251 1251 compat-table/es2020/Promise.allSettled.js: OK 1252 - compat-table/es2020/String.prototype.matchAll.js: TypeError: undefined is not a function 1253 - compat-table/es2020/String.prototype.matchAll.throws-non-global.js: failed 1252 + compat-table/es2020/String.prototype.matchAll.js: OK 1253 + compat-table/es2020/String.prototype.matchAll.throws-non-global.js: OK 1254 1254 compat-table/es2020/globalThis.descriptor.js: OK 1255 1255 compat-table/es2020/globalThis.js: OK 1256 1256 compat-table/es2020/nullish-coalescing.js: OK
+105
src/modules/buffer.c
··· 1224 1224 DEFINE_TYPEDARRAY_CONSTRUCTOR(BigInt64Array, TYPED_ARRAY_BIGINT64) 1225 1225 DEFINE_TYPEDARRAY_CONSTRUCTOR(BigUint64Array, TYPED_ARRAY_BIGUINT64) 1226 1226 1227 + static ant_value_t js_typedarray_from(ant_t *js, ant_value_t *args, int nargs, TypedArrayType type, const char *type_name) { 1228 + if (nargs < 1) return js_mkerr_typed(js, JS_ERR_TYPE, "%s.from requires at least 1 argument", type_name); 1229 + 1230 + ant_value_t source = args[0]; 1231 + bool has_map = nargs >= 2 && vtype(args[1]) != T_UNDEF; 1232 + ant_value_t map_fn = js_mkundef(); 1233 + ant_value_t this_arg = nargs >= 3 ? args[2] : js_mkundef(); 1234 + 1235 + if (has_map) { 1236 + if (!is_callable(args[1])) 1237 + return js_mkerr_typed(js, JS_ERR_TYPE, "%s.from: mapFn is not a function", type_name); 1238 + map_fn = args[1]; 1239 + } 1240 + 1241 + ant_value_t *collected = NULL; 1242 + size_t count = 0, cap = 16; 1243 + collected = malloc(cap * sizeof(ant_value_t)); 1244 + if (!collected) return js_mkerr(js, "oom"); 1245 + 1246 + js_iter_t it; 1247 + if (js_iter_open(js, source, &it)) { 1248 + ant_value_t item; 1249 + while (js_iter_next(js, &it, &item)) { 1250 + if (count >= cap) { 1251 + cap *= 2; 1252 + ant_value_t *tmp = realloc(collected, cap * sizeof(ant_value_t)); 1253 + if (!tmp) { free(collected); return js_mkerr(js, "oom"); } 1254 + collected = tmp; 1255 + } 1256 + if (has_map) { 1257 + ant_value_t map_args[2] = { item, js_mknum((double)count) }; 1258 + item = sv_vm_call(js->vm, js, map_fn, this_arg, map_args, 2, NULL, false); 1259 + if (is_err(item)) { free(collected); return item; } 1260 + } 1261 + collected[count++] = item; 1262 + } 1263 + js_iter_close(js, &it); 1264 + } else { 1265 + ant_value_t len_val = js_get(js, source, "length"); 1266 + size_t len = vtype(len_val) == T_NUM ? (size_t)js_getnum(len_val) : 0; 1267 + for (size_t i = 0; i < len; i++) { 1268 + char idx[16]; 1269 + snprintf(idx, sizeof(idx), "%zu", i); 1270 + ant_value_t item = js_get(js, source, idx); 1271 + if (count >= cap) { 1272 + cap *= 2; 1273 + ant_value_t *tmp = realloc(collected, cap * sizeof(ant_value_t)); 1274 + if (!tmp) { free(collected); return js_mkerr(js, "oom"); } 1275 + collected = tmp; 1276 + } 1277 + if (has_map) { 1278 + ant_value_t map_args[2] = { item, js_mknum((double)i) }; 1279 + item = sv_vm_call(js->vm, js, map_fn, this_arg, map_args, 2, NULL, false); 1280 + if (is_err(item)) { free(collected); return item; } 1281 + } 1282 + collected[count++] = item; 1283 + } 1284 + } 1285 + 1286 + size_t elem_size = get_element_size(type); 1287 + ArrayBufferData *buffer = create_array_buffer_data(count * elem_size); 1288 + if (!buffer) { free(collected); return js_mkerr(js, "oom"); } 1289 + 1290 + ant_value_t result = create_typed_array(js, type, buffer, 0, count, type_name); 1291 + uint8_t *data = buffer->data; 1292 + 1293 + for (size_t i = 0; i < count; i++) { 1294 + double val = vtype(collected[i]) == T_NUM ? js_getnum(collected[i]) : js_to_number(js, collected[i]); 1295 + switch (type) { 1296 + case TYPED_ARRAY_INT8: ((int8_t *)data)[i] = (int8_t)val; break; 1297 + case TYPED_ARRAY_UINT8: 1298 + case TYPED_ARRAY_UINT8_CLAMPED: data[i] = (uint8_t)val; break; 1299 + case TYPED_ARRAY_INT16: ((int16_t *)data)[i] = (int16_t)val; break; 1300 + case TYPED_ARRAY_UINT16: ((uint16_t *)data)[i] = (uint16_t)val; break; 1301 + case TYPED_ARRAY_INT32: ((int32_t *)data)[i] = (int32_t)val; break; 1302 + case TYPED_ARRAY_UINT32: ((uint32_t *)data)[i] = (uint32_t)val; break; 1303 + case TYPED_ARRAY_FLOAT16: ((uint16_t *)data)[i] = double_to_half(val); break; 1304 + case TYPED_ARRAY_FLOAT32: ((float *)data)[i] = (float)val; break; 1305 + case TYPED_ARRAY_FLOAT64: ((double *)data)[i] = val; break; 1306 + default: break; 1307 + }} 1308 + 1309 + free(collected); 1310 + return result; 1311 + } 1312 + 1313 + #define DEFINE_TYPEDARRAY_FROM(name, type) \ 1314 + static ant_value_t js_##name##_from(ant_t *js, ant_value_t *args, int nargs) { \ 1315 + return js_typedarray_from(js, args, nargs, type, #name); \ 1316 + } 1317 + 1318 + DEFINE_TYPEDARRAY_FROM(Int8Array, TYPED_ARRAY_INT8) 1319 + DEFINE_TYPEDARRAY_FROM(Uint8Array, TYPED_ARRAY_UINT8) 1320 + DEFINE_TYPEDARRAY_FROM(Uint8ClampedArray, TYPED_ARRAY_UINT8_CLAMPED) 1321 + DEFINE_TYPEDARRAY_FROM(Int16Array, TYPED_ARRAY_INT16) 1322 + DEFINE_TYPEDARRAY_FROM(Uint16Array, TYPED_ARRAY_UINT16) 1323 + DEFINE_TYPEDARRAY_FROM(Int32Array, TYPED_ARRAY_INT32) 1324 + DEFINE_TYPEDARRAY_FROM(Uint32Array, TYPED_ARRAY_UINT32) 1325 + DEFINE_TYPEDARRAY_FROM(Float16Array, TYPED_ARRAY_FLOAT16) 1326 + DEFINE_TYPEDARRAY_FROM(Float32Array, TYPED_ARRAY_FLOAT32) 1327 + DEFINE_TYPEDARRAY_FROM(Float64Array, TYPED_ARRAY_FLOAT64) 1328 + DEFINE_TYPEDARRAY_FROM(BigInt64Array, TYPED_ARRAY_BIGINT64) 1329 + DEFINE_TYPEDARRAY_FROM(BigUint64Array, TYPED_ARRAY_BIGUINT64) 1330 + 1227 1331 static ant_value_t js_dataview_constructor(ant_t *js, ant_value_t *args, int nargs) { 1228 1332 if (vtype(js->new_target) == T_UNDEF) { 1229 1333 return js_mkerr_typed(js, JS_ERR_TYPE, "DataView constructor requires 'new'"); ··· 2409 2513 js_mkprop_fast(js, name##_ctor_obj, "name", 4, ANT_STRING(#name)); \ 2410 2514 js_set_descriptor(js, name##_ctor_obj, "name", 4, 0); \ 2411 2515 js_define_species_getter(js, name##_ctor_obj); \ 2516 + js_set(js, name##_ctor_obj, "from", js_mkfun(js_##name##_from)); \ 2412 2517 ant_value_t name##_ctor = js_obj_to_func(name##_ctor_obj); \ 2413 2518 js_setprop(js, name##_proto, ANT_STRING("constructor"), name##_ctor); \ 2414 2519 js_set_descriptor(js, name##_proto, "constructor", 11, JS_DESC_W | JS_DESC_C); \