EncodedJSValue JSC_HOST_CALL moduleLoaderObjectParseModule(ExecState* exec) { VM& vm = exec->vm(); const Identifier moduleKey = exec->argument(0).toPropertyKey(exec); if (exec->hadException()) return JSValue::encode(jsUndefined()); String source = exec->argument(1).toString(exec)->value(exec); if (exec->hadException()) return JSValue::encode(jsUndefined()); SourceCode sourceCode = makeSource(source, moduleKey.impl()); CodeProfiling profile(sourceCode); ParserError error; std::unique_ptr<ModuleProgramNode> moduleProgramNode = parse<ModuleProgramNode>( &vm, sourceCode, Identifier(), JSParserBuiltinMode::NotBuiltin, JSParserStrictMode::Strict, SourceParseMode::ModuleAnalyzeMode, error); if (error.isValid()) { throwVMError(exec, error.toErrorObject(exec->lexicalGlobalObject(), sourceCode)); return JSValue::encode(jsUndefined()); } ASSERT(moduleProgramNode); ModuleAnalyzer moduleAnalyzer(exec, moduleKey, sourceCode, moduleProgramNode->varDeclarations(), moduleProgramNode->lexicalVariables()); JSModuleRecord* moduleRecord = moduleAnalyzer.analyze(*moduleProgramNode); return JSValue::encode(moduleRecord); }
EncodedJSValue JSC_HOST_CALL moduleLoaderPrototypeParseModule(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); const Identifier moduleKey = exec->argument(0).toPropertyKey(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); auto* jsSourceCode = jsDynamicCast<JSSourceCode*>(vm, exec->argument(1)); if (!jsSourceCode) return throwVMTypeError(exec, scope); SourceCode sourceCode = jsSourceCode->sourceCode(); CodeProfiling profile(sourceCode); ParserError error; std::unique_ptr<ModuleProgramNode> moduleProgramNode = parse<ModuleProgramNode>( &vm, sourceCode, Identifier(), JSParserBuiltinMode::NotBuiltin, JSParserStrictMode::Strict, JSParserScriptMode::Module, SourceParseMode::ModuleAnalyzeMode, SuperBinding::NotNeeded, error); if (error.isValid()) { throwVMError(exec, scope, error.toErrorObject(exec->lexicalGlobalObject(), sourceCode)); return JSValue::encode(jsUndefined()); } ASSERT(moduleProgramNode); ModuleAnalyzer moduleAnalyzer(exec, moduleKey, sourceCode, moduleProgramNode->varDeclarations(), moduleProgramNode->lexicalVariables()); RETURN_IF_EXCEPTION(scope, encodedJSValue()); JSModuleRecord* moduleRecord = moduleAnalyzer.analyze(*moduleProgramNode); return JSValue::encode(moduleRecord); }
bool checkModuleSyntax(VM& vm, const SourceCode& source, ParserError& error) { JSLockHolder lock(vm); RELEASE_ASSERT(vm.atomicStringTable() == wtfThreadData().atomicStringTable()); std::unique_ptr<ModuleProgramNode> moduleProgramNode = parse<ModuleProgramNode>( &vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin, JSParserStrictMode::Strict, SourceParseMode::ModuleAnalyzeMode, error); if (!moduleProgramNode) return false; ModuleAnalyzer moduleAnalyzer(vm, moduleProgramNode->varDeclarations(), moduleProgramNode->lexicalVariables()); moduleAnalyzer.analyze(*moduleProgramNode); return true; }
bool checkModuleSyntax(ExecState* exec, const SourceCode& source, ParserError& error) { VM& vm = exec->vm(); JSLockHolder lock(vm); RELEASE_ASSERT(vm.atomicStringTable() == wtfThreadData().atomicStringTable()); std::unique_ptr<ModuleProgramNode> moduleProgramNode = parse<ModuleProgramNode>( &vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin, JSParserStrictMode::Strict, SourceParseMode::ModuleAnalyzeMode, SuperBinding::NotNeeded, error); if (!moduleProgramNode) return false; PrivateName privateName(PrivateName::Description, "EntryPointModule"); ModuleAnalyzer moduleAnalyzer(exec, Identifier::fromUid(privateName), source, moduleProgramNode->varDeclarations(), moduleProgramNode->lexicalVariables()); moduleAnalyzer.analyze(*moduleProgramNode); return true; }