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