summaryrefslogtreecommitdiffstats
path: root/JavaScriptCore/parser/SyntaxChecker.h
diff options
context:
space:
mode:
Diffstat (limited to 'JavaScriptCore/parser/SyntaxChecker.h')
-rw-r--r--JavaScriptCore/parser/SyntaxChecker.h103
1 files changed, 62 insertions, 41 deletions
diff --git a/JavaScriptCore/parser/SyntaxChecker.h b/JavaScriptCore/parser/SyntaxChecker.h
index ce3ab61..f9093a7 100644
--- a/JavaScriptCore/parser/SyntaxChecker.h
+++ b/JavaScriptCore/parser/SyntaxChecker.h
@@ -30,15 +30,24 @@ namespace JSC {
class SyntaxChecker {
public:
SyntaxChecker(JSGlobalData* , Lexer*)
+ : m_topBinaryExpr(0)
{
}
typedef SyntaxChecker FunctionBodyBuilder;
+ enum { NoneExpr = 0,
+ ResolveEvalExpr, ResolveExpr, NumberExpr, StringExpr,
+ ThisExpr, NullExpr, BoolExpr, RegExpExpr, ObjectLiteralExpr,
+ FunctionExpr, BracketExpr, DotExpr, CallExpr,
+ NewExpr, PreExpr, PostExpr, UnaryExpr, BinaryExpr,
+ ConditionalExpr, AssignmentExpr, TypeofExpr,
+ DeleteExpr, ArrayLiteralExpr };
+ typedef int ExpressionType;
- typedef int Expression;
+ typedef ExpressionType Expression;
typedef int SourceElements;
typedef int Arguments;
- typedef int Comma;
+ typedef ExpressionType Comma;
struct Property {
ALWAYS_INLINE Property(void* = 0)
: type((PropertyNode::Type)0)
@@ -73,38 +82,38 @@ public:
static const bool NeedsFreeVariableInfo = false;
int createSourceElements() { return 1; }
- int makeFunctionCallNode(int, int, int, int, int) { return 1; }
- void appendToComma(int, int) { }
- int createCommaExpr(int, int) { return 1; }
- int makeAssignNode(int, Operator, int, bool, bool, int, int, int) { return 1; }
- int makePrefixNode(int, Operator, int, int, int) { return 1; }
- int makePostfixNode(int, Operator, int, int, int) { return 1; }
- int makeTypeOfNode(int) { return 1; }
- int makeDeleteNode(int, int, int, int) { return 1; }
- int makeNegateNode(int) { return 1; }
- int makeBitwiseNotNode(int) { return 1; }
- int createLogicalNot(int) { return 1; }
- int createUnaryPlus(int) { return 1; }
- int createVoid(int) { return 1; }
- int thisExpr() { return 1; }
- int createResolve(const Identifier*, int) { return 1; }
- int createObjectLiteral() { return 1; }
- int createObjectLiteral(int) { return 1; }
- int createArray(int) { return 1; }
- int createArray(int, int) { return 1; }
- int createNumberExpr(double) { return 1; }
- int createString(const Identifier*) { return 1; }
- int createBoolean(bool) { return 1; }
- int createNull() { return 1; }
- int createBracketAccess(int, int, bool, int, int, int) { return 1; }
- int createDotAccess(int, const Identifier&, int, int, int) { return 1; }
- int createRegex(const Identifier&, const Identifier&, int) { return 1; }
- int createNewExpr(int, int, int, int, int) { return 1; }
- int createNewExpr(int, int, int) { return 1; }
- int createConditionalExpr(int, int, int) { return 1; }
- int createAssignResolve(const Identifier&, int, bool, int, int, int) { return 1; }
- int createFunctionExpr(const Identifier*, int, int, int, int, int, int) { return 1; }
- int createFunctionBody() { return 1; }
+ ExpressionType makeFunctionCallNode(int, int, int, int, int) { return CallExpr; }
+ void appendToComma(ExpressionType& base, ExpressionType right) { base = right; }
+ ExpressionType createCommaExpr(ExpressionType, ExpressionType right) { return right; }
+ ExpressionType makeAssignNode(ExpressionType, Operator, ExpressionType, bool, bool, int, int, int) { return AssignmentExpr; }
+ ExpressionType makePrefixNode(ExpressionType, Operator, int, int, int) { return PreExpr; }
+ ExpressionType makePostfixNode(ExpressionType, Operator, int, int, int) { return PostExpr; }
+ ExpressionType makeTypeOfNode(ExpressionType) { return TypeofExpr; }
+ ExpressionType makeDeleteNode(ExpressionType, int, int, int) { return DeleteExpr; }
+ ExpressionType makeNegateNode(ExpressionType) { return UnaryExpr; }
+ ExpressionType makeBitwiseNotNode(ExpressionType) { return UnaryExpr; }
+ ExpressionType createLogicalNot(ExpressionType) { return UnaryExpr; }
+ ExpressionType createUnaryPlus(ExpressionType) { return UnaryExpr; }
+ ExpressionType createVoid(ExpressionType) { return UnaryExpr; }
+ ExpressionType thisExpr() { return ThisExpr; }
+ ExpressionType createResolve(const Identifier*, int) { return ResolveExpr; }
+ ExpressionType createObjectLiteral() { return ObjectLiteralExpr; }
+ ExpressionType createObjectLiteral(int) { return ObjectLiteralExpr; }
+ ExpressionType createArray(int) { return ArrayLiteralExpr; }
+ ExpressionType createArray(int, int) { return ArrayLiteralExpr; }
+ ExpressionType createNumberExpr(double) { return NumberExpr; }
+ ExpressionType createString(const Identifier*) { return StringExpr; }
+ ExpressionType createBoolean(bool) { return BoolExpr; }
+ ExpressionType createNull() { return NullExpr; }
+ ExpressionType createBracketAccess(ExpressionType, ExpressionType, bool, int, int, int) { return BracketExpr; }
+ ExpressionType createDotAccess(ExpressionType, const Identifier&, int, int, int) { return DotExpr; }
+ ExpressionType createRegex(const Identifier&, const Identifier&, int) { return RegExpExpr; }
+ ExpressionType createNewExpr(ExpressionType, int, int, int, int) { return NewExpr; }
+ ExpressionType createNewExpr(ExpressionType, int, int) { return NewExpr; }
+ ExpressionType createConditionalExpr(ExpressionType, ExpressionType, ExpressionType) { return ConditionalExpr; }
+ ExpressionType createAssignResolve(const Identifier&, ExpressionType, bool, int, int, int) { return AssignmentExpr; }
+ ExpressionType createFunctionExpr(const Identifier*, int, int, int, int, int, int) { return FunctionExpr; }
+ int createFunctionBody(bool) { return 1; }
int createArguments() { return 1; }
int createArguments(int) { return 1; }
int createArgumentsList(int) { return 1; }
@@ -169,26 +178,38 @@ public:
void addVar(const Identifier*, bool) { }
int combineCommaNodes(int, int) { return 1; }
int evalCount() const { return 0; }
- void appendBinaryExpressionInfo(int& operandStackDepth, int, int, int, int, bool) { operandStackDepth++; }
+ void appendBinaryExpressionInfo(int& operandStackDepth, int expr, int, int, int, bool)
+ {
+ if (!m_topBinaryExpr)
+ m_topBinaryExpr = expr;
+ else
+ m_topBinaryExpr = BinaryExpr;
+ operandStackDepth++;
+ }
// Logic to handle datastructures used during parsing of binary expressions
void operatorStackPop(int& operatorStackDepth) { operatorStackDepth--; }
bool operatorStackHasHigherPrecedence(int&, int) { return true; }
- BinaryOperand getFromOperandStack(int) { return 1; }
+ BinaryOperand getFromOperandStack(int) { return m_topBinaryExpr; }
void shrinkOperandStackBy(int& operandStackDepth, int amount) { operandStackDepth -= amount; }
void appendBinaryOperation(int& operandStackDepth, int&, BinaryOperand, BinaryOperand) { operandStackDepth++; }
void operatorStackAppend(int& operatorStackDepth, int, int) { operatorStackDepth++; }
- int popOperandStack(int&) { return 1; }
+ int popOperandStack(int&) { int res = m_topBinaryExpr; m_topBinaryExpr = 0; return res; }
- void appendUnaryToken(int&, int, int) { }
- int unaryTokenStackLastType(int&) { ASSERT_NOT_REACHED(); return 1; }
- int unaryTokenStackLastStart(int&) { ASSERT_NOT_REACHED(); return 1; }
- void unaryTokenStackRemoveLast(int&) { }
+ void appendUnaryToken(int& stackDepth, int tok, int) { stackDepth = 1; m_topUnaryToken = tok; }
+ int unaryTokenStackLastType(int&) { return m_topUnaryToken; }
+ int unaryTokenStackLastStart(int&) { return 0; }
+ void unaryTokenStackRemoveLast(int& stackDepth) { stackDepth = 0; }
void assignmentStackAppend(int, int, int, int, int, Operator) { }
int createAssignment(int, int, int, int, int) { ASSERT_NOT_REACHED(); return 1; }
const Identifier& getName(const Property& property) { ASSERT(property.name); return *property.name; }
PropertyNode::Type getType(const Property& property) { return property.type; }
+ bool isResolve(ExpressionType expr) { return expr == ResolveExpr || expr == ResolveEvalExpr; }
+
+private:
+ int m_topBinaryExpr;
+ int m_topUnaryToken;
};
}