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 SyntaxChecker_h
2706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define SyntaxChecker_h
2806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <yarr/YarrSyntaxChecker.h>
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsennamespace JSC {
3206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass SyntaxChecker {
3306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenpublic:
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    struct BinaryExprContext {
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        BinaryExprContext(SyntaxChecker& context)
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            : m_context(&context)
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_context->m_topBinaryExprs.append(m_context->m_topBinaryExpr);
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_context->m_topBinaryExpr = 0;
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ~BinaryExprContext()
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_context->m_topBinaryExpr = m_context->m_topBinaryExprs.last();
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_context->m_topBinaryExprs.removeLast();
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    private:
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        SyntaxChecker* m_context;
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    struct UnaryExprContext {
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        UnaryExprContext(SyntaxChecker& context)
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            : m_context(&context)
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_context->m_topUnaryTokens.append(m_context->m_topUnaryToken);
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_context->m_topUnaryToken = 0;
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ~UnaryExprContext()
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_context->m_topUnaryToken = m_context->m_topUnaryTokens.last();
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_context->m_topUnaryTokens.removeLast();
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    private:
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        SyntaxChecker* m_context;
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    SyntaxChecker(JSGlobalData* , Lexer*)
6606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    {
6706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
6806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef SyntaxChecker FunctionBodyBuilder;
70a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    enum { NoneExpr = 0,
71a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ResolveEvalExpr, ResolveExpr, NumberExpr, StringExpr,
72a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ThisExpr, NullExpr, BoolExpr, RegExpExpr, ObjectLiteralExpr,
73a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        FunctionExpr, BracketExpr, DotExpr, CallExpr,
74a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        NewExpr, PreExpr, PostExpr, UnaryExpr, BinaryExpr,
75a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ConditionalExpr, AssignmentExpr, TypeofExpr,
76a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        DeleteExpr, ArrayLiteralExpr };
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    typedef int ExpressionType;
7806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    typedef ExpressionType Expression;
8006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int SourceElements;
8106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int Arguments;
82a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    typedef ExpressionType Comma;
83e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    struct Property {
84e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        ALWAYS_INLINE Property(void* = 0)
85e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            : type((PropertyNode::Type)0)
86e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        {
87e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        }
88e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        ALWAYS_INLINE Property(const Identifier* ident, PropertyNode::Type ty)
89e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        : name(ident)
90e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        , type(ty)
91e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        {
92e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        }
93e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        ALWAYS_INLINE Property(PropertyNode::Type ty)
94e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            : name(0)
95e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            , type(ty)
96e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        {
97e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        }
98e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        ALWAYS_INLINE bool operator!() { return !type; }
99e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        const Identifier* name;
100e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        PropertyNode::Type type;
101e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    };
10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int PropertyList;
10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int ElementList;
10406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int ArgumentsList;
10506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int FormalParameterList;
10606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int FunctionBody;
10706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int Statement;
10806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int ClauseList;
10906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int Clause;
11006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int ConstDeclList;
11106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef int BinaryOperand;
11206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
11306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const bool CreatesAST = false;
11468513a70bcd92384395513322f1b801e7bf9c729Steve Block    static const bool NeedsFreeVariableInfo = false;
115ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    static const bool CanUseFunctionCache = true;
11606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
11706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createSourceElements() { return 1; }
118a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType makeFunctionCallNode(int, int, int, int, int) { return CallExpr; }
119a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    void appendToComma(ExpressionType& base, ExpressionType right) { base = right; }
120a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createCommaExpr(ExpressionType, ExpressionType right) { return right; }
121a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType makeAssignNode(ExpressionType, Operator, ExpressionType, bool, bool, int, int, int) { return AssignmentExpr; }
122a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType makePrefixNode(ExpressionType, Operator, int, int, int) { return PreExpr; }
123a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType makePostfixNode(ExpressionType, Operator, int, int, int) { return PostExpr; }
124a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType makeTypeOfNode(ExpressionType) { return TypeofExpr; }
125a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType makeDeleteNode(ExpressionType, int, int, int) { return DeleteExpr; }
126a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType makeNegateNode(ExpressionType) { return UnaryExpr; }
127a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType makeBitwiseNotNode(ExpressionType) { return UnaryExpr; }
128a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createLogicalNot(ExpressionType) { return UnaryExpr; }
129a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createUnaryPlus(ExpressionType) { return UnaryExpr; }
130a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createVoid(ExpressionType) { return UnaryExpr; }
131a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType thisExpr() { return ThisExpr; }
132a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createResolve(const Identifier*, int) { return ResolveExpr; }
133a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createObjectLiteral() { return ObjectLiteralExpr; }
134a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createObjectLiteral(int) { return ObjectLiteralExpr; }
135a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createArray(int) { return ArrayLiteralExpr; }
136a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createArray(int, int) { return ArrayLiteralExpr; }
137a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createNumberExpr(double) { return NumberExpr; }
138a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createString(const Identifier*) { return StringExpr; }
139a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createBoolean(bool) { return BoolExpr; }
140a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createNull() { return NullExpr; }
141a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createBracketAccess(ExpressionType, ExpressionType, bool, int, int, int) { return BracketExpr; }
142a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createDotAccess(ExpressionType, const Identifier&, int, int, int) { return DotExpr; }
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExpressionType createRegExp(const Identifier& pattern, const Identifier&, int) { return Yarr::checkSyntax(pattern.ustring()) ? 0 : RegExpExpr; }
144a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createNewExpr(ExpressionType, int, int, int, int) { return NewExpr; }
145a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createNewExpr(ExpressionType, int, int) { return NewExpr; }
146a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createConditionalExpr(ExpressionType, ExpressionType, ExpressionType) { return ConditionalExpr; }
147a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createAssignResolve(const Identifier&, ExpressionType, bool, int, int, int) { return AssignmentExpr; }
148a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ExpressionType createFunctionExpr(const Identifier*, int, int, int, int, int, int) { return FunctionExpr; }
149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    int createFunctionBody(bool) { return 1; }
15006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createArguments() { return 1; }
15106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createArguments(int) { return 1; }
15206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createArgumentsList(int) { return 1; }
15306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createArgumentsList(int, int) { return 1; }
154e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    template <bool complete> Property createProperty(const Identifier* name, int, PropertyNode::Type type)
155e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    {
156e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        ASSERT(name);
157e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (!complete)
158e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            return Property(type);
159e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return Property(name, type);
160e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
161e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    template <bool complete> Property createProperty(JSGlobalData* globalData, double name, int, PropertyNode::Type type)
162e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    {
163e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (!complete)
164e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            return Property(type);
165e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return Property(&globalData->parser->arena().identifierArena().makeNumericIdentifier(globalData, name), type);
166e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
167e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    int createPropertyList(Property) { return 1; }
168e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    int createPropertyList(Property, int) { return 1; }
16906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createElementList(int, int) { return 1; }
17006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createElementList(int, int, int) { return 1; }
17106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createFormalParameterList(const Identifier&) { return 1; }
17206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createFormalParameterList(int, const Identifier&) { return 1; }
17306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createClause(int, int) { return 1; }
17406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createClauseList(int) { return 1; }
17506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createClauseList(int, int) { return 1; }
17606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void setUsesArguments(int) { }
17706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createFuncDeclStatement(const Identifier*, int, int, int, int, int, int) { return 1; }
17806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createBlockStatement(int, int, int) { return 1; }
17906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createExprStatement(int, int, int) { return 1; }
18006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createIfStatement(int, int, int, int) { return 1; }
18106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createIfStatement(int, int, int, int, int) { return 1; }
18206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createForLoop(int, int, int, int, bool, int, int) { return 1; }
18306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createForInLoop(const Identifier*, int, int, int, int, int, int, int, int, int, int) { return 1; }
18406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createForInLoop(int, int, int, int, int, int, int, int) { return 1; }
18506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createEmptyStatement() { return 1; }
18606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createVarStatement(int, int, int) { return 1; }
18706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createReturnStatement(int, int, int, int, int) { return 1; }
18806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createBreakStatement(int, int, int, int) { return 1; }
18906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createBreakStatement(const Identifier*, int, int, int, int) { return 1; }
19006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createContinueStatement(int, int, int, int) { return 1; }
19106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createContinueStatement(const Identifier*, int, int, int, int) { return 1; }
19206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createTryStatement(int, const Identifier*, bool, int, int, int, int) { return 1; }
19306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createSwitchStatement(int, int, int, int, int, int) { return 1; }
19406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createWhileStatement(int, int, int, int) { return 1; }
19506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createWithStatement(int, int, int, int, int, int) { return 1; }
19606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createDoWhileStatement(int, int, int, int) { return 1; }
19706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createLabelStatement(const Identifier*, int, int, int) { return 1; }
19806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createThrowStatement(int, int, int, int, int) { return 1; }
19906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createDebugger(int, int) { return 1; }
20006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createConstStatement(int, int, int) { return 1; }
20106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int appendConstDecl(int, const Identifier*, int) { return 1; }
202e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    template <bool strict> Property createGetterOrSetterProperty(PropertyNode::Type type, const Identifier* name, int, int, int, int, int, int)
203e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    {
204e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        ASSERT(name);
205e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (!strict)
206e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            return Property(type);
207e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return Property(name, type);
208e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
20906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
21006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void appendStatement(int, int) { }
21106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void addVar(const Identifier*, bool) { }
21206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int combineCommaNodes(int, int) { return 1; }
21306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int evalCount() const { return 0; }
214a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    void appendBinaryExpressionInfo(int& operandStackDepth, int expr, int, int, int, bool)
215a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!m_topBinaryExpr)
217a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_topBinaryExpr = expr;
218a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        else
219a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_topBinaryExpr = BinaryExpr;
220a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        operandStackDepth++;
221a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
22206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
22306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Logic to handle datastructures used during parsing of binary expressions
22406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void operatorStackPop(int& operatorStackDepth) { operatorStackDepth--; }
22506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool operatorStackHasHigherPrecedence(int&, int) { return true; }
226a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    BinaryOperand getFromOperandStack(int) { return m_topBinaryExpr; }
22706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void shrinkOperandStackBy(int& operandStackDepth, int amount) { operandStackDepth -= amount; }
22806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void appendBinaryOperation(int& operandStackDepth, int&, BinaryOperand, BinaryOperand) { operandStackDepth++; }
22906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void operatorStackAppend(int& operatorStackDepth, int, int) { operatorStackDepth++; }
230a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    int popOperandStack(int&) { int res = m_topBinaryExpr; m_topBinaryExpr = 0; return res; }
23106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    void appendUnaryToken(int& stackDepth, int tok, int) { stackDepth = 1; m_topUnaryToken = tok; }
233a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    int unaryTokenStackLastType(int&) { return m_topUnaryToken; }
234a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    int unaryTokenStackLastStart(int&) { return 0; }
235a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    void unaryTokenStackRemoveLast(int& stackDepth) { stackDepth = 0; }
23606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
23706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void assignmentStackAppend(int, int, int, int, int, Operator) { }
23806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int createAssignment(int, int, int, int, int) { ASSERT_NOT_REACHED(); return 1; }
239f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    const Identifier& getName(const Property& property) const { ASSERT(property.name); return *property.name; }
240f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PropertyNode::Type getType(const Property& property) const { return property.type; }
241f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool isResolve(ExpressionType expr) const { return expr == ResolveExpr || expr == ResolveEvalExpr; }
242a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
243a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochprivate:
244a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    int m_topBinaryExpr;
245a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    int m_topUnaryToken;
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<int, 8> m_topBinaryExprs;
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<int, 8> m_topUnaryTokens;
24806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
24906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
25006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
25106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
25206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
253