Ignore:
Timestamp:
Jan 16, 2011, 3:54:40 PM (14 years ago)
Author:
[email protected]
Message:

2011-01-16 Oliver Hunt <[email protected]>

Reviewed by Geoffrey Garen.

Strict mode restrictions on arguments and eval usage aren't complete
https://bugs.webkit.org/show_bug.cgi?id=52528

Add a helper function to aid parse failure tests by testing both direct
eval/global code, and nested code (so that we test the syntax checker
mode as well)

  • fast/js/basic-strict-mode-expected.txt:
  • fast/js/script-tests/basic-strict-mode.js: (shouldBeSyntaxError):

2011-01-16 Oliver Hunt <[email protected]>

Reviewed by Geoffrey Garen.

Strict mode restrictions on arguments and eval usage aren't complete
https://bugs.webkit.org/show_bug.cgi?id=52528

Fix a few bugs in strict mode where we incorrect allow mutation of
arguments and eval in the parser.

Alas the "optimisation" used by the syntax checker for validating
binary and unary expressions was too aggressive: we do actually need
a stack for operations and operands although it needn't be as complete
as that used for the full AST builder.

Also disallow assignment to arguments in all cases as allowing arguments
to be assignable is always an error in strict mode, regardless of context.

  • parser/ASTBuilder.h: (JSC::ASTBuilder::BinaryExprContext::BinaryExprContext): (JSC::ASTBuilder::UnaryExprContext::UnaryExprContext):
  • parser/JSParser.cpp: (JSC::JSParser::parseAssignmentExpression): (JSC::JSParser::parseBinaryExpression): (JSC::JSParser::parseUnaryExpression):
  • parser/SyntaxChecker.h: (JSC::SyntaxChecker::BinaryExprContext::BinaryExprContext): (JSC::SyntaxChecker::BinaryExprContext::~BinaryExprContext): (JSC::SyntaxChecker::UnaryExprContext::UnaryExprContext): (JSC::SyntaxChecker::UnaryExprContext::~UnaryExprContext): (JSC::SyntaxChecker::appendBinaryExpressionInfo): (JSC::SyntaxChecker::operatorStackPop):
File:
1 edited

Legend:

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

    r75414 r75896  
    3232class SyntaxChecker {
    3333public:
     34    struct BinaryExprContext {
     35        BinaryExprContext(SyntaxChecker& context)
     36            : m_context(&context)
     37        {
     38            m_context->m_topBinaryExprs.append(m_context->m_topBinaryExpr);
     39            m_context->m_topBinaryExpr = 0;
     40        }
     41        ~BinaryExprContext()
     42        {
     43            m_context->m_topBinaryExpr = m_context->m_topBinaryExprs.last();
     44            m_context->m_topBinaryExprs.removeLast();
     45        }
     46    private:
     47        SyntaxChecker* m_context;
     48    };
     49    struct UnaryExprContext {
     50        UnaryExprContext(SyntaxChecker& context)
     51            : m_context(&context)
     52        {
     53            m_context->m_topUnaryTokens.append(m_context->m_topUnaryToken);
     54            m_context->m_topUnaryToken = 0;
     55        }
     56        ~UnaryExprContext()
     57        {
     58            m_context->m_topUnaryToken = m_context->m_topUnaryTokens.last();
     59            m_context->m_topUnaryTokens.removeLast();
     60        }
     61    private:
     62        SyntaxChecker* m_context;
     63    };
     64   
    3465    SyntaxChecker(JSGlobalData* , Lexer*)
    35         : m_topBinaryExpr(0)
    3666    {
    3767    }
     
    213243    int m_topBinaryExpr;
    214244    int m_topUnaryToken;
     245    Vector<int, 8> m_topBinaryExprs;
     246    Vector<int, 8> m_topUnaryTokens;
    215247};
    216248
Note: See TracChangeset for help on using the changeset viewer.