Changeset 194107 in webkit
- Timestamp:
- Dec 15, 2015 9:58:04 AM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r194101 r194107 1 2015-12-15 Caitlin Potter <caitp@igalia.com> 2 3 [JSC] SyntaxError if AssignmentElement is `eval` or `arguments` in strict code 4 https://bugs.webkit.org/show_bug.cgi?id=152302 5 6 Reviewed by Mark Lam. 7 8 `eval` and `arguments` must not be assigned to in strict code. This 9 change fixes `language/expressions/assignment/destructuring/obj-id-simple-strict.js` 10 in Test262, as well as a variety of other similar tests. 11 12 * parser/Parser.cpp: 13 (JSC::Parser<LexerType>::parseAssignmentElement): 14 (JSC::Parser<LexerType>::parseDestructuringPattern): 15 * tests/stress/destructuring-assignment-syntax.js: 16 1 17 2015-12-15 Csaba Osztrogonác <ossy@webkit.org> 2 18 -
trunk/Source/JavaScriptCore/parser/Parser.cpp
r193766 r194107 828 828 template <class TreeBuilder> TreeDestructuringPattern Parser<LexerType>::parseAssignmentElement(TreeBuilder& context, DestructuringKind kind, ExportType exportType, const Identifier** duplicateIdentifier, bool* hasDestructuringPattern, AssignmentContext bindingContext, int depth) 829 829 { 830 SavePoint savePoint = createSavePoint();831 830 TreeDestructuringPattern assignmentTarget = 0; 832 831 833 if (match(OPENBRACE) || match(OPENBRACKET)) 832 if (match(OPENBRACE) || match(OPENBRACKET)) { 833 SavePoint savePoint = createSavePoint(); 834 834 assignmentTarget = parseDestructuringPattern(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth); 835 if (!assignmentTarget || match(DOT) || match(OPENBRACKET) || match(OPENPAREN) || match(TEMPLATE)) { 835 if (assignmentTarget && !match(DOT) && !match(OPENBRACKET) && !match(OPENPAREN) && !match(TEMPLATE)) 836 return assignmentTarget; 836 837 restoreSavePoint(savePoint); 837 JSTextPosition startPosition = tokenStartPosition(); 838 auto element = parseMemberExpression(context); 839 840 semanticFailIfFalse(element && context.isAssignmentLocation(element), "Invalid destructuring assignment target"); 841 842 return createAssignmentElement(context, element, startPosition, lastTokenEndPosition()); 843 } 844 return assignmentTarget; 838 } 839 840 JSTextPosition startPosition = tokenStartPosition(); 841 auto element = parseMemberExpression(context); 842 843 semanticFailIfFalse(element && context.isAssignmentLocation(element), "Invalid destructuring assignment target"); 844 845 if (strictMode() && m_lastIdentifier && context.isResolve(element)) { 846 failIfTrueIfStrict(m_vm->propertyNames->eval == *m_lastIdentifier, "Cannot modify 'eval' in strict mode"); 847 failIfTrueIfStrict(m_vm->propertyNames->arguments == *m_lastIdentifier, "Cannot modify 'arguments' in strict mode"); 848 } 849 850 return createAssignmentElement(context, element, startPosition, lastTokenEndPosition()); 845 851 } 846 852 … … 925 931 if (consume(COLON)) 926 932 innerPattern = parseBindingOrAssignmentElement(context, kind, exportType, duplicateIdentifier, hasDestructuringPattern, bindingContext, depth + 1); 927 else 933 else { 934 if (kind == DestructureToExpressions && strictMode()) { 935 failIfTrueIfStrict(m_vm->propertyNames->eval == *propertyName, "Cannot modify 'eval' in strict mode"); 936 failIfTrueIfStrict(m_vm->propertyNames->arguments == *propertyName, "Cannot modify 'arguments' in strict mode"); 937 } 928 938 innerPattern = createBindingPattern(context, kind, exportType, *propertyName, identifierToken, bindingContext, duplicateIdentifier); 939 } 929 940 } else { 930 941 JSTokenType tokenType = m_token.m_type; -
trunk/Source/JavaScriptCore/tests/stress/destructuring-assignment-syntax.js
r192661 r194107 58 58 testSyntaxError("[null] = []", "SyntaxError: Invalid destructuring assignment target."); 59 59 testSyntaxError("[n\\u{75}ll] = []", "SyntaxError: Invalid destructuring assignment target."); 60 61 testSyntaxError("'use strict'; ({ eval } = {})", "SyntaxError: Cannot modify 'eval' in strict mode."); 62 // FIXME: support CoverInitializedName properly. 63 //testSyntaxError("'use strict'; ({ eval = 0 } = {})", "SyntaxError: Cannot modify 'eval' in strict mode."); 64 testSyntaxError("'use strict'; ({ a: eval } = {})", "SyntaxError: Cannot modify 'eval' in strict mode."); 65 testSyntaxError("'use strict'; ({ a: eval = 0 } = {})", "SyntaxError: Cannot modify 'eval' in strict mode."); 66 testSyntaxError("'use strict'; ({ arguments } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode."); 67 // FIXME: support CoverInitializedName properly. 68 //testSyntaxError("'use strict'; ({ arguments = 0 } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode."); 69 testSyntaxError("'use strict'; ({ a: arguments } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode."); 70 testSyntaxError("'use strict'; ({ a: arguments = 0 } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode."); 71 testSyntaxError("'use strict'; ([ eval ] = [])", "SyntaxError: Cannot modify 'eval' in strict mode."); 72 testSyntaxError("'use strict'; ([ eval = 0 ] = [])", "SyntaxError: Cannot modify 'eval' in strict mode."); 73 testSyntaxError("'use strict'; ([ arguments ] = [])", "SyntaxError: Cannot modify 'arguments' in strict mode."); 74 testSyntaxError("'use strict'; ([ arguments = 0 ] = [])", "SyntaxError: Cannot modify 'arguments' in strict mode.");
Note: See TracChangeset
for help on using the changeset viewer.