Add test-vm-codegen.js (currently modified pending clarification from JSC team)

This commit is contained in:
Kai Tamkun
2025-04-24 14:06:48 -07:00
parent 76af83a2eb
commit ab870c5bd8
2 changed files with 103 additions and 2 deletions

View File

@@ -164,8 +164,8 @@ Structure* NodeVMGlobalObject::createStructure(JSC::VM& vm, JSC::JSValue prototy
void NodeVMGlobalObject::finishCreation(JSC::VM&, NodeVMContextOptions options)
{
Base::finishCreation(vm());
setEvalEnabled(options.allowStrings, "TODO(@heimskr)"_s);
setWebAssemblyEnabled(options.allowWasm, "TODO(@heimskr)"_s);
setEvalEnabled(options.allowStrings, "Code generation from strings disallowed for this context"_s);
setWebAssemblyEnabled(options.allowWasm, "Wasm code generation disallowed by embedder"_s);
}
void NodeVMGlobalObject::destroy(JSCell* cell)

View File

@@ -0,0 +1,101 @@
'use strict';
require('../common');
const assert = require('assert');
const { createContext, runInContext, runInNewContext } = require('vm');
const WASM_BYTES = Buffer.from(
[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]);
{
const ctx = createContext({ WASM_BYTES });
const test = 'eval(""); new WebAssembly.Module(WASM_BYTES);';
runInContext(test, ctx);
runInNewContext(test, { WASM_BYTES }, {
contextCodeGeneration: undefined,
});
}
{
const ctx = createContext({}, {
codeGeneration: {
strings: false,
},
});
const EvalError = runInContext('EvalError', ctx);
assert.throws(() => {
runInContext('eval("x")', ctx);
}, EvalError);
}
{
const ctx = createContext({ WASM_BYTES }, {
codeGeneration: {
wasm: false,
},
});
const CompileError = runInContext('WebAssembly.CompileError', ctx);
assert.rejects(() => {
return runInContext('try { WebAssembly.instantiate(new WebAssembly.Module(WASM_BYTES)); } catch (e) { Promise.reject(e); }', ctx);
}, CompileError);
}
assert.throws(() => {
runInNewContext('eval("x")', {}, {
contextCodeGeneration: {
strings: false,
},
});
}, {
name: 'EvalError'
});
assert.rejects(() => {
return runInNewContext('try { WebAssembly.instantiate(new WebAssembly.Module(WASM_BYTES)); } catch (e) { Promise.reject(e); }', { WASM_BYTES }, {
contextCodeGeneration: {
wasm: false,
},
});
}, {
name: 'CompileError'
});
assert.throws(() => {
createContext({}, {
codeGeneration: {
strings: 0,
},
});
}, {
code: 'ERR_INVALID_ARG_TYPE',
});
assert.throws(() => {
runInNewContext('eval("x")', {}, {
contextCodeGeneration: {
wasm: 1,
},
});
}, {
code: 'ERR_INVALID_ARG_TYPE'
});
assert.throws(() => {
createContext({}, {
codeGeneration: 1,
});
}, {
code: 'ERR_INVALID_ARG_TYPE',
});
assert.throws(() => {
createContext({}, {
codeGeneration: null,
});
}, {
code: 'ERR_INVALID_ARG_TYPE',
});