v8js
v8js copied to clipboard
Syntax errors are ignored in loaded modules
When required script contains syntax errors, it silently skips it just like file was not included.
$v8 = new V8Js();
$v8->setModuleLoader(function ($path) {
return 'synta}{ error!'; // returns undefined
// return 'module.exports = 1'; // this works
});
$script = 'let a = require("file.js"); print(a)';
$r = $v8->executeString($script);
echo $r;
Is there any way to get syntax error exception when module loader returns invalid code?
@stesie is this literally as simple as adding (in v8js_methods.cc):
v8js_throw_script_exception(c->isolate, &try_catch);
in place of:
info.GetReturnValue().Set(isolate->ThrowException(V8JS_SYM("Module script compile failed")));
to somewhat match the one found in v8js_compile_script ? or perhaps refactoring to use v8js_compile_script for modules, too?
trying it out seems to do what you'd want; i'm just not 100% sure what the other side-effects of doing so might be.
@stesie here's what i'm proposing in v8js_methods.cc:
if (script.IsEmpty()) {
efree(normalised_module_id);
efree(normalised_path);
if (try_catch.HasCaught()) {
if (c->in_execution < 1) {
v8js_throw_script_exception(c->isolate, &try_catch);
return;
}
/* Rethrow back to JS */
try_catch.ReThrow();
}
return;
}
produces (using the OP's test example):
PHP Fatal error: Uncaught V8JsScriptException: file.js:1: SyntaxError: Unexpected token '{' in......
If that seems fine, i'll get a PR for php7 & 8 sorted :)