Skip to content

Commit 10793bd

Browse files
committed
Use Object.setPrototypeOf instead of Object.create+assign for bindings
Apparently some bundlers use objects with read-only properties for imported modules. This conflicts with Object.assign even though the object being assigned to only has read-only properties on its prototype. Regardless, if the assignment is done before the prototype is set, everything works just fine. Fixes #2659
1 parent f16b08f commit 10793bd

File tree

7 files changed

+25
-25
lines changed

7 files changed

+25
-25
lines changed

src/bindings/js.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -554,18 +554,10 @@ export class JSBuilder extends ExportsWalker {
554554
continue;
555555
}
556556
let resetPos = sb.length;
557-
sb.push(": Object.assign(Object.create(");
558-
if (moduleName == "env") {
559-
sb.push("globalThis");
560-
} else {
561-
sb.push("__module");
562-
sb.push(moduleId.toString());
563-
}
564-
sb.push("), ");
565-
if (moduleName == "env") {
566-
sb.push("imports.env || {}, ");
567-
}
568-
sb.push("{\n");
557+
558+
// Use Object.setPrototypeOf to avoid issues with read-only properties
559+
// on module objects created by bundlers (issue #2659)
560+
sb.push(": Object.setPrototypeOf({\n");
569561
++this.indentLevel;
570562
let numInstrumented = 0;
571563
for (let _keys2 = Map_keys(module), j = 0, l = _keys2.length; j < l; ++j) {
@@ -598,7 +590,15 @@ export class JSBuilder extends ExportsWalker {
598590
sb.push(",\n");
599591
} else {
600592
indent(sb, this.indentLevel);
601-
sb.push("}),\n");
593+
sb.push("}, ");
594+
if (moduleName == "env") {
595+
// TODO: If necessary, use "Object.setPrototypeOf(Object.assign({}, imports.env || {}), globalThis)"
596+
sb.push("Object.assign(Object.create(globalThis), imports.env || {})");
597+
} else {
598+
sb.push("__module");
599+
sb.push(moduleId.toString());
600+
}
601+
sb.push("),\n");
602602
}
603603
}
604604
--this.indentLevel;

tests/compiler/bindings/esm.debug.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
async function instantiate(module, imports = {}) {
22
const adaptedImports = {
3-
env: Object.assign(Object.create(globalThis), imports.env || {}, {
3+
env: Object.setPrototypeOf({
44
trace(message, n, a0, a1, a2, a3, a4) {
55
// ~lib/builtins/trace(~lib/string/String, i32?, f64?, f64?, f64?, f64?, f64?) => void
66
message = __liftString(message >>> 0);
@@ -44,7 +44,7 @@ async function instantiate(module, imports = {}) {
4444
throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);
4545
})();
4646
},
47-
}),
47+
}, Object.assign(Object.create(globalThis), imports.env || {})),
4848
};
4949
const { exports } = await WebAssembly.instantiate(module, adaptedImports);
5050
const memory = exports.memory || imports.env.memory;

tests/compiler/bindings/esm.release.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
async function instantiate(module, imports = {}) {
22
const adaptedImports = {
3-
env: Object.assign(Object.create(globalThis), imports.env || {}, {
3+
env: Object.setPrototypeOf({
44
trace(message, n, a0, a1, a2, a3, a4) {
55
// ~lib/builtins/trace(~lib/string/String, i32?, f64?, f64?, f64?, f64?, f64?) => void
66
message = __liftString(message >>> 0);
@@ -44,7 +44,7 @@ async function instantiate(module, imports = {}) {
4444
throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);
4545
})();
4646
},
47-
}),
47+
}, Object.assign(Object.create(globalThis), imports.env || {})),
4848
};
4949
const { exports } = await WebAssembly.instantiate(module, adaptedImports);
5050
const memory = exports.memory || imports.env.memory;

tests/compiler/bindings/noExportRuntime.debug.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
async function instantiate(module, imports = {}) {
22
const adaptedImports = {
3-
env: Object.assign(Object.create(globalThis), imports.env || {}, {
3+
env: Object.setPrototypeOf({
44
abort(message, fileName, lineNumber, columnNumber) {
55
// ~lib/builtins/abort(~lib/string/String | null?, ~lib/string/String | null?, u32?, u32?) => void
66
message = __liftString(message >>> 0);
@@ -12,7 +12,7 @@ async function instantiate(module, imports = {}) {
1212
throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);
1313
})();
1414
},
15-
}),
15+
}, Object.assign(Object.create(globalThis), imports.env || {})),
1616
};
1717
const { exports } = await WebAssembly.instantiate(module, adaptedImports);
1818
const memory = exports.memory || imports.env.memory;

tests/compiler/bindings/noExportRuntime.release.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
async function instantiate(module, imports = {}) {
22
const adaptedImports = {
3-
env: Object.assign(Object.create(globalThis), imports.env || {}, {
3+
env: Object.setPrototypeOf({
44
abort(message, fileName, lineNumber, columnNumber) {
55
// ~lib/builtins/abort(~lib/string/String | null?, ~lib/string/String | null?, u32?, u32?) => void
66
message = __liftString(message >>> 0);
@@ -12,7 +12,7 @@ async function instantiate(module, imports = {}) {
1212
throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);
1313
})();
1414
},
15-
}),
15+
}, Object.assign(Object.create(globalThis), imports.env || {})),
1616
};
1717
const { exports } = await WebAssembly.instantiate(module, adaptedImports);
1818
const memory = exports.memory || imports.env.memory;

tests/compiler/bindings/raw.debug.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export async function instantiate(module, imports = {}) {
22
const adaptedImports = {
3-
env: Object.assign(Object.create(globalThis), imports.env || {}, {
3+
env: Object.setPrototypeOf({
44
trace(message, n, a0, a1, a2, a3, a4) {
55
// ~lib/builtins/trace(~lib/string/String, i32?, f64?, f64?, f64?, f64?, f64?) => void
66
message = __liftString(message >>> 0);
@@ -44,7 +44,7 @@ export async function instantiate(module, imports = {}) {
4444
throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);
4545
})();
4646
},
47-
}),
47+
}, Object.assign(Object.create(globalThis), imports.env || {})),
4848
};
4949
const { exports } = await WebAssembly.instantiate(module, adaptedImports);
5050
const memory = exports.memory || imports.env.memory;

tests/compiler/bindings/raw.release.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export async function instantiate(module, imports = {}) {
22
const adaptedImports = {
3-
env: Object.assign(Object.create(globalThis), imports.env || {}, {
3+
env: Object.setPrototypeOf({
44
trace(message, n, a0, a1, a2, a3, a4) {
55
// ~lib/builtins/trace(~lib/string/String, i32?, f64?, f64?, f64?, f64?, f64?) => void
66
message = __liftString(message >>> 0);
@@ -44,7 +44,7 @@ export async function instantiate(module, imports = {}) {
4444
throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);
4545
})();
4646
},
47-
}),
47+
}, Object.assign(Object.create(globalThis), imports.env || {})),
4848
};
4949
const { exports } = await WebAssembly.instantiate(module, adaptedImports);
5050
const memory = exports.memory || imports.env.memory;

0 commit comments

Comments
 (0)