static UnlinkedFunctionCodeBlock* generateFunctionCodeBlock( VM& vm, UnlinkedFunctionExecutable* executable, const SourceCode& source, CodeSpecializationKind kind, DebuggerMode debuggerMode, ProfilerMode profilerMode, UnlinkedFunctionKind functionKind, ParserError& error) { JSParserBuiltinMode builtinMode = executable->isBuiltinFunction() ? JSParserBuiltinMode::Builtin : JSParserBuiltinMode::NotBuiltin; JSParserStrictMode strictMode = executable->isInStrictContext() ? JSParserStrictMode::Strict : JSParserStrictMode::NotStrict; std::unique_ptr<FunctionNode> function = parse<FunctionNode>( &vm, source, executable->parameters(), executable->name(), builtinMode, strictMode, JSParserCodeType::Function, error, 0); if (!function) { ASSERT(error.isValid()); return nullptr; } function->finishParsing(executable->parameters(), executable->name(), executable->functionMode()); executable->recordParse(function->features(), function->hasCapturedVariables()); UnlinkedFunctionCodeBlock* result = UnlinkedFunctionCodeBlock::create(&vm, FunctionCode, ExecutableInfo(function->needsActivation(), function->usesEval(), function->isStrictMode(), kind == CodeForConstruct, functionKind == UnlinkedBuiltinFunction, executable->constructorKind())); auto generator(std::make_unique<BytecodeGenerator>(vm, function.get(), result, debuggerMode, profilerMode)); error = generator->generate(); if (error.isValid()) return nullptr; return result; }
static UnlinkedFunctionCodeBlock* generateFunctionCodeBlock(VM& vm, UnlinkedFunctionExecutable* executable, const SourceCode& source, CodeSpecializationKind kind, DebuggerMode debuggerMode, ProfilerMode profilerMode, UnlinkedFunctionKind functionKind, bool bodyIncludesBraces, ParserError& error) { RefPtr<FunctionBodyNode> body = parse<FunctionBodyNode>(&vm, source, executable->parameters(), executable->name(), executable->toStrictness(), JSParseFunctionCode, error, 0, bodyIncludesBraces); if (!body) { ASSERT(error.m_type != ParserError::ErrorNone); return 0; } if (executable->forceUsesArguments()) body->setUsesArguments(); body->finishParsing(executable->parameters(), executable->name(), executable->functionMode()); executable->recordParse(body->features(), body->hasCapturedVariables()); UnlinkedFunctionCodeBlock* result = UnlinkedFunctionCodeBlock::create(&vm, FunctionCode, ExecutableInfo(body->needsActivation(), body->usesEval(), body->isStrictMode(), kind == CodeForConstruct, functionKind == UnlinkedBuiltinFunction)); OwnPtr<BytecodeGenerator> generator(adoptPtr(new BytecodeGenerator(vm, body.get(), result, debuggerMode, profilerMode))); error = generator->generate(); body->destroyData(); if (error.m_type != ParserError::ErrorNone) return 0; return result; }
static UnlinkedFunctionCodeBlock* generateUnlinkedFunctionCodeBlock( VM& vm, UnlinkedFunctionExecutable* executable, const SourceCode& source, CodeSpecializationKind kind, DebuggerMode debuggerMode, UnlinkedFunctionKind functionKind, ParserError& error, SourceParseMode parseMode) { JSParserBuiltinMode builtinMode = executable->isBuiltinFunction() ? JSParserBuiltinMode::Builtin : JSParserBuiltinMode::NotBuiltin; JSParserStrictMode strictMode = executable->isInStrictContext() ? JSParserStrictMode::Strict : JSParserStrictMode::NotStrict; JSParserScriptMode scriptMode = executable->scriptMode(); ASSERT(isFunctionParseMode(executable->parseMode())); std::unique_ptr<FunctionNode> function = parse<FunctionNode>( &vm, source, executable->name(), builtinMode, strictMode, scriptMode, executable->parseMode(), executable->superBinding(), error, nullptr); if (!function) { ASSERT(error.isValid()); return nullptr; } function->finishParsing(executable->name(), executable->functionMode()); executable->recordParse(function->features(), function->hasCapturedVariables()); bool isClassContext = executable->superBinding() == SuperBinding::Needed; UnlinkedFunctionCodeBlock* result = UnlinkedFunctionCodeBlock::create(&vm, FunctionCode, ExecutableInfo(function->usesEval(), function->isStrictMode(), kind == CodeForConstruct, functionKind == UnlinkedBuiltinFunction, executable->constructorKind(), scriptMode, executable->superBinding(), parseMode, executable->derivedContextType(), false, isClassContext, EvalContextType::FunctionEvalContext), debuggerMode); error = BytecodeGenerator::generate(vm, function.get(), result, debuggerMode, executable->parentScopeTDZVariables()); if (error.isValid()) return nullptr; return result; }
static UnlinkedFunctionCodeBlock* generateFunctionCodeBlockInPreParse(VM& vm, UnlinkedFunctionExecutable* executable, const SourceCode& source, CodeSpecializationKind kind, DebuggerMode debuggerMode, ProfilerMode profilerMode, UnlinkedFunctionKind functionKind, bool bodyIncludesBraces, ParserError& error) { RefPtr<FunctionBodyNode> body; if (Worklist* worklist = existingGlobalParserWorklistOrNull()) { #if ENABLE(VMOLAB_TIME) TimeCounter::start(TimeCounter::TYPEwait); #endif //printf("Worklist existing!!\n"); body = worklist->waitAndGetParsedNode(ParsingKey(source.provider(), source.startOffset())); //printf("PreParsing Success!!\n"); #if ENABLE(VMOLAB_TIME) TimeCounter::stop(TimeCounter::TYPEwait); #endif } if (!body) body = parse<FunctionBodyNode>(&vm, source, executable->parameters(), executable->name(), executable->toStrictness(), JSParseFunctionCode, error, 0, bodyIncludesBraces); ASSERT(body); if (executable->forceUsesArguments()) body->setUsesArguments(); body->finishParsing(executable->parameters(), executable->name(), executable->functionMode()); executable->recordParse(body->features(), body->hasCapturedVariables()); UnlinkedFunctionCodeBlock* result = UnlinkedFunctionCodeBlock::create(&vm, FunctionCode, ExecutableInfo(body->needsActivation(), body->usesEval(), body->isStrictMode(), kind == CodeForConstruct, functionKind == UnlinkedBuiltinFunction)); OwnPtr<BytecodeGenerator> generator(adoptPtr(new BytecodeGenerator(vm, body.get(), result, debuggerMode, profilerMode))); error = generator->generate(); body->destroyData(); if (error.m_type != ParserError::ErrorNone) return 0; if (vm.isInParallelParseSave()) { if ((executable->toStrictness() != JSParseBuiltin) && (source.provider()->url().length() != 0)) { std::unique_ptr<PreParserCacheItem> newInfo; //PreParserCacheItemCreationParameters parameters { source.startOffset(), source.endOffset(), source.firstLine(), source.startColumn, executable->toStrictness(), &executable->name() }; PreParserCacheItemCreationParameters parameters; parameters.startOffset = source.startOffset(); parameters.endOffset = source.endOffset() - 1; parameters.firstLine = source.firstLine(); parameters.startColumn = source.startColumn(); parameters.strictness = executable->toStrictness(); parameters.name = &executable->name(); newInfo = PreParserCacheItem::create(parameters); PreParserCache* cache = vm.addPreParserCache(source.provider()); cache->add(WTF::move(newInfo)); } } return result; }
static UnlinkedFunctionCodeBlock* generateFunctionCodeBlock(JSGlobalData& globalData, JSScope* scope, UnlinkedFunctionExecutable* executable, const SourceCode& source, CodeSpecializationKind kind, DebuggerMode debuggerMode, ProfilerMode profilerMode, ParserError& error) { RefPtr<FunctionBodyNode> body = parse<FunctionBodyNode>(&globalData, source, executable->parameters(), executable->name(), executable->isInStrictContext() ? JSParseStrict : JSParseNormal, JSParseFunctionCode, error); if (!body) { ASSERT(error.m_type != ParserError::ErrorNone); return 0; } if (executable->forceUsesArguments()) body->setUsesArguments(); body->finishParsing(executable->parameters(), executable->name(), executable->functionNameIsInScopeToggle()); executable->recordParse(body->features(), body->hasCapturedVariables(), body->lineNo(), body->lastLine()); UnlinkedFunctionCodeBlock* result = UnlinkedFunctionCodeBlock::create(&globalData, FunctionCode, ExecutableInfo(body->needsActivation(), body->usesEval(), body->isStrictMode(), kind == CodeForConstruct)); OwnPtr<BytecodeGenerator> generator(adoptPtr(new BytecodeGenerator(globalData, scope, body.get(), result, debuggerMode, profilerMode))); error = generator->generate(); body->destroyData(); if (error.m_type != ParserError::ErrorNone) return 0; return result; }