Ignore:
Timestamp:
Jul 19, 2015, 9:57:44 AM (10 years ago)
Author:
[email protected]
Message:

[ES6] Add support for block scope const
https://bugs.webkit.org/show_bug.cgi?id=31813

Reviewed by Filip Pizlo.

Source/JavaScriptCore:

'const' is now implemented in an ES6 spec compliant manner.
'const' variables are always block scoped and always live
either on the stack or in a JSLexicalEnvironment. 'const'
variables never live on the global object.

Inside the BytecodeGenerator, when assigning to a stack
'const' variable or a LocalClosureVar 'const' variable,
we will emit code that just throws a type error.
When assigning to a ClosureVar const variable, CodeBlock linking
will ensure that we perform a dynamic lookup of that variable so
that put_to_scope's slow path throws a type error.

The old 'const' implementation has been removed in this patch.

  • bytecode/BytecodeList.json:
  • bytecode/BytecodeUseDef.h:

(JSC::computeUsesForBytecodeOffset):
(JSC::computeDefsForBytecodeOffset):

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::dumpBytecode):
(JSC::CodeBlock::CodeBlock):

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::BytecodeGenerator):
(JSC::BytecodeGenerator::pushLexicalScope):
(JSC::BytecodeGenerator::prepareLexicalScopeForNextForLoopIteration):
(JSC::BytecodeGenerator::variable):
(JSC::BytecodeGenerator::variableForLocalEntry):
(JSC::BytecodeGenerator::createVariable):
(JSC::BytecodeGenerator::emitResolveScope):
(JSC::BytecodeGenerator::emitInstanceOf):
(JSC::BytecodeGenerator::emitGetById):
(JSC::BytecodeGenerator::isArgumentNumber):
(JSC::BytecodeGenerator::emitReadOnlyExceptionIfNeeded):
(JSC::BytecodeGenerator::emitEnumeration):
(JSC::BytecodeGenerator::variablePerSymbolTable): Deleted.
(JSC::BytecodeGenerator::emitInitGlobalConst): Deleted.

  • bytecompiler/BytecodeGenerator.h:

(JSC::Variable::Variable):
(JSC::Variable::isReadOnly):
(JSC::Variable::isSpecial):
(JSC::Variable::isConst):
(JSC::BytecodeGenerator::thisRegister):
(JSC::BytecodeGenerator::emitTypeOf):
(JSC::BytecodeGenerator::emitIn):

  • bytecompiler/NodesCodegen.cpp:

(JSC::PostfixNode::emitResolve):
(JSC::PrefixNode::emitResolve):
(JSC::ReadModifyResolveNode::emitBytecode):
(JSC::AssignResolveNode::emitBytecode):
(JSC::CommaNode::emitBytecode):
(JSC::BindingNode::bindValue):
(JSC::ConstDeclNode::emitCodeSingle): Deleted.
(JSC::ConstDeclNode::emitBytecode): Deleted.
(JSC::ConstStatementNode::emitBytecode): Deleted.

  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::parseBlock):

  • dfg/DFGCapabilities.cpp:

(JSC::DFG::capabilityLevel):

  • jit/JIT.cpp:

(JSC::JIT::privateCompileMainPass):

  • jit/JIT.h:
  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_put_to_arguments):
(JSC::JIT::emit_op_init_global_const): Deleted.

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::emit_op_put_to_arguments):
(JSC::JIT::emit_op_init_global_const): Deleted.

  • llint/LowLevelInterpreter.asm:
  • llint/LowLevelInterpreter32_64.asm:
  • llint/LowLevelInterpreter64.asm:
  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createDeclarationStatement):
(JSC::ASTBuilder::createEmptyVarExpression):
(JSC::ASTBuilder::createDebugger):
(JSC::ASTBuilder::appendStatement):
(JSC::ASTBuilder::createVarStatement): Deleted.
(JSC::ASTBuilder::createLetStatement): Deleted.
(JSC::ASTBuilder::createConstStatement): Deleted.
(JSC::ASTBuilder::appendConstDecl): Deleted.

  • parser/NodeConstructors.h:

(JSC::CommaNode::CommaNode):
(JSC::SourceElements::SourceElements):
(JSC::SwitchNode::SwitchNode):
(JSC::BlockNode::BlockNode):
(JSC::ConstStatementNode::ConstStatementNode): Deleted.
(JSC::ConstDeclNode::ConstDeclNode): Deleted.

  • parser/Nodes.h:

(JSC::ConstDeclNode::hasInitializer): Deleted.
(JSC::ConstDeclNode::ident): Deleted.

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseStatementListItem):
(JSC::Parser<LexerType>::parseVariableDeclaration):
(JSC::Parser<LexerType>::parseWhileStatement):
(JSC::Parser<LexerType>::parseVariableDeclarationList):
(JSC::Parser<LexerType>::createBindingPattern):
(JSC::Parser<LexerType>::parseDestructuringPattern):
(JSC::Parser<LexerType>::parseDefaultValueForDestructuringPattern):
(JSC::Parser<LexerType>::parseForStatement):
(JSC::Parser<LexerType>::parseTryStatement):
(JSC::Parser<LexerType>::parseFunctionInfo):
(JSC::Parser<LexerType>::parseFunctionDeclaration):
(JSC::Parser<LexerType>::parseClass):
(JSC::Parser<LexerType>::parseConstDeclaration): Deleted.
(JSC::Parser<LexerType>::parseConstDeclarationList): Deleted.

  • parser/Parser.h:

(JSC::isEvalNode):
(JSC::isEvalNode<EvalNode>):
(JSC::isArguments):
(JSC::isEval):
(JSC::isEvalOrArgumentsIdentifier):
(JSC::Scope::Scope):
(JSC::Scope::declareCallee):
(JSC::Scope::declareVariable):
(JSC::Scope::declareLexicalVariable):
(JSC::Scope::hasDeclaredVariable):
(JSC::Scope::allowsVarDeclarations):
(JSC::Scope::allowsLexicalDeclarations):
(JSC::Scope::declareParameter):
(JSC::Scope::declareBoundParameter):
(JSC::Parser::destructuringKindFromDeclarationType):
(JSC::Parser::assignmentContextFromDeclarationType):
(JSC::Parser::isEvalOrArguments):
(JSC::Parser::currentScope):
(JSC::Parser::popScope):
(JSC::Parser::declareVariable):
(JSC::Parser::hasDeclaredVariable):
(JSC::Parser::setStrictMode):
(JSC::Parser::strictMode):
(JSC::Parser::isValidStrictMode):
(JSC::Parser::declareParameter):
(JSC::Parser::declareBoundParameter):
(JSC::Parser::breakIsValid):

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createForInLoop):
(JSC::SyntaxChecker::createForOfLoop):
(JSC::SyntaxChecker::createEmptyStatement):
(JSC::SyntaxChecker::createDeclarationStatement):
(JSC::SyntaxChecker::createReturnStatement):
(JSC::SyntaxChecker::createBreakStatement):
(JSC::SyntaxChecker::createVarStatement): Deleted.
(JSC::SyntaxChecker::createLetStatement): Deleted.

  • parser/VariableEnvironment.h:

(JSC::VariableEnvironmentEntry::isCaptured):
(JSC::VariableEnvironmentEntry::isConst):
(JSC::VariableEnvironmentEntry::isVar):
(JSC::VariableEnvironmentEntry::isLet):
(JSC::VariableEnvironmentEntry::setIsCaptured):
(JSC::VariableEnvironmentEntry::setIsConst):
(JSC::VariableEnvironmentEntry::setIsVar):
(JSC::VariableEnvironmentEntry::setIsLet):
(JSC::VariableEnvironmentEntry::isConstant): Deleted.
(JSC::VariableEnvironmentEntry::setIsConstant): Deleted.

  • runtime/Executable.cpp:

(JSC::ProgramExecutable::initializeGlobalProperties):

  • runtime/JSGlobalObject.cpp:

(JSC::JSGlobalObject::defineOwnProperty):
(JSC::JSGlobalObject::addGlobalVar):
(JSC::JSGlobalObject::addFunction):
(JSC::lastInPrototypeChain):

  • runtime/JSGlobalObject.h:

(JSC::JSGlobalObject::finishCreation):
(JSC::JSGlobalObject::addVar):
(JSC::JSGlobalObject::addConst): Deleted.

  • runtime/JSLexicalEnvironment.cpp:

(JSC::JSLexicalEnvironment::symbolTablePut):

  • tests/stress/const-and-with-statement.js: Added.

(truth):
(assert):
(shouldThrowInvalidConstAssignment):
(.):

  • tests/stress/const-exception-handling.js: Added.

(truth):
(assert):
(.):

  • tests/stress/const-loop-semantics.js: Added.

(truth):
(assert):
(shouldThrowInvalidConstAssignment):
(.):

  • tests/stress/const-not-strict-mode.js: Added.

(truth):
(assert):
(shouldThrowTDZ):
(.):

  • tests/stress/const-semantics.js: Added.

(truth):
(assert):
(shouldThrowInvalidConstAssignment):
(.):

  • tests/stress/const-tdz.js: Added.

(truth):
(assert):
(shouldThrowTDZ):
(.):

Source/WebInspectorUI:

"const" variables do not live on the global object and are only
accessible within the "Program" they're defined in. Therefore,
the WebInspector global must be defined as "var" and not "const".

  • UserInterface/Base/WebInspector.js:

LayoutTests:

"const" variables do not live on the global object. They
are only available in the "Program" (read: JavaScript file or
script tag) that they're defined in. Tests have been updated
accordingly to switch the "const" variables assumed to be globals
into "var"s. "var" declared variables in the top level scope
of a program do live on the global object.

  • fast/canvas/webgl/compressed-tex-image.html:
  • fast/dom/event-handler-attributes.html:
  • fast/forms/listbox-visible-size.html:
  • js/arguments-expected.txt:
  • js/arrowfunction-syntax-errors-expected.txt:
  • js/const-expected.txt:
  • js/const-without-initializer-expected.txt:
  • js/constant-count-expected.txt:
  • js/dom/inc-const-valueOf-expected.txt:
  • js/dom/script-tests/inc-const-valueOf.js:

(testPreIncConstVarWithAssign):

  • js/function-toString-parentheses-expected.txt:
  • js/kde/const-expected.txt:
  • js/kde/resources/const.js:
  • js/parser-syntax-check-expected.txt:
  • js/script-tests/arguments.js:

(argumentsVarUndefined):
(argumentsConst):
(argumentCalleeInException):
(argumentsConstUndefined): Deleted.

  • js/script-tests/class-syntax-declaration.js:

(A):

  • js/script-tests/class-syntax-expression.js:
  • js/script-tests/const-without-initializer.js:
  • js/script-tests/const.js:

(shouldThrowInvalidConstAssignment):
(assert):
(f):
(tryCatch1):
(tryCatch2):
(with1):
(with2):
(.):

  • js/script-tests/constant-count.js:

(f):

  • js/script-tests/function-dot-arguments.js:

(assignConstInitTest2.g):
(assignConstInitTest2):

  • js/script-tests/function-toString-parentheses.js:
  • js/script-tests/parser-syntax-check.js:
  • sputnik/Conformance/07_Lexical_Conventions/7.5_Tokens/7.5.3_Future_Reserved_Words/S7.5.3_A1.6-expected.txt:
  • sputnik/Conformance/07_Lexical_Conventions/7.8_Literals/7.8.5_Regular_Expression_Literals/S7.8.5_A3.1_T7-expected.txt:
  • sputnik/Conformance/07_Lexical_Conventions/7.8_Literals/7.8.5_Regular_Expression_Literals/S7.8.5_A3.1_T8-expected.txt:
  • sputnik/Conformance/07_Lexical_Conventions/7.8_Literals/7.8.5_Regular_Expression_Literals/S7.8.5_A3.1_T9-expected.txt:
  • sputnik/Conformance/08_Types/8.4_The_String_Type/S8.4_A13_T3-expected.txt:
  • sputnik/Conformance/08_Types/8.4_The_String_Type/S8.4_A14_T3-expected.txt:
  • sputnik/Conformance/12_Statement/12.2_Variable_Statement/S12.2_A8_T1-expected.txt:
  • sputnik/Conformance/12_Statement/12.2_Variable_Statement/S12.2_A8_T2-expected.txt:
  • sputnik/Conformance/12_Statement/12.2_Variable_Statement/S12.2_A8_T3-expected.txt:
  • sputnik/Conformance/12_Statement/12.2_Variable_Statement/S12.2_A8_T4-expected.txt:
  • sputnik/Conformance/12_Statement/12.2_Variable_Statement/S12.2_A8_T6-expected.txt:
  • sputnik/Conformance/12_Statement/12.2_Variable_Statement/S12.2_A8_T7-expected.txt:
  • sputnik/Conformance/12_Statement/12.2_Variable_Statement/S12.2_A8_T8-expected.txt:
  • transforms/3d/hit-testing/composited-hit-test.html:
  • transforms/3d/hit-testing/coplanar-with-camera.html:
  • transforms/3d/hit-testing/hover-rotated-negative-z.html:
  • transforms/3d/hit-testing/hover-rotated-with-children-negative-z.html:
  • transforms/3d/hit-testing/negative-zoffset-hit-test.html:
  • transforms/3d/hit-testing/overlapping-layers-hit-test.html:
  • transforms/3d/hit-testing/perspective-clipped.html:
  • transforms/3d/hit-testing/rotated-hit-test-with-child.html:
  • transforms/3d/hit-testing/rotated-hit-test.html:
  • transforms/3d/hit-testing/rotated-hit-test2.html:
  • transitions/resources/transition-test-helpers.js:

(roundNumber):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/Parser.h

    r186959 r187012  
    6868#define TreeClause typename TreeBuilder::Clause
    6969#define TreeClauseList typename TreeBuilder::ClauseList
    70 #define TreeConstDeclList typename TreeBuilder::ConstDeclList
    7170#define TreeArguments typename TreeBuilder::Arguments
    7271#define TreeArgumentsList typename TreeBuilder::ArgumentsList
     
    8584enum FunctionBodyType { ArrowFunctionBodyExpression, ArrowFunctionBodyBlock, StandardFunctionBodyBlock };
    8685enum FunctionRequirements { FunctionNoRequirements, FunctionNeedsName };
     86
    8787enum DestructuringKind {
    8888    DestructureToVariables,
    89     DestructureToLexicalVariables,
     89    DestructureToLet,
     90    DestructureToConst,
    9091    DestructureToParameters,
    9192    DestructureToExpressions
    9293};
     94
     95enum class DeclarationType {
     96    VarDeclaration,
     97    LetDeclaration,
     98    ConstDeclaration
     99};
     100
     101enum DeclarationResult {
     102    Valid = 0,
     103    InvalidStrictMode = 1 << 0,
     104    InvalidDuplicateDeclaration = 1 << 1
     105};
     106
     107typedef uint8_t DeclarationResultMask;
     108
    93109
    94110template <typename T> inline bool isEvalNode() { return false; }
     
    99115    bool isLoop;
    100116};
     117
     118ALWAYS_INLINE static bool isArguments(const VM* vm, const Identifier* ident)
     119{
     120    return vm->propertyNames->arguments == *ident;
     121}
     122ALWAYS_INLINE static bool isEval(const VM* vm, const Identifier* ident)
     123{
     124    return vm->propertyNames->eval == *ident;
     125}
     126ALWAYS_INLINE static bool isEvalOrArgumentsIdentifier(const VM* vm, const Identifier* ident)
     127{
     128    return isEval(vm, ident) || isArguments(vm, ident);
     129}
    101130
    102131struct Scope {
     
    237266    }
    238267
    239     bool declareVariable(const Identifier* ident, bool isConstant = false)
     268    DeclarationResultMask declareVariable(const Identifier* ident)
    240269    {
    241270        ASSERT(m_allowsVarDeclarations);
    242         bool isValidStrictMode = m_vm->propertyNames->eval != *ident && m_vm->propertyNames->arguments != *ident;
     271        DeclarationResultMask result = DeclarationResult::Valid;
     272        bool isValidStrictMode = !isEvalOrArgumentsIdentifier(m_vm, ident);
    243273        m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode;
    244274        auto addResult = m_declaredVariables.add(ident->impl());
    245275        addResult.iterator->value.setIsVar();
    246         if (isConstant)
    247             addResult.iterator->value.setIsConstant();
    248 
    249         return isValidStrictMode;
    250     }
    251 
    252     bool declareLexicalVariable(const Identifier* ident)
     276        if (!isValidStrictMode)
     277            result |= DeclarationResult::InvalidStrictMode;
     278        return result;
     279    }
     280
     281    DeclarationResultMask declareLexicalVariable(const Identifier* ident, bool isConstant)
    253282    {
    254283        ASSERT(m_allowsLexicalDeclarations);
    255         bool isValidStrictMode = m_vm->propertyNames->eval != *ident && m_vm->propertyNames->arguments != *ident;
     284        DeclarationResultMask result = DeclarationResult::Valid;
     285        bool isValidStrictMode = !isEvalOrArgumentsIdentifier(m_vm, ident);
    256286        m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode;
    257287        auto addResult = m_lexicalVariables.add(ident->impl());
    258         addResult.iterator->value.setIsLet();
    259         bool successfulDeclaration = addResult.isNewEntry && isValidStrictMode;
    260         return successfulDeclaration;
     288        if (isConstant)
     289            addResult.iterator->value.setIsConst();
     290        else
     291            addResult.iterator->value.setIsLet();
     292
     293        if (!addResult.isNewEntry)
     294            result |= DeclarationResult::InvalidDuplicateDeclaration;
     295        if (!isValidStrictMode)
     296            result |= DeclarationResult::InvalidStrictMode;
     297
     298        return result;
    261299    }
    262300
     
    301339    bool allowsLexicalDeclarations() const { return m_allowsLexicalDeclarations; }
    302340
    303     bool declareParameter(const Identifier* ident)
     341    DeclarationResultMask declareParameter(const Identifier* ident)
    304342    {
    305343        ASSERT(m_allowsVarDeclarations);
    306         bool isArguments = m_vm->propertyNames->arguments == *ident;
     344        DeclarationResultMask result = DeclarationResult::Valid;
     345        bool isArgumentsIdent = isArguments(m_vm, ident);
    307346        auto addResult = m_declaredVariables.add(ident->impl());
    308347        addResult.iterator->value.clearIsVar();
    309         bool isValidStrictMode = addResult.isNewEntry && m_vm->propertyNames->eval != *ident && !isArguments;
     348        bool isValidStrictMode = addResult.isNewEntry && m_vm->propertyNames->eval != *ident && !isArgumentsIdent;
    310349        m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode;
    311350        m_declaredParameters.add(ident->impl());
    312 
    313         if (isArguments)
     351        if (!isValidStrictMode)
     352            result |= DeclarationResult::InvalidStrictMode;
     353        if (isArgumentsIdent)
    314354            m_shadowsArguments = true;
    315         return isValidStrictMode;
     355
     356        return result;
    316357    }
    317358   
     
    323364    BindingResult declareBoundParameter(const Identifier* ident)
    324365    {
    325         bool isArguments = m_vm->propertyNames->arguments == *ident;
     366        bool isArgumentsIdent = isArguments(m_vm, ident);
    326367        auto addResult = m_declaredVariables.add(ident->impl());
    327368        addResult.iterator->value.setIsVar(); // Treat destructuring parameters as "var"s.
    328         bool isValidStrictMode = addResult.isNewEntry && m_vm->propertyNames->eval != *ident && !isArguments;
     369        bool isValidStrictMode = addResult.isNewEntry && !isEval(m_vm, ident) && !isArgumentsIdent;
    329370        m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode;
    330371   
    331         if (isArguments)
     372        if (isArgumentsIdent)
    332373            m_shadowsArguments = true;
    333374        if (!addResult.isNewEntry)
     
    616657    };
    617658
     659    ALWAYS_INLINE DestructuringKind destructuringKindFromDeclarationType(DeclarationType type)
     660    {
     661        switch (type) {
     662        case DeclarationType::VarDeclaration:
     663            return DestructureToVariables;
     664        case DeclarationType::LetDeclaration:
     665            return DestructureToLet;
     666        case DeclarationType::ConstDeclaration:
     667            return DestructureToConst;
     668        }
     669
     670        RELEASE_ASSERT_NOT_REACHED();
     671        return DestructureToVariables;
     672    }
     673
     674    ALWAYS_INLINE AssignmentContext assignmentContextFromDeclarationType(DeclarationType type)
     675    {
     676        switch (type) {
     677        case DeclarationType::ConstDeclaration:
     678            return AssignmentContext::ConstDeclarationStatement;
     679        default:
     680            return AssignmentContext::DeclarationStatement;
     681        }
     682    }
     683
     684    ALWAYS_INLINE bool isEvalOrArguments(const Identifier* ident) { return isEvalOrArgumentsIdentifier(m_vm, ident); }
     685
    618686    ScopeRef currentScope()
    619687    {
     
    662730    }
    663731   
    664     enum class DeclarationType { VarDeclaration, LexicalDeclaration };
    665     bool declareVariable(const Identifier* ident, typename Parser::DeclarationType type = DeclarationType::VarDeclaration, bool isConstant = false)
     732    DeclarationResultMask declareVariable(const Identifier* ident, DeclarationType type = DeclarationType::VarDeclaration)
    666733    {
    667734        unsigned i = m_scopeStack.size() - 1;
     
    674741            }
    675742
    676             return m_scopeStack[i].declareVariable(ident, isConstant);
    677         }
    678 
    679         ASSERT(type == DeclarationType::LexicalDeclaration);
     743            return m_scopeStack[i].declareVariable(ident);
     744        }
     745
     746        ASSERT(type == DeclarationType::LetDeclaration || type == DeclarationType::ConstDeclaration);
    680747
    681748        // Lexical variables declared at a top level scope that shadow arguments or vars are not allowed.
    682749        if (m_statementDepth == 1 && (hasDeclaredParameter(*ident) || hasDeclaredVariable(*ident)))
    683             return false;
     750            return DeclarationResult::InvalidDuplicateDeclaration;
    684751
    685752        while (!m_scopeStack[i].allowsLexicalDeclarations()) {
     
    688755        }
    689756
    690         return m_scopeStack[i].declareLexicalVariable(ident);
     757        return m_scopeStack[i].declareLexicalVariable(ident, type == DeclarationType::ConstDeclaration);
    691758    }
    692759   
     
    895962    bool strictMode() { return currentScope()->strictMode(); }
    896963    bool isValidStrictMode() { return currentScope()->isValidStrictMode(); }
    897     bool declareParameter(const Identifier* ident) { return currentScope()->declareParameter(ident); }
     964    DeclarationResultMask declareParameter(const Identifier* ident) { return currentScope()->declareParameter(ident); }
    898965    Scope::BindingResult declareBoundParameter(const Identifier* ident) { return currentScope()->declareBoundParameter(ident); }
    899966    bool breakIsValid()
     
    9441011    template <class TreeBuilder> TreeStatement parseFunctionDeclaration(TreeBuilder&);
    9451012    template <class TreeBuilder> TreeStatement parseVariableDeclaration(TreeBuilder&, DeclarationType);
    946     template <class TreeBuilder> TreeStatement parseConstDeclaration(TreeBuilder&);
    9471013    template <class TreeBuilder> TreeStatement parseDoWhileStatement(TreeBuilder&);
    9481014    template <class TreeBuilder> TreeStatement parseWhileStatement(TreeBuilder&);
     
    9801046    template <class TreeBuilder> ALWAYS_INLINE bool parseFormalParameters(TreeBuilder&, TreeFormalParameterList, unsigned&);
    9811047    enum VarDeclarationListContext { ForLoopContext, VarDeclarationContext };
    982     template <class TreeBuilder> TreeExpression parseVariableDeclarationList(TreeBuilder&, int& declarations, TreeDestructuringPattern& lastPattern, TreeExpression& lastInitializer, JSTextPosition& identStart, JSTextPosition& initStart, JSTextPosition& initEnd, VarDeclarationListContext, DeclarationType);
    983     template <class TreeBuilder> NEVER_INLINE TreeConstDeclList parseConstDeclarationList(TreeBuilder&);
     1048    template <class TreeBuilder> TreeExpression parseVariableDeclarationList(TreeBuilder&, int& declarations, TreeDestructuringPattern& lastPattern, TreeExpression& lastInitializer, JSTextPosition& identStart, JSTextPosition& initStart, JSTextPosition& initEnd, VarDeclarationListContext, DeclarationType, bool& forLoopConstDoesNotHaveInitializer);
    9841049    template <class TreeBuilder> TreeSourceElements parseArrowFunctionSingleExpressionBodySourceElements(TreeBuilder&);
    9851050    template <class TreeBuilder> TreeExpression parseArrowFunctionExpression(TreeBuilder&);
Note: See TracChangeset for help on using the changeset viewer.