WebKit Bugzilla
Attachment 359599 Details for
Bug 193544
: [JSC] Reduce size of SourceProvider
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-193544-20190119010354.patch (text/plain), 22.07 KB, created by
Yusuke Suzuki
on 2019-01-19 01:03:55 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Yusuke Suzuki
Created:
2019-01-19 01:03:55 PST
Size:
22.07 KB
patch
obsolete
>Subversion Revision: 240195 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index 19a250df1e8669b8ab2a7fafd36f316209b112f9..66fe67e148e36299d2d80afd5c81bb21c8a832c4 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,47 @@ >+2019-01-19 Yusuke Suzuki <yusukesuzuki@slowstart.org> >+ >+ [JSC] Reduce size of SourceProvider >+ https://bugs.webkit.org/show_bug.cgi?id=193544 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ This patch attempts to reduce the dirty memory footprint by the following 2 optimizations. >+ >+ 1. Reordering the members of SourceProvider to reduce the size. This affects on JSC, and CachedScriptSourceProvider used in WebCore. >+ >+ 2. Create one SourceProvider for all the builtin code and use substring to create builtin JS functions. >+ This reduces # of SourceProvider created for builtins. >+ >+ We also remove the dead code using m_syntaxAlreadyValidated in Parser.cpp. >+ >+ Unfortunately, MSVC does not accept super long C string literal. So instead, we construct combined string in a form of C array. >+ >+ * Scripts/wkbuiltins/builtins_generate_combined_header.py: >+ (BuiltinsCombinedHeaderGenerator.generate_output): >+ * Scripts/wkbuiltins/builtins_generate_combined_implementation.py: >+ (BuiltinsCombinedImplementationGenerator.generate_output): >+ * Scripts/wkbuiltins/builtins_generator.py: >+ (BuiltinsGenerator.generate_embedded_code_data_section_for_function): >+ (BuiltinsGenerator.generate_embedded_code_string_section_for_function): >+ * builtins/BuiltinExecutables.cpp: >+ (JSC::BuiltinExecutables::BuiltinExecutables): >+ (JSC::JSC_FOREACH_BUILTIN_CODE): >+ (JSC::BuiltinExecutables::createExecutable): >+ * builtins/BuiltinExecutables.h: >+ * parser/Parser.cpp: >+ (JSC::Parser<LexerType>::Parser): >+ (JSC::Parser<LexerType>::parseExpressionOrLabelStatement): >+ (JSC::Parser<LexerType>::shouldCheckPropertyForUnderscoreProtoDuplicate): >+ (JSC::Parser<LexerType>::parseObjectLiteral): >+ (JSC::Parser<LexerType>::parseUnaryExpression): >+ * parser/Parser.h: >+ * parser/SourceCode.h: >+ * parser/SourceProvider.cpp: >+ (JSC::SourceProvider::SourceProvider): >+ * parser/SourceProvider.h: >+ (JSC::SourceProvider::isValid const): Deleted. >+ (JSC::SourceProvider::setValid): Deleted. >+ > 2019-01-18 Keith Miller <keith_miller@apple.com> > > JSScript API should only take ascii files. >diff --git a/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generate_combined_header.py b/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generate_combined_header.py >index eac694803adbaac3e6bc48aa2a34cc8efacef2df..88744b1f823527c5198cc9420285dd8567dd47c1 100644 >--- a/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generate_combined_header.py >+++ b/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generate_combined_header.py >@@ -55,6 +55,8 @@ def generate_output(self): > sections.append(Template(Templates.HeaderIncludeGuard).substitute(args)) > sections.append(self.generate_forward_declarations()) > sections.append(Template(Templates.NamespaceTop).substitute(args)) >+ sections.append("extern const char s_%(namespace)sCombinedCode[];" % args); >+ sections.append("extern const unsigned s_%(namespace)sCombinedCodeLength;" % args); > for object in self.model().objects: > sections.append(self.generate_section_for_object(object)) > sections.append(self.generate_section_for_code_table_macro()) >diff --git a/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generate_combined_implementation.py b/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generate_combined_implementation.py >index 7874dcad94b4a6a2fc7c418f04e69d1395c1edb0..2bbdc8ba55dfc7c5bfd50ef46b4adf1734c953ff 100644 >--- a/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generate_combined_implementation.py >+++ b/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generate_combined_implementation.py >@@ -56,8 +56,33 @@ def generate_output(self): > sections.append(self.generate_primary_header_includes()) > sections.append(self.generate_secondary_header_includes()) > sections.append(Template(Templates.NamespaceTop).substitute(args)) >+ >+ combinedCode = "" >+ combinedCodeOffset = 0 >+ function_data = [] > for function in self.model().all_functions(): >- sections.append(self.generate_embedded_code_string_section_for_function(function)) >+ data = self.generate_embedded_code_data_section_for_function(function) >+ combinedCode += data['originalSource'] >+ data['embeddedSource'] = combinedCodeOffset >+ data['namespace'] = args['namespace'] >+ combinedCodeOffset += data['embeddedSourceLength'] >+ function_data.append(data) >+ >+ combinedCharacters = [] >+ for ch in combinedCode: >+ combinedCharacters.append(str(ord(ch))) >+ >+ sections.append("const char s_%sCombinedCode[] = { %s };" % (args['namespace'], (", ".join(combinedCharacters)))); >+ sections.append("const unsigned s_%sCombinedCodeLength = %d;" % (args['namespace'], len(combinedCharacters))); >+ >+ for data in function_data: >+ lines = [] >+ lines.append("const JSC::ConstructAbility s_%(codeName)sConstructAbility = JSC::ConstructAbility::%(canConstruct)s;" % data); >+ lines.append("const int s_%(codeName)sLength = %(embeddedSourceLength)d;" % data); >+ lines.append("static const JSC::Intrinsic s_%(codeName)sIntrinsic = JSC::%(intrinsic)s;" % data); >+ lines.append("const char* s_%(codeName)s { s_%(namespace)sCombinedCode + %(embeddedSource)d };" % data); >+ sections.append('\n'.join(lines)) >+ > if self.model().framework is Frameworks.JavaScriptCore: > sections.append(Template(Templates.CombinedJSCImplementationStaticMacros).substitute(args)) > elif self.model().framework is Frameworks.WebCore: >diff --git a/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generator.py b/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generator.py >index 9fa94547a25f7ce69c1203cfd40da9cd322ab846..3ea00619c72da9bfa21e5f7b6235381b7a951a2a 100644 >--- a/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generator.py >+++ b/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_generator.py >@@ -111,7 +111,7 @@ def generate_primary_header_includes(self): > "#include \"%s.h\"" % name, > ]) > >- def generate_embedded_code_string_section_for_function(self, function): >+ def generate_embedded_code_data_section_for_function(self, function): > text = function.function_source > # Wrap it in parens to avoid adding to global scope. > function_type_string = "function " >@@ -129,14 +129,17 @@ def generate_embedded_code_string_section_for_function(self, function): > if function.is_constructor: > constructAbility = "CanConstruct" > >- args = { >+ return { > 'codeName': BuiltinsGenerator.mangledNameForFunction(function) + 'Code', > 'embeddedSource': embeddedSource, > 'embeddedSourceLength': embeddedSourceLength, >+ 'originalSource': text + "\n", > 'canConstruct': constructAbility, > 'intrinsic': function.intrinsic > } > >+ def generate_embedded_code_string_section_for_function(self, function): >+ args = self.generate_embedded_code_data_section_for_function(function) > lines = [] > lines.append("const JSC::ConstructAbility s_%(codeName)sConstructAbility = JSC::ConstructAbility::%(canConstruct)s;" % args); > lines.append("const int s_%(codeName)sLength = %(embeddedSourceLength)d;" % args); >diff --git a/Source/JavaScriptCore/builtins/BuiltinExecutables.cpp b/Source/JavaScriptCore/builtins/BuiltinExecutables.cpp >index ba6ad37e425a81a71d72e55b21014cf1ce538830..de4709385093b4700c8be6cea67565bcc50b9fd0 100644 >--- a/Source/JavaScriptCore/builtins/BuiltinExecutables.cpp >+++ b/Source/JavaScriptCore/builtins/BuiltinExecutables.cpp >@@ -36,9 +36,10 @@ namespace JSC { > > BuiltinExecutables::BuiltinExecutables(VM& vm) > : m_vm(vm) >-#define INITIALIZE_BUILTIN_SOURCE_MEMBERS(name, functionName, overrideName, length) , m_##name##Source(makeSource(StringImpl::createFromLiteral(s_##name, length), { })) >+ , m_combinedSourceProvider(StringSourceProvider::create(StringImpl::createFromLiteral(s_JSCCombinedCode, s_JSCCombinedCodeLength), { }, URL())) >+#define INITIALIZE_BUILTIN_SOURCE_MEMBERS(name, functionName, overrideName, length) , m_##name##Source(m_combinedSourceProvider.copyRef(), s_##name - s_JSCCombinedCode, (s_##name - s_JSCCombinedCode) + length, 1, 1) > JSC_FOREACH_BUILTIN_CODE(INITIALIZE_BUILTIN_SOURCE_MEMBERS) >-#undef EXPOSE_BUILTIN_STRINGS >+#undef INITIALIZE_BUILTIN_SOURCE_MEMBERS > { > } > >@@ -101,18 +102,6 @@ UnlinkedFunctionExecutable* BuiltinExecutables::createExecutable(VM& vm, const S > > unsigned asyncOffset = isAsyncFunction ? strlen("async ") : 0; > unsigned parametersStart = strlen("function (") + asyncOffset; >- JSTokenLocation start; >- start.line = -1; >- start.lineStartOffset = std::numeric_limits<unsigned>::max(); >- start.startOffset = parametersStart; >- start.endOffset = std::numeric_limits<unsigned>::max(); >- >- JSTokenLocation end; >- end.line = 1; >- end.lineStartOffset = 0; >- end.startOffset = strlen("(") + asyncOffset; >- end.endOffset = std::numeric_limits<unsigned>::max(); >- > unsigned startColumn = parametersStart; > int functionKeywordStart = strlen("(") + asyncOffset; > int functionNameStart = parametersStart; >@@ -192,16 +181,29 @@ UnlinkedFunctionExecutable* BuiltinExecutables::createExecutable(VM& vm, const S > > JSTextPosition positionBeforeLastNewline; > positionBeforeLastNewline.line = lineCount; >- positionBeforeLastNewline.offset = offsetOfLastNewline; >- positionBeforeLastNewline.lineStartOffset = positionBeforeLastNewlineLineStartOffset; >+ positionBeforeLastNewline.offset = source.startOffset() + offsetOfLastNewline; >+ positionBeforeLastNewline.lineStartOffset = source.startOffset() + positionBeforeLastNewlineLineStartOffset; > >- SourceCode newSource = source.subExpression(parametersStart, view.length() - closeBraceOffsetFromEnd, 0, parametersStart); >+ SourceCode newSource = source.subExpression(source.startOffset() + parametersStart, source.startOffset() + (view.length() - closeBraceOffsetFromEnd), 0, parametersStart); > bool isBuiltinDefaultClassConstructor = constructorKind != ConstructorKind::None; > UnlinkedFunctionKind kind = isBuiltinDefaultClassConstructor ? UnlinkedNormalFunction : UnlinkedBuiltinFunction; > > SourceParseMode parseMode = isAsyncFunction ? SourceParseMode::AsyncFunctionMode : SourceParseMode::NormalFunctionMode; >+ >+ JSTokenLocation start; >+ start.line = -1; >+ start.lineStartOffset = std::numeric_limits<unsigned>::max(); >+ start.startOffset = source.startOffset() + parametersStart; >+ start.endOffset = std::numeric_limits<unsigned>::max(); >+ >+ JSTokenLocation end; >+ end.line = 1; >+ end.lineStartOffset = source.startOffset(); >+ end.startOffset = source.startOffset() + strlen("(") + asyncOffset; >+ end.endOffset = std::numeric_limits<unsigned>::max(); >+ > FunctionMetadataNode metadata( >- start, end, startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, >+ start, end, startColumn, endColumn, source.startOffset() + functionKeywordStart, source.startOffset() + functionNameStart, source.startOffset() + parametersStart, > isInStrictContext, constructorKind, constructorKind == ConstructorKind::Extends ? SuperBinding::Needed : SuperBinding::NotNeeded, > parameterCount, parseMode, isArrowFunctionBodyExpression); > >@@ -237,7 +239,6 @@ UnlinkedFunctionExecutable* BuiltinExecutables::createExecutable(VM& vm, const S > RELEASE_ASSERT(metadataFromParser); > metadataFromParser->overrideName(name); > metadataFromParser->setEndPosition(positionBeforeLastNewlineFromParser); >- > if (metadata != *metadataFromParser || positionBeforeLastNewlineFromParser != positionBeforeLastNewline) { > dataLogLn("Expected Metadata:\n", metadata); > dataLogLn("Metadata from parser:\n", *metadataFromParser); >diff --git a/Source/JavaScriptCore/builtins/BuiltinExecutables.h b/Source/JavaScriptCore/builtins/BuiltinExecutables.h >index 438c60ce119181d45d20f057f85c7432fe20ce11..6dcbedd473e186a5346c38041bec699ed0d606d9 100644 >--- a/Source/JavaScriptCore/builtins/BuiltinExecutables.h >+++ b/Source/JavaScriptCore/builtins/BuiltinExecutables.h >@@ -47,7 +47,7 @@ UnlinkedFunctionExecutable* name##Executable(); \ > const SourceCode& name##Source() { return m_##name##Source; } > > JSC_FOREACH_BUILTIN_CODE(EXPOSE_BUILTIN_EXECUTABLES) >-#undef EXPOSE_BUILTIN_SOURCES >+#undef EXPOSE_BUILTIN_EXECUTABLES > > static SourceCode defaultConstructorSourceCode(ConstructorKind); > UnlinkedFunctionExecutable* createDefaultConstructor(ConstructorKind, const Identifier& name); >@@ -60,6 +60,7 @@ const SourceCode& name##Source() { return m_##name##Source; } > > UnlinkedFunctionExecutable* createBuiltinExecutable(const SourceCode&, const Identifier&, ConstructAbility); > >+ Ref<StringSourceProvider> m_combinedSourceProvider; > #define DECLARE_BUILTIN_SOURCE_MEMBERS(name, functionName, overriddenName, length)\ > SourceCode m_##name##Source; \ > Weak<UnlinkedFunctionExecutable> m_##name##Executable; >diff --git a/Source/JavaScriptCore/parser/Parser.cpp b/Source/JavaScriptCore/parser/Parser.cpp >index 4b840d3ec340b0431277a5cfa3e6b546bcf866ba..1d223bc3a1236cd785bf04aee9e02e104c2b97bc 100644 >--- a/Source/JavaScriptCore/parser/Parser.cpp >+++ b/Source/JavaScriptCore/parser/Parser.cpp >@@ -129,7 +129,6 @@ Parser<LexerType>::Parser(VM* vm, const SourceCode& source, JSParserBuiltinMode > , m_source(&source) > , m_hasStackOverflow(false) > , m_allowsIn(true) >- , m_syntaxAlreadyValidated(source.provider()->isValid()) > , m_statementDepth(0) > , m_sourceElements(0) > , m_parsingBuiltin(builtinMode == JSParserBuiltinMode::Builtin) >@@ -3010,14 +3009,13 @@ template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExpressionOrL > JSTextPosition end = tokenEndPosition(); > next(); > consumeOrFail(COLON, "Labels must be followed by a ':'"); >- if (!m_syntaxAlreadyValidated) { >- // This is O(N^2) over the current list of consecutive labels, but I >- // have never seen more than one label in a row in the real world. >- for (size_t i = 0; i < labels.size(); i++) >- failIfTrue(ident->impl() == labels[i].m_ident->impl(), "Attempted to redeclare the label '", ident->impl(), "'"); >- failIfTrue(getLabel(ident), "Cannot find scope for the label '", ident->impl(), "'"); >- labels.append(LabelInfo(ident, start, end)); >- } >+ >+ // This is O(N^2) over the current list of consecutive labels, but I >+ // have never seen more than one label in a row in the real world. >+ for (size_t i = 0; i < labels.size(); i++) >+ failIfTrue(ident->impl() == labels[i].m_ident->impl(), "Attempted to redeclare the label '", ident->impl(), "'"); >+ failIfTrue(getLabel(ident), "Cannot find scope for the label '", ident->impl(), "'"); >+ labels.append(LabelInfo(ident, start, end)); > } while (matchSpecIdentifier()); > bool isLoop = false; > switch (m_token.m_type) { >@@ -3032,16 +3030,12 @@ template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExpressionOrL > } > const Identifier* unused = 0; > ScopeRef labelScope = currentScope(); >- if (!m_syntaxAlreadyValidated) { >- for (size_t i = 0; i < labels.size(); i++) >- pushLabel(labels[i].m_ident, isLoop); >- } >+ for (size_t i = 0; i < labels.size(); i++) >+ pushLabel(labels[i].m_ident, isLoop); > m_immediateParentAllowsFunctionDeclarationInStatement = allowFunctionDeclarationAsStatement; > TreeStatement statement = parseStatement(context, unused); >- if (!m_syntaxAlreadyValidated) { >- for (size_t i = 0; i < labels.size(); i++) >- popLabel(labelScope); >- } >+ for (size_t i = 0; i < labels.size(); i++) >+ popLabel(labelScope); > failIfFalse(statement, "Cannot parse statement"); > for (size_t i = 0; i < labels.size(); i++) { > const LabelInfo& info = labels[labels.size() - i - 1]; >@@ -4124,9 +4118,6 @@ template <class TreeBuilder> TreeProperty Parser<LexerType>::parseGetterSetter(T > template <typename LexerType> > template <class TreeBuilder> bool Parser<LexerType>::shouldCheckPropertyForUnderscoreProtoDuplicate(TreeBuilder& context, const TreeProperty& property) > { >- if (m_syntaxAlreadyValidated) >- return false; >- > if (!context.getName(property)) > return false; > >@@ -4181,7 +4172,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseObjectLitera > TreeProperty property = parseProperty(context, false); > failIfFalse(property, "Cannot parse object literal property"); > >- if (!m_syntaxAlreadyValidated && context.getType(property) & (PropertyNode::Getter | PropertyNode::Setter)) { >+ if (context.getType(property) & (PropertyNode::Getter | PropertyNode::Setter)) { > restoreSavePoint(savePoint); > return parseStrictObjectLiteral(context); > } >@@ -4199,7 +4190,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseObjectLitera > JSTokenLocation propertyLocation(tokenLocation()); > property = parseProperty(context, false); > failIfFalse(property, "Cannot parse object literal property"); >- if (!m_syntaxAlreadyValidated && context.getType(property) & (PropertyNode::Getter | PropertyNode::Setter)) { >+ if (context.getType(property) & (PropertyNode::Getter | PropertyNode::Setter)) { > restoreSavePoint(savePoint); > return parseStrictObjectLiteral(context); > } >@@ -4968,7 +4959,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseUnaryExpress > if (UNLIKELY(isUpdateOp(static_cast<JSTokenType>(lastOperator)) && context.isMetaProperty(expr))) > internalFailWithMessage(false, metaPropertyName(context, expr), " can't come after a prefix operator"); > bool isEvalOrArguments = false; >- if (strictMode() && !m_syntaxAlreadyValidated) { >+ if (strictMode()) { > if (context.isResolve(expr)) > isEvalOrArguments = *m_parserState.lastIdentifier == m_vm->propertyNames->eval || *m_parserState.lastIdentifier == m_vm->propertyNames->arguments; > } >@@ -5004,7 +4995,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseUnaryExpress > > JSTextPosition end = lastTokenEndPosition(); > >- if (!TreeBuilder::CreatesAST && (m_syntaxAlreadyValidated || !strictMode())) >+ if (!TreeBuilder::CreatesAST && (!strictMode())) > return expr; > > while (tokenStackDepth) { >diff --git a/Source/JavaScriptCore/parser/Parser.h b/Source/JavaScriptCore/parser/Parser.h >index 14cdd1a3a4bce1837a8796150a2a3a2f3b71ba5b..4dc4fa7336c4a054a5d0bb6470bc867095380813 100644 >--- a/Source/JavaScriptCore/parser/Parser.h >+++ b/Source/JavaScriptCore/parser/Parser.h >@@ -1857,7 +1857,6 @@ class Parser { > JSToken m_token; > bool m_allowsIn; > JSTextPosition m_lastTokenEndPosition; >- bool m_syntaxAlreadyValidated; > int m_statementDepth; > RefPtr<SourceProviderCache> m_functionCache; > SourceElements* m_sourceElements; >diff --git a/Source/JavaScriptCore/parser/SourceCode.h b/Source/JavaScriptCore/parser/SourceCode.h >index 313cfa45aaf922b07b045bbee0363859cbd4c09b..c3c0f7346b05536b5c099d43371586436fd3d9c2 100644 >--- a/Source/JavaScriptCore/parser/SourceCode.h >+++ b/Source/JavaScriptCore/parser/SourceCode.h >@@ -53,13 +53,6 @@ namespace JSC { > { > } > >- SourceCode(Ref<SourceProvider>&& provider, int startOffset, int endOffset, int firstLine, int startColumn) >- : UnlinkedSourceCode(WTFMove(provider), startOffset, endOffset) >- , m_firstLine(OrdinalNumber::fromOneBasedInt(std::max(firstLine, 1))) >- , m_startColumn(OrdinalNumber::fromOneBasedInt(std::max(startColumn, 1))) >- { >- } >- > SourceCode(RefPtr<SourceProvider>&& provider, int startOffset, int endOffset, int firstLine, int startColumn) > : UnlinkedSourceCode(WTFMove(provider), startOffset, endOffset) > , m_firstLine(OrdinalNumber::fromOneBasedInt(std::max(firstLine, 1))) >diff --git a/Source/JavaScriptCore/parser/SourceProvider.cpp b/Source/JavaScriptCore/parser/SourceProvider.cpp >index 5c198fdb13ad8b7953e5b6dd06dd7cda7e01cc58..15f00f306a3063adedc38a8fd1677b5bb9abb996 100644 >--- a/Source/JavaScriptCore/parser/SourceProvider.cpp >+++ b/Source/JavaScriptCore/parser/SourceProvider.cpp >@@ -32,9 +32,8 @@ > namespace JSC { > > SourceProvider::SourceProvider(const SourceOrigin& sourceOrigin, URL&& url, const TextPosition& startPosition, SourceProviderSourceType sourceType) >- : m_url(WTFMove(url)) >- , m_sourceType(sourceType) >- , m_validated(false) >+ : m_sourceType(sourceType) >+ , m_url(WTFMove(url)) > , m_sourceOrigin(sourceOrigin) > , m_startPosition(startPosition) > { >diff --git a/Source/JavaScriptCore/parser/SourceProvider.h b/Source/JavaScriptCore/parser/SourceProvider.h >index 40c7aa7ed16cfab667fa40613dc029f6b4198b35..09ad16834b0afb7be9f314afc2f250ad82edb5e5 100644 >--- a/Source/JavaScriptCore/parser/SourceProvider.h >+++ b/Source/JavaScriptCore/parser/SourceProvider.h >@@ -72,18 +72,14 @@ namespace JSC { > return m_id; > } > >- bool isValid() const { return m_validated; } >- void setValid() { m_validated = true; } >- > void setSourceURLDirective(const String& sourceURL) { m_sourceURLDirective = sourceURL; } > void setSourceMappingURLDirective(const String& sourceMappingURL) { m_sourceMappingURLDirective = sourceMappingURL; } > > private: > JS_EXPORT_PRIVATE void getID(); > >- URL m_url; > SourceProviderSourceType m_sourceType; >- bool m_validated : 1; >+ URL m_url; > SourceOrigin m_sourceOrigin; > String m_sourceURLDirective; > String m_sourceMappingURLDirective;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 193544
:
359464
|
359467
|
359468
|
359469
|
359471
|
359584
|
359587
|
359595
|
359597
|
359599
|
359648
|
359649