Function parameters should be parsed in the same parser arena as the function body
authorsaambarati1@gmail.com <saambarati1@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 17 Jul 2015 18:48:30 +0000 (18:48 +0000)
committersaambarati1@gmail.com <saambarati1@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 17 Jul 2015 18:48:30 +0000 (18:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=145995

Reviewed by Yusuke Suzuki.

Source/JavaScriptCore:

This patch changes how functions are parsed in JSC. A function's
parameters are now parsed in the same arena as the function itself.
This allows us to arena allocate all destructuring AST nodes and
the FunctionParameters node. This will help make implementing ES6
default parameter values sane.

A source code that represents a function now includes the text of the function's
parameters. The starting offset is at the opening parenthesis of the parameter
list or at the starting character of the identifier for arrow functions that
have single arguments and don't start with parenthesis.

For example:

"function (param1, param2) { ... }"
                           ^
                           | This offset used to be the starting offset of a function's SourceCode
          ^
          | This is the new starting offset for a function's SourceCode.

This requires us to change how some offsets are calculated
and also requires us to report some different line numbers for internal
metrics that use a SourceCode's starting line and column numbers.

This patch also does a bit of cleanup with regards to how
functions are parsed in general (especially arrow functions).
It removes some unnecessary #ifdefs and the likes for arrow
to make things clearer and more deliberate.

* API/JSScriptRef.cpp:
(parseScript):
* builtins/BuiltinExecutables.cpp:
(JSC::BuiltinExecutables::createExecutableInternal):
* bytecode/UnlinkedCodeBlock.cpp:
(JSC::generateFunctionCodeBlock):
(JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
(JSC::UnlinkedFunctionExecutable::visitChildren):
(JSC::UnlinkedFunctionExecutable::parameterCount): Deleted.
* bytecode/UnlinkedCodeBlock.h:
* bytecompiler/NodesCodegen.cpp:
(JSC::DestructuringAssignmentNode::emitBytecode):
(JSC::assignDefaultValueIfUndefined):
(JSC::ArrayPatternNode::collectBoundIdentifiers):
(JSC::DestructuringPatternNode::~DestructuringPatternNode): Deleted.
* parser/ASTBuilder.h:
(JSC::ASTBuilder::createClassExpr):
(JSC::ASTBuilder::createFunctionExpr):
(JSC::ASTBuilder::createFunctionBody):
(JSC::ASTBuilder::createArrowFunctionExpr):
(JSC::ASTBuilder::createGetterOrSetterProperty):
(JSC::ASTBuilder::createElementList):
(JSC::ASTBuilder::createFormalParameterList):
(JSC::ASTBuilder::appendParameter):
(JSC::ASTBuilder::createClause):
(JSC::ASTBuilder::createClauseList):
(JSC::ASTBuilder::createFuncDeclStatement):
(JSC::ASTBuilder::createForInLoop):
(JSC::ASTBuilder::createForOfLoop):
(JSC::ASTBuilder::isResolve):
(JSC::ASTBuilder::createDestructuringAssignment):
(JSC::ASTBuilder::createArrayPattern):
(JSC::ASTBuilder::appendArrayPatternSkipEntry):
(JSC::ASTBuilder::appendArrayPatternEntry):
(JSC::ASTBuilder::appendArrayPatternRestEntry):
(JSC::ASTBuilder::finishArrayPattern):
(JSC::ASTBuilder::createObjectPattern):
(JSC::ASTBuilder::appendObjectPatternEntry):
(JSC::ASTBuilder::createBindingLocation):
(JSC::ASTBuilder::setEndOffset):
* parser/Lexer.cpp:
(JSC::Lexer<T>::Lexer):
(JSC::Lexer<T>::nextTokenIsColon):
(JSC::Lexer<T>::setTokenPosition):
(JSC::Lexer<T>::lex):
(JSC::Lexer<T>::clear):
* parser/Lexer.h:
(JSC::Lexer::setIsReparsingFunction):
(JSC::Lexer::isReparsingFunction):
(JSC::Lexer::lineNumber):
(JSC::Lexer::setIsReparsing): Deleted.
(JSC::Lexer::isReparsing): Deleted.
* parser/NodeConstructors.h:
(JSC::TryNode::TryNode):
(JSC::FunctionParameters::FunctionParameters):
(JSC::FuncExprNode::FuncExprNode):
(JSC::FuncDeclNode::FuncDeclNode):
(JSC::ArrayPatternNode::ArrayPatternNode):
(JSC::ObjectPatternNode::ObjectPatternNode):
(JSC::BindingNode::BindingNode):
(JSC::DestructuringAssignmentNode::DestructuringAssignmentNode):
(JSC::ParameterNode::ParameterNode): Deleted.
(JSC::ArrayPatternNode::create): Deleted.
(JSC::ObjectPatternNode::create): Deleted.
(JSC::BindingNode::create): Deleted.
* parser/Nodes.cpp:
(JSC::ProgramNode::ProgramNode):
(JSC::EvalNode::EvalNode):
(JSC::FunctionBodyNode::FunctionBodyNode):
(JSC::FunctionBodyNode::finishParsing):
(JSC::FunctionNode::FunctionNode):
(JSC::FunctionNode::finishParsing):
(JSC::FunctionParameters::create): Deleted.
(JSC::FunctionParameters::FunctionParameters): Deleted.
(JSC::FunctionParameters::~FunctionParameters): Deleted.
* parser/Nodes.h:
(JSC::ProgramNode::startColumn):
(JSC::ProgramNode::endColumn):
(JSC::EvalNode::startColumn):
(JSC::EvalNode::endColumn):
(JSC::FunctionParameters::size):
(JSC::FunctionParameters::at):
(JSC::FunctionParameters::append):
(JSC::FuncExprNode::body):
(JSC::DestructuringPatternNode::~DestructuringPatternNode):
(JSC::DestructuringPatternNode::isBindingNode):
(JSC::DestructuringPatternNode::emitDirectBinding):
(JSC::ArrayPatternNode::appendIndex):
(JSC::ObjectPatternNode::appendEntry):
(JSC::BindingNode::boundProperty):
(JSC::BindingNode::divotStart):
(JSC::BindingNode::divotEnd):
(JSC::DestructuringAssignmentNode::bindings):
(JSC::FuncDeclNode::body):
(JSC::ParameterNode::pattern): Deleted.
(JSC::ParameterNode::nextParam): Deleted.
(JSC::FunctionParameters::patterns): Deleted.
* parser/Parser.cpp:
(JSC::Parser<LexerType>::Parser):
(JSC::Parser<LexerType>::~Parser):
(JSC::Parser<LexerType>::parseInner):
(JSC::Parser<LexerType>::allowAutomaticSemicolon):
(JSC::Parser<LexerType>::parseSourceElements):
(JSC::Parser<LexerType>::createBindingPattern):
(JSC::Parser<LexerType>::parseArrowFunctionSingleExpressionBodySourceElements):
(JSC::Parser<LexerType>::tryParseDestructuringPatternExpression):
(JSC::Parser<LexerType>::parseSwitchClauses):
(JSC::Parser<LexerType>::parseSwitchDefaultClause):
(JSC::Parser<LexerType>::parseBlockStatement):
(JSC::Parser<LexerType>::parseStatement):
(JSC::Parser<LexerType>::parseFormalParameters):
(JSC::Parser<LexerType>::parseFunctionBody):
(JSC::stringForFunctionMode):
(JSC::Parser<LexerType>::parseFunctionParameters):
(JSC::Parser<LexerType>::parseFunctionInfo):
(JSC::Parser<LexerType>::parseFunctionDeclaration):
(JSC::Parser<LexerType>::parseClass):
(JSC::Parser<LexerType>::parsePrimaryExpression):
(JSC::Parser<LexerType>::parseMemberExpression):
(JSC::Parser<LexerType>::parseArrowFunctionExpression):
(JSC::operatorString):
(JSC::Parser<LexerType>::parseArrowFunctionSingleExpressionBody): Deleted.
* parser/Parser.h:
(JSC::Parser::positionBeforeLastNewline):
(JSC::Parser::locationBeforeLastToken):
(JSC::Parser::findCachedFunctionInfo):
(JSC::Parser::isofToken):
(JSC::Parser::isEndOfArrowFunction):
(JSC::Parser::isArrowFunctionParamters):
(JSC::Parser::tokenStart):
(JSC::Parser::isLETMaskedAsIDENT):
(JSC::Parser::autoSemiColon):
(JSC::Parser::setEndOfStatement):
(JSC::Parser::canRecurse):
(JSC::Parser<LexerType>::parse):
(JSC::parse):
* parser/ParserFunctionInfo.h:
* parser/ParserModes.h:
(JSC::functionNameIsInScope):
* parser/SourceCode.h:
(JSC::makeSource):
(JSC::SourceCode::subExpression):
(JSC::SourceCode::subArrowExpression): Deleted.
* parser/SourceProviderCache.h:
(JSC::SourceProviderCache::get):
* parser/SourceProviderCacheItem.h:
(JSC::SourceProviderCacheItem::endFunctionToken):
(JSC::SourceProviderCacheItem::usedVariables):
(JSC::SourceProviderCacheItem::writtenVariables):
(JSC::SourceProviderCacheItem::SourceProviderCacheItem):
* parser/SyntaxChecker.h:
(JSC::SyntaxChecker::SyntaxChecker):
(JSC::SyntaxChecker::createClassExpr):
(JSC::SyntaxChecker::createFunctionExpr):
(JSC::SyntaxChecker::createFunctionBody):
(JSC::SyntaxChecker::createArrowFunctionExpr):
(JSC::SyntaxChecker::setFunctionNameStart):
(JSC::SyntaxChecker::createArguments):
(JSC::SyntaxChecker::createPropertyList):
(JSC::SyntaxChecker::createElementList):
(JSC::SyntaxChecker::createFormalParameterList):
(JSC::SyntaxChecker::appendParameter):
(JSC::SyntaxChecker::createClause):
(JSC::SyntaxChecker::createClauseList):
* runtime/CodeCache.cpp:
(JSC::CodeCache::getGlobalCodeBlock):
(JSC::CodeCache::getFunctionExecutableFromGlobalCode):
* runtime/Completion.cpp:
(JSC::checkSyntax):
* runtime/Executable.cpp:
(JSC::ProgramExecutable::checkSyntax):
* tests/controlFlowProfiler/conditional-expression.js:
(testConditionalFunctionCall):

LayoutTests:

* fast/profiler/anonymous-event-handler-expected.txt:
* fast/profiler/anonymous-function-called-from-different-contexts-expected.txt:
* fast/profiler/anonymous-function-calls-built-in-functions-expected.txt:
* fast/profiler/anonymous-function-calls-eval-expected.txt:
* fast/profiler/anonymous-functions-with-display-names-expected.txt:
* fast/profiler/apply-expected.txt:
* fast/profiler/built-in-function-calls-anonymous-expected.txt:
* fast/profiler/built-in-function-calls-user-defined-function-expected.txt:
* fast/profiler/call-expected.txt:
* fast/profiler/calling-the-function-that-started-the-profiler-from-another-scope-expected.txt:
* fast/profiler/compare-multiple-profiles-expected.txt:
* fast/profiler/constructor-expected.txt:
* fast/profiler/dead-time-expected.txt:
* fast/profiler/document-dot-write-expected.txt:
* fast/profiler/event-handler-expected.txt:
* fast/profiler/execution-context-and-eval-on-same-line-expected.txt:
* fast/profiler/inline-event-handler-expected.txt:
* fast/profiler/many-calls-in-the-same-scope-expected.txt:
* fast/profiler/multiple-and-different-scoped-anonymous-function-calls-expected.txt:
* fast/profiler/multiple-and-different-scoped-function-calls-expected.txt:
* fast/profiler/multiple-anonymous-functions-called-from-the-same-function-expected.txt:
* fast/profiler/multiple-frames-expected.txt:
* fast/profiler/named-functions-with-display-names-expected.txt:
* fast/profiler/nested-anonymous-functon-expected.txt:
* fast/profiler/nested-start-and-stop-profiler-expected.txt:
* fast/profiler/one-execution-context-expected.txt:
* fast/profiler/profile-calls-in-included-file-expected.txt:
* fast/profiler/profile-with-no-title-expected.txt:
* fast/profiler/profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting-expected.txt:
* fast/profiler/profiling-from-a-nested-location-expected.txt:
* fast/profiler/simple-event-call-expected.txt:
* fast/profiler/simple-no-level-change-expected.txt:
* fast/profiler/start-and-stop-profiler-multiple-times-expected.txt:
* fast/profiler/start-and-stop-profiling-in-the-same-function-expected.txt:
* fast/profiler/stop-profiling-after-setTimeout-expected.txt:
* fast/profiler/stop-then-function-call-expected.txt:
* fast/profiler/two-execution-contexts-expected.txt:
* fast/profiler/user-defined-function-calls-built-in-functions-expected.txt:
* fast/profiler/window-dot-eval-expected.txt:
* js/dom/script-start-end-locations-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@186959 268f45cc-cd09-0410-ab3c-d52691b4dbfc

65 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/profiler/anonymous-event-handler-expected.txt
LayoutTests/fast/profiler/anonymous-function-called-from-different-contexts-expected.txt
LayoutTests/fast/profiler/anonymous-function-calls-built-in-functions-expected.txt
LayoutTests/fast/profiler/anonymous-function-calls-eval-expected.txt
LayoutTests/fast/profiler/anonymous-functions-with-display-names-expected.txt
LayoutTests/fast/profiler/apply-expected.txt
LayoutTests/fast/profiler/built-in-function-calls-anonymous-expected.txt
LayoutTests/fast/profiler/built-in-function-calls-user-defined-function-expected.txt
LayoutTests/fast/profiler/call-expected.txt
LayoutTests/fast/profiler/calling-the-function-that-started-the-profiler-from-another-scope-expected.txt
LayoutTests/fast/profiler/compare-multiple-profiles-expected.txt
LayoutTests/fast/profiler/constructor-expected.txt
LayoutTests/fast/profiler/dead-time-expected.txt
LayoutTests/fast/profiler/document-dot-write-expected.txt
LayoutTests/fast/profiler/event-handler-expected.txt
LayoutTests/fast/profiler/execution-context-and-eval-on-same-line-expected.txt
LayoutTests/fast/profiler/inline-event-handler-expected.txt
LayoutTests/fast/profiler/many-calls-in-the-same-scope-expected.txt
LayoutTests/fast/profiler/multiple-and-different-scoped-anonymous-function-calls-expected.txt
LayoutTests/fast/profiler/multiple-and-different-scoped-function-calls-expected.txt
LayoutTests/fast/profiler/multiple-anonymous-functions-called-from-the-same-function-expected.txt
LayoutTests/fast/profiler/multiple-frames-expected.txt
LayoutTests/fast/profiler/named-functions-with-display-names-expected.txt
LayoutTests/fast/profiler/nested-anonymous-functon-expected.txt
LayoutTests/fast/profiler/nested-start-and-stop-profiler-expected.txt
LayoutTests/fast/profiler/one-execution-context-expected.txt
LayoutTests/fast/profiler/profile-calls-in-included-file-expected.txt
LayoutTests/fast/profiler/profile-with-no-title-expected.txt
LayoutTests/fast/profiler/profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting-expected.txt
LayoutTests/fast/profiler/profiling-from-a-nested-location-expected.txt
LayoutTests/fast/profiler/simple-event-call-expected.txt
LayoutTests/fast/profiler/simple-no-level-change-expected.txt
LayoutTests/fast/profiler/start-and-stop-profiler-multiple-times-expected.txt
LayoutTests/fast/profiler/start-and-stop-profiling-in-the-same-function-expected.txt
LayoutTests/fast/profiler/stop-profiling-after-setTimeout-expected.txt
LayoutTests/fast/profiler/stop-then-function-call-expected.txt
LayoutTests/fast/profiler/two-execution-contexts-expected.txt
LayoutTests/fast/profiler/user-defined-function-calls-built-in-functions-expected.txt
LayoutTests/fast/profiler/window-dot-eval-expected.txt
LayoutTests/js/dom/script-start-end-locations-expected.txt
Source/JavaScriptCore/API/JSScriptRef.cpp
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/builtins/BuiltinExecutables.cpp
Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp
Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h
Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
Source/JavaScriptCore/parser/ASTBuilder.h
Source/JavaScriptCore/parser/Lexer.cpp
Source/JavaScriptCore/parser/Lexer.h
Source/JavaScriptCore/parser/NodeConstructors.h
Source/JavaScriptCore/parser/Nodes.cpp
Source/JavaScriptCore/parser/Nodes.h
Source/JavaScriptCore/parser/Parser.cpp
Source/JavaScriptCore/parser/Parser.h
Source/JavaScriptCore/parser/ParserFunctionInfo.h
Source/JavaScriptCore/parser/ParserModes.h
Source/JavaScriptCore/parser/SourceCode.h
Source/JavaScriptCore/parser/SourceProviderCache.h
Source/JavaScriptCore/parser/SourceProviderCacheItem.h
Source/JavaScriptCore/parser/SyntaxChecker.h
Source/JavaScriptCore/runtime/CodeCache.cpp
Source/JavaScriptCore/runtime/Completion.cpp
Source/JavaScriptCore/runtime/Executable.cpp
Source/JavaScriptCore/tests/controlFlowProfiler/conditional-expression.js

index 06f2ab0..30af3d4 100644 (file)
@@ -1,3 +1,51 @@
+2015-07-17  Saam barati  <saambarati1@gmail.com>
+
+        Function parameters should be parsed in the same parser arena as the function body
+        https://bugs.webkit.org/show_bug.cgi?id=145995
+
+        Reviewed by Yusuke Suzuki.
+
+        * fast/profiler/anonymous-event-handler-expected.txt:
+        * fast/profiler/anonymous-function-called-from-different-contexts-expected.txt:
+        * fast/profiler/anonymous-function-calls-built-in-functions-expected.txt:
+        * fast/profiler/anonymous-function-calls-eval-expected.txt:
+        * fast/profiler/anonymous-functions-with-display-names-expected.txt:
+        * fast/profiler/apply-expected.txt:
+        * fast/profiler/built-in-function-calls-anonymous-expected.txt:
+        * fast/profiler/built-in-function-calls-user-defined-function-expected.txt:
+        * fast/profiler/call-expected.txt:
+        * fast/profiler/calling-the-function-that-started-the-profiler-from-another-scope-expected.txt:
+        * fast/profiler/compare-multiple-profiles-expected.txt:
+        * fast/profiler/constructor-expected.txt:
+        * fast/profiler/dead-time-expected.txt:
+        * fast/profiler/document-dot-write-expected.txt:
+        * fast/profiler/event-handler-expected.txt:
+        * fast/profiler/execution-context-and-eval-on-same-line-expected.txt:
+        * fast/profiler/inline-event-handler-expected.txt:
+        * fast/profiler/many-calls-in-the-same-scope-expected.txt:
+        * fast/profiler/multiple-and-different-scoped-anonymous-function-calls-expected.txt:
+        * fast/profiler/multiple-and-different-scoped-function-calls-expected.txt:
+        * fast/profiler/multiple-anonymous-functions-called-from-the-same-function-expected.txt:
+        * fast/profiler/multiple-frames-expected.txt:
+        * fast/profiler/named-functions-with-display-names-expected.txt:
+        * fast/profiler/nested-anonymous-functon-expected.txt:
+        * fast/profiler/nested-start-and-stop-profiler-expected.txt:
+        * fast/profiler/one-execution-context-expected.txt:
+        * fast/profiler/profile-calls-in-included-file-expected.txt:
+        * fast/profiler/profile-with-no-title-expected.txt:
+        * fast/profiler/profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting-expected.txt:
+        * fast/profiler/profiling-from-a-nested-location-expected.txt:
+        * fast/profiler/simple-event-call-expected.txt:
+        * fast/profiler/simple-no-level-change-expected.txt:
+        * fast/profiler/start-and-stop-profiler-multiple-times-expected.txt:
+        * fast/profiler/start-and-stop-profiling-in-the-same-function-expected.txt:
+        * fast/profiler/stop-profiling-after-setTimeout-expected.txt:
+        * fast/profiler/stop-then-function-call-expected.txt:
+        * fast/profiler/two-execution-contexts-expected.txt:
+        * fast/profiler/user-defined-function-calls-built-in-functions-expected.txt:
+        * fast/profiler/window-dot-eval-expected.txt:
+        * js/dom/script-start-end-locations-expected.txt:
+
 2015-07-17  Benjamin Poulain  <bpoulain@apple.com>
 
         [Content Extensions] CSS-display-none rules are not working properly
index 91e9ba7..848bf38 100644 (file)
@@ -4,15 +4,15 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Anonymous event handler
 Thread_1 (no file) (line 0:0)
-   startTest anonymous-event-handler.html (line 11:1)
+   startTest anonymous-event-handler.html (line 10:19)
       getElementById (no file) (line 0:0)
       click (no file) (line 0:0)
-         onclick anonymous-event-handler.html (line 15:54)
-            insertNewText profiler-test-JS-resources.js (line 17:26)
+         onclick anonymous-event-handler.html (line 15:51)
+            insertNewText profiler-test-JS-resources.js (line 17:23)
                createElement (no file) (line 0:0)
                createTextNode (no file) (line 0:0)
                appendChild (no file) (line 0:0)
                getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 35cbf7f..3cbbf04 100644 (file)
@@ -4,21 +4,21 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Same anonymous function called from different contexts
 Thread_1 (no file) (line 0:0)
-   startTest anonymous-function-called-from-different-contexts.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest anonymous-function-called-from-different-contexts.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
       eval (no file) (line 0:0)
          (program) (no file) (line 1:1)
-            anonymousFunction profiler-test-JS-resources.js (line 29:37)
-               insertNewText profiler-test-JS-resources.js (line 17:26)
+            anonymousFunction profiler-test-JS-resources.js (line 29:34)
+               insertNewText profiler-test-JS-resources.js (line 17:23)
                   createElement (no file) (line 0:0)
                   createTextNode (no file) (line 0:0)
                   appendChild (no file) (line 0:0)
                   getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index f38c9f8..9120600 100644 (file)
@@ -4,13 +4,13 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Anonymous function calls built-in functions
 Thread_1 (no file) (line 0:0)
-   startTest anonymous-function-calls-built-in-functions.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest anonymous-function-calls-built-in-functions.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 39997a5..9a0fd4b 100644 (file)
@@ -4,15 +4,15 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Anonymous function calles eval
 Thread_1 (no file) (line 0:0)
-   startTest anonymous-function-calls-eval.html (line 11:1)
-      variableThatPointsToAnAnonymousFunction anonymous-function-calls-eval.html (line 14:62)
+   startTest anonymous-function-calls-eval.html (line 10:19)
+      variableThatPointsToAnAnonymousFunction anonymous-function-calls-eval.html (line 14:59)
          eval (no file) (line 0:0)
             (program) (no file) (line 1:1)
-               insertNewText profiler-test-JS-resources.js (line 17:26)
+               insertNewText profiler-test-JS-resources.js (line 17:23)
                   createElement (no file) (line 0:0)
                   createTextNode (no file) (line 0:0)
                   appendChild (no file) (line 0:0)
                   getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 335f63d..7b8d807 100644 (file)
@@ -4,13 +4,13 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Anonymous functions with display names
 Thread_1 (no file) (line 0:0)
-   startTest anonymous-functions-with-display-names.html (line 23:1)
-      anonymousFunctionGenerator anonymous-functions-with-display-names.html (line 11:1)
-      0 iterations function anonymous-functions-with-display-names.html (line 13:5)
-      1 iterations function anonymous-functions-with-display-names.html (line 13:5)
-      2 iterations function anonymous-functions-with-display-names.html (line 13:5)
-      20 iterations function anonymous-functions-with-display-names.html (line 13:5)
-      1000 iterations function anonymous-functions-with-display-names.html (line 13:5)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest anonymous-functions-with-display-names.html (line 22:19)
+      anonymousFunctionGenerator anonymous-functions-with-display-names.html (line 10:36)
+      0 iterations function anonymous-functions-with-display-names.html (line 12:59)
+      1 iterations function anonymous-functions-with-display-names.html (line 12:59)
+      2 iterations function anonymous-functions-with-display-names.html (line 12:59)
+      20 iterations function anonymous-functions-with-display-names.html (line 12:59)
+      1000 iterations function anonymous-functions-with-display-names.html (line 12:59)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index eeea07f..708bd06 100644 (file)
@@ -4,9 +4,9 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Using the apply() method
 Thread_1 (no file) (line 0:0)
-   startTest apply.html (line 11:1)
-      fakeObject apply.html (line 18:1)
-         fakeInteriorFunction apply.html (line 24:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest apply.html (line 10:19)
+      fakeObject apply.html (line 17:21)
+         fakeInteriorFunction apply.html (line 23:30)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index d17eb58..63ab7a3 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Built-in function calls an anonymous function
 Thread_1 (no file) (line 0:0)
-   startTest built-in-function-calls-anonymous.html (line 11:1)
+   startTest built-in-function-calls-anonymous.html (line 10:19)
       Array (no file) (line 0:0)
       map (no file) (line 0:0)
          Object (no file) (line 0:0)
@@ -12,8 +12,8 @@ Thread_1 (no file) (line 0:0)
             toInteger (no file) (line 0:0)
                Number (no file) (line 0:0)
                (anonymous function) (no file) (line 0:0)
-         myFunction built-in-function-calls-anonymous.html (line 14:45)
-            arrayOperatorFunction profiler-test-JS-resources.js (line 25:46)
-      endTest profiler-test-JS-resources.js (line 1:20)
+         myFunction built-in-function-calls-anonymous.html (line 14:30)
+            arrayOperatorFunction profiler-test-JS-resources.js (line 25:31)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index e7fba59..2f888d4 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Built-in function calls a user defined function
 Thread_1 (no file) (line 0:0)
-   startTest built-in-function-calls-user-defined-function.html (line 11:1)
+   startTest built-in-function-calls-user-defined-function.html (line 10:19)
       Array (no file) (line 0:0)
       map (no file) (line 0:0)
          Object (no file) (line 0:0)
@@ -12,7 +12,7 @@ Thread_1 (no file) (line 0:0)
             toInteger (no file) (line 0:0)
                Number (no file) (line 0:0)
                (anonymous function) (no file) (line 0:0)
-         arrayOperatorFunction profiler-test-JS-resources.js (line 25:46)
-      endTest profiler-test-JS-resources.js (line 1:20)
+         arrayOperatorFunction profiler-test-JS-resources.js (line 25:31)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 536d11c..fc86fd9 100644 (file)
@@ -4,9 +4,9 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Using the call() method
 Thread_1 (no file) (line 0:0)
-   startTest call.html (line 11:1)
-      fakeObject call.html (line 20:1)
-         fakeInteriorFunction call.html (line 26:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest call.html (line 10:19)
+      fakeObject call.html (line 19:21)
+         fakeInteriorFunction call.html (line 25:30)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 4c5cfcb..6c2bb18 100644 (file)
@@ -4,9 +4,9 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Calling the same function where the profile started from another function
 Thread_1 (no file) (line 0:0)
-   indirection calling-the-function-that-started-the-profiler-from-another-scope.html (line 18:1)
-      functionWichStartsAndStopsTheProfiler calling-the-function-that-started-the-profiler-from-another-scope.html (line 24:1)
-   functionWichStartsAndStopsTheProfiler calling-the-function-that-started-the-profiler-from-another-scope.html (line 24:1)
-   endTest profiler-test-JS-resources.js (line 1:20)
+   indirection calling-the-function-that-started-the-profiler-from-another-scope.html (line 17:21)
+      functionWichStartsAndStopsTheProfiler calling-the-function-that-started-the-profiler-from-another-scope.html (line 23:47)
+   functionWichStartsAndStopsTheProfiler calling-the-function-that-started-the-profiler-from-another-scope.html (line 23:47)
+   endTest profiler-test-JS-resources.js (line 1:17)
 
 
index d0e06fe..c3bbe20 100644 (file)
@@ -4,14 +4,14 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Test
 Thread_1 (no file) (line 0:0)
-   startTest compare-multiple-profiles.html (line 23:1)
-      test compare-multiple-profiles.html (line 11:20)
-         test2 compare-multiple-profiles.html (line 17:21)
+   startTest compare-multiple-profiles.html (line 22:19)
+      test compare-multiple-profiles.html (line 11:14)
+         test2 compare-multiple-profiles.html (line 17:15)
 
 Profile title: Test
 Thread_1 (no file) (line 0:0)
-   startTest compare-multiple-profiles.html (line 23:1)
-      test compare-multiple-profiles.html (line 11:20)
-         test2 compare-multiple-profiles.html (line 17:21)
+   startTest compare-multiple-profiles.html (line 22:19)
+      test compare-multiple-profiles.html (line 11:14)
+         test2 compare-multiple-profiles.html (line 17:15)
 
 
index 2c761b1..93d8963 100644 (file)
@@ -4,9 +4,9 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Using a constructor.
 Thread_1 (no file) (line 0:0)
-   startTest constructor.html (line 11:1)
-      fakeObject constructor.html (line 20:1)
+   startTest constructor.html (line 10:19)
+      fakeObject constructor.html (line 19:21)
          Array (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 849e8a0..1de64f6 100644 (file)
@@ -4,10 +4,10 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Dead time in profile.
 Thread_1 (no file) (line 0:0)
-   onload dead-time.html (line 21:52)
-      startTest dead-time.html (line 13:1)
+   onload dead-time.html (line 21:44)
+      startTest dead-time.html (line 12:19)
          setTimeout (no file) (line 0:0)
    (program) dead-time.html (line 1:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index daf4560..849f1bd 100644 (file)
@@ -1,8 +1,8 @@
 
 Profile title: Call Document.write()
 Thread_1 (no file) (line 0:0)
-   startTest document-dot-write.html (line 11:1)
+   startTest document-dot-write.html (line 10:19)
       write (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 7ad37c2..15c48cd 100644 (file)
@@ -4,15 +4,15 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Event handler
 Thread_1 (no file) (line 0:0)
-   startTest event-handler.html (line 11:1)
+   startTest event-handler.html (line 10:19)
       getElementById (no file) (line 0:0)
       addEventListener (no file) (line 0:0)
       click (no file) (line 0:0)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 271d6a5..d95c261 100644 (file)
@@ -4,13 +4,13 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Two Execution Contexts on the same line
 Thread_1 (no file) (line 0:0)
-   startTest execution-context-and-eval-on-same-line.html (line 11:1)
-      evalFunction (no file) (line 1:25)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest execution-context-and-eval-on-same-line.html (line 10:19)
+      evalFunction (no file) (line 1:22)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 961a30f..a023e5f 100644 (file)
@@ -4,17 +4,17 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Inline event handler
 Thread_1 (no file) (line 0:0)
-   startTest inline-event-handler.html (line 11:1)
+   startTest inline-event-handler.html (line 10:19)
       getElementById (no file) (line 0:0)
       click (no file) (line 0:0)
-         onclick inline-event-handler.html (line 31:135)
-            eventListener inline-event-handler.html (line 17:26)
-               anonymousFunction profiler-test-JS-resources.js (line 29:37)
-                  insertNewText profiler-test-JS-resources.js (line 17:26)
+         onclick inline-event-handler.html (line 31:127)
+            eventListener inline-event-handler.html (line 17:23)
+               anonymousFunction profiler-test-JS-resources.js (line 29:34)
+                  insertNewText profiler-test-JS-resources.js (line 17:23)
                      createElement (no file) (line 0:0)
                      createTextNode (no file) (line 0:0)
                      appendChild (no file) (line 0:0)
                      getElementById (no file) (line 0:0)
-               endTest profiler-test-JS-resources.js (line 1:20)
+               endTest profiler-test-JS-resources.js (line 1:17)
 
 
index d5d169f..0cd45d1 100644 (file)
@@ -4,33 +4,33 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Many Calls In The Same Scope
 Thread_1 (no file) (line 0:0)
-   startTest many-calls-in-the-same-scope.html (line 11:1)
-      insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest many-calls-in-the-same-scope.html (line 10:19)
+      insertNewText profiler-test-JS-resources.js (line 17:23)
          createElement (no file) (line 0:0)
          createTextNode (no file) (line 0:0)
          appendChild (no file) (line 0:0)
          getElementById (no file) (line 0:0)
-      insertGivenText profiler-test-JS-resources.js (line 9:32)
+      insertGivenText profiler-test-JS-resources.js (line 9:25)
          createElement (no file) (line 0:0)
          createTextNode (no file) (line 0:0)
          appendChild (no file) (line 0:0)
          getElementById (no file) (line 0:0)
-      arrayOperatorFunction profiler-test-JS-resources.js (line 25:46)
-      intermediaryFunction profiler-test-JS-resources.js (line 33:1)
-         anonymousFunction profiler-test-JS-resources.js (line 29:37)
-            insertNewText profiler-test-JS-resources.js (line 17:26)
+      arrayOperatorFunction profiler-test-JS-resources.js (line 25:31)
+      intermediaryFunction profiler-test-JS-resources.js (line 32:30)
+         anonymousFunction profiler-test-JS-resources.js (line 29:34)
+            insertNewText profiler-test-JS-resources.js (line 17:23)
                createElement (no file) (line 0:0)
                createTextNode (no file) (line 0:0)
                appendChild (no file) (line 0:0)
                getElementById (no file) (line 0:0)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      end many-calls-in-the-same-scope.html (line 27:1)
-      endT many-calls-in-the-same-scope.html (line 32:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      end many-calls-in-the-same-scope.html (line 26:13)
+      endT many-calls-in-the-same-scope.html (line 31:14)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 47daac9..051ec81 100644 (file)
@@ -4,20 +4,20 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Multiple and different scoped calls to the same anonymous function
 Thread_1 (no file) (line 0:0)
-   startTest multiple-and-different-scoped-anonymous-function-calls.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest multiple-and-different-scoped-anonymous-function-calls.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      intermediaryFunction profiler-test-JS-resources.js (line 33:1)
-         anonymousFunction profiler-test-JS-resources.js (line 29:37)
-            insertNewText profiler-test-JS-resources.js (line 17:26)
+      intermediaryFunction profiler-test-JS-resources.js (line 32:30)
+         anonymousFunction profiler-test-JS-resources.js (line 29:34)
+            insertNewText profiler-test-JS-resources.js (line 17:23)
                createElement (no file) (line 0:0)
                createTextNode (no file) (line 0:0)
                appendChild (no file) (line 0:0)
                getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 46f60f5..b9fdced 100644 (file)
@@ -4,19 +4,19 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Multiple and different scoped calls to the same function
 Thread_1 (no file) (line 0:0)
-   startTest multiple-and-different-scoped-function-calls.html (line 11:1)
-      insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest multiple-and-different-scoped-function-calls.html (line 10:19)
+      insertNewText profiler-test-JS-resources.js (line 17:23)
          createElement (no file) (line 0:0)
          createTextNode (no file) (line 0:0)
          appendChild (no file) (line 0:0)
          getElementById (no file) (line 0:0)
-      intermediaryFunction profiler-test-JS-resources.js (line 33:1)
-         anonymousFunction profiler-test-JS-resources.js (line 29:37)
-            insertNewText profiler-test-JS-resources.js (line 17:26)
+      intermediaryFunction profiler-test-JS-resources.js (line 32:30)
+         anonymousFunction profiler-test-JS-resources.js (line 29:34)
+            insertNewText profiler-test-JS-resources.js (line 17:23)
                createElement (no file) (line 0:0)
                createTextNode (no file) (line 0:0)
                appendChild (no file) (line 0:0)
                getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 6946445..e401404 100644 (file)
@@ -4,19 +4,19 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Multiple calls to different anonymous functions
 Thread_1 (no file) (line 0:0)
-   startTest multiple-anonymous-functions-called-from-the-same-function.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest multiple-anonymous-functions-called-from-the-same-function.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      anotherAnonymousFunction profiler-test-JS-resources.js (line 30:44)
-         insertGivenText profiler-test-JS-resources.js (line 9:32)
+      anotherAnonymousFunction profiler-test-JS-resources.js (line 30:41)
+         insertGivenText profiler-test-JS-resources.js (line 9:25)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 96a76ee..2e23f4c 100644 (file)
@@ -4,15 +4,15 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Other window executing JavaScript
 Thread_1 (no file) (line 0:0)
-   startTest multiple-frames.html (line 11:1)
+   startTest multiple-frames.html (line 10:19)
       getElementById (no file) (line 0:0)
-      functionInOtherFrame other-frame.html (line 4:33)
-         functionInParentFrame multiple-frames.html (line 21:34)
-      insertGivenText profiler-test-JS-resources.js (line 9:32)
+      functionInOtherFrame other-frame.html (line 4:30)
+         functionInParentFrame multiple-frames.html (line 21:31)
+      insertGivenText profiler-test-JS-resources.js (line 9:25)
          createElement (no file) (line 0:0)
          createTextNode (no file) (line 0:0)
          appendChild (no file) (line 0:0)
          getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index c70e717..190a64c 100644 (file)
@@ -4,13 +4,13 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Named functions with display names
 Thread_1 (no file) (line 0:0)
-   startTest named-functions-with-display-names.html (line 54:1)
-      0 iterations function named-functions-with-display-names.html (line 11:1)
-      1 iteration function named-functions-with-display-names.html (line 18:1)
-      2 iterations function named-functions-with-display-names.html (line 25:1)
-      20 iterations function named-functions-with-display-names.html (line 32:1)
-      1000 iterations function named-functions-with-display-names.html (line 39:1)
-      bogusDisplayNameFunction named-functions-with-display-names.html (line 47:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest named-functions-with-display-names.html (line 53:19)
+      0 iterations function named-functions-with-display-names.html (line 10:19)
+      1 iteration function named-functions-with-display-names.html (line 17:19)
+      2 iterations function named-functions-with-display-names.html (line 24:19)
+      20 iterations function named-functions-with-display-names.html (line 31:20)
+      1000 iterations function named-functions-with-display-names.html (line 38:22)
+      bogusDisplayNameFunction named-functions-with-display-names.html (line 46:34)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 078ec1a..d229a42 100644 (file)
@@ -4,14 +4,14 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Nested anonymous functions called
 Thread_1 (no file) (line 0:0)
-   startTest nested-anonymous-functon.html (line 11:1)
-      AnonymousFunctionWichCallsAnAnonymousFunction nested-anonymous-functon.html (line 14:68)
-         anonymousFunction profiler-test-JS-resources.js (line 29:37)
-            insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest nested-anonymous-functon.html (line 10:19)
+      AnonymousFunctionWichCallsAnAnonymousFunction nested-anonymous-functon.html (line 14:65)
+         anonymousFunction profiler-test-JS-resources.js (line 29:34)
+            insertNewText profiler-test-JS-resources.js (line 17:23)
                createElement (no file) (line 0:0)
                createTextNode (no file) (line 0:0)
                appendChild (no file) (line 0:0)
                getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 103bdca..2c48218 100644 (file)
@@ -4,35 +4,35 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Start the profiler the third time.
 Thread_1 (no file) (line 0:0)
-   startTest nested-start-and-stop-profiler.html (line 11:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest nested-start-and-stop-profiler.html (line 10:19)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
 Profile title: Start the profiler the third time.
 Thread_1 (no file) (line 0:0)
-   startTest nested-start-and-stop-profiler.html (line 11:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest nested-start-and-stop-profiler.html (line 10:19)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 Profile title: Start the profiler the second time.
 Thread_1 (no file) (line 0:0)
-   startTest nested-start-and-stop-profiler.html (line 11:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest nested-start-and-stop-profiler.html (line 10:19)
+      endTest profiler-test-JS-resources.js (line 1:17)
          profileEnd (no file) (line 0:0)
-         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 63:1)
+         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 62:38)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
-            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                replace (no file) (line 0:0)
                createTextNode (no file) (line 0:0)
                appendChild (no file) (line 0:0)
                children (no file) (line 0:0)
-               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                   replace (no file) (line 0:0)
                   createTextNode (no file) (line 0:0)
                   appendChild (no file) (line 0:0)
                   children (no file) (line 0:0)
-                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                      replace (no file) (line 0:0)
                      createTextNode (no file) (line 0:0)
                      appendChild (no file) (line 0:0)
@@ -43,29 +43,29 @@ Thread_1 (no file) (line 0:0)
 
 Profile title: Start the profiler the third time.
 Thread_1 (no file) (line 0:0)
-   startTest nested-start-and-stop-profiler.html (line 11:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest nested-start-and-stop-profiler.html (line 10:19)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 Profile title: Start the profiler the second time.
 Thread_1 (no file) (line 0:0)
-   startTest nested-start-and-stop-profiler.html (line 11:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest nested-start-and-stop-profiler.html (line 10:19)
+      endTest profiler-test-JS-resources.js (line 1:17)
          profileEnd (no file) (line 0:0)
-         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 63:1)
+         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 62:38)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
-            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                replace (no file) (line 0:0)
                createTextNode (no file) (line 0:0)
                appendChild (no file) (line 0:0)
                children (no file) (line 0:0)
-               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                   replace (no file) (line 0:0)
                   createTextNode (no file) (line 0:0)
                   appendChild (no file) (line 0:0)
                   children (no file) (line 0:0)
-                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                      replace (no file) (line 0:0)
                      createTextNode (no file) (line 0:0)
                      appendChild (no file) (line 0:0)
@@ -75,49 +75,49 @@ Thread_1 (no file) (line 0:0)
 
 Profile title: Start the profiler the first time.
 Thread_1 (no file) (line 0:0)
-   startTest nested-start-and-stop-profiler.html (line 11:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest nested-start-and-stop-profiler.html (line 10:19)
+      endTest profiler-test-JS-resources.js (line 1:17)
          profileEnd (no file) (line 0:0)
-         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 63:1)
+         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 62:38)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
-            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                replace (no file) (line 0:0)
                createTextNode (no file) (line 0:0)
                appendChild (no file) (line 0:0)
                children (no file) (line 0:0)
-               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                   replace (no file) (line 0:0)
                   createTextNode (no file) (line 0:0)
                   appendChild (no file) (line 0:0)
                   children (no file) (line 0:0)
-                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                      replace (no file) (line 0:0)
                      createTextNode (no file) (line 0:0)
                      appendChild (no file) (line 0:0)
                      children (no file) (line 0:0)
-                     printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                     printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                         replace (no file) (line 0:0)
                         createTextNode (no file) (line 0:0)
                         appendChild (no file) (line 0:0)
                         children (no file) (line 0:0)
-                        printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                        printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                            replace (no file) (line 0:0)
                            createTextNode (no file) (line 0:0)
                            appendChild (no file) (line 0:0)
                            children (no file) (line 0:0)
-                           printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                           printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                               replace (no file) (line 0:0)
                               createTextNode (no file) (line 0:0)
                               appendChild (no file) (line 0:0)
                               children (no file) (line 0:0)
-                              printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                              printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                                  replace (no file) (line 0:0)
                                  createTextNode (no file) (line 0:0)
                                  appendChild (no file) (line 0:0)
                                  children (no file) (line 0:0)
-                                 printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                                 printProfileNodeWithoutTime profiler-test-JS-resources.js (line 77:37)
                                     replace (no file) (line 0:0)
                                     createTextNode (no file) (line 0:0)
                                     appendChild (no file) (line 0:0)
index acdde43..f8dd670 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: One Execution Context
 Thread_1 (no file) (line 0:0)
-   startTest one-execution-context.html (line 11:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest one-execution-context.html (line 10:19)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 98c59dd..c42d171 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Profile call in included file
 Thread_1 (no file) (line 0:0)
-   startProfile profiler-test-JS-resources.js (line 43:1)
-   endTest profiler-test-JS-resources.js (line 1:20)
+   startProfile profiler-test-JS-resources.js (line 42:22)
+   endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 2fab800..18dacdb 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: 
 Thread_1 (no file) (line 0:0)
-   startTest profile-with-no-title.html (line 11:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest profile-with-no-title.html (line 10:19)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 58fce40..156a2b3 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Profiling From A Nested Location But Stop Profiling Outside The Nesting
 Thread_1 (no file) (line 0:0)
-   functionWichStartsTheProfiler profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting.html (line 17:1)
-   endTest profiler-test-JS-resources.js (line 1:20)
+   functionWichStartsTheProfiler profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting.html (line 16:39)
+   endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 13d9958..484283b 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Profiling From A Nested Location
 Thread_1 (no file) (line 0:0)
-   functionWichStartsAndStopsTheProfiler profiling-from-a-nested-location.html (line 16:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   functionWichStartsAndStopsTheProfiler profiling-from-a-nested-location.html (line 15:47)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index b6a8331..c4cee3d 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: A simple profile test where an event happens.
 Thread_1 (no file) (line 0:0)
-   startTest simple-event-call.html (line 11:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+   startTest simple-event-call.html (line 10:19)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 6afc34e..8bc38a5 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: A simple profile test where no scope chagnes
 Thread_1 (no file) (line 0:0)
-   functionWichStartsAndStopsTheProfiler simple-no-level-change.html (line 16:1)
+   functionWichStartsAndStopsTheProfiler simple-no-level-change.html (line 15:47)
       getElementById (no file) (line 0:0)
 
 
index 473dea4..281e4bf 100644 (file)
@@ -4,70 +4,70 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Start the profiler the first time.
 Thread_1 (no file) (line 0:0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest start-and-stop-profiler-multiple-times.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
 Profile title: Start the profiler the first time.
 Thread_1 (no file) (line 0:0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest start-and-stop-profiler-multiple-times.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 Profile title: Start the profiler the second time.
 Thread_1 (no file) (line 0:0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest start-and-stop-profiler-multiple-times.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
 Profile title: Start the profiler the first time.
 Thread_1 (no file) (line 0:0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest start-and-stop-profiler-multiple-times.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 Profile title: Start the profiler the second time.
 Thread_1 (no file) (line 0:0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest start-and-stop-profiler-multiple-times.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 Profile title: Start the profiler the third time.
 Thread_1 (no file) (line 0:0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
-      anonymousFunction profiler-test-JS-resources.js (line 29:37)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest start-and-stop-profiler-multiple-times.html (line 10:19)
+      anonymousFunction profiler-test-JS-resources.js (line 29:34)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index bffc653..7a8f5a6 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Profiling From A Nested Location
 Thread_1 (no file) (line 0:0)
-   startTest start-and-stop-profiling-in-the-same-function.html (line 11:1)
-      functionWichStopsTheProfiler start-and-stop-profiling-in-the-same-function.html (line 18:1)
+   startTest start-and-stop-profiling-in-the-same-function.html (line 10:19)
+      functionWichStopsTheProfiler start-and-stop-profiling-in-the-same-function.html (line 17:38)
 
 
index 2bd2916..b325da4 100644 (file)
@@ -4,10 +4,10 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Stop profiling from a timeout
 Thread_1 (no file) (line 0:0)
-   onload stop-profiling-after-setTimeout.html (line 21:52)
-      startTest stop-profiling-after-setTimeout.html (line 13:1)
+   onload stop-profiling-after-setTimeout.html (line 21:44)
+      startTest stop-profiling-after-setTimeout.html (line 12:19)
          setTimeout (no file) (line 0:0)
    (program) stop-profiling-after-setTimeout.html (line 1:1)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 07e8570..1c05045 100644 (file)
@@ -5,6 +5,6 @@ To run this test manually, load it in the browser then load the WebInspector and
 Profile title: Test
 Thread_1 (no file) (line 0:0)
    (program) (no file) (line 1:16)
-      test stop-then-function-call.html (line 11:20)
+      test stop-then-function-call.html (line 11:14)
 
 
index 102c081..01e9dd1 100644 (file)
@@ -4,8 +4,8 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Two Execution Contexts
 Thread_1 (no file) (line 0:0)
-   startTest two-execution-contexts.html (line 11:1)
-      intermediaryFunction two-execution-contexts.html (line 18:1)
-         testEnd two-execution-contexts.html (line 33:20)
+   startTest two-execution-contexts.html (line 10:19)
+      intermediaryFunction two-execution-contexts.html (line 17:30)
+         testEnd two-execution-contexts.html (line 33:17)
 
 
index f0c2e41..d6ce551 100644 (file)
@@ -6,11 +6,11 @@ This is inserted Text
 
 Profile title: User defined function calles built-in functions
 Thread_1 (no file) (line 0:0)
-   startTest user-defined-function-calls-built-in-functions.html (line 11:1)
+   startTest user-defined-function-calls-built-in-functions.html (line 10:19)
       createElement (no file) (line 0:0)
       createTextNode (no file) (line 0:0)
       appendChild (no file) (line 0:0)
       getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 8507288..dce88dc 100644 (file)
@@ -4,13 +4,13 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Call window.eval()
 Thread_1 (no file) (line 0:0)
-   startTest window-dot-eval.html (line 11:1)
-      evalFunction (no file) (line 1:25)
-         insertNewText profiler-test-JS-resources.js (line 17:26)
+   startTest window-dot-eval.html (line 10:19)
+      evalFunction (no file) (line 1:22)
+         insertNewText profiler-test-JS-resources.js (line 17:23)
             createElement (no file) (line 0:0)
             createTextNode (no file) (line 0:0)
             appendChild (no file) (line 0:0)
             getElementById (no file) (line 0:0)
-      endTest profiler-test-JS-resources.js (line 1:20)
+      endTest profiler-test-JS-resources.js (line 1:17)
 
 
index 279a6f8..ca955d3 100644 (file)
@@ -5,273 +5,273 @@ program { 23:9 - 23:50 }
 program { 23:68 - 23:109 }
 program { 25:9 - 26:1 }
 program { 27:13 - 28:1 }
-function "hf1" { 30:24 - 30:38 }
-function "hf2" { 31:28 - 31:42 }
-function "hf3" { 32:32 - 32:46 }
-function "hf4" { 34:24 - 36:9 }
-function "hf5" { 37:28 - 39:9 }
-function "hf6" { 40:32 - 42:9 }
-function "hf7" { 45:16 - 47:5 }
-function "hf8" { 49:35 - 49:45 }
-function "hf9" { 49:97 - 49:107 }
+function "hf1" { 30:21 - 30:38 }
+function "hf2" { 31:25 - 31:42 }
+function "hf3" { 32:29 - 32:46 }
+function "hf4" { 34:21 - 36:9 }
+function "hf5" { 37:25 - 39:9 }
+function "hf6" { 40:29 - 42:9 }
+function "hf7" { 45:13 - 47:5 }
+function "hf8" { 49:32 - 49:45 }
+function "hf9" { 49:94 - 49:107 }
 
 program { 1:1 - 474:1 }
 
   On first line:
-function "f0" { 1:115 - 1:266 }
-function "f0a" { 1:142 - 1:257 }
-function "f0b" { 1:170 - 1:248 }
+function "f0" { 1:112 - 1:266 }
+function "f0a" { 1:139 - 1:257 }
+function "f0b" { 1:167 - 1:248 }
 eval { 1:1 - 1:56 }
-function "x0" { 1:298 - 1:476 }
-function "x0a" { 1:330 - 1:466 }
-function "x0b" { 1:364 - 1:456 }
+function "x0" { 1:292 - 1:476 }
+function "x0a" { 1:327 - 1:466 }
+function "x0b" { 1:361 - 1:456 }
 eval { 1:1 - 1:56 }
 
   Functions Declarations in a function:
-function "f1" { 9:22 - 9:113 }
+function "f1" { 9:16 - 9:113 }
 eval { 1:1 - 1:56 }
-function "f2" { 12:22 - 16:5 }
-function "f2a" { 14:24 - 14:116 }
+function "f2" { 12:16 - 16:5 }
+function "f2a" { 14:21 - 14:116 }
 eval { 1:1 - 1:56 }
-function "f3" { 19:22 - 31:5 }
-function "f3a" { 21:24 - 29:9 }
-function "f3b" { 23:28 - 27:13 }
+function "f3" { 19:16 - 31:5 }
+function "f3a" { 21:21 - 29:9 }
+function "f3b" { 23:25 - 27:13 }
 eval { 1:1 - 1:56 }
-function "f4" { 34:22 - 34:71 }
-function "f4a" { 34:49 - 34:50 }
-function "f5" { 36:22 - 36:151 }
-function "f5a" { 36:49 - 36:141 }
+function "f4" { 34:16 - 34:71 }
+function "f4a" { 34:46 - 34:50 }
+function "f5" { 36:16 - 36:151 }
+function "f5a" { 36:46 - 36:141 }
 eval { 1:1 - 1:56 }
-function "f6" { 38:22 - 38:189 }
-function "f6a" { 38:49 - 38:179 }
-function "f6b" { 38:77 - 38:169 }
+function "f6" { 38:16 - 38:189 }
+function "f6a" { 38:46 - 38:179 }
+function "f6b" { 38:74 - 38:169 }
 eval { 1:1 - 1:56 }
 
   Indented Functions Declarations in a function:
-function "fi1" { 43:27 - 43:119 }
+function "fi1" { 43:21 - 43:119 }
 eval { 1:1 - 1:56 }
-function "fi2" { 46:27 - 50:9 }
-function "fi2a" { 48:29 - 48:122 }
+function "fi2" { 46:21 - 50:9 }
+function "fi2a" { 48:26 - 48:122 }
 eval { 1:1 - 1:56 }
-function "fi3" { 53:27 - 65:9 }
-function "fi3a" { 55:29 - 63:13 }
-function "fi3b" { 57:33 - 61:17 }
+function "fi3" { 53:21 - 65:9 }
+function "fi3a" { 55:26 - 63:13 }
+function "fi3b" { 57:30 - 61:17 }
 eval { 1:1 - 1:56 }
-function "fi4" { 68:27 - 68:80 }
-function "fi4a" { 68:56 - 68:57 }
-function "fi5" { 70:27 - 70:160 }
-function "fi5a" { 70:56 - 70:149 }
+function "fi4" { 68:21 - 68:80 }
+function "fi4a" { 68:53 - 68:57 }
+function "fi5" { 70:21 - 70:160 }
+function "fi5a" { 70:53 - 70:149 }
 eval { 1:1 - 1:56 }
-function "fi6" { 72:27 - 72:201 }
-function "fi6a" { 72:56 - 72:190 }
-function "fi6b" { 72:86 - 72:179 }
+function "fi6" { 72:21 - 72:201 }
+function "fi6a" { 72:53 - 72:190 }
+function "fi6b" { 72:83 - 72:179 }
 eval { 1:1 - 1:56 }
 
   Functions Expressions in a function:
-function "x1" { 77:28 - 77:119 }
+function "x1" { 77:22 - 77:119 }
 eval { 1:1 - 1:56 }
-function "x2" { 80:28 - 84:5 }
-function "x2a" { 82:30 - 82:122 }
+function "x2" { 80:22 - 84:5 }
+function "x2a" { 82:27 - 82:122 }
 eval { 1:1 - 1:56 }
-function "x3" { 87:28 - 99:5 }
-function "x3a" { 89:30 - 97:9 }
-function "x3b" { 91:34 - 95:13 }
+function "x3" { 87:22 - 99:5 }
+function "x3a" { 89:27 - 97:9 }
+function "x3b" { 91:31 - 95:13 }
 eval { 1:1 - 1:56 }
-function "x4" { 102:28 - 102:83 }
-function "x4a" { 102:61 - 102:62 }
-function "x5" { 104:28 - 104:163 }
-function "x5a" { 104:61 - 104:153 }
+function "x4" { 102:22 - 102:83 }
+function "x4a" { 102:58 - 102:62 }
+function "x5" { 104:22 - 104:163 }
+function "x5a" { 104:58 - 104:153 }
 eval { 1:1 - 1:56 }
-function "x6" { 106:28 - 106:207 }
-function "x6a" { 106:61 - 106:197 }
-function "x6b" { 106:95 - 106:187 }
+function "x6" { 106:22 - 106:207 }
+function "x6a" { 106:58 - 106:197 }
+function "x6b" { 106:92 - 106:187 }
 eval { 1:1 - 1:56 }
 
   Indented Functions Expressions in a function:
-function "xi1" { 111:33 - 111:125 }
+function "xi1" { 111:27 - 111:125 }
 eval { 1:1 - 1:56 }
-function "xi2" { 114:33 - 118:9 }
-function "xi2a" { 116:35 - 116:128 }
+function "xi2" { 114:27 - 118:9 }
+function "xi2a" { 116:32 - 116:128 }
 eval { 1:1 - 1:56 }
-function "xi3" { 121:33 - 133:9 }
-function "xi3a" { 123:35 - 131:13 }
-function "xi3b" { 125:39 - 129:17 }
+function "xi3" { 121:27 - 133:9 }
+function "xi3a" { 123:32 - 131:13 }
+function "xi3b" { 125:36 - 129:17 }
 eval { 1:1 - 1:56 }
-function "xi4" { 136:33 - 136:92 }
-function "xi4a" { 136:68 - 136:69 }
-function "xi5" { 138:33 - 138:172 }
-function "xi5a" { 138:68 - 138:161 }
+function "xi4" { 136:27 - 136:92 }
+function "xi4a" { 136:65 - 136:69 }
+function "xi5" { 138:27 - 138:172 }
+function "xi5a" { 138:65 - 138:161 }
 eval { 1:1 - 1:56 }
-function "xi6" { 140:33 - 140:219 }
-function "xi6a" { 140:68 - 140:208 }
-function "xi6b" { 140:104 - 140:197 }
+function "xi6" { 140:27 - 140:219 }
+function "xi6a" { 140:65 - 140:208 }
+function "xi6b" { 140:101 - 140:197 }
 eval { 1:1 - 1:56 }
 
   Anonymous Function Declaration in a function:
-function "" { 146:58 - 151:5 }
+function "" { 146:52 - 151:5 }
 eval { 1:1 - 1:56 }
 
   Global eval:
 eval { 1:1 - 1:56 }
 
   Global Functions Declarations:
-function "gf1" { 161:19 - 161:111 }
+function "gf1" { 161:13 - 161:111 }
 eval { 1:1 - 1:56 }
-function "gf2" { 164:19 - 168:1 }
-function "gf2a" { 166:21 - 166:114 }
+function "gf2" { 164:13 - 168:1 }
+function "gf2a" { 166:18 - 166:114 }
 eval { 1:1 - 1:56 }
-function "gf3" { 171:19 - 183:1 }
-function "gf3a" { 173:21 - 181:5 }
-function "gf3b" { 175:25 - 179:9 }
+function "gf3" { 171:13 - 183:1 }
+function "gf3a" { 173:18 - 181:5 }
+function "gf3b" { 175:22 - 179:9 }
 eval { 1:1 - 1:56 }
-function "gf4" { 186:19 - 186:72 }
-function "gf4a" { 186:48 - 186:49 }
-function "gf5" { 188:19 - 188:152 }
-function "gf5a" { 188:48 - 188:141 }
+function "gf4" { 186:13 - 186:72 }
+function "gf4a" { 186:45 - 186:49 }
+function "gf5" { 188:13 - 188:152 }
+function "gf5a" { 188:45 - 188:141 }
 eval { 1:1 - 1:56 }
-function "gf6" { 190:19 - 190:193 }
-function "gf6a" { 190:48 - 190:182 }
-function "gf6b" { 190:78 - 190:171 }
+function "gf6" { 190:13 - 190:193 }
+function "gf6a" { 190:45 - 190:182 }
+function "gf6b" { 190:75 - 190:171 }
 eval { 1:1 - 1:56 }
 
   Indented Global Functions Declarations:
-function "gfi1" { 195:24 - 195:117 }
+function "gfi1" { 195:18 - 195:117 }
 eval { 1:1 - 1:56 }
-function "gfi2" { 198:24 - 202:5 }
-function "gfi2a" { 200:26 - 200:120 }
+function "gfi2" { 198:18 - 202:5 }
+function "gfi2a" { 200:23 - 200:120 }
 eval { 1:1 - 1:56 }
-function "gfi3" { 205:24 - 217:5 }
-function "gfi3a" { 207:26 - 215:9 }
-function "gfi3b" { 209:30 - 213:13 }
+function "gfi3" { 205:18 - 217:5 }
+function "gfi3a" { 207:23 - 215:9 }
+function "gfi3b" { 209:27 - 213:13 }
 eval { 1:1 - 1:56 }
-function "gfi4" { 220:24 - 220:81 }
-function "gfi4a" { 220:55 - 220:56 }
-function "gfi5" { 222:24 - 222:161 }
-function "gfi5a" { 222:55 - 222:149 }
+function "gfi4" { 220:18 - 220:81 }
+function "gfi4a" { 220:52 - 220:56 }
+function "gfi5" { 222:18 - 222:161 }
+function "gfi5a" { 222:52 - 222:149 }
 eval { 1:1 - 1:56 }
-function "gfi6" { 224:24 - 224:205 }
-function "gfi6a" { 224:55 - 224:193 }
-function "gfi6b" { 224:87 - 224:181 }
+function "gfi6" { 224:18 - 224:205 }
+function "gfi6a" { 224:52 - 224:193 }
+function "gfi6b" { 224:84 - 224:181 }
 eval { 1:1 - 1:56 }
 
   Global Functions Expressions:
-function "gx1" { 229:25 - 229:117 }
+function "gx1" { 229:19 - 229:117 }
 eval { 1:1 - 1:56 }
-function "gx2" { 232:25 - 236:1 }
-function "gx2a" { 234:27 - 234:120 }
+function "gx2" { 232:19 - 236:1 }
+function "gx2a" { 234:24 - 234:120 }
 eval { 1:1 - 1:56 }
-function "gx3" { 239:25 - 251:1 }
-function "gx3a" { 241:27 - 249:5 }
-function "gx3b" { 243:31 - 247:9 }
+function "gx3" { 239:19 - 251:1 }
+function "gx3a" { 241:24 - 249:5 }
+function "gx3b" { 243:28 - 247:9 }
 eval { 1:1 - 1:56 }
-function "gx4" { 254:25 - 254:84 }
-function "gx4a" { 254:60 - 254:61 }
-function "gx5" { 256:25 - 256:164 }
-function "gx5a" { 256:60 - 256:153 }
+function "gx4" { 254:19 - 254:84 }
+function "gx4a" { 254:57 - 254:61 }
+function "gx5" { 256:19 - 256:164 }
+function "gx5a" { 256:57 - 256:153 }
 eval { 1:1 - 1:56 }
-function "gx6" { 258:25 - 258:211 }
-function "gx6a" { 258:60 - 258:200 }
-function "gx6b" { 258:96 - 258:189 }
+function "gx6" { 258:19 - 258:211 }
+function "gx6a" { 258:57 - 258:200 }
+function "gx6b" { 258:93 - 258:189 }
 eval { 1:1 - 1:56 }
 
   Indented Functions Declarations:
-function "gxi1" { 263:30 - 263:123 }
+function "gxi1" { 263:24 - 263:123 }
 eval { 1:1 - 1:56 }
-function "gxi2" { 266:30 - 270:5 }
-function "gxi2a" { 268:32 - 268:126 }
+function "gxi2" { 266:24 - 270:5 }
+function "gxi2a" { 268:29 - 268:126 }
 eval { 1:1 - 1:56 }
-function "gxi3" { 273:30 - 285:5 }
-function "gxi3a" { 275:32 - 283:9 }
-function "gxi3b" { 277:36 - 281:13 }
+function "gxi3" { 273:24 - 285:5 }
+function "gxi3a" { 275:29 - 283:9 }
+function "gxi3b" { 277:33 - 281:13 }
 eval { 1:1 - 1:56 }
-function "gxi4" { 288:30 - 288:93 }
-function "gxi4a" { 288:67 - 288:68 }
-function "gxi5" { 290:30 - 290:173 }
-function "gxi5a" { 290:67 - 290:161 }
+function "gxi4" { 288:24 - 288:93 }
+function "gxi4a" { 288:64 - 288:68 }
+function "gxi5" { 290:24 - 290:173 }
+function "gxi5a" { 290:64 - 290:161 }
 eval { 1:1 - 1:56 }
-function "gxi6" { 292:30 - 292:223 }
-function "gxi6a" { 292:67 - 292:211 }
-function "gxi6b" { 292:105 - 292:199 }
+function "gxi6" { 292:24 - 292:223 }
+function "gxi6a" { 292:64 - 292:211 }
+function "gxi6b" { 292:102 - 292:199 }
 eval { 1:1 - 1:56 }
 
   Anonymous Global Function Declarations:
-function "" { 299:56 - 304:1 }
+function "" { 299:50 - 304:1 }
 eval { 1:1 - 1:56 }
 
   Function Declarations in an eval:
 eval { 1:1 - 16:7 }
-function "ef1" { 3:20 - 14:5 }
-function "ef1a" { 5:25 - 12:9 }
-function "ef1b" { 7:29 - 10:13 }
+function "ef1" { 3:17 - 14:5 }
+function "ef1a" { 5:22 - 12:9 }
+function "ef1b" { 7:26 - 10:13 }
 eval { 1:1 - 1:56 }
 eval { 1:1 - 1:225 }
-function "ef2" { 1:59 - 1:217 }
-function "ef2a" { 1:88 - 1:207 }
-function "ef2b" { 1:118 - 1:197 }
+function "ef2" { 1:56 - 1:217 }
+function "ef2a" { 1:85 - 1:207 }
+function "ef2b" { 1:115 - 1:197 }
 eval { 1:1 - 1:56 }
 eval { 1:1 - 17:8 }
-function "efi1" { 4:21 - 15:5 }
-function "efi1a" { 6:26 - 13:9 }
-function "efi1b" { 8:30 - 11:13 }
+function "efi1" { 4:18 - 15:5 }
+function "efi1a" { 6:23 - 13:9 }
+function "efi1b" { 8:27 - 11:13 }
 eval { 1:1 - 1:56 }
 eval { 1:1 - 1:234 }
-function "efi2" { 1:60 - 1:225 }
-function "efi2a" { 1:91 - 1:214 }
-function "efi2b" { 1:123 - 1:203 }
+function "efi2" { 1:57 - 1:225 }
+function "efi2a" { 1:88 - 1:214 }
+function "efi2b" { 1:120 - 1:203 }
 eval { 1:1 - 1:56 }
 
   Function Expressions in an eval:
 eval { 1:1 - 16:7 }
-function "ex1" { 3:26 - 14:5 }
-function "ex1a" { 5:31 - 12:9 }
-function "ex1b" { 7:35 - 10:13 }
+function "ex1" { 3:23 - 14:5 }
+function "ex1a" { 5:28 - 12:9 }
+function "ex1b" { 7:32 - 10:13 }
 eval { 1:1 - 1:56 }
 eval { 1:1 - 1:246 }
-function "ex2" { 1:65 - 1:237 }
-function "ex2a" { 1:100 - 1:226 }
-function "ex2b" { 1:136 - 1:215 }
+function "ex2" { 1:62 - 1:237 }
+function "ex2a" { 1:97 - 1:226 }
+function "ex2b" { 1:133 - 1:215 }
 eval { 1:1 - 1:56 }
 eval { 1:1 - 17:8 }
-function "exi1" { 4:27 - 15:5 }
-function "exi1a" { 6:32 - 13:9 }
-function "exi1b" { 8:36 - 11:13 }
+function "exi1" { 4:24 - 15:5 }
+function "exi1a" { 6:29 - 13:9 }
+function "exi1b" { 8:33 - 11:13 }
 eval { 1:1 - 1:56 }
 eval { 1:1 - 1:255 }
-function "exi2" { 1:66 - 1:245 }
-function "exi2a" { 1:103 - 1:233 }
-function "exi2b" { 1:141 - 1:221 }
+function "exi2" { 1:63 - 1:245 }
+function "exi2a" { 1:100 - 1:233 }
+function "exi2b" { 1:138 - 1:221 }
 eval { 1:1 - 1:56 }
 
   new Function Object:
-function "anonymous" { 1:27 - 2:228 }
-function "nf1a" { 2:60 - 2:219 }
-function "nf1b" { 2:90 - 2:209 }
-function "nf1c" { 2:120 - 2:199 }
-eval { 1:1 - 1:56 }
-function "anonymous" { 1:27 - 18:8 }
-function "nf2a" { 5:21 - 16:5 }
-function "nf2b" { 7:25 - 14:9 }
-function "nf2c" { 9:29 - 12:13 }
-eval { 1:1 - 1:56 }
-function "anonymous" { 1:27 - 2:228 }
-function "nf1a" { 2:60 - 2:219 }
-function "nf1b" { 2:90 - 2:209 }
-function "nf1c" { 2:120 - 2:199 }
-eval { 1:1 - 1:56 }
-function "anonymous" { 1:27 - 2:237 }
-function "nfi1a" { 2:61 - 2:227 }
-function "nfi1b" { 2:93 - 2:216 }
-function "nfi1c" { 2:125 - 2:205 }
-eval { 1:1 - 1:56 }
-function "anonymous" { 1:27 - 18:8 }
-function "nf2a" { 5:21 - 16:5 }
-function "nf2b" { 7:25 - 14:9 }
-function "nf2c" { 9:29 - 12:13 }
-eval { 1:1 - 1:56 }
-function "anonymous" { 1:27 - 18:9 }
-function "nfi2a" { 5:22 - 16:5 }
-function "nfi2b" { 7:26 - 14:9 }
-function "nfi2c" { 9:30 - 12:13 }
+function "anonymous" { 1:20 - 2:228 }
+function "nf1a" { 2:57 - 2:219 }
+function "nf1b" { 2:87 - 2:209 }
+function "nf1c" { 2:117 - 2:199 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:20 - 18:8 }
+function "nf2a" { 5:18 - 16:5 }
+function "nf2b" { 7:22 - 14:9 }
+function "nf2c" { 9:26 - 12:13 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:20 - 2:228 }
+function "nf1a" { 2:57 - 2:219 }
+function "nf1b" { 2:87 - 2:209 }
+function "nf1c" { 2:117 - 2:199 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:20 - 2:237 }
+function "nfi1a" { 2:58 - 2:227 }
+function "nfi1b" { 2:90 - 2:216 }
+function "nfi1c" { 2:122 - 2:205 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:20 - 18:8 }
+function "nf2a" { 5:18 - 16:5 }
+function "nf2b" { 7:22 - 14:9 }
+function "nf2c" { 9:26 - 12:13 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:20 - 18:9 }
+function "nfi2a" { 5:19 - 16:5 }
+function "nfi2b" { 7:23 - 14:9 }
+function "nfi2c" { 9:27 - 12:13 }
 eval { 1:1 - 1:56 }
 
 PASS successfullyParsed is true
index a7baf14..c20af6d 100644 (file)
@@ -70,7 +70,7 @@ private:
 static bool parseScript(VM* vm, const SourceCode& source, ParserError& error)
 {
     return !!JSC::parse<JSC::ProgramNode>(
-        vm, source, 0, Identifier(), JSParserBuiltinMode::NotBuiltin, 
+        vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin, 
         JSParserStrictMode::NotStrict, JSParserCodeType::Program, 
         error);
 }
index de4102b..aafdf99 100644 (file)
@@ -1,3 +1,212 @@
+2015-07-17  Saam barati  <saambarati1@gmail.com>
+
+        Function parameters should be parsed in the same parser arena as the function body
+        https://bugs.webkit.org/show_bug.cgi?id=145995
+
+        Reviewed by Yusuke Suzuki.
+
+        This patch changes how functions are parsed in JSC. A function's
+        parameters are now parsed in the same arena as the function itself.
+        This allows us to arena allocate all destructuring AST nodes and
+        the FunctionParameters node. This will help make implementing ES6
+        default parameter values sane.
+
+        A source code that represents a function now includes the text of the function's 
+        parameters. The starting offset is at the opening parenthesis of the parameter
+        list or at the starting character of the identifier for arrow functions that
+        have single arguments and don't start with parenthesis.
+
+        For example:
+
+        "function (param1, param2) { ... }"
+                                   ^
+                                   | This offset used to be the starting offset of a function's SourceCode
+                  ^
+                  | This is the new starting offset for a function's SourceCode.
+
+        This requires us to change how some offsets are calculated
+        and also requires us to report some different line numbers for internal
+        metrics that use a SourceCode's starting line and column numbers.
+
+        This patch also does a bit of cleanup with regards to how
+        functions are parsed in general (especially arrow functions).
+        It removes some unnecessary #ifdefs and the likes for arrow
+        to make things clearer and more deliberate.
+
+        * API/JSScriptRef.cpp:
+        (parseScript):
+        * builtins/BuiltinExecutables.cpp:
+        (JSC::BuiltinExecutables::createExecutableInternal):
+        * bytecode/UnlinkedCodeBlock.cpp:
+        (JSC::generateFunctionCodeBlock):
+        (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
+        (JSC::UnlinkedFunctionExecutable::visitChildren):
+        (JSC::UnlinkedFunctionExecutable::parameterCount): Deleted.
+        * bytecode/UnlinkedCodeBlock.h:
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::DestructuringAssignmentNode::emitBytecode):
+        (JSC::assignDefaultValueIfUndefined):
+        (JSC::ArrayPatternNode::collectBoundIdentifiers):
+        (JSC::DestructuringPatternNode::~DestructuringPatternNode): Deleted.
+        * parser/ASTBuilder.h:
+        (JSC::ASTBuilder::createClassExpr):
+        (JSC::ASTBuilder::createFunctionExpr):
+        (JSC::ASTBuilder::createFunctionBody):
+        (JSC::ASTBuilder::createArrowFunctionExpr):
+        (JSC::ASTBuilder::createGetterOrSetterProperty):
+        (JSC::ASTBuilder::createElementList):
+        (JSC::ASTBuilder::createFormalParameterList):
+        (JSC::ASTBuilder::appendParameter):
+        (JSC::ASTBuilder::createClause):
+        (JSC::ASTBuilder::createClauseList):
+        (JSC::ASTBuilder::createFuncDeclStatement):
+        (JSC::ASTBuilder::createForInLoop):
+        (JSC::ASTBuilder::createForOfLoop):
+        (JSC::ASTBuilder::isResolve):
+        (JSC::ASTBuilder::createDestructuringAssignment):
+        (JSC::ASTBuilder::createArrayPattern):
+        (JSC::ASTBuilder::appendArrayPatternSkipEntry):
+        (JSC::ASTBuilder::appendArrayPatternEntry):
+        (JSC::ASTBuilder::appendArrayPatternRestEntry):
+        (JSC::ASTBuilder::finishArrayPattern):
+        (JSC::ASTBuilder::createObjectPattern):
+        (JSC::ASTBuilder::appendObjectPatternEntry):
+        (JSC::ASTBuilder::createBindingLocation):
+        (JSC::ASTBuilder::setEndOffset):
+        * parser/Lexer.cpp:
+        (JSC::Lexer<T>::Lexer):
+        (JSC::Lexer<T>::nextTokenIsColon):
+        (JSC::Lexer<T>::setTokenPosition):
+        (JSC::Lexer<T>::lex):
+        (JSC::Lexer<T>::clear):
+        * parser/Lexer.h:
+        (JSC::Lexer::setIsReparsingFunction):
+        (JSC::Lexer::isReparsingFunction):
+        (JSC::Lexer::lineNumber):
+        (JSC::Lexer::setIsReparsing): Deleted.
+        (JSC::Lexer::isReparsing): Deleted.
+        * parser/NodeConstructors.h:
+        (JSC::TryNode::TryNode):
+        (JSC::FunctionParameters::FunctionParameters):
+        (JSC::FuncExprNode::FuncExprNode):
+        (JSC::FuncDeclNode::FuncDeclNode):
+        (JSC::ArrayPatternNode::ArrayPatternNode):
+        (JSC::ObjectPatternNode::ObjectPatternNode):
+        (JSC::BindingNode::BindingNode):
+        (JSC::DestructuringAssignmentNode::DestructuringAssignmentNode):
+        (JSC::ParameterNode::ParameterNode): Deleted.
+        (JSC::ArrayPatternNode::create): Deleted.
+        (JSC::ObjectPatternNode::create): Deleted.
+        (JSC::BindingNode::create): Deleted.
+        * parser/Nodes.cpp:
+        (JSC::ProgramNode::ProgramNode):
+        (JSC::EvalNode::EvalNode):
+        (JSC::FunctionBodyNode::FunctionBodyNode):
+        (JSC::FunctionBodyNode::finishParsing):
+        (JSC::FunctionNode::FunctionNode):
+        (JSC::FunctionNode::finishParsing):
+        (JSC::FunctionParameters::create): Deleted.
+        (JSC::FunctionParameters::FunctionParameters): Deleted.
+        (JSC::FunctionParameters::~FunctionParameters): Deleted.
+        * parser/Nodes.h:
+        (JSC::ProgramNode::startColumn):
+        (JSC::ProgramNode::endColumn):
+        (JSC::EvalNode::startColumn):
+        (JSC::EvalNode::endColumn):
+        (JSC::FunctionParameters::size):
+        (JSC::FunctionParameters::at):
+        (JSC::FunctionParameters::append):
+        (JSC::FuncExprNode::body):
+        (JSC::DestructuringPatternNode::~DestructuringPatternNode):
+        (JSC::DestructuringPatternNode::isBindingNode):
+        (JSC::DestructuringPatternNode::emitDirectBinding):
+        (JSC::ArrayPatternNode::appendIndex):
+        (JSC::ObjectPatternNode::appendEntry):
+        (JSC::BindingNode::boundProperty):
+        (JSC::BindingNode::divotStart):
+        (JSC::BindingNode::divotEnd):
+        (JSC::DestructuringAssignmentNode::bindings):
+        (JSC::FuncDeclNode::body):
+        (JSC::ParameterNode::pattern): Deleted.
+        (JSC::ParameterNode::nextParam): Deleted.
+        (JSC::FunctionParameters::patterns): Deleted.
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::Parser):
+        (JSC::Parser<LexerType>::~Parser):
+        (JSC::Parser<LexerType>::parseInner):
+        (JSC::Parser<LexerType>::allowAutomaticSemicolon):
+        (JSC::Parser<LexerType>::parseSourceElements):
+        (JSC::Parser<LexerType>::createBindingPattern):
+        (JSC::Parser<LexerType>::parseArrowFunctionSingleExpressionBodySourceElements):
+        (JSC::Parser<LexerType>::tryParseDestructuringPatternExpression):
+        (JSC::Parser<LexerType>::parseSwitchClauses):
+        (JSC::Parser<LexerType>::parseSwitchDefaultClause):
+        (JSC::Parser<LexerType>::parseBlockStatement):
+        (JSC::Parser<LexerType>::parseStatement):
+        (JSC::Parser<LexerType>::parseFormalParameters):
+        (JSC::Parser<LexerType>::parseFunctionBody):
+        (JSC::stringForFunctionMode):
+        (JSC::Parser<LexerType>::parseFunctionParameters):
+        (JSC::Parser<LexerType>::parseFunctionInfo):
+        (JSC::Parser<LexerType>::parseFunctionDeclaration):
+        (JSC::Parser<LexerType>::parseClass):
+        (JSC::Parser<LexerType>::parsePrimaryExpression):
+        (JSC::Parser<LexerType>::parseMemberExpression):
+        (JSC::Parser<LexerType>::parseArrowFunctionExpression):
+        (JSC::operatorString):
+        (JSC::Parser<LexerType>::parseArrowFunctionSingleExpressionBody): Deleted.
+        * parser/Parser.h:
+        (JSC::Parser::positionBeforeLastNewline):
+        (JSC::Parser::locationBeforeLastToken):
+        (JSC::Parser::findCachedFunctionInfo):
+        (JSC::Parser::isofToken):
+        (JSC::Parser::isEndOfArrowFunction):
+        (JSC::Parser::isArrowFunctionParamters):
+        (JSC::Parser::tokenStart):
+        (JSC::Parser::isLETMaskedAsIDENT):
+        (JSC::Parser::autoSemiColon):
+        (JSC::Parser::setEndOfStatement):
+        (JSC::Parser::canRecurse):
+        (JSC::Parser<LexerType>::parse):
+        (JSC::parse):
+        * parser/ParserFunctionInfo.h:
+        * parser/ParserModes.h:
+        (JSC::functionNameIsInScope):
+        * parser/SourceCode.h:
+        (JSC::makeSource):
+        (JSC::SourceCode::subExpression):
+        (JSC::SourceCode::subArrowExpression): Deleted.
+        * parser/SourceProviderCache.h:
+        (JSC::SourceProviderCache::get):
+        * parser/SourceProviderCacheItem.h:
+        (JSC::SourceProviderCacheItem::endFunctionToken):
+        (JSC::SourceProviderCacheItem::usedVariables):
+        (JSC::SourceProviderCacheItem::writtenVariables):
+        (JSC::SourceProviderCacheItem::SourceProviderCacheItem):
+        * parser/SyntaxChecker.h:
+        (JSC::SyntaxChecker::SyntaxChecker):
+        (JSC::SyntaxChecker::createClassExpr):
+        (JSC::SyntaxChecker::createFunctionExpr):
+        (JSC::SyntaxChecker::createFunctionBody):
+        (JSC::SyntaxChecker::createArrowFunctionExpr):
+        (JSC::SyntaxChecker::setFunctionNameStart):
+        (JSC::SyntaxChecker::createArguments):
+        (JSC::SyntaxChecker::createPropertyList):
+        (JSC::SyntaxChecker::createElementList):
+        (JSC::SyntaxChecker::createFormalParameterList):
+        (JSC::SyntaxChecker::appendParameter):
+        (JSC::SyntaxChecker::createClause):
+        (JSC::SyntaxChecker::createClauseList):
+        * runtime/CodeCache.cpp:
+        (JSC::CodeCache::getGlobalCodeBlock):
+        (JSC::CodeCache::getFunctionExecutableFromGlobalCode):
+        * runtime/Completion.cpp:
+        (JSC::checkSyntax):
+        * runtime/Executable.cpp:
+        (JSC::ProgramExecutable::checkSyntax):
+        * tests/controlFlowProfiler/conditional-expression.js:
+        (testConditionalFunctionCall):
+
 2015-07-16  Filip Pizlo  <fpizlo@apple.com>
 
         Unreviewed, fix build for newer LLVMs.
index 40abe02..be224dd 100644 (file)
@@ -69,10 +69,9 @@ UnlinkedFunctionExecutable* BuiltinExecutables::createExecutableInternal(const S
     UnlinkedFunctionKind kind = isParsingDefaultConstructor ? UnlinkedNormalFunction : UnlinkedBuiltinFunction;
     RefPtr<SourceProvider> sourceOverride = isParsingDefaultConstructor ? source.provider() : nullptr;
     std::unique_ptr<ProgramNode> program = parse<ProgramNode>(
-        &m_vm, source, 0, Identifier(), builtinMode, 
-        JSParserStrictMode::NotStrict, 
-        JSParserCodeType::Program,
-        error, &positionBeforeLastNewline, constructorKind);
+        &m_vm, source, Identifier(), builtinMode, 
+        JSParserStrictMode::NotStrict, JSParserCodeType::Program, error, 
+        &positionBeforeLastNewline, FunctionParseMode::NotAFunctionMode, constructorKind);
 
     if (!program) {
         dataLog("Fatal error compiling builtin function '", name.string(), "': ", error.message());
index e8849bf..0e1c8fb 100644 (file)
@@ -60,15 +60,15 @@ static UnlinkedFunctionCodeBlock* generateFunctionCodeBlock(
     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);
+        &vm, source, executable->name(), builtinMode, strictMode, 
+        JSParserCodeType::Function, error, nullptr, executable->parseMode());
 
     if (!function) {
         ASSERT(error.isValid());
         return nullptr;
     }
 
-    function->finishParsing(executable->parameters(), executable->name(), executable->functionMode());
+    function->finishParsing(executable->name(), executable->functionMode());
     executable->recordParse(function->features(), function->hasCapturedVariables());
     
     UnlinkedFunctionCodeBlock* result = UnlinkedFunctionCodeBlock::create(&vm, FunctionCode,
@@ -84,7 +84,6 @@ UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* struct
     : 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())
@@ -96,6 +95,8 @@ UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* struct
     , 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)
@@ -107,11 +108,6 @@ UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* struct
     m_parentScopeTDZVariables.swap(parentScopeTDZVariables);
 }
 
-size_t UnlinkedFunctionExecutable::parameterCount() const
-{
-    return m_parameters->size();
-}
-
 void UnlinkedFunctionExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor)
 {
     UnlinkedFunctionExecutable* thisObject = jsCast<UnlinkedFunctionExecutable*>(cell);
index a6a9a21..550a024 100644 (file)
@@ -49,7 +49,6 @@ namespace JSC {
 class Debugger;
 class FunctionBodyNode;
 class FunctionExecutable;
-class FunctionParameters;
 class JSScope;
 class ParserError;
 class ScriptExecutable;
@@ -123,7 +122,8 @@ public:
     {
         return (kind == CodeForCall) ? m_symbolTableForCall.get() : m_symbolTableForConstruct.get();
     }
-    size_t parameterCount() const;
+    unsigned parameterCount() const { return m_parameterCount; };
+    FunctionParseMode parseMode() const { return m_parseMode; };
     bool isInStrictContext() const { return m_isInStrictContext; }
     FunctionMode functionMode() const { return static_cast<FunctionMode>(m_functionMode); }
     ConstructorKind constructorKind() const { return static_cast<ConstructorKind>(m_constructorKind); }
@@ -155,8 +155,6 @@ public:
         m_codeBlockForConstruct.clear();
     }
 
-    FunctionParameters* parameters() { return m_parameters.get(); }
-
     void recordParse(CodeFeatures features, bool hasCapturedVariables)
     {
         m_features = features;
@@ -183,7 +181,6 @@ private:
     WriteBarrier<JSString> m_nameValue;
     WriteBarrier<SymbolTable> m_symbolTableForCall;
     WriteBarrier<SymbolTable> m_symbolTableForConstruct;
-    RefPtr<FunctionParameters> m_parameters;
     RefPtr<SourceProvider> m_sourceOverride;
     VariableEnvironment m_parentScopeTDZVariables;
     unsigned m_firstLineOffset;
@@ -196,6 +193,8 @@ private:
     unsigned m_parametersStartOffset;
     unsigned m_typeProfilingStartOffset;
     unsigned m_typeProfilingEndOffset;
+    unsigned m_parameterCount;
+    FunctionParseMode m_parseMode;
 
     CodeFeatures m_features;
 
index 6cb5486..a8aff9f 100644 (file)
@@ -3189,10 +3189,6 @@ RegisterID* DestructuringAssignmentNode::emitBytecode(BytecodeGenerator& generat
     return generator.moveToDestinationIfNeeded(dst, initializer.get());
 }
 
-DestructuringPatternNode::~DestructuringPatternNode()
-{
-}
-
 static void assignDefaultValueIfUndefined(BytecodeGenerator& generator, RegisterID* maybeUndefined, ExpressionNode* defaultValue)
 {
     ASSERT(defaultValue);
@@ -3350,7 +3346,7 @@ void ArrayPatternNode::toString(StringBuilder& builder) const
 void ArrayPatternNode::collectBoundIdentifiers(Vector<Identifier>& identifiers) const
 {
     for (size_t i = 0; i < m_targetPatterns.size(); i++) {
-        if (DestructuringPatternNode* node = m_targetPatterns[i].pattern.get())
+        if (DestructuringPatternNode* node = m_targetPatterns[i].pattern)
             node->collectBoundIdentifiers(identifiers);
     }
 }
index 766aac1..c75d811 100644 (file)
@@ -94,8 +94,6 @@ public:
     };
 
 
-    typedef SyntaxChecker FunctionBodyBuilder;
-
     typedef ExpressionNode* Expression;
     typedef JSC::SourceElements* SourceElements;
     typedef ArgumentsNode* Arguments;
@@ -110,7 +108,7 @@ public:
     typedef TemplateStringListNode* TemplateStringList;
     typedef TemplateLiteralNode* TemplateLiteral;
 #endif
-    typedef ParameterNode* FormalParameterList;
+    typedef FunctionParameters* FormalParameterList;
     typedef FunctionBodyNode* FunctionBody;
 #if ENABLE(ES6_CLASS_SYNTAX)
     typedef ClassExprNode* ClassExpression;
@@ -120,10 +118,10 @@ public:
     typedef CaseClauseNode* Clause;
     typedef ConstDeclNode* ConstDeclList;
     typedef std::pair<ExpressionNode*, BinaryOpInfo> BinaryOperand;
-    typedef RefPtr<DestructuringPatternNode> DestructuringPattern;
-    typedef RefPtr<ArrayPatternNode> ArrayPattern;
-    typedef RefPtr<ObjectPatternNode> ObjectPattern;
-    typedef RefPtr<BindingNode> BindingPattern;
+    typedef DestructuringPatternNode* DestructuringPattern;
+    typedef ArrayPatternNode* ArrayPattern;
+    typedef ObjectPatternNode* ObjectPattern;
+    typedef BindingNode* BindingPattern;
     static const bool CreatesAST = true;
     static const bool NeedsFreeVariableInfo = true;
     static const bool CanUseFunctionCache = true;
@@ -344,11 +342,11 @@ public:
     }
 #endif
 
-    ExpressionNode* createFunctionExpr(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& info)
+    ExpressionNode* createFunctionExpr(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& functionInfo)
     {
-        FuncExprNode* result = new (m_parserArena) FuncExprNode(location, *info.name, info.body,
-            m_sourceCode->subExpression(info.startFunctionOffset, info.endFunctionOffset, info.bodyStartLine, info.bodyStartColumn), info.parameters);
-        info.body->setLoc(info.bodyStartLine, info.bodyEndLine, location.startOffset, location.lineStartOffset);
+        FuncExprNode* result = new (m_parserArena) FuncExprNode(location, *functionInfo.name, functionInfo.body,
+            m_sourceCode->subExpression(functionInfo.startOffset, functionInfo.endOffset, functionInfo.startLine, functionInfo.bodyStartColumn));
+        functionInfo.body->setLoc(functionInfo.startLine, functionInfo.endLine, location.startOffset, location.lineStartOffset);
         return result;
     }
 
@@ -356,45 +354,41 @@ public:
         const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, 
         unsigned startColumn, unsigned endColumn, int functionKeywordStart, 
         int functionNameStart, int parametersStart, bool inStrictContext, 
-        ConstructorKind constructorKind)
+        ConstructorKind constructorKind, unsigned parameterCount, FunctionParseMode mode)
     {
         return new (m_parserArena) FunctionBodyNode(
             m_parserArena, startLocation, endLocation, startColumn, endColumn, 
             functionKeywordStart, functionNameStart, parametersStart, 
-            inStrictContext, constructorKind);
+            inStrictContext, constructorKind, parameterCount, mode);
     }
 
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    ExpressionNode* createArrowFunctionExpr(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& info)
+    ExpressionNode* createArrowFunctionExpr(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& functionInfo)
     {
-        SourceCode source = info.functionBodyType == ArrowFunctionBodyExpression
-            ? m_sourceCode->subArrowExpression(info.arrowFunctionOffset, info.endFunctionOffset, info.bodyStartLine, info.bodyStartColumn)
-            : m_sourceCode->subExpression(info.startFunctionOffset, info.endFunctionOffset, info.bodyStartLine, info.bodyStartColumn);
+        SourceCode source = m_sourceCode->subExpression(functionInfo.startOffset, functionInfo.endOffset, functionInfo.startLine, functionInfo.bodyStartColumn);
 
-        FuncExprNode* result = new (m_parserArena) FuncExprNode(location, *info.name, info.body, source, info.parameters);
-        info.body->setLoc(info.bodyStartLine, info.bodyEndLine, location.startOffset, location.lineStartOffset);
+        FuncExprNode* result = new (m_parserArena) FuncExprNode(location, *functionInfo.name, functionInfo.body, source);
+        functionInfo.body->setLoc(functionInfo.startLine, functionInfo.endLine, location.startOffset, location.lineStartOffset);
         return result;
     }
-#endif
 
     NEVER_INLINE PropertyNode* createGetterOrSetterProperty(const JSTokenLocation& location, PropertyNode::Type type, bool,
-        const Identifier* name, const ParserFunctionInfo<ASTBuilder>& info, SuperBinding superBinding)
+        const Identifier* name, const ParserFunctionInfo<ASTBuilder>& functionInfo, SuperBinding superBinding)
     {
         ASSERT(name);
-        info.body->setLoc(info.bodyStartLine, info.bodyEndLine, location.startOffset, location.lineStartOffset);
-        info.body->setInferredName(*name);
-        SourceCode source = m_sourceCode->subExpression(info.startFunctionOffset, info.endFunctionOffset, info.bodyStartLine, info.bodyStartColumn);
-        FuncExprNode* funcExpr = new (m_parserArena) FuncExprNode(location, m_vm->propertyNames->nullIdentifier, info.body, source, info.parameters);
+        functionInfo.body->setLoc(functionInfo.startLine, functionInfo.endLine, location.startOffset, location.lineStartOffset);
+        functionInfo.body->setInferredName(*name);
+        SourceCode source = m_sourceCode->subExpression(functionInfo.startOffset, functionInfo.endOffset, functionInfo.startLine, functionInfo.bodyStartColumn);
+        FuncExprNode* funcExpr = new (m_parserArena) FuncExprNode(location, m_vm->propertyNames->nullIdentifier, functionInfo.body, source);
         return new (m_parserArena) PropertyNode(*name, funcExpr, type, PropertyNode::Unknown, superBinding);
     }
     
     NEVER_INLINE PropertyNode* createGetterOrSetterProperty(VM* vm, ParserArena& parserArena, const JSTokenLocation& location, PropertyNode::Type type, bool,
-        double name, const ParserFunctionInfo<ASTBuilder>& info, SuperBinding superBinding)
+        double name, const ParserFunctionInfo<ASTBuilder>& functionInfo, SuperBinding superBinding)
     {
-        info.body->setLoc(info.bodyStartLine, info.bodyEndLine, location.startOffset, location.lineStartOffset);
+        functionInfo.body->setLoc(functionInfo.startLine, functionInfo.endLine, location.startOffset, location.lineStartOffset);
         const Identifier& ident = parserArena.identifierArena().makeNumericIdentifier(vm, name);
-        SourceCode source = m_sourceCode->subExpression(info.startFunctionOffset, info.endFunctionOffset, info.bodyStartLine, info.bodyStartColumn);
-        FuncExprNode* funcExpr = new (m_parserArena) FuncExprNode(location, vm->propertyNames->nullIdentifier, info.body, source, info.parameters);
+        SourceCode source = m_sourceCode->subExpression(functionInfo.startOffset, functionInfo.endOffset, functionInfo.startLine, functionInfo.bodyStartColumn);
+        FuncExprNode* funcExpr = new (m_parserArena) FuncExprNode(location, vm->propertyNames->nullIdentifier, functionInfo.body, source);
         return new (m_parserArena) PropertyNode(ident, funcExpr, type, PropertyNode::Unknown, superBinding);
     }
 
@@ -420,21 +414,21 @@ public:
     ElementNode* createElementList(int elisions, ExpressionNode* expr) { return new (m_parserArena) ElementNode(elisions, expr); }
     ElementNode* createElementList(ElementNode* elems, int elisions, ExpressionNode* expr) { return new (m_parserArena) ElementNode(elems, elisions, expr); }
 
-    ParameterNode* createFormalParameterList(DestructuringPattern pattern) { return new (m_parserArena) ParameterNode(pattern); }
-    ParameterNode* createFormalParameterList(ParameterNode* list, DestructuringPattern pattern) { return new (m_parserArena) ParameterNode(list, pattern); }
+    FormalParameterList createFormalParameterList() { return new (m_parserArena) FunctionParameters(); }
+    void appendParameter(FormalParameterList list, DestructuringPattern pattern) { list->append(pattern); }
 
     CaseClauseNode* createClause(ExpressionNode* expr, JSC::SourceElements* statements) { return new (m_parserArena) CaseClauseNode(expr, statements); }
     ClauseListNode* createClauseList(CaseClauseNode* clause) { return new (m_parserArena) ClauseListNode(clause); }
     ClauseListNode* createClauseList(ClauseListNode* tail, CaseClauseNode* clause) { return new (m_parserArena) ClauseListNode(tail, clause); }
 
-    StatementNode* createFuncDeclStatement(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& info)
+    StatementNode* createFuncDeclStatement(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& functionInfo)
     {
-        FuncDeclNode* decl = new (m_parserArena) FuncDeclNode(location, *info.name, info.body,
-            m_sourceCode->subExpression(info.startFunctionOffset, info.endFunctionOffset, info.bodyStartLine, info.bodyStartColumn), info.parameters);
-        if (*info.name == m_vm->propertyNames->arguments)
+        FuncDeclNode* decl = new (m_parserArena) FuncDeclNode(location, *functionInfo.name, functionInfo.body,
+            m_sourceCode->subExpression(functionInfo.startOffset, functionInfo.endOffset, functionInfo.startLine, functionInfo.bodyStartColumn));
+        if (*functionInfo.name == m_vm->propertyNames->arguments)
             usesArguments();
         m_scope.m_funcDeclarations.append(decl->body());
-        info.body->setLoc(info.bodyStartLine, info.bodyEndLine, location.startOffset, location.lineStartOffset);
+        functionInfo.body->setLoc(functionInfo.startLine, functionInfo.endLine, location.startOffset, location.lineStartOffset);
         return decl;
     }
 
@@ -486,9 +480,9 @@ public:
         return result;
     }
     
-    StatementNode* createForInLoop(const JSTokenLocation& location, PassRefPtr<DestructuringPatternNode> pattern, ExpressionNode* iter, StatementNode* statements, const JSTextPosition& eStart, const JSTextPosition& eDivot, const JSTextPosition& eEnd, int start, int end, VariableEnvironment& lexicalVariables)
+    StatementNode* createForInLoop(const JSTokenLocation& location, DestructuringPatternNode* pattern, ExpressionNode* iter, StatementNode* statements, const JSTextPosition& eStart, const JSTextPosition& eDivot, const JSTextPosition& eEnd, int start, int end, VariableEnvironment& lexicalVariables)
     {
-        auto lexpr = new (m_parserArena) DestructuringAssignmentNode(location, pattern.get(), 0);
+        auto lexpr = new (m_parserArena) DestructuringAssignmentNode(location, pattern, 0);
         return createForInLoop(location, lexpr, iter, statements, eStart, eDivot, eEnd, start, end, lexicalVariables);
     }
     
@@ -500,9 +494,9 @@ public:
         return result;
     }
     
-    StatementNode* createForOfLoop(const JSTokenLocation& location, PassRefPtr<DestructuringPatternNode> pattern, ExpressionNode* iter, StatementNode* statements, const JSTextPosition& eStart, const JSTextPosition& eDivot, const JSTextPosition& eEnd, int start, int end, VariableEnvironment& lexicalVariables)
+    StatementNode* createForOfLoop(const JSTokenLocation& location, DestructuringPatternNode* pattern, ExpressionNode* iter, StatementNode* statements, const JSTextPosition& eStart, const JSTextPosition& eDivot, const JSTextPosition& eEnd, int start, int end, VariableEnvironment& lexicalVariables)
     {
-        auto lexpr = new (m_parserArena) DestructuringAssignmentNode(location, pattern.get(), 0);
+        auto lexpr = new (m_parserArena) DestructuringAssignmentNode(location, pattern, 0);
         return createForOfLoop(location, lexpr, iter, statements, eStart, eDivot, eEnd, start, end, lexicalVariables);
     }
 
@@ -745,14 +739,14 @@ public:
 
     bool isResolve(ExpressionNode* expr) const { return expr->isResolveNode(); }
 
-    ExpressionNode* createDestructuringAssignment(const JSTokenLocation& location, PassRefPtr<DestructuringPatternNode> pattern, ExpressionNode* initializer)
+    ExpressionNode* createDestructuringAssignment(const JSTokenLocation& location, DestructuringPattern pattern, ExpressionNode* initializer)
     {
-        return new (m_parserArena) DestructuringAssignmentNode(location, pattern.get(), initializer);
+        return new (m_parserArena) DestructuringAssignmentNode(location, pattern, initializer);
     }
     
     ArrayPattern createArrayPattern(const JSTokenLocation&)
     {
-        return ArrayPatternNode::create();
+        return new (m_parserArena) ArrayPatternNode();
     }
     
     void appendArrayPatternSkipEntry(ArrayPattern node, const JSTokenLocation& location)
@@ -762,32 +756,32 @@ public:
 
     void appendArrayPatternEntry(ArrayPattern node, const JSTokenLocation& location, DestructuringPattern pattern, ExpressionNode* defaultValue)
     {
-        node->appendIndex(ArrayPatternNode::BindingType::Element, location, pattern.get(), defaultValue);
+        node->appendIndex(ArrayPatternNode::BindingType::Element, location, pattern, defaultValue);
     }
 
     void appendArrayPatternRestEntry(ArrayPattern node, const JSTokenLocation& location, DestructuringPattern pattern)
     {
-        node->appendIndex(ArrayPatternNode::BindingType::RestElement, location, pattern.get(), nullptr);
+        node->appendIndex(ArrayPatternNode::BindingType::RestElement, location, pattern, nullptr);
     }
 
     void finishArrayPattern(ArrayPattern node, const JSTextPosition& divotStart, const JSTextPosition& divot, const JSTextPosition& divotEnd)
     {
-        setExceptionLocation(node.get(), divotStart, divot, divotEnd);
+        setExceptionLocation(node, divotStart, divot, divotEnd);
     }
     
     ObjectPattern createObjectPattern(const JSTokenLocation&)
     {
-        return ObjectPatternNode::create();
+        return new (m_parserArena) ObjectPatternNode();
     }
     
     void appendObjectPatternEntry(ObjectPattern node, const JSTokenLocation& location, bool wasString, const Identifier& identifier, DestructuringPattern pattern, ExpressionNode* defaultValue)
     {
-        node->appendEntry(location, identifier, wasString, pattern.get(), defaultValue);
+        node->appendEntry(location, identifier, wasString, pattern, defaultValue);
     }
     
     BindingPattern createBindingLocation(const JSTokenLocation&, const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext context)
     {
-        return BindingNode::create(boundProperty, start, end, context);
+        return new (m_parserArena) BindingNode(boundProperty, start, end, context);
     }
 
     void setEndOffset(Node* node, int offset)
index 53aa9b0..bc5a771 100644 (file)
@@ -494,7 +494,7 @@ static const LChar singleCharacterEscapeValuesForASCII[128] = {
 
 template <typename T>
 Lexer<T>::Lexer(VM* vm, JSParserBuiltinMode builtinMode)
-    : m_isReparsing(false)
+    : m_isReparsingFunction(false)
     , m_vm(vm)
     , m_parsingBuiltinFunction(builtinMode == JSParserBuiltinMode::Builtin)
 {
@@ -1715,7 +1715,6 @@ bool Lexer<T>::nextTokenIsColon()
     return code < m_codeEnd && *code == ':';
 }
 
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
 template <typename T>
 void Lexer<T>::setTokenPosition(JSToken* tokenRecord)
 {
@@ -1725,7 +1724,6 @@ void Lexer<T>::setTokenPosition(JSToken* tokenRecord)
     tokenData->lineStartOffset = currentLineStartOffset();
     ASSERT(tokenData->offset >= tokenData->lineStartOffset);
 }
-#endif
 
 template <typename T>
 JSTokenType Lexer<T>::lex(JSToken* tokenRecord, unsigned lexerFlags, bool strictMode)
@@ -2411,7 +2409,7 @@ void Lexer<T>::clear()
     Vector<UChar> newBufferForRawTemplateString16;
     m_bufferForRawTemplateString16.swap(newBufferForRawTemplateString16);
 
-    m_isReparsing = false;
+    m_isReparsingFunction = false;
 }
 
 // Instantiate the two flavors of Lexer we need instead of putting most of this file in Lexer.h
index b142c48..20dcf30 100644 (file)
@@ -84,12 +84,10 @@ public:
 
     // Functions to set up parsing.
     void setCode(const SourceCode&, ParserArena*);
-    void setIsReparsing() { m_isReparsing = true; }
-    bool isReparsing() const { return m_isReparsing; }
+    void setIsReparsingFunction() { m_isReparsingFunction = true; }
+    bool isReparsingFunction() const { return m_isReparsingFunction; }
 
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
     void setTokenPosition(JSToken* tokenRecord);
-#endif
     JSTokenType lex(JSToken*, unsigned, bool strictMode);
     bool nextTokenIsColon();
     int lineNumber() const { return m_lineNumber; }
@@ -224,7 +222,7 @@ private:
     const T* m_lineStart;
     JSTextPosition m_positionBeforeLastNewline;
     JSTokenLocation m_lastTockenLocation;
-    bool m_isReparsing;
+    bool m_isReparsingFunction;
     bool m_atLineStart;
     bool m_error;
     String m_lexErrorMessage;
index e1e8487..1be563d 100644 (file)
@@ -828,34 +828,22 @@ namespace JSC {
     {
     }
 
-    inline ParameterNode::ParameterNode(PassRefPtr<DestructuringPatternNode> pattern)
-        : m_pattern(pattern)
-        , m_next(0)
-    {
-        ASSERT(m_pattern);
-    }
-
-    inline ParameterNode::ParameterNode(ParameterNode* previous, PassRefPtr<DestructuringPatternNode> pattern)
-        : m_pattern(pattern)
-        , m_next(0)
+    inline FunctionParameters::FunctionParameters()
     {
-        previous->m_next = this;
-        ASSERT(m_pattern);
-        ASSERT(previous->m_pattern);
     }
 
-    inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
+    inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source)
         : ExpressionNode(location)
         , m_body(body)
     {
-        m_body->finishParsing(source, parameter, ident, FunctionExpression);
+        m_body->finishParsing(source, ident, FunctionExpression);
     }
 
-    inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
+    inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source)
         : StatementNode(location)
         , m_body(body)
     {
-        m_body->finishParsing(source, parameter, ident, FunctionDeclaration);
+        m_body->finishParsing(source, ident, FunctionDeclaration);
     }
 
 #if ENABLE(ES6_CLASS_SYNTAX)
@@ -954,26 +942,11 @@ namespace JSC {
     {
     }
     
-    inline Ref<ArrayPatternNode> ArrayPatternNode::create()
-    {
-        return adoptRef(*new ArrayPatternNode);
-    }
-    
     inline ObjectPatternNode::ObjectPatternNode()
         : DestructuringPatternNode()
     {
     }
     
-    inline Ref<ObjectPatternNode> ObjectPatternNode::create()
-    {
-        return adoptRef(*new ObjectPatternNode);
-    }
-
-    inline Ref<BindingNode> BindingNode::create(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext context)
-    {
-        return adoptRef(*new BindingNode(boundProperty, start, end, context));
-    }
-    
     inline BindingNode::BindingNode(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext context)
         : DestructuringPatternNode()
         , m_divotStart(start)
@@ -983,7 +956,7 @@ namespace JSC {
     {
     }
     
-    inline DestructuringAssignmentNode::DestructuringAssignmentNode(const JSTokenLocation& location, PassRefPtr<DestructuringPatternNode> bindings, ExpressionNode* initializer)
+    inline DestructuringAssignmentNode::DestructuringAssignmentNode(const JSTokenLocation& location, DestructuringPatternNode* bindings, ExpressionNode* initializer)
         : ExpressionNode(location)
         , m_bindings(bindings)
         , m_initializer(initializer)
index ff581f7..43d7e05 100644 (file)
@@ -117,7 +117,7 @@ StatementNode* ScopeNode::singleStatement() const
 
 // ------------------------------ ProgramNode -----------------------------
 
-ProgramNode::ProgramNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, const SourceCode& source, CodeFeatures features, int numConstants)
+ProgramNode::ProgramNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, FunctionParameters*, const SourceCode& source, CodeFeatures features, int numConstants)
     : ScopeNode(parserArena, startLocation, endLocation, source, children, varEnvironment, funcStack, lexicalVariables, features, numConstants)
     , m_startColumn(startColumn)
     , m_endColumn(endColumn)
@@ -131,7 +131,7 @@ void ProgramNode::setClosedVariables(Vector<RefPtr<UniquedStringImpl>>&& closedV
 
 // ------------------------------ EvalNode -----------------------------
 
-EvalNode::EvalNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, const SourceCode& source, CodeFeatures features, int numConstants)
+EvalNode::EvalNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, FunctionParameters*, const SourceCode& source, CodeFeatures features, int numConstants)
     : ScopeNode(parserArena, startLocation, endLocation, source, children, varEnvironment, funcStack, lexicalVariables, features, numConstants)
     , m_endColumn(endColumn)
 {
@@ -139,39 +139,11 @@ EvalNode::EvalNode(ParserArena& parserArena, const JSTokenLocation& startLocatio
 
 // ------------------------------ FunctionBodyNode -----------------------------
 
-Ref<FunctionParameters> FunctionParameters::create(ParameterNode* firstParameter)
-{
-    unsigned parameterCount = 0;
-    for (ParameterNode* parameter = firstParameter; parameter; parameter = parameter->nextParam())
-        ++parameterCount;
-
-    size_t objectSize = sizeof(FunctionParameters) - sizeof(void*) + sizeof(DestructuringPatternNode*) * parameterCount;
-    void* slot = fastMalloc(objectSize);
-    return adoptRef(*new (slot) FunctionParameters(firstParameter, parameterCount));
-}
-
-FunctionParameters::FunctionParameters(ParameterNode* firstParameter, unsigned size)
-    : m_size(size)
-{
-    unsigned i = 0;
-    for (ParameterNode* parameter = firstParameter; parameter; parameter = parameter->nextParam()) {
-        auto pattern = parameter->pattern();
-        pattern->ref();
-        patterns()[i++] = pattern;
-    }
-}
-
-FunctionParameters::~FunctionParameters()
-{
-    for (unsigned i = 0; i < m_size; ++i)
-        patterns()[i]->deref();
-}
-
 FunctionBodyNode::FunctionBodyNode(
     ParserArena&, const JSTokenLocation& startLocation, 
     const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, 
-    int functionKeywordStart, int functionNameStart, int parametersStart,
-    bool isInStrictContext, ConstructorKind constructorKind)
+    int functionKeywordStart, int functionNameStart, int parametersStart, bool isInStrictContext, 
+    ConstructorKind constructorKind, unsigned parameterCount, FunctionParseMode mode)
         : StatementNode(endLocation)
         , m_startColumn(startColumn)
         , m_endColumn(endColumn)
@@ -179,16 +151,17 @@ FunctionBodyNode::FunctionBodyNode(
         , m_functionNameStart(functionNameStart)
         , m_parametersStart(parametersStart)
         , m_startStartOffset(startLocation.startOffset)
+        , m_parameterCount(parameterCount)
+        , m_parseMode(mode)
         , m_isInStrictContext(isInStrictContext)
         , m_constructorKind(static_cast<unsigned>(constructorKind))
 {
     ASSERT(m_constructorKind == static_cast<unsigned>(constructorKind));
 }
 
-void FunctionBodyNode::finishParsing(const SourceCode& source, ParameterNode* firstParameter, const Identifier& ident, enum FunctionMode functionMode)
+void FunctionBodyNode::finishParsing(const SourceCode& source, const Identifier& ident, enum FunctionMode functionMode)
 {
     m_source = source;
-    m_parameters = FunctionParameters::create(firstParameter);
     m_ident = ident;
     m_functionMode = functionMode;
 }
@@ -201,17 +174,17 @@ void FunctionBodyNode::setEndPosition(JSTextPosition position)
 
 // ------------------------------ FunctionNode -----------------------------
 
-FunctionNode::FunctionNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
+FunctionNode::FunctionNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, SourceElements* children, VariableEnvironment& varEnvironment, FunctionStack& funcStack, VariableEnvironment& lexicalVariables, FunctionParameters* parameters, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
     : ScopeNode(parserArena, startLocation, endLocation, sourceCode, children, varEnvironment, funcStack, lexicalVariables, features, numConstants)
+    , m_parameters(parameters)
     , m_startColumn(startColumn)
     , m_endColumn(endColumn)
 {
 }
 
-void FunctionNode::finishParsing(PassRefPtr<FunctionParameters> parameters, const Identifier& ident, enum FunctionMode functionMode)
+void FunctionNode::finishParsing(const Identifier& ident, enum FunctionMode functionMode)
 {
     ASSERT(!source().isNull());
-    m_parameters = parameters;
     m_ident = ident;
     m_functionMode = functionMode;
 }
index 08af647..7f3f05d 100644 (file)
@@ -42,6 +42,7 @@ namespace JSC {
     class ArgumentListNode;
     class BytecodeGenerator;
     class FunctionBodyNode;
+    class FunctionParameters;
     class Label;
     class PropertyListNode;
     class ReadModifyResolveNode;
@@ -1541,19 +1542,6 @@ namespace JSC {
         StatementNode* m_finallyBlock;
     };
 
-    class ParameterNode : public ParserArenaDeletable {
-    public:
-        ParameterNode(PassRefPtr<DestructuringPatternNode>);
-        ParameterNode(ParameterNode*, PassRefPtr<DestructuringPatternNode>);
-
-        DestructuringPatternNode* pattern() const { return m_pattern.get(); }
-        ParameterNode* nextParam() const { return m_next; }
-
-    private:
-        RefPtr<DestructuringPatternNode> m_pattern;
-        ParameterNode* m_next;
-    };
-
     class ScopeNode : public StatementNode, public ParserArenaRoot, public VariableEnvironmentNode {
     public:
         typedef DeclarationStacks::FunctionStack FunctionStack;
@@ -1619,7 +1607,7 @@ namespace JSC {
 
     class ProgramNode : public ScopeNode {
     public:
-        ProgramNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, const SourceCode&, CodeFeatures, int numConstants);
+        ProgramNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, FunctionParameters*, const SourceCode&, CodeFeatures, int numConstants);
 
         unsigned startColumn() const { return m_startColumn; }
         unsigned endColumn() const { return m_endColumn; }
@@ -1638,7 +1626,7 @@ namespace JSC {
 
     class EvalNode : public ScopeNode {
     public:
-        EvalNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, const SourceCode&, CodeFeatures, int numConstants);
+        EvalNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, FunctionParameters*, const SourceCode&, CodeFeatures, int numConstants);
 
         ALWAYS_INLINE unsigned startColumn() const { return 0; }
         unsigned endColumn() const { return m_endColumn; }
@@ -1651,23 +1639,16 @@ namespace JSC {
         unsigned m_endColumn;
     };
 
-    class FunctionParameters : public RefCounted<FunctionParameters> {
-        WTF_MAKE_FAST_ALLOCATED;
-        WTF_MAKE_NONCOPYABLE(FunctionParameters);
+    class FunctionParameters : public ParserArenaDeletable {
     public:
-        static Ref<FunctionParameters> create(ParameterNode*);
-        ~FunctionParameters();
-
-        unsigned size() const { return m_size; }
-        DestructuringPatternNode* at(unsigned index) { ASSERT(index < m_size); return patterns()[index]; }
+        FunctionParameters();
+        ALWAYS_INLINE unsigned size() const { return m_patterns.size(); }
+        ALWAYS_INLINE DestructuringPatternNode* at(unsigned index) { return m_patterns[index]; }
+        ALWAYS_INLINE void append(DestructuringPatternNode* pattern) { ASSERT(pattern); m_patterns.append(pattern); }
 
     private:
-        FunctionParameters(ParameterNode*, unsigned size);
-
-        DestructuringPatternNode** patterns() { return &m_storage; }
 
-        unsigned m_size;
-        DestructuringPatternNode* m_storage;
+        Vector<DestructuringPatternNode*, 3> m_patterns;
     };
 
     class FunctionBodyNode final : public StatementNode, public ParserArenaDeletable {
@@ -1678,13 +1659,11 @@ namespace JSC {
             ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, 
             unsigned startColumn, unsigned endColumn, int functionKeywordStart, 
             int functionNameStart, int parametersStart, bool isInStrictContext, 
-            ConstructorKind);
-
-        FunctionParameters* parameters() const { return m_parameters.get(); }
+            ConstructorKind, unsigned, FunctionParseMode);
 
         virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
 
-        void finishParsing(const SourceCode&, ParameterNode*, const Identifier&, FunctionMode);
+        void finishParsing(const SourceCode&, const Identifier&, FunctionMode);
         
         void overrideName(const Identifier& ident) { m_ident = ident; }
         const Identifier& ident() { return m_ident; }
@@ -1698,6 +1677,8 @@ namespace JSC {
         int parametersStart() const { return m_parametersStart; }
         unsigned startColumn() const { return m_startColumn; }
         unsigned endColumn() const { return m_endColumn; }
+        unsigned parameterCount() const { return m_parameterCount; }
+        FunctionParseMode parseMode() const { return m_parseMode; }
 
         void setEndPosition(JSTextPosition);
 
@@ -1711,7 +1692,6 @@ namespace JSC {
         Identifier m_ident;
         Identifier m_inferredName;
         FunctionMode m_functionMode;
-        RefPtr<FunctionParameters> m_parameters;
         unsigned m_startColumn;
         unsigned m_endColumn;
         int m_functionKeywordStart;
@@ -1719,19 +1699,21 @@ namespace JSC {
         int m_parametersStart;
         SourceCode m_source;
         int m_startStartOffset;
+        unsigned m_parameterCount;
+        FunctionParseMode m_parseMode;
         unsigned m_isInStrictContext : 1;
         unsigned m_constructorKind : 2;
     };
 
     class FunctionNode final : public ScopeNode {
     public:
-        FunctionNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, const SourceCode&, CodeFeatures, int numConstants);
+        FunctionNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, FunctionParameters*, const SourceCode&, CodeFeatures, int numConstants);
 
-        FunctionParameters* parameters() const { return m_parameters.get(); }
+        FunctionParameters* parameters() const { return m_parameters; }
 
         virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
 
-        void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&, FunctionMode);
+        void finishParsing(const Identifier&, FunctionMode);
         
         const Identifier& ident() { return m_ident; }
 
@@ -1745,14 +1727,14 @@ namespace JSC {
     private:
         Identifier m_ident;
         FunctionMode m_functionMode;
-        RefPtr<FunctionParameters> m_parameters;
+        FunctionParameters* m_parameters;
         unsigned m_startColumn;
         unsigned m_endColumn;
     };
 
     class FuncExprNode : public ExpressionNode {
     public:
-        FuncExprNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
+        FuncExprNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&);
 
         FunctionBodyNode* body() { return m_body; }
 
@@ -1783,11 +1765,9 @@ namespace JSC {
     };
 #endif
 
-    class DestructuringPatternNode : public RefCounted<DestructuringPatternNode> {
-        WTF_MAKE_NONCOPYABLE(DestructuringPatternNode);
-        WTF_MAKE_FAST_ALLOCATED;
-
+    class DestructuringPatternNode : public ParserArenaDeletable {
     public:
+        virtual ~DestructuringPatternNode() { }
         virtual void collectBoundIdentifiers(Vector<Identifier>&) const = 0;
         virtual void bindValue(BytecodeGenerator&, RegisterID* source) const = 0;
         virtual void toString(StringBuilder&) const = 0;
@@ -1795,21 +1775,19 @@ namespace JSC {
         virtual bool isBindingNode() const { return false; }
         virtual RegisterID* emitDirectBinding(BytecodeGenerator&, RegisterID*, ExpressionNode*) { return 0; }
         
-        virtual ~DestructuringPatternNode() = 0;
-        
     protected:
         DestructuringPatternNode();
     };
 
     class ArrayPatternNode : public DestructuringPatternNode, public ThrowableExpressionData {
     public:
+        ArrayPatternNode();
         enum class BindingType {
             Elision,
             Element,
             RestElement
         };
 
-        static Ref<ArrayPatternNode> create();
         void appendIndex(BindingType bindingType, const JSTokenLocation&, DestructuringPatternNode* node, ExpressionNode* defaultValue)
         {
             m_targetPatterns.append({ bindingType, node, defaultValue });
@@ -1818,10 +1796,9 @@ namespace JSC {
     private:
         struct Entry {
             BindingType bindingType;
-            RefPtr<DestructuringPatternNode> pattern;
+            DestructuringPatternNode* pattern;
             ExpressionNode* defaultValue;
         };
-        ArrayPatternNode();
         virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
         virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
         virtual RegisterID* emitDirectBinding(BytecodeGenerator&, RegisterID* dst, ExpressionNode*) override;
@@ -1832,21 +1809,20 @@ namespace JSC {
     
     class ObjectPatternNode : public DestructuringPatternNode {
     public:
-        static Ref<ObjectPatternNode> create();
+        ObjectPatternNode();
         void appendEntry(const JSTokenLocation&, const Identifier& identifier, bool wasString, DestructuringPatternNode* pattern, ExpressionNode* defaultValue)
         {
             m_targetPatterns.append(Entry{ identifier, wasString, pattern, defaultValue });
         }
         
     private:
-        ObjectPatternNode();
         virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
         virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
         virtual void toString(StringBuilder&) const override;
         struct Entry {
             Identifier propertyName;
             bool wasString;
-            RefPtr<DestructuringPatternNode> pattern;
+            DestructuringPatternNode* pattern;
             ExpressionNode* defaultValue;
         };
         Vector<Entry> m_targetPatterns;
@@ -1854,15 +1830,13 @@ namespace JSC {
 
     class BindingNode : public DestructuringPatternNode {
     public:
-        static Ref<BindingNode> create(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext);
+        BindingNode(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext);
         const Identifier& boundProperty() const { return m_boundProperty; }
 
         const JSTextPosition& divotStart() const { return m_divotStart; }
         const JSTextPosition& divotEnd() const { return m_divotEnd; }
         
     private:
-        BindingNode(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext);
-
         virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
         virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
         virtual void toString(StringBuilder&) const override;
@@ -1877,8 +1851,8 @@ namespace JSC {
 
     class DestructuringAssignmentNode : public ExpressionNode, public ParserArenaDeletable {
     public:
-        DestructuringAssignmentNode(const JSTokenLocation&, PassRefPtr<DestructuringPatternNode>, ExpressionNode*);
-        DestructuringPatternNode* bindings() { return m_bindings.get(); }
+        DestructuringAssignmentNode(const JSTokenLocation&, DestructuringPatternNode*, ExpressionNode*);
+        DestructuringPatternNode* bindings() { return m_bindings; }
         
         using ParserArenaDeletable::operator new;
 
@@ -1887,13 +1861,13 @@ namespace JSC {
         virtual bool isDestructuringNode() const override { return true; }
         virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
 
-        RefPtr<DestructuringPatternNode> m_bindings;
+        DestructuringPatternNode* m_bindings;
         ExpressionNode* m_initializer;
     };
 
     class FuncDeclNode : public StatementNode {
     public:
-        FuncDeclNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
+        FuncDeclNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&);
 
         virtual bool isFuncDeclNode() const override { return true; }
         FunctionBodyNode* body() { return m_body; }
@@ -1989,11 +1963,6 @@ namespace JSC {
         ConstDeclNode* tail;
     };
 
-    struct ParameterList {
-        ParameterNode* head;
-        ParameterNode* tail;
-    };
-
     struct ClauseList {
         ClauseListNode* head;
         ClauseListNode* tail;
index 92ae9ab..222bd61 100644 (file)
@@ -191,8 +191,7 @@ void Parser<LexerType>::logError(bool shouldPrintToken, const A& value1, const B
 
 template <typename LexerType>
 Parser<LexerType>::Parser(
-    VM* vm, const SourceCode& source, FunctionParameters* parameters, 
-    const Identifier& name, JSParserBuiltinMode builtinMode, 
+    VM* vm, const SourceCode& source, JSParserBuiltinMode builtinMode, 
     JSParserStrictMode strictMode, JSParserCodeType codeType, 
     ConstructorKind defaultConstructorKind, ThisTDZMode thisTDZMode)
     : m_vm(vm)
@@ -223,30 +222,7 @@ Parser<LexerType>::Parser(
         scope->setIsFunction();
     if (strictMode == JSParserStrictMode::Strict)
         scope->setStrictMode();
-    if (parameters) {
-        bool hadBindingParameters = false;
-        for (unsigned i = 0; i < parameters->size(); i++) {
-            auto parameter = parameters->at(i);
-            if (!parameter->isBindingNode()) {
-                hadBindingParameters = true;
-                continue;
-            }
-            scope->declareParameter(&static_cast<BindingNode*>(parameter)->boundProperty());
-        }
-        if (hadBindingParameters) {
-            Vector<Identifier> boundParameterNames;
-            for (unsigned i = 0; i < parameters->size(); i++) {
-                auto parameter = parameters->at(i);
-                if (parameter->isBindingNode())
-                    continue;
-                parameter->collectBoundIdentifiers(boundParameterNames);
-            }
-            for (auto& boundParameterName : boundParameterNames)
-                scope->declareVariable(&boundParameterName);
-        }
-    }
-    if (!name.isNull())
-        scope->declareCallee(&name);
+
     next();
 }
 
@@ -256,18 +232,56 @@ Parser<LexerType>::~Parser()
 }
 
 template <typename LexerType>
-String Parser<LexerType>::parseInner()
+String Parser<LexerType>::parseInner(const Identifier& calleeName, FunctionParseMode parseMode)
 {
     String parseError = String();
     
     ASTBuilder context(const_cast<VM*>(m_vm), m_parserArena, const_cast<SourceCode*>(m_source));
-    if (m_lexer->isReparsing())
-        m_statementDepth--;
     ScopeRef scope = currentScope();
     scope->setIsLexicalScope();
 
-    SourceElements* sourceElements = parseSourceElements(context, CheckForStrictMode, StandardFunctionParseType);
-    if (!sourceElements || !consume(EOFTOK)) {
+    bool isArrowFunctionBodyExpression = false;
+    if (m_lexer->isReparsingFunction()) {
+        ParserFunctionInfo<ASTBuilder> functionInfo;
+        parseFunctionParameters(context, parseMode, functionInfo);
+        m_parameters = functionInfo.parameters;
+
+#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
+        if (parseMode == ArrowFunctionMode && !hasError()) {
+            // The only way we could have an error wile reparsing is if we run out of stack space.
+            RELEASE_ASSERT(match(ARROWFUNCTION));
+            next();
+            isArrowFunctionBodyExpression = !match(OPENBRACE);
+        }
+#endif
+    }
+
+    if (!calleeName.isNull())
+        scope->declareCallee(&calleeName);
+
+    if (m_lexer->isReparsingFunction())
+        m_statementDepth--;
+
+    SourceElements* sourceElements = nullptr;
+    // The only way we can error this early is if we reparse a function and we run out of stack space.
+    if (!hasError()) {
+        if (isArrowFunctionBodyExpression)
+            sourceElements = parseArrowFunctionSingleExpressionBodySourceElements(context);
+        else
+            sourceElements = parseSourceElements(context, CheckForStrictMode);
+    }
+
+    bool validEnding;
+    if (isArrowFunctionBodyExpression) {
+        ASSERT(m_lexer->isReparsingFunction());
+        // When we reparse and stack overflow, we're not guaranteed a valid ending. If we don't run out of stack space,
+        // then of course this will always be valid because we already parsed for syntax errors. But we must
+        // be cautious in case we run out of stack space.
+        validEnding = isEndOfArrowFunction(); 
+    } else
+        validEnding = consume(EOFTOK);
+
+    if (!sourceElements || !validEnding) {
         if (hasError())
             parseError = m_errorMessage;
         else
@@ -346,7 +360,7 @@ bool Parser<LexerType>::allowAutomaticSemicolon()
 }
 
 template <typename LexerType>
-template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseSourceElements(TreeBuilder& context, SourceElementsMode mode, FunctionParseType functionParseType)
+template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseSourceElements(TreeBuilder& context, SourceElementsMode mode)
 {
     const unsigned lengthOfUseStrictLiteral = 12; // "use strict".length
     TreeSourceElements sourceElements = context.createSourceElements();
@@ -356,22 +370,6 @@ template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseSourceEl
     auto savePoint = createSavePoint();
     bool hasSetStrict = false;
     
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    if (match(ARROWFUNCTION)) {
-        TreeStatement arrowfunctionStatement = parseArrowFunctionSingleExpressionBody(context, functionParseType);
-            
-        if (arrowfunctionStatement) {
-            context.setEndOffset(arrowfunctionStatement, m_lastTokenEndPosition.offset);
-            context.appendStatement(sourceElements, arrowfunctionStatement);
-        }
-        
-        propagateError();
-        return sourceElements;
-    }
-#else
-    UNUSED_PARAM(functionParseType);
-#endif
-    
     while (TreeStatement statement = parseStatementListItem(context, directive, &directiveLiteralLength)) {
         if (mode == CheckForStrictMode && !seenNonDirective) {
             if (directive) {
@@ -662,24 +660,13 @@ template <class TreeBuilder> TreeDestructuringPattern Parser<LexerType>::createB
     return context.createBindingLocation(token.m_location, name, token.m_startPosition, token.m_endPosition, bindingContext);
 }
 
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
 template <typename LexerType>
-template <class TreeBuilder> TreeStatement Parser<LexerType>::parseArrowFunctionSingleExpressionBody(TreeBuilder& context, FunctionParseType parseType)
+template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseArrowFunctionSingleExpressionBodySourceElements(TreeBuilder& context)
 {
-    ASSERT(match(ARROWFUNCTION));
+    ASSERT(!match(OPENBRACE));
 
-    // When reparsing phase, parseType becomes StandardFunctionParseType even if the function is arrow function.
-    // This condition considers the following situations.
-    // (1): If we are in the reparsing phase, this arrow function is already parsed once, so there is no syntax error.
-    // (2): But if we are not in the reparsing phase, we should check this function is called in the context of the arrow function.
-    if (!m_lexer->isReparsing() && parseType != ArrowFunctionParseType)
-        failDueToUnexpectedToken();
-    
     JSTokenLocation location(tokenLocation());
     JSTextPosition start = tokenStartPosition();
-    JSTextPosition end = tokenEndPosition();
-
-    next();
 
     failIfStackOverflow();
     TreeExpression expr = parseAssignmentExpression(context);
@@ -689,14 +676,18 @@ template <class TreeBuilder> TreeStatement Parser<LexerType>::parseArrowFunction
 
     failIfFalse(isEndOfArrowFunction(), "Expected a ';', ']', '}', ')', ',', line terminator or EOF following a arrow function statement");
 
-    end = tokenEndPosition();
+    JSTextPosition end = tokenEndPosition();
     
     if (!m_lexer->prevTerminator())
         setEndOfStatement();
 
-    return context.createReturnStatement(location, expr, start, end);
+    TreeSourceElements sourceElements = context.createSourceElements();
+    TreeStatement body = context.createReturnStatement(location, expr, start, end);
+    context.setEndOffset(body, m_lastTokenEndPosition.offset);
+    context.appendStatement(sourceElements, body);
+
+    return sourceElements;
 }
-#endif
 
 template <typename LexerType>
 template <class TreeBuilder> TreeDestructuringPattern Parser<LexerType>::tryParseDestructuringPatternExpression(TreeBuilder& context, AssignmentContext bindingContext)
@@ -1229,7 +1220,7 @@ template <class TreeBuilder> TreeClauseList Parser<LexerType>::parseSwitchClause
     TreeExpression condition = parseExpression(context);
     failIfFalse(condition, "Cannot parse switch clause");
     consumeOrFail(COLON, "Expected a ':' after switch clause expression");
-    TreeSourceElements statements = parseSourceElements(context, DontCheckForStrictMode, StandardFunctionParseType);
+    TreeSourceElements statements = parseSourceElements(context, DontCheckForStrictMode);
     failIfFalse(statements, "Cannot parse the body of a switch clause");
     TreeClause clause = context.createClause(condition, statements);
     context.setStartOffset(clause, startOffset);
@@ -1242,7 +1233,7 @@ template <class TreeBuilder> TreeClauseList Parser<LexerType>::parseSwitchClause
         TreeExpression condition = parseExpression(context);
         failIfFalse(condition, "Cannot parse switch case expression");
         consumeOrFail(COLON, "Expected a ':' after switch clause expression");
-        TreeSourceElements statements = parseSourceElements(context, DontCheckForStrictMode, StandardFunctionParseType);
+        TreeSourceElements statements = parseSourceElements(context, DontCheckForStrictMode);
         failIfFalse(statements, "Cannot parse the body of a switch clause");
         clause = context.createClause(condition, statements);
         context.setStartOffset(clause, startOffset);
@@ -1259,7 +1250,7 @@ template <class TreeBuilder> TreeClause Parser<LexerType>::parseSwitchDefaultCla
     unsigned startOffset = tokenStart();
     next();
     consumeOrFail(COLON, "Expected a ':' after switch default clause");
-    TreeSourceElements statements = parseSourceElements(context, DontCheckForStrictMode, StandardFunctionParseType);
+    TreeSourceElements statements = parseSourceElements(context, DontCheckForStrictMode);
     failIfFalse(statements, "Cannot parse the body of a switch default clause");
     TreeClause result = context.createClause(0, statements);
     context.setStartOffset(result, startOffset);
@@ -1358,7 +1349,7 @@ template <class TreeBuilder> TreeStatement Parser<LexerType>::parseBlockStatemen
             popScope(lexicalScope, TreeBuilder::NeedsFreeVariableInfo);
         return result;
     }
-    TreeSourceElements subtree = parseSourceElements(context, DontCheckForStrictMode, StandardFunctionParseType);
+    TreeSourceElements subtree = parseSourceElements(context, DontCheckForStrictMode);
     failIfFalse(subtree, "Cannot parse the body of the block statement");
     matchOrFail(CLOSEBRACE, "Expected a closing '}' at the end of a block statement");
     int endOffset = m_token.m_data.offset;
@@ -1466,46 +1457,43 @@ template <class TreeBuilder> TreeStatement Parser<LexerType>::parseStatement(Tre
 }
 
 template <typename LexerType>
-template <class TreeBuilder> TreeFormalParameterList Parser<LexerType>::parseFormalParameters(TreeBuilder& context)
+template <class TreeBuilder> bool Parser<LexerType>::parseFormalParameters(TreeBuilder& context, TreeFormalParameterList list, unsigned& parameterCount)
 {
     auto parameter = parseDestructuringPattern(context, DestructureToParameters);
     failIfFalse(parameter, "Cannot parse parameter pattern");
-    TreeFormalParameterList list = context.createFormalParameterList(parameter);
-    TreeFormalParameterList tail = list;
+    context.appendParameter(list, parameter);
+    parameterCount++;
     while (consume(COMMA)) {
         parameter = parseDestructuringPattern(context, DestructureToParameters);
         failIfFalse(parameter, "Cannot parse parameter pattern");
-        tail = context.createFormalParameterList(tail, parameter);
+        context.appendParameter(list, parameter);
+        parameterCount++;
     }
-    return list;
+    return true;
 }
 
 template <typename LexerType>
 template <class TreeBuilder> TreeFunctionBody Parser<LexerType>::parseFunctionBody(
-    TreeBuilder& context, int functionKeywordStart, int functionNameStart, 
-    int parametersStart, ConstructorKind constructorKind, FunctionParseType parseType)
+    TreeBuilder& context, const JSTokenLocation& startLocation, int startColumn, int functionKeywordStart, int functionNameStart, int parametersStart, 
+    ConstructorKind constructorKind, FunctionBodyType bodyType, unsigned parameterCount, FunctionParseMode parseMode)
 {
-    JSTokenLocation startLocation(tokenLocation());
-    unsigned startColumn = tokenColumn();
-
-    if (parseType == StandardFunctionParseType) {
+    if (bodyType == StandardFunctionBodyBlock || bodyType == ArrowFunctionBodyBlock) {
         next();
         if (match(CLOSEBRACE)) {
             unsigned endColumn = tokenColumn();
-            return context.createFunctionBody(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind);
+            return context.createFunctionBody(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, parameterCount, parseMode);
         }
     }
 
     DepthManager statementDepth(&m_statementDepth);
     m_statementDepth = 0;
-    typename TreeBuilder::FunctionBodyBuilder bodyBuilder(const_cast<VM*>(m_vm), m_lexer.get());
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    failIfFalse(parseSourceElements(bodyBuilder, CheckForStrictMode, parseType), parseType == StandardFunctionParseType ? "Cannot parse body of this function" : "Cannot parse body of this arrow function");
-#else
-    failIfFalse(parseSourceElements(bodyBuilder, CheckForStrictMode, StandardFunctionParseType), "Cannot parse body of this function");
-#endif
+    SyntaxChecker syntaxChecker(const_cast<VM*>(m_vm), m_lexer.get());
+    if (bodyType == ArrowFunctionBodyExpression)
+        failIfFalse(parseArrowFunctionSingleExpressionBodySourceElements(syntaxChecker), "Cannot parse body of this arrow function");
+    else
+        failIfFalse(parseSourceElements(syntaxChecker, CheckForStrictMode), bodyType == StandardFunctionBodyBlock ? "Cannot parse body of this function" : "Cannot parse body of this arrow function");
     unsigned endColumn = tokenColumn();
-    return context.createFunctionBody(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind);
+    return context.createFunctionBody(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, parameterCount, parseMode);
 }
 
 static const char* stringForFunctionMode(FunctionParseMode mode)
@@ -1515,24 +1503,28 @@ static const char* stringForFunctionMode(FunctionParseMode mode)
         return "getter";
     case SetterMode:
         return "setter";
-    case FunctionMode:
+    case NormalFunctionMode:
         return "function";
     case MethodMode:
         return "method";
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
     case ArrowFunctionMode:
         return "arrow function";
-#endif
+    case NotAFunctionMode:
+        RELEASE_ASSERT_NOT_REACHED();
+        return "";
     }
     RELEASE_ASSERT_NOT_REACHED();
     return nullptr;
 }
 
-template <typename LexerType> template <class TreeBuilder> int Parser<LexerType>::parseFunctionParameters(TreeBuilder& context, FunctionParseMode mode, ParserFunctionInfo<TreeBuilder>& info)
+template <typename LexerType> template <class TreeBuilder> int Parser<LexerType>::parseFunctionParameters(TreeBuilder& context, FunctionParseMode mode, ParserFunctionInfo<TreeBuilder>& functionInfo)
 {
+    RELEASE_ASSERT(mode != NotAFunctionMode);
     int parametersStart = m_token.m_location.startOffset;
+    TreeFormalParameterList parameterList = context.createFormalParameterList();
+    functionInfo.parameters = parameterList;
+    functionInfo.startOffset = parametersStart;
     
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
     if (mode == ArrowFunctionMode) {
         if (!match(IDENT) && !match(OPENPAREN)) {
             semanticFailureDueToKeyword(stringForFunctionMode(mode), " name");
@@ -1541,76 +1533,87 @@ template <typename LexerType> template <class TreeBuilder> int Parser<LexerType>
             if (match(OPENPAREN)) {
                 next();
                 
-                if (!match(CLOSEPAREN)) {
-                    info.parameters = parseFormalParameters(context);
-                    failIfFalse(info.parameters, "Cannot parse parameters for this ", stringForFunctionMode(mode));
-                }
+                if (match(CLOSEPAREN))
+                    functionInfo.parameterCount = 0;
+                else
+                    failIfFalse(parseFormalParameters(context, parameterList, functionInfo.parameterCount), "Cannot parse parameters for this ", stringForFunctionMode(mode));
                 
                 consumeOrFail(CLOSEPAREN, "Expected a ')' or a ',' after a parameter declaration");
             } else {
+                functionInfo.parameterCount = 1;
                 auto parameter = parseDestructuringPattern(context, DestructureToParameters);
                 failIfFalse(parameter, "Cannot parse parameter pattern");
-                info.parameters = context.createFormalParameterList(parameter);
-                failIfFalse(info.parameters, "Cannot parse parameters for this ", stringForFunctionMode(mode));
+                context.appendParameter(parameterList, parameter);
             }
         }
-        
+
         return parametersStart;
     }
-#endif
-    
+
     if (!consume(OPENPAREN)) {
         semanticFailureDueToKeyword(stringForFunctionMode(mode), " name");
         failWithMessage("Expected an opening '(' before a ", stringForFunctionMode(mode), "'s parameter list");
     }
 
-    if (mode == GetterMode)
+    if (mode == GetterMode) {
         consumeOrFail(CLOSEPAREN, "getter functions must have no parameters");
-    else if (mode == SetterMode) {
+        functionInfo.parameterCount = 0;
+    } else if (mode == SetterMode) {
         failIfTrue(match(CLOSEPAREN), "setter functions must have one parameter");
         auto parameter = parseDestructuringPattern(context, DestructureToParameters);
         failIfFalse(parameter, "setter functions must have one parameter");
-        info.parameters = context.createFormalParameterList(parameter);
+        context.appendParameter(parameterList, parameter);
+        functionInfo.parameterCount = 1;
         failIfTrue(match(COMMA), "setter functions must have one parameter");
         consumeOrFail(CLOSEPAREN, "Expected a ')' after a parameter declaration");
     } else {
-        if (!match(CLOSEPAREN)) {
-            info.parameters = parseFormalParameters(context);
-            failIfFalse(info.parameters, "Cannot parse parameters for this ", stringForFunctionMode(mode));
-        }
+        if (match(CLOSEPAREN))
+            functionInfo.parameterCount = 0;
+        else
+            failIfFalse(parseFormalParameters(context, parameterList, functionInfo.parameterCount), "Cannot parse parameters for this ", stringForFunctionMode(mode));
         consumeOrFail(CLOSEPAREN, "Expected a ')' or a ',' after a parameter declaration");
     }
-    
+
     return parametersStart;
 }
 
 template <typename LexerType>
-template <class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuilder& context, FunctionRequirements requirements, FunctionParseMode mode, bool nameIsInContainingScope, ConstructorKind constructorKind, SuperBinding expectedSuperBinding, int functionKeywordStart, ParserFunctionInfo<TreeBuilder>& info, FunctionParseType parseType)
+template <class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuilder& context, FunctionRequirements requirements, FunctionParseMode mode, bool nameIsInContainingScope, ConstructorKind constructorKind, SuperBinding expectedSuperBinding, int functionKeywordStart, ParserFunctionInfo<TreeBuilder>& functionInfo, FunctionParseType parseType)
 {
+    RELEASE_ASSERT(mode != NotAFunctionMode);
+
     AutoPopScopeRef functionScope(this, pushScope());
     functionScope->setIsFunction();
     int functionNameStart = m_token.m_location.startOffset;
     const Identifier* lastFunctionName = m_lastFunctionName;
     m_lastFunctionName = nullptr;
     int parametersStart;
+    JSTokenLocation startLocation;
+    int startColumn;
+    FunctionBodyType functionBodyType;
     
     switch (parseType) {
     case StandardFunctionParseType: {
+        RELEASE_ASSERT(mode != ArrowFunctionMode);
         if (match(IDENT) || isLETMaskedAsIDENT()) {
-            info.name = m_token.m_data.ident;
-            m_lastFunctionName = info.name;
+            functionInfo.name = m_token.m_data.ident;
+            m_lastFunctionName = functionInfo.name;
             next();
             if (!nameIsInContainingScope)
-                failIfFalseIfStrict(functionScope->declareVariable(info.name), "'", info.name->impl(), "' is not a valid ", stringForFunctionMode(mode), " name in strict mode");
+                failIfFalseIfStrict(functionScope->declareVariable(functionInfo.name), "'", functionInfo.name->impl(), "' is not a valid ", stringForFunctionMode(mode), " name in strict mode");
         } else if (requirements == FunctionNeedsName) {
-            if (match(OPENPAREN) && mode == FunctionMode)
+            if (match(OPENPAREN) && mode == NormalFunctionMode)
                 semanticFail("Function statements must have a name");
             semanticFailureDueToKeyword(stringForFunctionMode(mode), " name");
             failDueToUnexpectedToken();
             return false;
         }
-        
-        parametersStart = parseFunctionParameters(context, mode, info);
+
+        startLocation = tokenLocation();
+        functionInfo.startLine = tokenLine();
+        startColumn = tokenColumn();
+
+        parametersStart = parseFunctionParameters(context, mode, functionInfo);
         propagateError();
         
         matchOrFail(OPENBRACE, "Expected an opening '{' at the start of a ", stringForFunctionMode(mode), " body");
@@ -1622,14 +1625,20 @@ template <class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuild
             constructorKind = m_defaultConstructorKind;
             expectedSuperBinding = m_defaultConstructorKind == ConstructorKind::Derived ? SuperBinding::Needed : SuperBinding::NotNeeded;
         }
-        
-        info.startFunctionOffset = m_token.m_data.offset;
+
+        functionBodyType = StandardFunctionBodyBlock;
         
         break;
     }
 #if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
     case ArrowFunctionParseType: {
-        parametersStart = parseFunctionParameters(context, ArrowFunctionMode, info);
+        RELEASE_ASSERT(mode == ArrowFunctionMode);
+
+        startLocation = tokenLocation();
+        functionInfo.startLine = tokenLine();
+        startColumn = tokenColumn();
+
+        parametersStart = parseFunctionParameters(context, mode, functionInfo);
         propagateError();
         
         matchOrFail(ARROWFUNCTION, "Expected a '=>' after arrow function parameter declaration");
@@ -1639,30 +1648,25 @@ template <class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuild
 
         ASSERT(constructorKind == ConstructorKind::None);
         
-        info.arrowFunctionOffset = m_token.m_data.offset;
         // Check if arrow body start with {. If it true it mean that arrow function is Fat arrow function
         // and we need use common approach to parse function body
-        SavePoint savePoint = createSavePoint();
-        
         next();
-        info.functionBodyType = match(OPENBRACE) ? ArrowFunctionBodyBlock : ArrowFunctionBodyExpression;
-        info.startFunctionOffset = (info.functionBodyType == ArrowFunctionBodyBlock) ? m_token.m_data.offset : info.arrowFunctionOffset;
+        functionBodyType = match(OPENBRACE) ? ArrowFunctionBodyBlock : ArrowFunctionBodyExpression;
         
-        restoreSavePoint(savePoint);
-
         break;
     }
+#else
+    default:
+        RELEASE_ASSERT_NOT_REACHED();
 #endif
     }
     
     bool isClassConstructor = constructorKind != ConstructorKind::None;
 
-    info.bodyStartLine = tokenLine();
-    info.bodyStartColumn = m_token.m_data.offset - m_token.m_data.lineStartOffset;
-    JSTokenLocation startLocation(tokenLocation());
+    functionInfo.bodyStartColumn = startColumn;
     
     // If we know about this function already, we can use the cached info and skip the parser to the end of the function.
-    if (const SourceProviderCacheItem* cachedInfo = TreeBuilder::CanUseFunctionCache ? findCachedFunctionInfo(info.startFunctionOffset) : 0) {
+    if (const SourceProviderCacheItem* cachedInfo = TreeBuilder::CanUseFunctionCache ? findCachedFunctionInfo(functionInfo.startOffset) : 0) {
         // If we're in a strict context, the cached function info must say it was strict too.
         ASSERT(!strictMode() || cachedInfo->strictMode);
         JSTokenLocation endLocation;
@@ -1671,17 +1675,17 @@ template <class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuild
         endLocation.startOffset = cachedInfo->lastTockenStartOffset;
         endLocation.lineStartOffset = cachedInfo->lastTockenLineStartOffset;
 
-        bool endColumnIsOnStartLine = (endLocation.line == info.bodyStartLine);
+        bool endColumnIsOnStartLine = (endLocation.line == functionInfo.startLine);
         ASSERT(endLocation.startOffset >= endLocation.lineStartOffset);
         unsigned bodyEndColumn = endColumnIsOnStartLine ?
             endLocation.startOffset - m_token.m_data.lineStartOffset :
             endLocation.startOffset - endLocation.lineStartOffset;
         unsigned currentLineStartOffset = m_token.m_location.lineStartOffset;
 
-        info.body = context.createFunctionBody(
-            startLocation, endLocation, info.bodyStartColumn, bodyEndColumn, 
+        functionInfo.body = context.createFunctionBody(
+            startLocation, endLocation, functionInfo.bodyStartColumn, bodyEndColumn, 
             functionKeywordStart, functionNameStart, parametersStart, 
-            cachedInfo->strictMode, constructorKind);
+            cachedInfo->strictMode, constructorKind, cachedInfo->parameterCount, mode);
         
         functionScope->restoreFromSourceProviderCache(cachedInfo);
         popScope(functionScope, TreeBuilder::NeedsFreeVariableInfo);
@@ -1693,64 +1697,40 @@ template <class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuild
 
         m_lexer->setOffset(m_token.m_location.endOffset, m_token.m_location.lineStartOffset);
         m_lexer->setLineNumber(m_token.m_location.line);
-        info.endFunctionOffset = cachedInfo->endFunctionOffset;
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
+        functionInfo.endOffset = cachedInfo->endFunctionOffset;
+
         if (parseType == ArrowFunctionParseType)
-            info.functionBodyType = cachedInfo->isBodyArrowExpression ?  ArrowFunctionBodyExpression : ArrowFunctionBodyBlock;
+            functionBodyType = cachedInfo->isBodyArrowExpression ?  ArrowFunctionBodyExpression : ArrowFunctionBodyBlock;
         else
-            info.functionBodyType = StandardFunctionBodyBlock;
+            functionBodyType = StandardFunctionBodyBlock;
         
-        switch (info.functionBodyType) {
+        switch (functionBodyType) {
         case ArrowFunctionBodyExpression:
             next();
-            context.setEndOffset(info.body, m_lexer->currentOffset());
+            context.setEndOffset(functionInfo.body, m_lexer->currentOffset());
             break;
         case ArrowFunctionBodyBlock:
         case StandardFunctionBodyBlock:
-            context.setEndOffset(info.body, m_lexer->currentOffset());
+            context.setEndOffset(functionInfo.body, m_lexer->currentOffset());
             next();
             break;
         }
-#else
-        context.setEndOffset(info.body, m_lexer->currentOffset());
-        next();
-#endif
-        info.bodyEndLine = m_lastTokenEndPosition.line;
+        functionInfo.endLine = m_lastTokenEndPosition.line;
         return true;
     }
     
     m_lastFunctionName = lastFunctionName;
     ParserState oldState = saveState();
     
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    switch (info.functionBodyType) {
-    case ArrowFunctionBodyBlock: {
-        // Consume => in case of arrow function block e.g. x => { return x; }
-        next();
-    
-        info.bodyStartLine = tokenLine();
-        info.bodyStartColumn = m_token.m_data.offset - m_token.m_data.lineStartOffset;
-            
-        info.body = parseFunctionBody(context, functionKeywordStart, functionNameStart, parametersStart, constructorKind, StandardFunctionParseType);
-        break;
-    }
-    case StandardFunctionBodyBlock:
-    case ArrowFunctionBodyExpression : {
-        info.body = parseFunctionBody(context, functionKeywordStart, functionNameStart, parametersStart, constructorKind, parseType);
-        break;
-    }
-    }
-#else
-    info.body = parseFunctionBody(context, functionKeywordStart, functionNameStart, parametersStart, constructorKind, StandardFunctionParseType);
-#endif
+    functionInfo.body = parseFunctionBody(context, startLocation, startColumn, functionKeywordStart, functionNameStart, parametersStart, constructorKind, functionBodyType, functionInfo.parameterCount, mode);
     
     restoreState(oldState);
-    failIfFalse(info.body, "Cannot parse the body of this ", stringForFunctionMode(mode));
-    context.setEndOffset(info.body, m_lexer->currentOffset());
-    if (functionScope->strictMode() && info.name) {
-        RELEASE_ASSERT(mode == FunctionMode || mode == MethodMode);
-        semanticFailIfTrue(m_vm->propertyNames->arguments == *info.name, "'", info.name->impl(), "' is not a valid function name in strict mode");
-        semanticFailIfTrue(m_vm->propertyNames->eval == *info.name, "'", info.name->impl(), "' is not a valid function name in strict mode");
+    failIfFalse(functionInfo.body, "Cannot parse the body of this ", stringForFunctionMode(mode));
+    context.setEndOffset(functionInfo.body, m_lexer->currentOffset());
+    if (functionScope->strictMode() && functionInfo.name) {
+        RELEASE_ASSERT(mode == NormalFunctionMode || mode == MethodMode);
+        semanticFailIfTrue(m_vm->propertyNames->arguments == *functionInfo.name, "'", functionInfo.name->impl(), "' is not a valid function name in strict mode");
+        semanticFailIfTrue(m_vm->propertyNames->eval == *functionInfo.name, "'", functionInfo.name->impl(), "' is not a valid function name in strict mode");
     }
     if (functionScope->hasDirectSuper()) {
         semanticFailIfTrue(!isClassConstructor, "Cannot call super() outside of a class constructor");
@@ -1760,56 +1740,48 @@ template <class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuild
         semanticFailIfTrue(expectedSuperBinding == SuperBinding::NotNeeded, "super can only be used in a method of a derived class");
 
     JSTokenLocation location = JSTokenLocation(m_token.m_location);
-    info.endFunctionOffset = m_token.m_data.offset;
+    functionInfo.endOffset = m_token.m_data.offset;
     
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    if (info.functionBodyType == ArrowFunctionBodyExpression) {
+    if (functionBodyType == ArrowFunctionBodyExpression) {
         location = locationBeforeLastToken();
-        info.endFunctionOffset = location.endOffset;
+        functionInfo.endOffset = location.endOffset;
     }
-#endif
     
     // Cache the tokenizer state and the function scope the first time the function is parsed.
     // Any future reparsing can then skip the function.
     static const int minimumFunctionLengthToCache = 16;
     std::unique_ptr<SourceProviderCacheItem> newInfo;
-    int functionLength = info.endFunctionOffset - info.startFunctionOffset;
+    int functionLength = functionInfo.endOffset - functionInfo.startOffset;
     if (TreeBuilder::CanUseFunctionCache && m_functionCache && functionLength > minimumFunctionLengthToCache) {
         SourceProviderCacheItemCreationParameters parameters;
-        parameters.endFunctionOffset = info.endFunctionOffset;
+        parameters.endFunctionOffset = functionInfo.endOffset;
         parameters.functionNameStart = functionNameStart;
         parameters.lastTockenLine = location.line;
         parameters.lastTockenStartOffset = location.startOffset;
         parameters.lastTockenEndOffset = location.endOffset;
         parameters.lastTockenLineStartOffset = location.lineStartOffset;
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-        if (info.functionBodyType == ArrowFunctionBodyExpression) {
+        parameters.parameterCount = functionInfo.parameterCount;
+        if (functionBodyType == ArrowFunctionBodyExpression) {
             parameters.isBodyArrowExpression = true;
             parameters.tokenType = m_token.m_type;
         }
-#endif
         functionScope->fillParametersForSourceProviderCache(parameters);
         newInfo = SourceProviderCacheItem::create(parameters);
     }
     
     popScope(functionScope, TreeBuilder::NeedsFreeVariableInfo);
     
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    if (info.functionBodyType == ArrowFunctionBodyExpression)
+    if (functionBodyType == ArrowFunctionBodyExpression)
         failIfFalse(isEndOfArrowFunction(), "Expected the closing ';' ',' ']' ')' '}', line terminator or EOF after arrow function");
     else {
         matchOrFail(CLOSEBRACE, "Expected a closing '}' after a ", stringForFunctionMode(mode), " body");
         next();
     }
-#else
-    matchOrFail(CLOSEBRACE, "Expected a closing '}' after a ", stringForFunctionMode(mode), " body");
-    next();
-#endif
     
     if (newInfo)
-        m_functionCache->add(info.startFunctionOffset, WTF::move(newInfo));
+        m_functionCache->add(functionInfo.startOffset, WTF::move(newInfo));
     
-    info.bodyEndLine = m_lastTokenEndPosition.line;
+    functionInfo.endLine = m_lastTokenEndPosition.line;
     return true;
 }
 
@@ -1820,12 +1792,12 @@ template <class TreeBuilder> TreeStatement Parser<LexerType>::parseFunctionDecla
     JSTokenLocation location(tokenLocation());
     unsigned functionKeywordStart = tokenStart();
     next();
-    ParserFunctionInfo<TreeBuilder> info;
-    failIfFalse((parseFunctionInfo(context, FunctionNeedsName, FunctionMode, true, ConstructorKind::None, SuperBinding::NotNeeded,
-        functionKeywordStart, info, StandardFunctionParseType)), "Cannot parse this function");
-    failIfFalse(info.name, "Function statements must have a name");
-    failIfFalseIfStrict(declareVariable(info.name), "Cannot declare a function named '", info.name->impl(), "' in strict mode");
-    return context.createFuncDeclStatement(location, info);
+    ParserFunctionInfo<TreeBuilder> functionInfo;
+    failIfFalse((parseFunctionInfo(context, FunctionNeedsName, NormalFunctionMode, true, ConstructorKind::None, SuperBinding::NotNeeded,
+        functionKeywordStart, functionInfo, StandardFunctionParseType)), "Cannot parse this function");
+    failIfFalse(functionInfo.name, "Function statements must have a name");
+    failIfFalseIfStrict(declareVariable(functionInfo.name), "Cannot declare a function named '", functionInfo.name->impl(), "' in strict mode");
+    return context.createFuncDeclStatement(location, functionInfo);
 }
 
 #if ENABLE(ES6_CLASS_SYNTAX)
@@ -1939,7 +1911,7 @@ template <class TreeBuilder> TreeClassExpression Parser<LexerType>::parseClass(T
         } else {
             ParserFunctionInfo<TreeBuilder> methodInfo;
             bool isConstructor = !isStaticMethod && *ident == propertyNames.constructor;
-            failIfFalse((parseFunctionInfo(context, FunctionNoRequirements, isStaticMethod ? FunctionMode : MethodMode, false, isConstructor ? constructorKind : ConstructorKind::None, SuperBinding::Needed, methodStart, methodInfo, StandardFunctionParseType)), "Cannot parse this method");
+            failIfFalse((parseFunctionInfo(context, FunctionNoRequirements, isStaticMethod ? NormalFunctionMode : MethodMode, false, isConstructor ? constructorKind : ConstructorKind::None, SuperBinding::Needed, methodStart, methodInfo, StandardFunctionParseType)), "Cannot parse this method");
             failIfFalse(ident && declareVariable(ident), "Cannot declare a method named '", methodInfo.name->impl(), "'");
             methodInfo.name = isConstructor ? className : ident;
 
@@ -2757,7 +2729,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parsePrimaryExpre
         next();
         ParserFunctionInfo<TreeBuilder> info;
         info.name = &m_vm->propertyNames->nullIdentifier;
-        failIfFalse((parseFunctionInfo(context, FunctionNoRequirements, FunctionMode, false, ConstructorKind::None, SuperBinding::NotNeeded, functionKeywordStart, info, StandardFunctionParseType)), "Cannot parse function expression");
+        failIfFalse((parseFunctionInfo(context, FunctionNoRequirements, NormalFunctionMode, false, ConstructorKind::None, SuperBinding::NotNeeded, functionKeywordStart, info, StandardFunctionParseType)), "Cannot parse function expression");
         return context.createFunctionExpr(location, info);
     }
 #if ENABLE(ES6_CLASS_SYNTAX)
@@ -3002,7 +2974,6 @@ endMemberExpression:
     return base;
 }
 
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
 template <typename LexerType>
 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseArrowFunctionExpression(TreeBuilder& context)
 {
@@ -3012,11 +2983,10 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseArrowFunctio
     location = tokenLocation();
     ParserFunctionInfo<TreeBuilder> info;
     info.name = &m_vm->propertyNames->nullIdentifier;
-    failIfFalse((parseFunctionInfo(context, FunctionNoRequirements, FunctionMode, true, ConstructorKind::None, SuperBinding::NotNeeded, functionKeywordStart, info, ArrowFunctionParseType)), "Cannot parse arrow function expression");
+    failIfFalse((parseFunctionInfo(context, FunctionNoRequirements, ArrowFunctionMode, true, ConstructorKind::None, SuperBinding::NotNeeded, functionKeywordStart, info, ArrowFunctionParseType)), "Cannot parse arrow function expression");
 
     return context.createArrowFunctionExpr(location, info);
 }
-#endif
 
 static const char* operatorString(bool prefix, unsigned tok)
 {
index 1ca7601..23387ef 100644 (file)
@@ -81,21 +81,9 @@ class SourceCode;
 COMPILE_ASSERT(LastUntaggedToken < 64, LessThan64UntaggedTokens);
 
 enum SourceElementsMode { CheckForStrictMode, DontCheckForStrictMode };
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
 enum FunctionParseType { StandardFunctionParseType, ArrowFunctionParseType };
-#else
-enum FunctionParseType { StandardFunctionParseType};
-#endif
+enum FunctionBodyType { ArrowFunctionBodyExpression, ArrowFunctionBodyBlock, StandardFunctionBodyBlock };
 enum FunctionRequirements { FunctionNoRequirements, FunctionNeedsName };
-enum FunctionParseMode {
-    FunctionMode,
-    GetterMode,
-    SetterMode,
-    MethodMode,
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    ArrowFunctionMode
-#endif
-};
 enum DestructuringKind {
     DestructureToVariables,
     DestructureToLexicalVariables,
@@ -537,13 +525,12 @@ class Parser {
 
 public:
     Parser(
-        VM*, const SourceCode&, FunctionParameters*, const Identifier&, 
-        JSParserBuiltinMode, JSParserStrictMode, JSParserCodeType,
+        VM*, const SourceCode&, JSParserBuiltinMode, JSParserStrictMode, JSParserCodeType, 
         ConstructorKind defaultConstructorKind = ConstructorKind::None, ThisTDZMode = ThisTDZMode::CheckIfNeeded);
     ~Parser();
 
     template <class ParsedNode>
-    std::unique_ptr<ParsedNode> parse(ParserError&);
+    std::unique_ptr<ParsedNode> parse(ParserError&, const Identifier&, FunctionParseMode);
 
     JSTextPosition positionBeforeLastNewline() const { return m_lexer->positionBeforeLastNewline(); }
     JSTokenLocation locationBeforeLastToken() const { return m_lexer->lastTokenLocation(); }
@@ -739,7 +726,7 @@ private:
     }
 
     Parser();
-    String parseInner();
+    String parseInner(const Identifier&, FunctionParseMode);
 
     void didFinishParsing(SourceElements*, DeclarationStacks::FunctionStack&, VariableEnvironment&, CodeFeatures, int, const Vector<RefPtr<UniquedStringImpl>>&&);
 
@@ -796,7 +783,6 @@ private:
         return m_token.m_type == IDENT && *m_token.m_data.ident == m_vm->propertyNames->of;
     }
     
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
     ALWAYS_INLINE bool isEndOfArrowFunction()
     {
         return match(SEMICOLON) || match(COMMA) || match(CLOSEPAREN) || match(CLOSEBRACE) || match(CLOSEBRACKET) || match(EOFTOK) || m_lexer->prevTerminator();
@@ -804,6 +790,7 @@ private:
     
     ALWAYS_INLINE bool isArrowFunctionParamters()
     {
+#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
         bool isArrowFunction = false;
         
         if (match(EOFTOK))
@@ -834,8 +821,10 @@ private:
         restoreSavePoint(saveArrowFunctionPoint);
         
         return isArrowFunction;
-    }
+#else
+        return false;
 #endif
+    }
     
     ALWAYS_INLINE unsigned tokenStart()
     {
@@ -946,7 +935,7 @@ private:
         return match(LET) && !strictMode();
     }
 
-    template <class TreeBuilder> TreeSourceElements parseSourceElements(TreeBuilder&, SourceElementsMode, FunctionParseType);
+    template <class TreeBuilder> TreeSourceElements parseSourceElements(TreeBuilder&, SourceElementsMode);
     template <class TreeBuilder> TreeStatement parseStatementListItem(TreeBuilder&, const Identifier*& directive, unsigned* directiveLiteralLength);
     template <class TreeBuilder> TreeStatement parseStatement(TreeBuilder&, const Identifier*& directive, unsigned* directiveLiteralLength = 0);
 #if ENABLE(ES6_CLASS_SYNTAX)
@@ -987,17 +976,13 @@ private:
     template <class TreeBuilder> TreeProperty parseProperty(TreeBuilder&, bool strict);
     template <class TreeBuilder> TreeExpression parsePropertyMethod(TreeBuilder& context, const Identifier* methodName);
     template <class TreeBuilder> TreeProperty parseGetterSetter(TreeBuilder&, bool strict, PropertyNode::Type, unsigned getterOrSetterStartOffset, ConstructorKind = ConstructorKind::None, SuperBinding = SuperBinding::NotNeeded);
-    template <class TreeBuilder> ALWAYS_INLINE TreeFunctionBody parseFunctionBody(TreeBuilder&, int functionKeywordStart, int functionNameStart, int parametersStart, ConstructorKind, FunctionParseType);
-    template <class TreeBuilder> ALWAYS_INLINE TreeFormalParameterList parseFormalParameters(TreeBuilder&);
+    template <class TreeBuilder> ALWAYS_INLINE TreeFunctionBody parseFunctionBody(TreeBuilder&, const JSTokenLocation&, int, int functionKeywordStart, int functionNameStart, int parametersStart, ConstructorKind, FunctionBodyType, unsigned, FunctionParseMode);
+    template <class TreeBuilder> ALWAYS_INLINE bool parseFormalParameters(TreeBuilder&, TreeFormalParameterList, unsigned&);
     enum VarDeclarationListContext { ForLoopContext, VarDeclarationContext };
     template <class TreeBuilder> TreeExpression parseVariableDeclarationList(TreeBuilder&, int& declarations, TreeDestructuringPattern& lastPattern, TreeExpression& lastInitializer, JSTextPosition& identStart, JSTextPosition& initStart, JSTextPosition& initEnd, VarDeclarationListContext, DeclarationType);
     template <class TreeBuilder> NEVER_INLINE TreeConstDeclList parseConstDeclarationList(TreeBuilder&);
-
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    template <class TreeBuilder> TreeStatement parseArrowFunctionSingleExpressionBody(TreeBuilder&, FunctionParseType);
+    template <class TreeBuilder> TreeSourceElements parseArrowFunctionSingleExpressionBodySourceElements(TreeBuilder&);
     template <class TreeBuilder> TreeExpression parseArrowFunctionExpression(TreeBuilder&);
-#endif
-
     template <class TreeBuilder> NEVER_INLINE TreeDestructuringPattern createBindingPattern(TreeBuilder&, DestructuringKind, const Identifier&, int depth, JSToken, AssignmentContext);
     template <class TreeBuilder> NEVER_INLINE TreeDestructuringPattern parseDestructuringPattern(TreeBuilder&, DestructuringKind, AssignmentContext = AssignmentContext::DeclarationStatement, int depth = 0);
     template <class TreeBuilder> NEVER_INLINE TreeDestructuringPattern tryParseDestructuringPatternExpression(TreeBuilder&, AssignmentContext);
@@ -1030,13 +1015,10 @@ private:
         return allowAutomaticSemicolon();
     }
     
-
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
     void setEndOfStatement()
     {
         m_lexer->setTokenPosition(&m_token);
     }
-#endif
 
     bool canRecurse()
     {
@@ -1108,6 +1090,7 @@ private:
     const SourceCode* m_source;
     ParserArena m_parserArena;
     std::unique_ptr<LexerType> m_lexer;
+    FunctionParameters* m_parameters { nullptr };
     
     bool m_hasStackOverflow;
     String m_errorMessage;
@@ -1153,13 +1136,13 @@ private:
 
 template <typename LexerType>
 template <class ParsedNode>
-std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error)
+std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error, const Identifier& calleeName, FunctionParseMode parseMode)
 {
     int errLine;
     String errMsg;
 
     if (ParsedNode::scopeIsFunction)
-        m_lexer->setIsReparsing();
+        m_lexer->setIsReparsingFunction();
 
     m_sourceElements = 0;
 
@@ -1170,7 +1153,7 @@ std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error)
     ASSERT(m_source->startColumn() > 0);
     unsigned startColumn = m_source->startColumn() - 1;
 
-    String parseError = parseInner();
+    String parseError = parseInner(calleeName, parseMode);
 
     int lineNumber = m_lexer->lineNumber();
     bool lexError = m_lexer->sawError();
@@ -1200,6 +1183,7 @@ std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error)
                                     m_varDeclarations,
                                     m_funcDeclarations,
                                     currentScope()->finalizeLexicalEnvironment(),
+                                    m_parameters,
                                     *m_source,
                                     m_features,
                                     m_numConstants);
@@ -1233,18 +1217,19 @@ std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error)
 
 template <class ParsedNode>
 std::unique_ptr<ParsedNode> parse(
-    VM* vm, const SourceCode& source, FunctionParameters* parameters,
+    VM* vm, const SourceCode& source,
     const Identifier& name, JSParserBuiltinMode builtinMode,
     JSParserStrictMode strictMode, JSParserCodeType codeType,
-    ParserError& error, JSTextPosition* positionBeforeLastNewline = 0,
-    ConstructorKind defaultConstructorKind = ConstructorKind::None, ThisTDZMode thisTDZMode = ThisTDZMode::CheckIfNeeded)
+    ParserError& error, JSTextPosition* positionBeforeLastNewline = nullptr,
+    FunctionParseMode parseMode = NotAFunctionMode, ConstructorKind defaultConstructorKind = ConstructorKind::None, 
+    ThisTDZMode thisTDZMode = ThisTDZMode::CheckIfNeeded)
 {
     SamplingRegion samplingRegion("Parsing");
 
     ASSERT(!source.provider()->source().isNull());
     if (source.provider()->source().is8Bit()) {
-        Parser<Lexer<LChar>> parser(vm, source, parameters, name, builtinMode, strictMode, codeType, defaultConstructorKind, thisTDZMode);
-        std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error);
+        Parser<Lexer<LChar>> parser(vm, source, builtinMode, strictMode, codeType, defaultConstructorKind, thisTDZMode);
+        std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error, name, parseMode);
         if (positionBeforeLastNewline)
             *positionBeforeLastNewline = parser.positionBeforeLastNewline();
         if (builtinMode == JSParserBuiltinMode::Builtin) {
@@ -1256,8 +1241,8 @@ std::unique_ptr<ParsedNode> parse(
         return result;
     }
     ASSERT_WITH_MESSAGE(defaultConstructorKind == ConstructorKind::None, "BuiltinExecutables::createDefaultConstructor should always use a 8-bit string");
-    Parser<Lexer<UChar>> parser(vm, source, parameters, name, builtinMode, strictMode, codeType, defaultConstructorKind, thisTDZMode);
-    std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error);
+    Parser<Lexer<UChar>> parser(vm, source, builtinMode, strictMode, codeType, defaultConstructorKind, thisTDZMode);
+    std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error, name, parseMode);
     if (positionBeforeLastNewline)
         *positionBeforeLastNewline = parser.positionBeforeLastNewline();
     return result;
index 366084d..4c565aa 100644 (file)
 
 namespace JSC {
 
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-enum FunctionBodyType { ArrowFunctionBodyExpression, ArrowFunctionBodyBlock, StandardFunctionBodyBlock };
-#endif
-
 template <class TreeBuilder>
 struct ParserFunctionInfo {
     const Identifier* name = 0;
     typename TreeBuilder::FormalParameterList parameters = 0;
     typename TreeBuilder::FunctionBody body = 0;
-    unsigned startFunctionOffset = 0;
-    unsigned endFunctionOffset = 0;
-    int bodyStartLine = 0;
-    int bodyEndLine = 0;
+    unsigned parameterCount = 0;
+    unsigned startOffset = 0;
+    unsigned endOffset = 0;
+    int startLine = 0;
+    int endLine = 0;
     unsigned bodyStartColumn = 0;
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    unsigned arrowFunctionOffset = 0;
-    unsigned arrowFunctionNextTockenEndOffset = 0;
-    bool isArrowFunction { false };
-    bool isEndByTerminator { false };
-    FunctionBodyType functionBodyType { StandardFunctionBodyBlock };
-#endif
 };
 
 #if ENABLE(ES6_CLASS_SYNTAX)
index edf0296..b124054 100644 (file)
@@ -44,6 +44,15 @@ enum DebuggerMode { DebuggerOff, DebuggerOn };
 
 enum FunctionMode { FunctionExpression, FunctionDeclaration };
 
+enum FunctionParseMode {
+    NormalFunctionMode,
+    GetterMode,
+    SetterMode,
+    MethodMode,
+    NotAFunctionMode,
+    ArrowFunctionMode
+};
+
 inline bool functionNameIsInScope(const Identifier& name, FunctionMode functionMode)
 {
     if (name.isNull())
index f4a1902..7f37ecf 100644 (file)
@@ -105,9 +105,6 @@ namespace JSC {
         
         SourceCode subExpression(unsigned openBrace, unsigned closeBrace, int firstLine, int startColumn);
 
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-        SourceCode subArrowExpression(unsigned startArrowFunction, unsigned endArrowFunction, int firstLine, int startColumn);
-#endif
     private:
         RefPtr<SourceProvider> m_provider;
         int m_startChar;
@@ -121,20 +118,8 @@ namespace JSC {
         return SourceCode(StringSourceProvider::create(source, url, startPosition), startPosition.m_line.oneBasedInt(), startPosition.m_column.oneBasedInt());
     }
     
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
-    inline SourceCode SourceCode::subArrowExpression(unsigned startArrowFunction, unsigned endArrowFunction, int firstLine, int startColumn)
-    {
-        ASSERT(provider()->source()[startArrowFunction] == '=' && provider()->source()[startArrowFunction + 1] == '>');
-
-        startColumn += 1; // Convert to base 1.
-        return SourceCode(provider(), startArrowFunction, endArrowFunction, firstLine, startColumn);
-    }
-#endif
-
     inline SourceCode SourceCode::subExpression(unsigned openBrace, unsigned closeBrace, int firstLine, int startColumn)
     {
-        ASSERT(provider()->source()[openBrace] == '{');
-        ASSERT(provider()->source()[closeBrace] == '}');
         startColumn += 1; // Convert to base 1.
         return SourceCode(provider(), openBrace, closeBrace + 1, firstLine, startColumn);
     }
index cded968..5070b28 100644 (file)
@@ -43,7 +43,7 @@ public:
     const SourceProviderCacheItem* get(int sourcePosition) const { return m_map.get(sourcePosition); }
 
 private:
-    HashMap<int, std::unique_ptr<SourceProviderCacheItem>> m_map;
+    HashMap<int, std::unique_ptr<SourceProviderCacheItem>, WTF::IntHash<int>, WTF::UnsignedWithZeroKeyHashTraits<int>> m_map;
 };
 
 }
index c0c507f..81d221b 100644 (file)
@@ -40,15 +40,14 @@ struct SourceProviderCacheItemCreationParameters {
     unsigned lastTockenEndOffset;
     unsigned lastTockenLineStartOffset;
     unsigned endFunctionOffset;
+    unsigned parameterCount;
     bool needsFullActivation;
     bool usesEval;
     bool strictMode;
     Vector<RefPtr<UniquedStringImpl>> usedVariables;
     Vector<RefPtr<UniquedStringImpl>> writtenVariables;
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
     bool isBodyArrowExpression { false };
     JSTokenType tokenType { CLOSEBRACE };
-#endif
 };
 
 #if COMPILER(MSVC)
@@ -65,11 +64,7 @@ public:
     JSToken endFunctionToken() const 
     {
         JSToken token;
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
         token.m_type = isBodyArrowExpression ? tokenType : CLOSEBRACE;
-#else
-        token.m_type = CLOSEBRACE;
-#endif
         token.m_data.offset = lastTockenStartOffset;
         token.m_location.startOffset = lastTockenStartOffset;
         token.m_location.endOffset = lastTockenEndOffset;
@@ -87,6 +82,7 @@ public:
     unsigned lastTockenLine : 31;
     unsigned lastTockenStartOffset : 31;
     unsigned lastTockenEndOffset: 31;
+    unsigned parameterCount;
     
     bool usesEval : 1;
 
@@ -98,10 +94,8 @@ public:
 
     UniquedStringImpl** usedVariables() const { return const_cast<UniquedStringImpl**>(m_variables); }
     UniquedStringImpl** writtenVariables() const { return const_cast<UniquedStringImpl**>(&m_variables[usedVariablesCount]); }
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
     bool isBodyArrowExpression;
     JSTokenType tokenType;
-#endif
 
 private:
     SourceProviderCacheItem(const SourceProviderCacheItemCreationParameters&);
@@ -130,15 +124,14 @@ inline SourceProviderCacheItem::SourceProviderCacheItem(const SourceProviderCach
     , lastTockenLine(parameters.lastTockenLine)
     , lastTockenStartOffset(parameters.lastTockenStartOffset)
     , lastTockenEndOffset(parameters.lastTockenEndOffset)
+    , parameterCount(parameters.parameterCount)
     , usesEval(parameters.usesEval)
     , strictMode(parameters.strictMode)
     , lastTockenLineStartOffset(parameters.lastTockenLineStartOffset)
     , usedVariablesCount(parameters.usedVariables.size())
     , writtenVariablesCount(parameters.writtenVariables.size())
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
     , isBodyArrowExpression(parameters.isBodyArrowExpression)
     , tokenType(parameters.tokenType)
-#endif
 {
     unsigned j = 0;
     for (unsigned i = 0; i < usedVariablesCount; ++i, ++j) {
index 07d3b0e..c6d3563 100644 (file)
@@ -69,7 +69,6 @@ public:
     {
     }
 
-    typedef SyntaxChecker FunctionBodyBuilder;
     enum { NoneExpr = 0,
         ResolveEvalExpr, ResolveExpr, IntegerExpr, DoubleExpr, StringExpr,
         ThisExpr, NullExpr, BoolExpr, RegExpExpr, ObjectLiteralExpr,
@@ -179,10 +178,8 @@ public:
     ClassExpression createClassExpr(const JSTokenLocation&, const Identifier&, ExpressionType, ExpressionType, PropertyList, PropertyList) { return ClassExpr; }
 #endif
     ExpressionType createFunctionExpr(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; }
-    int createFunctionBody(const JSTokenLocation&, const JSTokenLocation&, int, int, bool, int, int, int, ConstructorKind) { return FunctionBodyResult; }
-#if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
+    int createFunctionBody(const JSTokenLocation&, const JSTokenLocation&, int, int, bool, int, int, int, ConstructorKind, unsigned, int) { return FunctionBodyResult; }
     ExpressionType createArrowFunctionExpr(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; }
-#endif 
     void setFunctionNameStart(int, int) { }
     int createArguments() { return ArgumentsResult; }
     int createArguments(int) { return ArgumentsResult; }
@@ -221,8 +218,8 @@ public:
     int createPropertyList(const JSTokenLocation&, Property, int) { return PropertyListResult; }
     int createElementList(int, int) { return ElementsListResult; }
     int createElementList(int, int, int) { return ElementsListResult; }
-    int createFormalParameterList(DestructuringPattern) { return FormalParameterListResult; }
-    int createFormalParameterList(int, DestructuringPattern) { return FormalParameterListResult; }
+    int createFormalParameterList() { return FormalParameterListResult; }
+    void appendParameter(int, DestructuringPattern) { }
     int createClause(int, int) { return ClauseResult; }
     int createClauseList(int) { return ClauseListResult; }
     int createClauseList(int, int) { return ClauseListResult; }
index a6d3c28..0001d5c 100644 (file)
@@ -94,8 +94,8 @@ UnlinkedCodeBlockType* CodeCache::getGlobalCodeBlock(VM& vm, ExecutableType* exe
 
     typedef typename CacheTypes<UnlinkedCodeBlockType>::RootNode RootNode;
     std::unique_ptr<RootNode> rootNode = parse<RootNode>(
-        &vm, source, 0, Identifier(), builtinMode, strictMode, 
-        JSParserCodeType::Program, error, 0, ConstructorKind::None, thisTDZMode);
+        &vm, source, Identifier(), builtinMode, strictMode, 
+        JSParserCodeType::Program, error, nullptr, FunctionParseMode::NotAFunctionMode, ConstructorKind::None, thisTDZMode);
     if (!rootNode)
         return nullptr;
 
@@ -145,7 +145,7 @@ UnlinkedFunctionExecutable* CodeCache::getFunctionExecutableFromGlobalCode(VM& v
 
     JSTextPosition positionBeforeLastNewline;
     std::unique_ptr<ProgramNode> program = parse<ProgramNode>(
-        &vm, source, 0, Identifier(), JSParserBuiltinMode::NotBuiltin, 
+        &vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin, 
         JSParserStrictMode::NotStrict, JSParserCodeType::Program, 
         error, &positionBeforeLastNewline);
     if (!program) {
index f67bc57..d361537 100644 (file)
@@ -57,7 +57,7 @@ bool checkSyntax(VM& vm, const SourceCode& source, ParserError& error)
     JSLockHolder lock(vm);
     RELEASE_ASSERT(vm.atomicStringTable() == wtfThreadData().atomicStringTable());
     return !!parse<ProgramNode>(
-        &vm, source, 0, Identifier(), JSParserBuiltinMode::NotBuiltin, 
+        &vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin, 
         JSParserStrictMode::NotStrict, JSParserCodeType::Program, error);
 }
 
index 741d793..eca763f 100644 (file)
@@ -475,7 +475,7 @@ JSObject* ProgramExecutable::checkSyntax(ExecState* exec)
     VM* vm = &exec->vm();
     JSGlobalObject* lexicalGlobalObject = exec->lexicalGlobalObject();
     std::unique_ptr<ProgramNode> programNode = parse<ProgramNode>(
-        vm, m_source, 0, Identifier(), JSParserBuiltinMode::NotBuiltin, 
+        vm, m_source, Identifier(), JSParserBuiltinMode::NotBuiltin, 
         JSParserStrictMode::NotStrict, JSParserCodeType::Program, error);
     if (programNode)
         return 0;
index 284b97c..ecb0ffa 100644 (file)
@@ -24,17 +24,17 @@ function testConditionalFunctionCall(x, y) {
         : bar()
 }
 testConditionalFunctionCall(false, false);
-checkBasicBlock(testConditionalFunctionCall, "x", ShouldHaveExecuted);
+checkBasicBlock(testConditionalFunctionCall, "x ?", ShouldHaveExecuted);
 checkBasicBlock(testConditionalFunctionCall, "? y", ShouldHaveExecuted);
 checkBasicBlock(testConditionalFunctionCall, "bar", ShouldHaveExecuted);
 checkBasicBlock(testConditionalFunctionCall, ": bar", ShouldHaveExecuted);
-checkBasicBlock(testConditionalFunctionCall, "y", ShouldNotHaveExecuted);
+checkBasicBlock(testConditionalFunctionCall, "y ?", ShouldNotHaveExecuted);
 checkBasicBlock(testConditionalFunctionCall, "? foo", ShouldNotHaveExecuted);
 checkBasicBlock(testConditionalFunctionCall, "foo", ShouldNotHaveExecuted);
 checkBasicBlock(testConditionalFunctionCall, "baz", ShouldNotHaveExecuted);
 
 testConditionalFunctionCall(true, false);
-checkBasicBlock(testConditionalFunctionCall, "y", ShouldHaveExecuted);
+checkBasicBlock(testConditionalFunctionCall, "y ?", ShouldHaveExecuted);
 checkBasicBlock(testConditionalFunctionCall, "? foo", ShouldHaveExecuted);
 checkBasicBlock(testConditionalFunctionCall, ": baz", ShouldHaveExecuted);
 checkBasicBlock(testConditionalFunctionCall, "baz", ShouldHaveExecuted);