106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen/* 206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 Apple Inc. All rights reserved. 306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Redistribution and use in source and binary forms, with or without 506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * modification, are permitted provided that the following conditions 606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * are met: 706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 1. Redistributions of source code must retain the above copyright 806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * notice, this list of conditions and the following disclaimer. 906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright 1006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * notice, this list of conditions and the following disclaimer in the 1106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * documentation and/or other materials provided with the distribution. 1206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 1306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE POSSIBILITY OF SUCH DAMAGE. 2406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen */ 2506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 2606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#ifndef ASTBuilder_h 2706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define ASTBuilder_h 2806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 2906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "NodeConstructors.h" 3006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "SyntaxChecker.h" 3106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <utility> 3206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 3306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsennamespace JSC { 3406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 3506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass ASTBuilder { 3606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen struct BinaryOpInfo { 3706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BinaryOpInfo() {} 3806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BinaryOpInfo(int s, int d, int e, bool r) 3906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen : start(s) 4006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , divot(d) 4106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , end(e) 4206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , hasAssignment(r) 4306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 4406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 4506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BinaryOpInfo(const BinaryOpInfo& lhs, const BinaryOpInfo& rhs) 4606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen : start(lhs.start) 4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , divot(rhs.start) 4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , end(rhs.end) 4906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , hasAssignment(lhs.hasAssignment || rhs.hasAssignment) 5006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 5106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 5206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int start; 5306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int divot; 5406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int end; 5506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool hasAssignment; 5606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen }; 5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 5806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 5906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen struct AssignmentInfo { 6006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen AssignmentInfo() {} 6106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen AssignmentInfo(ExpressionNode* node, int start, int divot, int initAssignments, Operator op) 6206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen : m_node(node) 6306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_start(start) 6406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_divot(divot) 6506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_initAssignments(initAssignments) 6606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_op(op) 6706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 6806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 6906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* m_node; 7006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int m_start; 7106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int m_divot; 7206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int m_initAssignments; 7306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Operator m_op; 7406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen }; 7506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenpublic: 7606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASTBuilder(JSGlobalData* globalData, Lexer* lexer) 7706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen : m_globalData(globalData) 7806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_lexer(lexer) 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_scope(globalData) 8006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_evalCount(0) 8106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 8206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch struct BinaryExprContext { 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch BinaryExprContext(ASTBuilder&) {} 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch }; 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch struct UnaryExprContext { 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch UnaryExprContext(ASTBuilder&) {} 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch }; 9006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 9106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef SyntaxChecker FunctionBodyBuilder; 9206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 9306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef ExpressionNode* Expression; 9406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef JSC::SourceElements* SourceElements; 9506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef ArgumentsNode* Arguments; 9606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef CommaNode* Comma; 9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef PropertyNode* Property; 9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef PropertyListNode* PropertyList; 9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef ElementNode* ElementList; 10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef ArgumentListNode* ArgumentsList; 10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef ParameterNode* FormalParameterList; 10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef FunctionBodyNode* FunctionBody; 10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef StatementNode* Statement; 10406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef ClauseListNode* ClauseList; 10506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef CaseClauseNode* Clause; 10606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef ConstDeclNode* ConstDeclList; 10706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen typedef std::pair<ExpressionNode*, BinaryOpInfo> BinaryOperand; 10806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 10906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen static const bool CreatesAST = true; 11068513a70bcd92384395513322f1b801e7bf9c729Steve Block static const bool NeedsFreeVariableInfo = true; 111ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch static const bool CanUseFunctionCache = true; 11206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 11306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeBinaryNode(int token, std::pair<ExpressionNode*, BinaryOpInfo>, std::pair<ExpressionNode*, BinaryOpInfo>); 11406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeFunctionCallNode(ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end); 11506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 11606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen JSC::SourceElements* createSourceElements() { return new (m_globalData) JSC::SourceElements(m_globalData); } 11706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ParserArenaData<DeclarationStacks::VarStack>* varDeclarations() { return m_scope.m_varDeclarations; } 11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ParserArenaData<DeclarationStacks::FunctionStack>* funcDeclarations() { return m_scope.m_funcDeclarations; } 12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch int features() const { return m_scope.m_features; } 12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch int numConstants() const { return m_scope.m_numConstants; } 12206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 12306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void appendToComma(CommaNode* commaNode, ExpressionNode* expr) { commaNode->append(expr); } 12406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 12506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen CommaNode* createCommaExpr(ExpressionNode* lhs, ExpressionNode* rhs) { return new (m_globalData) CommaNode(m_globalData, lhs, rhs); } 12606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 12706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeAssignNode(ExpressionNode* left, Operator, ExpressionNode* right, bool leftHasAssignments, bool rightHasAssignments, int start, int divot, int end); 12806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makePrefixNode(ExpressionNode*, Operator, int start, int divot, int end); 12906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makePostfixNode(ExpressionNode*, Operator, int start, int divot, int end); 13006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeTypeOfNode(ExpressionNode*); 13106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeDeleteNode(ExpressionNode*, int start, int divot, int end); 13206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeNegateNode(ExpressionNode*); 13306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeBitwiseNotNode(ExpressionNode*); 13406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeMultNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 13506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeDivNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 1360617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen ExpressionNode* makeModNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 13706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeAddNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 13806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeSubNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 1390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen ExpressionNode* makeBitXOrNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 1400617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen ExpressionNode* makeBitAndNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 1410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen ExpressionNode* makeBitOrNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 14206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeLeftShiftNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 14306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* makeRightShiftNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 1440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen ExpressionNode* makeURightShiftNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 14506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 14606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createLogicalNot(ExpressionNode* expr) { return new (m_globalData) LogicalNotNode(m_globalData, expr); } 14706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createUnaryPlus(ExpressionNode* expr) { return new (m_globalData) UnaryPlusNode(m_globalData, expr); } 14806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createVoid(ExpressionNode* expr) 14906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 15006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen incConstants(); 15106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) VoidNode(m_globalData, expr); 15206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 15306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* thisExpr() 15406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 15506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesThis(); 15606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) ThisNode(m_globalData); 15706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 15806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createResolve(const Identifier* ident, int start) 15906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 16006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_globalData->propertyNames->arguments == *ident) 16106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesArguments(); 16206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) ResolveNode(m_globalData, *ident, start); 16306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 16406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createObjectLiteral() { return new (m_globalData) ObjectLiteralNode(m_globalData); } 16506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createObjectLiteral(PropertyListNode* properties) { return new (m_globalData) ObjectLiteralNode(m_globalData, properties); } 16606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 16706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createArray(int elisions) 16806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 16906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (elisions) 17006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen incConstants(); 17106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) ArrayNode(m_globalData, elisions); 17206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 17306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 17406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createArray(ElementNode* elems) { return new (m_globalData) ArrayNode(m_globalData, elems); } 17506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createArray(int elisions, ElementNode* elems) 17606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 17706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (elisions) 17806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen incConstants(); 17906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) ArrayNode(m_globalData, elisions, elems); 18006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 18106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createNumberExpr(double d) 18206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 18306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen incConstants(); 18406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) NumberNode(m_globalData, d); 18506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 18606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 18706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createString(const Identifier* string) 18806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 18906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen incConstants(); 19006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) StringNode(m_globalData, *string); 19106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 19206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 19306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createBoolean(bool b) 19406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 19506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen incConstants(); 19606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) BooleanNode(m_globalData, b); 19706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 19806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 19906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createNull() 20006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 20106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen incConstants(); 20206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) NullNode(m_globalData); 20306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 20406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 20506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createBracketAccess(ExpressionNode* base, ExpressionNode* property, bool propertyHasAssignments, int start, int divot, int end) 20606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 20706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BracketAccessorNode* node = new (m_globalData) BracketAccessorNode(m_globalData, base, property, propertyHasAssignments); 20806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(node, start, divot, end); 20906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 21006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 21106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 21206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createDotAccess(ExpressionNode* base, const Identifier& property, int start, int divot, int end) 21306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 21406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen DotAccessorNode* node = new (m_globalData) DotAccessorNode(m_globalData, base, property); 21506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(node, start, divot, end); 21606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 21706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 21806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ExpressionNode* createRegExp(const Identifier& pattern, const Identifier& flags, int start) 22006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (Yarr::checkSyntax(pattern.ustring())) 22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 22306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen RegExpNode* node = new (m_globalData) RegExpNode(m_globalData, pattern, flags); 224f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick int size = pattern.length() + 2; // + 2 for the two /'s 22506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(node, start, start + size, start + size); 22606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 22706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 22806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 22906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createNewExpr(ExpressionNode* expr, ArgumentsNode* arguments, int start, int divot, int end) 23006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 23106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NewExprNode* node = new (m_globalData) NewExprNode(m_globalData, expr, arguments); 23206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(node, start, divot, end); 23306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 23406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 23506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 23606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createNewExpr(ExpressionNode* expr, int start, int end) 23706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 23806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NewExprNode* node = new (m_globalData) NewExprNode(m_globalData, expr); 23906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(node, start, end, end); 24006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 24106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 24206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 24306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createConditionalExpr(ExpressionNode* condition, ExpressionNode* lhs, ExpressionNode* rhs) 24406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 24506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) ConditionalNode(m_globalData, condition, lhs, rhs); 24606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 24706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 24806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createAssignResolve(const Identifier& ident, ExpressionNode* rhs, bool rhsHasAssignment, int start, int divot, int end) 24906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 25006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen AssignResolveNode* node = new (m_globalData) AssignResolveNode(m_globalData, ident, rhs, rhsHasAssignment); 25106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(node, start, divot, end); 25206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 25306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 25406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 25506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createFunctionExpr(const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine) 25606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 25706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen FuncExprNode* result = new (m_globalData) FuncExprNode(m_globalData, *name, body, m_lexer->sourceCode(openBracePos, closeBracePos, bodyStartLine), parameters); 25806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen body->setLoc(bodyStartLine, bodyEndLine); 25906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 26006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 26106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 262a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch FunctionBodyNode* createFunctionBody(bool inStrictContext) 26306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 26406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesClosures(); 265a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return FunctionBodyNode::create(m_globalData, inStrictContext); 26606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 26706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 268e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke template <bool> PropertyNode* createGetterOrSetterProperty(PropertyNode::Type type, const Identifier* name, ParameterNode* params, FunctionBodyNode* body, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine) 26906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 27006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(name); 27106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen body->setLoc(bodyStartLine, bodyEndLine); 27206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) PropertyNode(m_globalData, *name, new (m_globalData) FuncExprNode(m_globalData, m_globalData->propertyNames->nullIdentifier, body, m_lexer->sourceCode(openBracePos, closeBracePos, bodyStartLine), params), type); 27306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 27406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 27506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 27606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ArgumentsNode* createArguments() { return new (m_globalData) ArgumentsNode(m_globalData); } 27706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ArgumentsNode* createArguments(ArgumentListNode* args) { return new (m_globalData) ArgumentsNode(m_globalData, args); } 27806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ArgumentListNode* createArgumentsList(ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(m_globalData, arg); } 27906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ArgumentListNode* createArgumentsList(ArgumentListNode* args, ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(m_globalData, args, arg); } 28006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 281e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke template <bool> PropertyNode* createProperty(const Identifier* propertyName, ExpressionNode* node, PropertyNode::Type type) { return new (m_globalData) PropertyNode(m_globalData, *propertyName, node, type); } 282e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke template <bool> PropertyNode* createProperty(JSGlobalData*, double propertyName, ExpressionNode* node, PropertyNode::Type type) { return new (m_globalData) PropertyNode(m_globalData, propertyName, node, type); } 28306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PropertyListNode* createPropertyList(PropertyNode* property) { return new (m_globalData) PropertyListNode(m_globalData, property); } 28406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PropertyListNode* createPropertyList(PropertyNode* property, PropertyListNode* tail) { return new (m_globalData) PropertyListNode(m_globalData, property, tail); } 28506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 28606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ElementNode* createElementList(int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode(m_globalData, elisions, expr); } 28706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ElementNode* createElementList(ElementNode* elems, int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode(m_globalData, elems, elisions, expr); } 28806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 28906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ParameterNode* createFormalParameterList(const Identifier& ident) { return new (m_globalData) ParameterNode(m_globalData, ident); } 29006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ParameterNode* createFormalParameterList(ParameterNode* list, const Identifier& ident) { return new (m_globalData) ParameterNode(m_globalData, list, ident); } 29106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 29206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen CaseClauseNode* createClause(ExpressionNode* expr, JSC::SourceElements* statements) { return new (m_globalData) CaseClauseNode(m_globalData, expr, statements); } 29306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ClauseListNode* createClauseList(CaseClauseNode* clause) { return new (m_globalData) ClauseListNode(m_globalData, clause); } 29406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ClauseListNode* createClauseList(ClauseListNode* tail, CaseClauseNode* clause) { return new (m_globalData) ClauseListNode(m_globalData, tail, clause); } 29506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 29606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void setUsesArguments(FunctionBodyNode* node) { node->setUsesArguments(); } 29706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 29806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createFuncDeclStatement(const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine) 29906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 30006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen FuncDeclNode* decl = new (m_globalData) FuncDeclNode(m_globalData, *name, body, m_lexer->sourceCode(openBracePos, closeBracePos, bodyStartLine), parameters); 30106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (*name == m_globalData->propertyNames->arguments) 30206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesArguments(); 30381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_scope.m_funcDeclarations->data.append(decl->body()); 30406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen body->setLoc(bodyStartLine, bodyEndLine); 30506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return decl; 30606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 30706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 30806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createBlockStatement(JSC::SourceElements* elements, int startLine, int endLine) 30906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 31006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BlockNode* block = new (m_globalData) BlockNode(m_globalData, elements); 31106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen block->setLoc(startLine, endLine); 31206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return block; 31306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 31406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 31506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createExprStatement(ExpressionNode* expr, int start, int end) 31606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 31706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExprStatementNode* result = new (m_globalData) ExprStatementNode(m_globalData, expr); 31806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(start, end); 31906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 32006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 32106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 32206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createIfStatement(ExpressionNode* condition, StatementNode* trueBlock, int start, int end) 32306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 32406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen IfNode* result = new (m_globalData) IfNode(m_globalData, condition, trueBlock); 32506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(start, end); 32606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 32706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 32806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 32906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createIfStatement(ExpressionNode* condition, StatementNode* trueBlock, StatementNode* falseBlock, int start, int end) 33006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 33106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen IfNode* result = new (m_globalData) IfElseNode(m_globalData, condition, trueBlock, falseBlock); 33206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(start, end); 33306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 33406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 33506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 33606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createForLoop(ExpressionNode* initializer, ExpressionNode* condition, ExpressionNode* iter, StatementNode* statements, bool b, int start, int end) 33706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 33806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ForNode* result = new (m_globalData) ForNode(m_globalData, initializer, condition, iter, statements, b); 33906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(start, end); 34006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 34106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 34206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 34306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createForInLoop(const Identifier* ident, ExpressionNode* initializer, ExpressionNode* iter, StatementNode* statements, int start, int divot, int end, int initStart, int initEnd, int startLine, int endLine) 34406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 34506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ForInNode* result = new (m_globalData) ForInNode(m_globalData, *ident, initializer, iter, statements, initStart, initStart - start, initEnd - initStart); 34606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 34706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(result, start, divot + 1, end); 34806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 34906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 35006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 35106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createForInLoop(ExpressionNode* lhs, ExpressionNode* iter, StatementNode* statements, int eStart, int eDivot, int eEnd, int start, int end) 35206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 35306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ForInNode* result = new (m_globalData) ForInNode(m_globalData, lhs, iter, statements); 35406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(start, end); 35506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(result, eStart, eDivot, eEnd); 35606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 35706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 35806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 35906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createEmptyStatement() { return new (m_globalData) EmptyStatementNode(m_globalData); } 36006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 36106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createVarStatement(ExpressionNode* expr, int start, int end) 36206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 36306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* result; 36406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!expr) 36506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result = new (m_globalData) EmptyStatementNode(m_globalData); 36606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen else 36706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result = new (m_globalData) VarStatementNode(m_globalData, expr); 36806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(start, end); 36906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 37006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 37106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 37206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createReturnStatement(ExpressionNode* expression, int eStart, int eEnd, int startLine, int endLine) 37306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 37406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ReturnNode* result = new (m_globalData) ReturnNode(m_globalData, expression); 37506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(result, eStart, eEnd, eEnd); 37606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 37706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 37806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 37906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 38006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createBreakStatement(int eStart, int eEnd, int startLine, int endLine) 38106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 38206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BreakNode* result = new (m_globalData) BreakNode(m_globalData); 38306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(result, eStart, eEnd, eEnd); 38406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 38506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 38606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 38706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 38806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createBreakStatement(const Identifier* ident, int eStart, int eEnd, int startLine, int endLine) 38906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 39006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BreakNode* result = new (m_globalData) BreakNode(m_globalData, *ident); 39106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(result, eStart, eEnd, eEnd); 39206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 39306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 39406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 39506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 39606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createContinueStatement(int eStart, int eEnd, int startLine, int endLine) 39706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 39806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ContinueNode* result = new (m_globalData) ContinueNode(m_globalData); 39906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(result, eStart, eEnd, eEnd); 40006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 40106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 40206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 40306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 40406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createContinueStatement(const Identifier* ident, int eStart, int eEnd, int startLine, int endLine) 40506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 40606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ContinueNode* result = new (m_globalData) ContinueNode(m_globalData, *ident); 40706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(result, eStart, eEnd, eEnd); 40806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 40906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 41006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 41106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 41206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createTryStatement(StatementNode* tryBlock, const Identifier* ident, bool catchHasEval, StatementNode* catchBlock, StatementNode* finallyBlock, int startLine, int endLine) 41306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 41406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen TryNode* result = new (m_globalData) TryNode(m_globalData, tryBlock, *ident, catchHasEval, catchBlock, finallyBlock); 41506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (catchBlock) 41606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesCatch(); 41706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 41806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 41906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 42006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 42106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createSwitchStatement(ExpressionNode* expr, ClauseListNode* firstClauses, CaseClauseNode* defaultClause, ClauseListNode* secondClauses, int startLine, int endLine) 42206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 42306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen CaseBlockNode* cases = new (m_globalData) CaseBlockNode(m_globalData, firstClauses, defaultClause, secondClauses); 42406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen SwitchNode* result = new (m_globalData) SwitchNode(m_globalData, expr, cases); 42506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 42606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 42706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 42806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 42906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createWhileStatement(ExpressionNode* expr, StatementNode* statement, int startLine, int endLine) 43006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 43106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WhileNode* result = new (m_globalData) WhileNode(m_globalData, expr, statement); 43206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 43306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 43406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 43506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 43606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createDoWhileStatement(StatementNode* statement, ExpressionNode* expr, int startLine, int endLine) 43706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 43806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen DoWhileNode* result = new (m_globalData) DoWhileNode(m_globalData, statement, expr); 43906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 44006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 44106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 44206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 44306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createLabelStatement(const Identifier* ident, StatementNode* statement, int start, int end) 44406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 44506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen LabelNode* result = new (m_globalData) LabelNode(m_globalData, *ident, statement); 44606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(result, start, end, end); 44706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 44806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 44906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 45006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createWithStatement(ExpressionNode* expr, StatementNode* statement, int start, int end, int startLine, int endLine) 45106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 45206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesWith(); 45306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WithNode* result = new (m_globalData) WithNode(m_globalData, expr, statement, end, end - start); 45406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 45506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 45606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 45706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 45806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createThrowStatement(ExpressionNode* expr, int start, int end, int startLine, int endLine) 45906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 46006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ThrowNode* result = new (m_globalData) ThrowNode(m_globalData, expr); 46106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 46206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(result, start, end, end); 46306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 46406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 46506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 46606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createDebugger(int startLine, int endLine) 46706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 46806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen DebuggerStatementNode* result = new (m_globalData) DebuggerStatementNode(m_globalData); 46906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 47006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 47106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 47206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 47306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen StatementNode* createConstStatement(ConstDeclNode* decls, int startLine, int endLine) 47406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 47506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ConstStatementNode* result = new (m_globalData) ConstStatementNode(m_globalData, decls); 47606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen result->setLoc(startLine, endLine); 47706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 47806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 47906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 48006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ConstDeclNode* appendConstDecl(ConstDeclNode* tail, const Identifier* name, ExpressionNode* initializer) 48106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 48206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ConstDeclNode* result = new (m_globalData) ConstDeclNode(m_globalData, *name, initializer); 48306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (tail) 48406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen tail->m_next = result; 48506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 48606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 48706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 48806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void appendStatement(JSC::SourceElements* elements, JSC::StatementNode* statement) 48906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 49006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen elements->append(statement); 49106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 49206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 49306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void addVar(const Identifier* ident, int attrs) 49406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 49506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_globalData->propertyNames->arguments == *ident) 49606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesArguments(); 49781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_scope.m_varDeclarations->data.append(std::make_pair(ident, attrs)); 49806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 49906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 50006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* combineCommaNodes(ExpressionNode* list, ExpressionNode* init) 50106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 50206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!list) 50306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return init; 50406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (list->isCommaNode()) { 50506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen static_cast<CommaNode*>(list)->append(init); 50606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return list; 50706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 50806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) CommaNode(m_globalData, list, init); 50906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 51006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 51106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int evalCount() const { return m_evalCount; } 51206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 51306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void appendBinaryExpressionInfo(int& operandStackDepth, ExpressionNode* current, int exprStart, int lhs, int rhs, bool hasAssignments) 51406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 51506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen operandStackDepth++; 51606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_binaryOperandStack.append(std::make_pair(current, BinaryOpInfo(exprStart, lhs, rhs, hasAssignments))); 51706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 51806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 51906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // Logic to handle datastructures used during parsing of binary expressions 52006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void operatorStackPop(int& operatorStackDepth) 52106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 52206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen operatorStackDepth--; 52306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_binaryOperatorStack.removeLast(); 52406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 52506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool operatorStackHasHigherPrecedence(int&, int precedence) 52606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 52706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return precedence <= m_binaryOperatorStack.last().second; 52806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 52906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const BinaryOperand& getFromOperandStack(int i) { return m_binaryOperandStack[m_binaryOperandStack.size() + i]; } 53006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void shrinkOperandStackBy(int& operandStackDepth, int amount) 53106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 53206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen operandStackDepth -= amount; 53306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(operandStackDepth >= 0); 53406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_binaryOperandStack.resize(m_binaryOperandStack.size() - amount); 53506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 53606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void appendBinaryOperation(int& operandStackDepth, int&, const BinaryOperand& lhs, const BinaryOperand& rhs) 53706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 53806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen operandStackDepth++; 53906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_binaryOperandStack.append(std::make_pair(makeBinaryNode(m_binaryOperatorStack.last().first, lhs, rhs), BinaryOpInfo(lhs.second, rhs.second))); 54006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 54106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void operatorStackAppend(int& operatorStackDepth, int op, int precedence) 54206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 54306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen operatorStackDepth++; 54406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_binaryOperatorStack.append(std::make_pair(op, precedence)); 54506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 54606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* popOperandStack(int&) 54706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 54806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* result = m_binaryOperandStack.last().first; 54906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_binaryOperandStack.removeLast(); 55006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 55106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 55206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 55306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void appendUnaryToken(int& tokenStackDepth, int type, int start) 55406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 55506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen tokenStackDepth++; 55606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_unaryTokenStack.append(std::make_pair(type, start)); 55706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 55806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 55906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int unaryTokenStackLastType(int&) 56006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 56106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return m_unaryTokenStack.last().first; 56206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 56306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 56406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int unaryTokenStackLastStart(int&) 56506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 56606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return m_unaryTokenStack.last().second; 56706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 56806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 56906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void unaryTokenStackRemoveLast(int& tokenStackDepth) 57006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 57106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen tokenStackDepth--; 57206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_unaryTokenStack.removeLast(); 57306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 57406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 57506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void assignmentStackAppend(int& assignmentStackDepth, ExpressionNode* node, int start, int divot, int assignmentCount, Operator op) 57606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 57706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen assignmentStackDepth++; 57806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_assignmentInfoStack.append(AssignmentInfo(node, start, divot, assignmentCount, op)); 57906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 58006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 58106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createAssignment(int& assignmentStackDepth, ExpressionNode* rhs, int initialAssignmentCount, int currentAssignmentCount, int lastTokenEnd) 58206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 58306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* result = makeAssignNode(m_assignmentInfoStack.last().m_node, m_assignmentInfoStack.last().m_op, rhs, m_assignmentInfoStack.last().m_initAssignments != initialAssignmentCount, m_assignmentInfoStack.last().m_initAssignments != currentAssignmentCount, m_assignmentInfoStack.last().m_start, m_assignmentInfoStack.last().m_divot + 1, lastTokenEnd); 58406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_assignmentInfoStack.removeLast(); 58506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen assignmentStackDepth--; 58606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return result; 58706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 588e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 589f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch const Identifier& getName(Property property) const { return property->name(); } 590f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PropertyNode::Type getType(Property property) const { return property->type(); } 591a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 592f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool isResolve(ExpressionNode* expr) const { return expr->isResolveNode(); } 593a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 59406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenprivate: 59506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen struct Scope { 59606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Scope(JSGlobalData* globalData) 59706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen : m_varDeclarations(new (globalData) ParserArenaData<DeclarationStacks::VarStack>) 59806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_funcDeclarations(new (globalData) ParserArenaData<DeclarationStacks::FunctionStack>) 59906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_features(0) 60006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_numConstants(0) 60106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 60206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 60306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ParserArenaData<DeclarationStacks::VarStack>* m_varDeclarations; 60406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ParserArenaData<DeclarationStacks::FunctionStack>* m_funcDeclarations; 60506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int m_features; 60606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int m_numConstants; 60706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen }; 60806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 60906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen static void setExceptionLocation(ThrowableExpressionData* node, unsigned start, unsigned divot, unsigned end) 61006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 61106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node->setExceptionSourceCode(divot, divot - start, end - divot); 61206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 61306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 61481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void incConstants() { m_scope.m_numConstants++; } 61581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void usesThis() { m_scope.m_features |= ThisFeature; } 61681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void usesCatch() { m_scope.m_features |= CatchFeature; } 61781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void usesClosures() { m_scope.m_features |= ClosureFeature; } 61881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void usesArguments() { m_scope.m_features |= ArgumentsFeature; } 61981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void usesAssignment() { m_scope.m_features |= AssignFeature; } 62081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void usesWith() { m_scope.m_features |= WithFeature; } 62106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void usesEval() 62206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 62306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_evalCount++; 62481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_scope.m_features |= EvalFeature; 62506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 62606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ExpressionNode* createNumber(double d) 62706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 62806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) NumberNode(m_globalData, d); 62906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 63006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 63106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen JSGlobalData* m_globalData; 63206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Lexer* m_lexer; 63381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch Scope m_scope; 63406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Vector<BinaryOperand, 10> m_binaryOperandStack; 63506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Vector<AssignmentInfo, 10> m_assignmentInfoStack; 63606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Vector<pair<int, int>, 10> m_binaryOperatorStack; 63706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Vector<pair<int, int>, 10> m_unaryTokenStack; 63806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen int m_evalCount; 63906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}; 64006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 64106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeTypeOfNode(ExpressionNode* expr) 64206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 64306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr->isResolveNode()) { 64406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ResolveNode* resolve = static_cast<ResolveNode*>(expr); 64506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) TypeOfResolveNode(m_globalData, resolve->identifier()); 64606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 64706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) TypeOfValueNode(m_globalData, expr); 64806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 64906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 65006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeDeleteNode(ExpressionNode* expr, int start, int divot, int end) 65106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 65206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!expr->isLocation()) 65306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) DeleteValueNode(m_globalData, expr); 65406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr->isResolveNode()) { 65506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ResolveNode* resolve = static_cast<ResolveNode*>(expr); 65606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) DeleteResolveNode(m_globalData, resolve->identifier(), divot, divot - start, end - divot); 65706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 65806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr->isBracketAccessorNode()) { 65906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr); 66006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) DeleteBracketNode(m_globalData, bracket->base(), bracket->subscript(), divot, divot - start, end - divot); 66106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 66206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(expr->isDotAccessorNode()); 66306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr); 66406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) DeleteDotNode(m_globalData, dot->base(), dot->identifier(), divot, divot - start, end - divot); 66506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 66606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 66706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeNegateNode(ExpressionNode* n) 66806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 66906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (n->isNumber()) { 67006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NumberNode* numberNode = static_cast<NumberNode*>(n); 67106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen numberNode->setValue(-numberNode->value()); 67206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return numberNode; 67306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 67406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 67506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) NegateNode(m_globalData, n); 67606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 67706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 67806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeBitwiseNotNode(ExpressionNode* expr) 67906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 68006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr->isNumber()) 68106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return createNumber(~toInt32(static_cast<NumberNode*>(expr)->value())); 68206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) BitwiseNotNode(m_globalData, expr); 68306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 68406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 68506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeMultNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 68606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 68706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen expr1 = expr1->stripUnaryPlus(); 68806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen expr2 = expr2->stripUnaryPlus(); 68906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 69006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 69106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return createNumber(static_cast<NumberNode*>(expr1)->value() * static_cast<NumberNode*>(expr2)->value()); 69206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 69306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr1->isNumber() && static_cast<NumberNode*>(expr1)->value() == 1) 69406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) UnaryPlusNode(m_globalData, expr2); 69506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 69606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr2->isNumber() && static_cast<NumberNode*>(expr2)->value() == 1) 69706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) UnaryPlusNode(m_globalData, expr1); 69806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 69906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) MultNode(m_globalData, expr1, expr2, rightHasAssignments); 70006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 70106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 70206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeDivNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 70306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 70406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen expr1 = expr1->stripUnaryPlus(); 70506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen expr2 = expr2->stripUnaryPlus(); 70606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 70706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 70806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return createNumber(static_cast<NumberNode*>(expr1)->value() / static_cast<NumberNode*>(expr2)->value()); 70906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) DivNode(m_globalData, expr1, expr2, rightHasAssignments); 71006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 71106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 7120617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenExpressionNode* ASTBuilder::makeModNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 7130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{ 7140617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen expr1 = expr1->stripUnaryPlus(); 7150617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen expr2 = expr2->stripUnaryPlus(); 7160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 7170617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 7180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return createNumber(fmod(static_cast<NumberNode*>(expr1)->value(), static_cast<NumberNode*>(expr2)->value())); 7190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return new (m_globalData) ModNode(m_globalData, expr1, expr2, rightHasAssignments); 7200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen} 7210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 72206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeAddNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 72306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 72406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 72506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return createNumber(static_cast<NumberNode*>(expr1)->value() + static_cast<NumberNode*>(expr2)->value()); 72606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) AddNode(m_globalData, expr1, expr2, rightHasAssignments); 72706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 72806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 72906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeSubNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 73006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 73106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen expr1 = expr1->stripUnaryPlus(); 73206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen expr2 = expr2->stripUnaryPlus(); 73306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 73406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 73506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return createNumber(static_cast<NumberNode*>(expr1)->value() - static_cast<NumberNode*>(expr2)->value()); 73606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) SubNode(m_globalData, expr1, expr2, rightHasAssignments); 73706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 73806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 73906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeLeftShiftNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 74006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 74106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 74206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return createNumber(toInt32(static_cast<NumberNode*>(expr1)->value()) << (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 74306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) LeftShiftNode(m_globalData, expr1, expr2, rightHasAssignments); 74406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 74506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 74606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeRightShiftNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 74706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 74806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 74906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return createNumber(toInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 75006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) RightShiftNode(m_globalData, expr1, expr2, rightHasAssignments); 75106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 75206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 7530617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenExpressionNode* ASTBuilder::makeURightShiftNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 7540617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{ 7550617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 7560617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return createNumber(toUInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 7570617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return new (m_globalData) UnsignedRightShiftNode(m_globalData, expr1, expr2, rightHasAssignments); 7580617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen} 7590617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 7600617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenExpressionNode* ASTBuilder::makeBitOrNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 7610617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{ 7620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 7630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return createNumber(toInt32(static_cast<NumberNode*>(expr1)->value()) | toInt32(static_cast<NumberNode*>(expr2)->value())); 7640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return new (m_globalData) BitOrNode(m_globalData, expr1, expr2, rightHasAssignments); 7650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen} 7660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 7670617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenExpressionNode* ASTBuilder::makeBitAndNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 7680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{ 7690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 7700617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return createNumber(toInt32(static_cast<NumberNode*>(expr1)->value()) & toInt32(static_cast<NumberNode*>(expr2)->value())); 7710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return new (m_globalData) BitAndNode(m_globalData, expr1, expr2, rightHasAssignments); 7720617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen} 7730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 7740617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenExpressionNode* ASTBuilder::makeBitXOrNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 7750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{ 7760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (expr1->isNumber() && expr2->isNumber()) 7770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return createNumber(toInt32(static_cast<NumberNode*>(expr1)->value()) ^ toInt32(static_cast<NumberNode*>(expr2)->value())); 7780617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return new (m_globalData) BitXOrNode(m_globalData, expr1, expr2, rightHasAssignments); 7790617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen} 7800617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 78106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeFunctionCallNode(ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end) 78206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 78306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!func->isLocation()) 78406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) FunctionCallValueNode(m_globalData, func, args, divot, divot - start, end - divot); 78506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (func->isResolveNode()) { 78606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ResolveNode* resolve = static_cast<ResolveNode*>(func); 78706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const Identifier& identifier = resolve->identifier(); 78806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (identifier == m_globalData->propertyNames->eval) { 78906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesEval(); 79006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) EvalFunctionCallNode(m_globalData, args, divot, divot - start, end - divot); 79106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 79206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) FunctionCallResolveNode(m_globalData, identifier, args, divot, divot - start, end - divot); 79306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 79406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (func->isBracketAccessorNode()) { 79506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(func); 79606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen FunctionCallBracketNode* node = new (m_globalData) FunctionCallBracketNode(m_globalData, bracket->base(), bracket->subscript(), args, divot, divot - start, end - divot); 79706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node->setSubexpressionInfo(bracket->divot(), bracket->endOffset()); 79806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 79906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 80006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(func->isDotAccessorNode()); 80106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen DotAccessorNode* dot = static_cast<DotAccessorNode*>(func); 80206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen FunctionCallDotNode* node; 80306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (dot->identifier() == m_globalData->propertyNames->call) 80406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node = new (m_globalData) CallFunctionCallDotNode(m_globalData, dot->base(), dot->identifier(), args, divot, divot - start, end - divot); 80506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen else if (dot->identifier() == m_globalData->propertyNames->apply) 80606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node = new (m_globalData) ApplyFunctionCallDotNode(m_globalData, dot->base(), dot->identifier(), args, divot, divot - start, end - divot); 80706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen else 80806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node = new (m_globalData) FunctionCallDotNode(m_globalData, dot->base(), dot->identifier(), args, divot, divot - start, end - divot); 80906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node->setSubexpressionInfo(dot->divot(), dot->endOffset()); 81006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 81106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 81206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 81306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeBinaryNode(int token, pair<ExpressionNode*, BinaryOpInfo> lhs, pair<ExpressionNode*, BinaryOpInfo> rhs) 81406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 81506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen switch (token) { 81606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case OR: 81706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) LogicalOpNode(m_globalData, lhs.first, rhs.first, OpLogicalOr); 81806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 81906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case AND: 82006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) LogicalOpNode(m_globalData, lhs.first, rhs.first, OpLogicalAnd); 82106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 822e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case BITOR: 8230617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return makeBitOrNode(lhs.first, rhs.first, rhs.second.hasAssignment); 82406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 825e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case BITXOR: 8260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return makeBitXOrNode(lhs.first, rhs.first, rhs.second.hasAssignment); 82706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 828e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case BITAND: 8290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return makeBitAndNode(lhs.first, rhs.first, rhs.second.hasAssignment); 83006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 83106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case EQEQ: 83206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) EqualNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 83306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 83406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case NE: 83506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) NotEqualNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 83606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 83706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case STREQ: 83806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) StrictEqualNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 83906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 84006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case STRNEQ: 84106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) NotStrictEqualNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 84206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 843e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case LT: 84406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) LessNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 84506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 846e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case GT: 84706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) GreaterNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 84806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 84906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case LE: 85006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) LessEqNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 85106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 85206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case GE: 85306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) GreaterEqNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 85406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 85506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case INSTANCEOF: { 85606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen InstanceOfNode* node = new (m_globalData) InstanceOfNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 85706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(node, lhs.second.start, rhs.second.start, rhs.second.end); 85806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 85906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 86006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 86106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case INTOKEN: { 86206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen InNode* node = new (m_globalData) InNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment); 86306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(node, lhs.second.start, rhs.second.start, rhs.second.end); 86406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 86506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 86606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 86706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case LSHIFT: 86806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return makeLeftShiftNode(lhs.first, rhs.first, rhs.second.hasAssignment); 86906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 87006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case RSHIFT: 87106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return makeRightShiftNode(lhs.first, rhs.first, rhs.second.hasAssignment); 87206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 87306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case URSHIFT: 8740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return makeURightShiftNode(lhs.first, rhs.first, rhs.second.hasAssignment); 87506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 876e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case PLUS: 87706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return makeAddNode(lhs.first, rhs.first, rhs.second.hasAssignment); 87806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 879e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case MINUS: 88006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return makeSubNode(lhs.first, rhs.first, rhs.second.hasAssignment); 88106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 882e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case TIMES: 88306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return makeMultNode(lhs.first, rhs.first, rhs.second.hasAssignment); 88406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 885e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case DIVIDE: 88606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return makeDivNode(lhs.first, rhs.first, rhs.second.hasAssignment); 88706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 888e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke case MOD: 8890617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return makeModNode(lhs.first, rhs.first, rhs.second.hasAssignment); 89006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 89106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen CRASH(); 89206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return 0; 89306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 89406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 89506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makeAssignNode(ExpressionNode* loc, Operator op, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, int start, int divot, int end) 89606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 89706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesAssignment(); 89806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!loc->isLocation()) 89906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) AssignErrorNode(m_globalData, loc, op, expr, divot, divot - start, end - divot); 90006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 90106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (loc->isResolveNode()) { 90206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ResolveNode* resolve = static_cast<ResolveNode*>(loc); 90306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (op == OpEqual) { 90406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen AssignResolveNode* node = new (m_globalData) AssignResolveNode(m_globalData, resolve->identifier(), expr, exprHasAssignments); 90506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen setExceptionLocation(node, start, divot, end); 90606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 90706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 90806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) ReadModifyResolveNode(m_globalData, resolve->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot); 90906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 91006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (loc->isBracketAccessorNode()) { 91106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(loc); 91206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (op == OpEqual) 91306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) AssignBracketNode(m_globalData, bracket->base(), bracket->subscript(), expr, locHasAssignments, exprHasAssignments, bracket->divot(), bracket->divot() - start, end - bracket->divot()); 91406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ReadModifyBracketNode* node = new (m_globalData) ReadModifyBracketNode(m_globalData, bracket->base(), bracket->subscript(), op, expr, locHasAssignments, exprHasAssignments, divot, divot - start, end - divot); 91506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node->setSubexpressionInfo(bracket->divot(), bracket->endOffset()); 91606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 91706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 91806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(loc->isDotAccessorNode()); 91906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen DotAccessorNode* dot = static_cast<DotAccessorNode*>(loc); 92006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (op == OpEqual) 92106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) AssignDotNode(m_globalData, dot->base(), dot->identifier(), expr, exprHasAssignments, dot->divot(), dot->divot() - start, end - dot->divot()); 92206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 92306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ReadModifyDotNode* node = new (m_globalData) ReadModifyDotNode(m_globalData, dot->base(), dot->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot); 92406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node->setSubexpressionInfo(dot->divot(), dot->endOffset()); 92506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 92606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 92706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 92806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makePrefixNode(ExpressionNode* expr, Operator op, int start, int divot, int end) 92906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 93006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesAssignment(); 93106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!expr->isLocation()) 93206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) PrefixErrorNode(m_globalData, expr, op, divot, divot - start, end - divot); 93306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 93406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr->isResolveNode()) { 93506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ResolveNode* resolve = static_cast<ResolveNode*>(expr); 93606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) PrefixResolveNode(m_globalData, resolve->identifier(), op, divot, divot - start, end - divot); 93706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 93806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr->isBracketAccessorNode()) { 93906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr); 94006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PrefixBracketNode* node = new (m_globalData) PrefixBracketNode(m_globalData, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot); 94106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node->setSubexpressionInfo(bracket->divot(), bracket->startOffset()); 94206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 94306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 94406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(expr->isDotAccessorNode()); 94506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr); 94606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PrefixDotNode* node = new (m_globalData) PrefixDotNode(m_globalData, dot->base(), dot->identifier(), op, divot, divot - start, end - divot); 94706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node->setSubexpressionInfo(dot->divot(), dot->startOffset()); 94806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 94906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 95006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 95106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenExpressionNode* ASTBuilder::makePostfixNode(ExpressionNode* expr, Operator op, int start, int divot, int end) 95206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 95306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen usesAssignment(); 95406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!expr->isLocation()) 95506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) PostfixErrorNode(m_globalData, expr, op, divot, divot - start, end - divot); 95606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 95706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr->isResolveNode()) { 95806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ResolveNode* resolve = static_cast<ResolveNode*>(expr); 95906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return new (m_globalData) PostfixResolveNode(m_globalData, resolve->identifier(), op, divot, divot - start, end - divot); 96006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 96106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (expr->isBracketAccessorNode()) { 96206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr); 96306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PostfixBracketNode* node = new (m_globalData) PostfixBracketNode(m_globalData, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot); 96406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node->setSubexpressionInfo(bracket->divot(), bracket->endOffset()); 96506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 96606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 96706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 96806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(expr->isDotAccessorNode()); 96906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr); 97006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PostfixDotNode* node = new (m_globalData) PostfixDotNode(m_globalData, dot->base(), dot->identifier(), op, divot, divot - start, end - divot); 97106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen node->setSubexpressionInfo(dot->divot(), dot->endOffset()); 97206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return node; 97306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 97406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 97506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 97606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 97706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 978