Files
sausage/userland/qjs/source/tests/bug1628.js
T
surma d44f1d9677 Build separate native and WASI pipelines with shared multicall names
Checkpoint before integration and package validation.

Assisted-by: SurmAgent:unknown [read] [edit] [bash]
2026-11-12 09:36:27 +00:00

54 lines
1.9 KiB
JavaScript

import { assert, assertThrows } from "./assert.js";
/* The ownKeys trap result is fed to CreateListFromArrayLike(), which throws
a TypeError when the result is not an object. */
const primitives = [0, 1, -1, NaN, "", "ab", true, false, undefined, null, 1n,
Symbol("s")];
for (const v of primitives) {
const p = new Proxy({}, { ownKeys() { return v; } });
assertThrows(TypeError, function() { Reflect.ownKeys(p); });
assertThrows(TypeError, function() { Object.keys(p); });
assertThrows(TypeError, function() { Object.getOwnPropertyNames(p); });
assertThrows(TypeError, function() { Object.getOwnPropertySymbols(p); });
assertThrows(TypeError, function() { Object.assign({}, p); });
assertThrows(TypeError, function() { ({...p}); });
assertThrows(TypeError, function() { JSON.stringify(p); });
assertThrows(TypeError, function() { for (const k in p) ; });
}
{
const p = new Proxy({}, { ownKeys() { return "ab"; } });
assertThrows(TypeError, function() { Reflect.ownKeys(p); });
}
{
assert(Reflect.ownKeys(new Proxy({}, { ownKeys: () => [] })).length, 0);
const a = Reflect.ownKeys(new Proxy({}, { ownKeys: () => ["a", "b"] }));
assert(a.length, 2);
assert(a[0], "a");
assert(a[1], "b");
const b = Reflect.ownKeys(new Proxy({}, {
ownKeys: () => ({length: 2, 0: "x", 1: "y"}),
}));
assert(b.length, 2);
assert(b[0], "x");
assert(b[1], "y");
/* a function has no 'length' index properties, so an empty list */
assert(Reflect.ownKeys(new Proxy({}, { ownKeys: () => function(){} })).length, 0);
}
{
let called = 0;
const p = new Proxy({}, { ownKeys() { called++; return 0; } });
assertThrows(TypeError, function() { Reflect.ownKeys(p); });
assert(called, 1);
const q = new Proxy({}, { ownKeys() { throw new RangeError("boom"); } });
assertThrows(RangeError, function() { Reflect.ownKeys(q); });
}