Changeset 192671 in webkit for trunk/Source/JavaScriptCore/parser/Parser.cpp
- Timestamp:
- Nov 19, 2015, 6:37:47 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/parser/Parser.cpp
r192661 r192671 670 670 671 671 template <typename LexerType> 672 bool Parser<LexerType>::declareRestOrNormalParameter(const Identifier& name, const Identifier** duplicateIdentifier) 673 { 674 DeclarationResultMask declarationResult = declareParameter(&name); 675 if ((declarationResult & DeclarationResult::InvalidStrictMode) && strictMode()) { 676 semanticFailIfTrue(isEvalOrArguments(&name), "Cannot destructure to a parameter name '", name.impl(), "' in strict mode"); 677 if (m_lastFunctionName && name == *m_lastFunctionName) 678 semanticFail("Cannot declare a parameter named '", name.impl(), "' as it shadows the name of a strict mode function"); 679 semanticFailureDueToKeyword("parameter name"); 680 if (hasDeclaredParameter(name)) 681 semanticFail("Cannot declare a parameter named '", name.impl(), "' in strict mode as it has already been declared"); 682 semanticFail("Cannot declare a parameter named '", name.impl(), "' in strict mode"); 683 } 684 if (declarationResult & DeclarationResult::InvalidDuplicateDeclaration) { 685 // It's not always an error to define a duplicate parameter. 686 // It's only an error when there are default parameter values or destructuring parameters. 687 // We note this value now so we can check it later. 688 if (duplicateIdentifier) 689 *duplicateIdentifier = &name; 690 } 691 692 return true; 693 } 694 695 template <typename LexerType> 672 696 template <class TreeBuilder> TreeDestructuringPattern Parser<LexerType>::createBindingPattern(TreeBuilder& context, DestructuringKind kind, ExportType exportType, const Identifier& name, JSToken token, AssignmentContext bindingContext, const Identifier** duplicateIdentifier) 673 697 { … … 688 712 } 689 713 } else if (kind == DestructureToParameters) { 690 DeclarationResultMask declarationResult = declareParameter(&name); 691 if ((declarationResult & DeclarationResult::InvalidStrictMode) && strictMode()) { 692 semanticFailIfTrue(isEvalOrArguments(&name), "Cannot destructure to a parameter name '", name.impl(), "' in strict mode"); 693 if (m_lastFunctionName && name == *m_lastFunctionName) 694 semanticFail("Cannot declare a parameter named '", name.impl(), "' as it shadows the name of a strict mode function"); 695 semanticFailureDueToKeyword("parameter name"); 696 if (hasDeclaredParameter(name)) 697 semanticFail("Cannot declare a parameter named '", name.impl(), "' in strict mode as it has already been declared"); 698 semanticFail("Cannot declare a parameter named '", name.impl(), "' in strict mode"); 699 } 700 if (declarationResult & DeclarationResult::InvalidDuplicateDeclaration) { 701 // It's not always an error to define a duplicate parameter. 702 // It's only an error when there are default parameter values or destructuring parameters. 703 // We note this value now so we can check it later. 704 if (duplicateIdentifier) 705 *duplicateIdentifier = &name; 706 } 714 declareRestOrNormalParameter(name, duplicateIdentifier); 715 propagateError(); 707 716 } 708 717 … … 1537 1546 template <class TreeBuilder> bool Parser<LexerType>::parseFormalParameters(TreeBuilder& context, TreeFormalParameterList list, unsigned& parameterCount) 1538 1547 { 1539 #define fail FromDuplicate() \1548 #define failIfDuplicateIfViolation() \ 1540 1549 if (duplicateParameter) {\ 1541 1550 semanticFailIfTrue(defaultValue, "Duplicate parameter '", duplicateParameter->impl(), "' not allowed in function with default parameter values");\ 1542 1551 semanticFailIfTrue(hasDestructuringPattern, "Duplicate parameter '", duplicateParameter->impl(), "' not allowed in function with destructuring parameters");\ 1543 } 1544 1552 semanticFailIfTrue(isRestParameter, "Duplicate parameter '", duplicateParameter->impl(), "' not allowed in function with a rest parameter");\ 1553 } 1554 1555 bool hasDestructuringPattern = false; 1556 bool isRestParameter = false; 1545 1557 const Identifier* duplicateParameter = nullptr; 1546 bool hasDestructuringPattern = false; 1547 auto parameter = parseDestructuringPattern(context, DestructureToParameters, ExportType::NotExported, &duplicateParameter, &hasDestructuringPattern); 1548 failIfFalse(parameter, "Cannot parse parameter pattern"); 1549 auto defaultValue = parseDefaultValueForDestructuringPattern(context); 1550 propagateError(); 1551 failFromDuplicate(); 1552 context.appendParameter(list, parameter, defaultValue); 1553 parameterCount++; 1554 while (consume(COMMA)) { 1555 parameter = parseDestructuringPattern(context, DestructureToParameters, ExportType::NotExported, &duplicateParameter, &hasDestructuringPattern); 1558 do { 1559 TreeDestructuringPattern parameter = 0; 1560 TreeExpression defaultValue = 0; 1561 1562 if (match(DOTDOTDOT)) { 1563 next(); 1564 failIfFalse(matchSpecIdentifier(), "Rest parameter '...' should be followed by a variable identifier"); 1565 declareRestOrNormalParameter(*m_token.m_data.ident, &duplicateParameter); 1566 propagateError(); 1567 JSTextPosition identifierStart = tokenStartPosition(); 1568 JSTextPosition identifierEnd = tokenEndPosition(); 1569 parameter = context.createRestParameter(*m_token.m_data.ident, parameterCount, identifierStart, identifierEnd); 1570 next(); 1571 failIfTrue(match(COMMA), "Rest parameter should be the last parameter in a function declaration"); // Let's have a good error message for this common case. 1572 isRestParameter = true; 1573 } else 1574 parameter = parseDestructuringPattern(context, DestructureToParameters, ExportType::NotExported, &duplicateParameter, &hasDestructuringPattern); 1556 1575 failIfFalse(parameter, "Cannot parse parameter pattern"); 1557 defaultValue = parseDefaultValueForDestructuringPattern(context); 1576 if (!isRestParameter) 1577 defaultValue = parseDefaultValueForDestructuringPattern(context); 1558 1578 propagateError(); 1559 fail FromDuplicate();1579 failIfDuplicateIfViolation(); 1560 1580 context.appendParameter(list, parameter, defaultValue); 1561 parameterCount++; 1562 } 1581 if (!isRestParameter) 1582 parameterCount++; 1583 } while (!isRestParameter && consume(COMMA)); 1584 1563 1585 return true; 1564 #undef fail FromDuplicate1586 #undef failIfDuplicateIfViolation 1565 1587 } 1566 1588
Note:
See TracChangeset
for help on using the changeset viewer.