Changeset 187012 in webkit for trunk/Source/JavaScriptCore/parser/Parser.h
- Timestamp:
- Jul 19, 2015, 9:57:44 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/parser/Parser.h
r186959 r187012 68 68 #define TreeClause typename TreeBuilder::Clause 69 69 #define TreeClauseList typename TreeBuilder::ClauseList 70 #define TreeConstDeclList typename TreeBuilder::ConstDeclList71 70 #define TreeArguments typename TreeBuilder::Arguments 72 71 #define TreeArgumentsList typename TreeBuilder::ArgumentsList … … 85 84 enum FunctionBodyType { ArrowFunctionBodyExpression, ArrowFunctionBodyBlock, StandardFunctionBodyBlock }; 86 85 enum FunctionRequirements { FunctionNoRequirements, FunctionNeedsName }; 86 87 87 enum DestructuringKind { 88 88 DestructureToVariables, 89 DestructureToLexicalVariables, 89 DestructureToLet, 90 DestructureToConst, 90 91 DestructureToParameters, 91 92 DestructureToExpressions 92 93 }; 94 95 enum class DeclarationType { 96 VarDeclaration, 97 LetDeclaration, 98 ConstDeclaration 99 }; 100 101 enum DeclarationResult { 102 Valid = 0, 103 InvalidStrictMode = 1 << 0, 104 InvalidDuplicateDeclaration = 1 << 1 105 }; 106 107 typedef uint8_t DeclarationResultMask; 108 93 109 94 110 template <typename T> inline bool isEvalNode() { return false; } … … 99 115 bool isLoop; 100 116 }; 117 118 ALWAYS_INLINE static bool isArguments(const VM* vm, const Identifier* ident) 119 { 120 return vm->propertyNames->arguments == *ident; 121 } 122 ALWAYS_INLINE static bool isEval(const VM* vm, const Identifier* ident) 123 { 124 return vm->propertyNames->eval == *ident; 125 } 126 ALWAYS_INLINE static bool isEvalOrArgumentsIdentifier(const VM* vm, const Identifier* ident) 127 { 128 return isEval(vm, ident) || isArguments(vm, ident); 129 } 101 130 102 131 struct Scope { … … 237 266 } 238 267 239 bool declareVariable(const Identifier* ident, bool isConstant = false)268 DeclarationResultMask declareVariable(const Identifier* ident) 240 269 { 241 270 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); 243 273 m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode; 244 274 auto addResult = m_declaredVariables.add(ident->impl()); 245 275 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) 253 282 { 254 283 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); 256 286 m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode; 257 287 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; 261 299 } 262 300 … … 301 339 bool allowsLexicalDeclarations() const { return m_allowsLexicalDeclarations; } 302 340 303 booldeclareParameter(const Identifier* ident)341 DeclarationResultMask declareParameter(const Identifier* ident) 304 342 { 305 343 ASSERT(m_allowsVarDeclarations); 306 bool isArguments = m_vm->propertyNames->arguments == *ident; 344 DeclarationResultMask result = DeclarationResult::Valid; 345 bool isArgumentsIdent = isArguments(m_vm, ident); 307 346 auto addResult = m_declaredVariables.add(ident->impl()); 308 347 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; 310 349 m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode; 311 350 m_declaredParameters.add(ident->impl()); 312 313 if (isArguments) 351 if (!isValidStrictMode) 352 result |= DeclarationResult::InvalidStrictMode; 353 if (isArgumentsIdent) 314 354 m_shadowsArguments = true; 315 return isValidStrictMode; 355 356 return result; 316 357 } 317 358 … … 323 364 BindingResult declareBoundParameter(const Identifier* ident) 324 365 { 325 bool isArguments = m_vm->propertyNames->arguments == *ident;366 bool isArgumentsIdent = isArguments(m_vm, ident); 326 367 auto addResult = m_declaredVariables.add(ident->impl()); 327 368 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; 329 370 m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode; 330 371 331 if (isArguments )372 if (isArgumentsIdent) 332 373 m_shadowsArguments = true; 333 374 if (!addResult.isNewEntry) … … 616 657 }; 617 658 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 618 686 ScopeRef currentScope() 619 687 { … … 662 730 } 663 731 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) 666 733 { 667 734 unsigned i = m_scopeStack.size() - 1; … … 674 741 } 675 742 676 return m_scopeStack[i].declareVariable(ident , isConstant);677 } 678 679 ASSERT(type == DeclarationType::Le xicalDeclaration);743 return m_scopeStack[i].declareVariable(ident); 744 } 745 746 ASSERT(type == DeclarationType::LetDeclaration || type == DeclarationType::ConstDeclaration); 680 747 681 748 // Lexical variables declared at a top level scope that shadow arguments or vars are not allowed. 682 749 if (m_statementDepth == 1 && (hasDeclaredParameter(*ident) || hasDeclaredVariable(*ident))) 683 return false;750 return DeclarationResult::InvalidDuplicateDeclaration; 684 751 685 752 while (!m_scopeStack[i].allowsLexicalDeclarations()) { … … 688 755 } 689 756 690 return m_scopeStack[i].declareLexicalVariable(ident );757 return m_scopeStack[i].declareLexicalVariable(ident, type == DeclarationType::ConstDeclaration); 691 758 } 692 759 … … 895 962 bool strictMode() { return currentScope()->strictMode(); } 896 963 bool isValidStrictMode() { return currentScope()->isValidStrictMode(); } 897 booldeclareParameter(const Identifier* ident) { return currentScope()->declareParameter(ident); }964 DeclarationResultMask declareParameter(const Identifier* ident) { return currentScope()->declareParameter(ident); } 898 965 Scope::BindingResult declareBoundParameter(const Identifier* ident) { return currentScope()->declareBoundParameter(ident); } 899 966 bool breakIsValid() … … 944 1011 template <class TreeBuilder> TreeStatement parseFunctionDeclaration(TreeBuilder&); 945 1012 template <class TreeBuilder> TreeStatement parseVariableDeclaration(TreeBuilder&, DeclarationType); 946 template <class TreeBuilder> TreeStatement parseConstDeclaration(TreeBuilder&);947 1013 template <class TreeBuilder> TreeStatement parseDoWhileStatement(TreeBuilder&); 948 1014 template <class TreeBuilder> TreeStatement parseWhileStatement(TreeBuilder&); … … 980 1046 template <class TreeBuilder> ALWAYS_INLINE bool parseFormalParameters(TreeBuilder&, TreeFormalParameterList, unsigned&); 981 1047 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); 984 1049 template <class TreeBuilder> TreeSourceElements parseArrowFunctionSingleExpressionBodySourceElements(TreeBuilder&); 985 1050 template <class TreeBuilder> TreeExpression parseArrowFunctionExpression(TreeBuilder&);
Note:
See TracChangeset
for help on using the changeset viewer.