v8js icon indicating copy to clipboard operation
v8js copied to clipboard

Syntax errors are ignored in loaded modules

Open windbridges opened this issue 5 years ago • 2 comments

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?

windbridges avatar Mar 17 '20 02:03 windbridges

@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.

redbullmarky avatar Jun 01 '22 16:06 redbullmarky

@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 :)

redbullmarky avatar Feb 27 '23 17:02 redbullmarky