Changeset 194107 in webkit


Ignore:
Timestamp:
Dec 15, 2015 9:58:04 AM (8 years ago)
Author:
commit-queue@webkit.org
Message:

[JSC] SyntaxError if AssignmentElement is eval or arguments in strict code
https://bugs.webkit.org/show_bug.cgi?id=152302

Patch by Caitlin Potter <caitp@igalia.com> on 2015-12-15
Reviewed by Mark Lam.

eval and arguments must not be assigned to in strict code. This
change fixes language/expressions/assignment/destructuring/obj-id-simple-strict.js
in Test262, as well as a variety of other similar tests.

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseAssignmentElement):
(JSC::Parser<LexerType>::parseDestructuringPattern):

  • tests/stress/destructuring-assignment-syntax.js:
Location:
trunk/Source/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r194101 r194107  
     12015-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
    1172015-12-15  Csaba Osztrogonác  <ossy@webkit.org>
    218
  • trunk/Source/JavaScriptCore/parser/Parser.cpp

    r193766 r194107  
    828828template <class TreeBuilder> TreeDestructuringPattern Parser<LexerType>::parseAssignmentElement(TreeBuilder& context, DestructuringKind kind, ExportType exportType, const Identifier** duplicateIdentifier, bool* hasDestructuringPattern, AssignmentContext bindingContext, int depth)
    829829{
    830     SavePoint savePoint = createSavePoint();
    831830    TreeDestructuringPattern assignmentTarget = 0;
    832831
    833     if (match(OPENBRACE) || match(OPENBRACKET))
     832    if (match(OPENBRACE) || match(OPENBRACKET)) {
     833        SavePoint savePoint = createSavePoint();
    834834        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;
    836837        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());
    845851}
    846852
     
    925931                if (consume(COLON))
    926932                    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                    }
    928938                    innerPattern = createBindingPattern(context, kind, exportType, *propertyName, identifierToken, bindingContext, duplicateIdentifier);
     939                }
    929940            } else {
    930941                JSTokenType tokenType = m_token.m_type;
  • trunk/Source/JavaScriptCore/tests/stress/destructuring-assignment-syntax.js

    r192661 r194107  
    5858testSyntaxError("[null] = []", "SyntaxError: Invalid destructuring assignment target.");
    5959testSyntaxError("[n\\u{75}ll] = []", "SyntaxError: Invalid destructuring assignment target.");
     60
     61testSyntaxError("'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.");
     64testSyntaxError("'use strict'; ({ a: eval } = {})", "SyntaxError: Cannot modify 'eval' in strict mode.");
     65testSyntaxError("'use strict'; ({ a: eval = 0 } = {})", "SyntaxError: Cannot modify 'eval' in strict mode.");
     66testSyntaxError("'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.");
     69testSyntaxError("'use strict'; ({ a: arguments } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode.");
     70testSyntaxError("'use strict'; ({ a: arguments = 0 } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode.");
     71testSyntaxError("'use strict'; ([ eval ] = [])", "SyntaxError: Cannot modify 'eval' in strict mode.");
     72testSyntaxError("'use strict'; ([ eval = 0 ] = [])", "SyntaxError: Cannot modify 'eval' in strict mode.");
     73testSyntaxError("'use strict'; ([ arguments ] = [])", "SyntaxError: Cannot modify 'arguments' in strict mode.");
     74testSyntaxError("'use strict'; ([ arguments = 0 ] = [])", "SyntaxError: Cannot modify 'arguments' in strict mode.");
Note: See TracChangeset for help on using the changeset viewer.