UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* structure, const SourceCode& source, RefPtr<SourceProvider>&& sourceOverride, FunctionBodyNode* node, UnlinkedFunctionKind kind) : Base(*vm, structure) , m_name(node->ident()) , m_inferredName(node->inferredName()) , m_parameters(node->parameters()) , m_sourceOverride(WTF::move(sourceOverride)) , m_firstLineOffset(node->firstLine() - source.firstLine()) , m_lineCount(node->lastLine() - node->firstLine()) , m_unlinkedFunctionNameStart(node->functionNameStart() - source.startOffset()) , m_unlinkedBodyStartColumn(node->startColumn()) , m_unlinkedBodyEndColumn(m_lineCount ? node->endColumn() : node->endColumn() - node->startColumn()) , m_startOffset(node->source().startOffset() - source.startOffset()) , m_sourceLength(node->source().length()) , m_parametersStartOffset(node->parametersStart()) , m_typeProfilingStartOffset(node->functionKeywordStart()) , m_typeProfilingEndOffset(node->startStartOffset() + node->source().length() - 1) , m_features(0) , m_isInStrictContext(node->isInStrictContext()) , m_hasCapturedVariables(false) , m_isBuiltinFunction(kind == UnlinkedBuiltinFunction) , m_constructorKind(static_cast<unsigned>(node->constructorKind())) , m_functionMode(node->functionMode()) { ASSERT(m_constructorKind == static_cast<unsigned>(node->constructorKind())); }
void Lexer<T>::setCode(const SourceCode& source, ParserArena* arena) { m_arena = &arena->identifierArena(); m_lineNumber = source.firstLine(); m_delimited = false; m_lastToken = -1; const StringImpl* sourceString = source.provider()->data(); if (sourceString) setCodeStart(sourceString); else m_codeStart = 0; m_source = &source; m_code = m_codeStart + source.startOffset(); m_codeEnd = m_codeStart + source.endOffset(); m_error = false; m_atLineStart = true; m_lexErrorMessage = UString(); m_buffer8.reserveInitialCapacity(initialReadBufferCapacity); m_buffer16.reserveInitialCapacity((m_codeEnd - m_code) / 2); if (LIKELY(m_code < m_codeEnd)) m_current = *m_code; else m_current = -1; ASSERT(currentOffset() == source.startOffset()); }
PassOwnPtr<ScheduledAction> ScheduledAction::create(ExecState* exec, DOMWrapperWorld* isolatedWorld, ContentSecurityPolicy* policy) { JSValue v = exec->argument(0); CallData callData; CallType callType = getCallData(v, callData); if (callType == CallTypeNone) { if (policy && !policy->allowEval()) return nullptr; UString string = v.toString(exec)->value(exec); if (exec->hadException()) return nullptr; return adoptPtr(new ScheduledAction(ustringToString(string), isolatedWorld)); } // WebERA this calculates a unique indification of the called function scheduled in this action. if (callType == CallTypeJS) { const SourceCode source = callData.js.functionExecutable->source(); WTF::String url = WebCore::decodeURLEscapeSequences(WTF::String(source.provider()->url().utf8().data())); uint calledLine = source.firstLine(); return adoptPtr(new ScheduledAction(exec, v, isolatedWorld, url.ascii().data(), calledLine)); } return adoptPtr(new ScheduledAction(exec, v, isolatedWorld, "<native-function>", -1)); }
void Lexer::setCode(const SourceCode& source, ParserArena& arena) { m_arena = &arena.identifierArena(); m_lineNumber = source.firstLine(); m_delimited = false; m_lastToken = -1; const UChar* data = source.provider()->data(); m_source = &source; m_codeStart = data; m_code = data + source.startOffset(); m_codeEnd = data + source.endOffset(); m_error = false; m_atLineStart = true; // ECMA-262 calls for stripping all Cf characters, but we only strip BOM characters. // See <https://bugs.webkit.org/show_bug.cgi?id=4931> for details. if (source.provider()->hasBOMs()) { for (const UChar* p = m_codeStart; p < m_codeEnd; ++p) { if (UNLIKELY(*p == byteOrderMark)) { copyCodeWithoutBOMs(); break; } } } // Read the first characters into the 4-character buffer. shift4(); ASSERT(currentOffset() == source.startOffset()); }
UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* structure, const SourceCode& source, RefPtr<SourceProvider>&& sourceOverride, FunctionMetadataNode* node, UnlinkedFunctionKind kind, ConstructAbility constructAbility, VariableEnvironment& parentScopeTDZVariables, DerivedContextType derivedContextType) : Base(*vm, structure) , m_name(node->ident()) , m_inferredName(node->inferredName()) , m_sourceOverride(WTF::move(sourceOverride)) , m_firstLineOffset(node->firstLine() - source.firstLine()) , m_lineCount(node->lastLine() - node->firstLine()) , m_unlinkedFunctionNameStart(node->functionNameStart() - source.startOffset()) , m_unlinkedBodyStartColumn(node->startColumn()) , m_unlinkedBodyEndColumn(m_lineCount ? node->endColumn() : node->endColumn() - node->startColumn()) , m_startOffset(node->source().startOffset() - source.startOffset()) , m_sourceLength(node->source().length()) , m_parametersStartOffset(node->parametersStart()) , m_typeProfilingStartOffset(node->functionKeywordStart()) , m_typeProfilingEndOffset(node->startStartOffset() + node->source().length() - 1) , m_parameterCount(node->parameterCount()) , m_parseMode(node->parseMode()) , m_features(0) , m_isInStrictContext(node->isInStrictContext()) , m_hasCapturedVariables(false) , m_isBuiltinFunction(kind == UnlinkedBuiltinFunction) , m_constructAbility(static_cast<unsigned>(constructAbility)) , m_constructorKind(static_cast<unsigned>(node->constructorKind())) , m_functionMode(node->functionMode()) , m_superBinding(static_cast<unsigned>(node->superBinding())) , m_derivedContextType(static_cast<unsigned>(derivedContextType)) { ASSERT(m_constructorKind == static_cast<unsigned>(node->constructorKind())); m_parentScopeTDZVariables.swap(parentScopeTDZVariables); }
void Lexer::setCode(const SourceCode& source, ParserArena& arena) { m_arena = &arena.identifierArena(); m_lineNumber = source.firstLine(); m_delimited = false; m_lastToken = -1; const UChar* data = source.provider()->data(); m_source = &source; m_codeStart = data; m_code = data + source.startOffset(); m_codeEnd = data + source.endOffset(); m_error = false; m_atLineStart = true; m_buffer8.reserveInitialCapacity(initialReadBufferCapacity); m_buffer16.reserveInitialCapacity((m_codeEnd - m_code) / 2); if (LIKELY(m_code < m_codeEnd)) m_current = *m_code; else m_current = -1; ASSERT(currentOffset() == source.startOffset()); }
FunctionExecutable* UnlinkedFunctionExecutable::link(VM& vm, const SourceCode& ownerSource, int overrideLineNumber) { SourceCode source = m_sourceOverride ? SourceCode(m_sourceOverride) : ownerSource; unsigned firstLine = source.firstLine() + m_firstLineOffset; unsigned startOffset = source.startOffset() + m_startOffset; // Adjust to one-based indexing. bool startColumnIsOnFirstSourceLine = !m_firstLineOffset; unsigned startColumn = m_unlinkedBodyStartColumn + (startColumnIsOnFirstSourceLine ? source.startColumn() : 1); bool endColumnIsOnStartLine = !m_lineCount; unsigned endColumn = m_unlinkedBodyEndColumn + (endColumnIsOnStartLine ? startColumn : 1); SourceCode code(source.provider(), startOffset, startOffset + m_sourceLength, firstLine, startColumn); FunctionExecutable* result = FunctionExecutable::create(vm, code, this, firstLine, firstLine + m_lineCount, startColumn, endColumn); if (overrideLineNumber != -1) result->setOverrideLineNumber(overrideLineNumber); return result; }
UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(JSGlobalData* globalData, Structure* structure, const SourceCode& source, FunctionBodyNode* node) : Base(*globalData, structure) , m_numCapturedVariables(node->capturedVariableCount()) , m_forceUsesArguments(node->usesArguments()) , m_isInStrictContext(node->isStrictMode()) , m_hasCapturedVariables(node->hasCapturedVariables()) , m_name(node->ident()) , m_inferredName(node->inferredName()) , m_parameters(node->parameters()) , m_firstLineOffset(node->firstLine() - source.firstLine()) , m_lineCount(node->lastLine() - node->firstLine()) , m_functionStartOffset(node->functionStart() - source.startOffset()) , m_startOffset(node->source().startOffset() - source.startOffset()) , m_sourceLength(node->source().length()) , m_features(node->features()) , m_functionNameIsInScopeToggle(node->functionNameIsInScopeToggle()) { }
UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* structure, const SourceCode& parentSource, SourceCode&& parentSourceOverride, FunctionMetadataNode* node, UnlinkedFunctionKind kind, ConstructAbility constructAbility, JSParserScriptMode scriptMode, VariableEnvironment& parentScopeTDZVariables, DerivedContextType derivedContextType) : Base(*vm, structure) , m_firstLineOffset(node->firstLine() - parentSource.firstLine().oneBasedInt()) , m_lineCount(node->lastLine() - node->firstLine()) , m_unlinkedFunctionNameStart(node->functionNameStart() - parentSource.startOffset()) , m_unlinkedBodyStartColumn(node->startColumn()) , m_unlinkedBodyEndColumn(m_lineCount ? node->endColumn() : node->endColumn() - node->startColumn()) , m_startOffset(node->source().startOffset() - parentSource.startOffset()) , m_sourceLength(node->source().length()) , m_parametersStartOffset(node->parametersStart()) , m_typeProfilingStartOffset(node->functionKeywordStart()) , m_typeProfilingEndOffset(node->startStartOffset() + node->source().length() - 1) , m_parameterCount(node->parameterCount()) , m_functionLength(node->functionLength()) , m_features(0) , m_sourceParseMode(node->parseMode()) , m_isInStrictContext(node->isInStrictContext()) , m_hasCapturedVariables(false) , m_isBuiltinFunction(kind == UnlinkedBuiltinFunction) , m_constructAbility(static_cast<unsigned>(constructAbility)) , m_constructorKind(static_cast<unsigned>(node->constructorKind())) , m_functionMode(static_cast<unsigned>(node->functionMode())) , m_scriptMode(static_cast<unsigned>(scriptMode)) , m_superBinding(static_cast<unsigned>(node->superBinding())) , m_derivedContextType(static_cast<unsigned>(derivedContextType)) , m_name(node->ident()) , m_ecmaName(node->ecmaName()) , m_inferredName(node->inferredName()) , m_parentSourceOverride(WTFMove(parentSourceOverride)) , m_classSource(node->classSource()) { // Make sure these bitfields are adequately wide. ASSERT(m_constructAbility == static_cast<unsigned>(constructAbility)); ASSERT(m_constructorKind == static_cast<unsigned>(node->constructorKind())); ASSERT(m_functionMode == static_cast<unsigned>(node->functionMode())); ASSERT(m_scriptMode == static_cast<unsigned>(scriptMode)); ASSERT(m_superBinding == static_cast<unsigned>(node->superBinding())); ASSERT(m_derivedContextType == static_cast<unsigned>(derivedContextType)); m_parentScopeTDZVariables.swap(parentScopeTDZVariables); }
FunctionExecutable* UnlinkedFunctionExecutable::link(VM& vm, const SourceCode& ownerSource, Optional<int> overrideLineNumber, Intrinsic intrinsic) { SourceCode source = m_sourceOverride ? SourceCode(m_sourceOverride) : ownerSource; unsigned firstLine = source.firstLine() + m_firstLineOffset; unsigned startOffset = source.startOffset() + m_startOffset; unsigned lineCount = m_lineCount; // Adjust to one-based indexing. bool startColumnIsOnFirstSourceLine = !m_firstLineOffset; unsigned startColumn = m_unlinkedBodyStartColumn + (startColumnIsOnFirstSourceLine ? source.startColumn() : 1); bool endColumnIsOnStartLine = !lineCount; unsigned endColumn = m_unlinkedBodyEndColumn + (endColumnIsOnStartLine ? startColumn : 1); SourceCode code(source.provider(), startOffset, startOffset + m_sourceLength, firstLine, startColumn); FunctionOverrides::OverrideInfo overrideInfo; bool hasFunctionOverride = false; if (UNLIKELY(Options::functionOverrides())) { hasFunctionOverride = FunctionOverrides::initializeOverrideFor(code, overrideInfo); if (hasFunctionOverride) { firstLine = overrideInfo.firstLine; lineCount = overrideInfo.lineCount; startColumn = overrideInfo.startColumn; endColumn = overrideInfo.endColumn; code = overrideInfo.sourceCode; } } FunctionExecutable* result = FunctionExecutable::create(vm, code, this, firstLine, firstLine + lineCount, startColumn, endColumn, intrinsic); if (overrideLineNumber) result->setOverrideLineNumber(*overrideLineNumber); if (UNLIKELY(hasFunctionOverride)) { result->overrideParameterAndTypeProfilingStartEndOffsets( overrideInfo.parametersStartOffset, overrideInfo.typeProfilingStartOffset, overrideInfo.typeProfilingEndOffset); } return result; }
UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* structure, const SourceCode& source, FunctionBodyNode* node, UnlinkedFunctionKind kind) : Base(*vm, structure) , m_numCapturedVariables(node->capturedVariableCount()) , m_forceUsesArguments(node->usesArguments()) , m_isInStrictContext(node->isStrictMode()) , m_hasCapturedVariables(node->hasCapturedVariables()) , m_isBuiltinFunction(kind == UnlinkedBuiltinFunction) , m_name(node->ident()) , m_inferredName(node->inferredName()) , m_parameters(node->parameters()) , m_firstLineOffset(node->firstLine() - source.firstLine()) , m_lineCount(node->lastLine() - node->firstLine()) , m_unlinkedFunctionNameStart(node->functionNameStart() - source.startOffset()) , m_unlinkedBodyStartColumn(node->startColumn()) , m_unlinkedBodyEndColumn(m_lineCount ? node->endColumn() : node->endColumn() - node->startColumn()) , m_startOffset(node->source().startOffset() - source.startOffset()) , m_sourceLength(node->source().length()) , m_features(node->features()) , m_functionMode(node->functionMode()) { }
void WebDebugListenerImpl::sourceParsed(ExecState* execState, const SourceCode& source, int errorLine, const UString& errorMsg) { if (m_listener && !m_inDebug) { m_inDebug = true; WebCore::String coreSourceURL = WebCore::ustringToString(source.provider()->url()); WebCore::Frame *frame = static_cast<WebCore::JSDOMWindow*>(execState->lexicalGlobalObject())->impl()->frame(); if (!(coreSourceURL.isNull() || coreSourceURL.isEmpty())) { WebCore::KURL sourceURL(WebCore::ParsedURLString, coreSourceURL); WebCore::KURL mappedURL; if(WebCore::FrameLoaderClientApollo::mapFrameUrl(frame, sourceURL, &mappedURL)) { coreSourceURL = mappedURL.string(); } } WebCore::String coreErrorMsg = WebCore::ustringToString(errorMsg); WebCore::String coreSource(source.data(), source.length()); m_listener->m_pVTable->sourceParsed(m_listener, source.provider()->asID(), coreSourceURL.webString(), coreSource.webString(), source.firstLine(), errorLine, coreErrorMsg.webString()); m_inDebug = false; } }