Index: src/compiler.cc |
=================================================================== |
--- src/compiler.cc (revision 3174) |
+++ src/compiler.cc (working copy) |
@@ -48,23 +48,24 @@ |
CodeGenSelector() |
: has_supported_syntax_(true), |
- location_(Location::Uninitialized()) { |
+ context_(Expression::kUninitialized) { |
} |
CodeGenTag Select(FunctionLiteral* fun); |
private: |
+ // Visit an expression in a given expression context. |
+ void ProcessExpression(Expression::Context context, Expression* expr) { |
William Hesse
2009/10/29 15:15:25
Could this be called VisitExpression?
I think the
Kevin Millikin (Chromium)
2009/10/29 16:36:10
I will change the order of arguments, and I'm open
|
+ Expression::Context saved = context_; |
+ context_ = context; |
+ Visit(expr); |
+ expr->set_context(context); |
+ context_ = saved; |
+ } |
+ |
void VisitDeclarations(ZoneList<Declaration*>* decls); |
void VisitStatements(ZoneList<Statement*>* stmts); |
- // Visit an expression in effect context with a desired location of |
- // nowhere. |
- void VisitAsEffect(Expression* expr); |
- |
- // Visit an expression in value context with a desired location of |
- // temporary. |
- void VisitAsValue(Expression* expr); |
- |
// AST node visit functions. |
#define DECLARE_VISIT(type) virtual void Visit##type(type* node); |
AST_NODE_LIST(DECLARE_VISIT) |
@@ -72,8 +73,8 @@ |
bool has_supported_syntax_; |
- // The desired location of the currently visited expression. |
- Location location_; |
+ // The desired expression context of the currently visited expression. |
+ Expression::Context context_; |
DISALLOW_COPY_AND_ASSIGN(CodeGenSelector); |
}; |
@@ -513,30 +514,6 @@ |
} |
-void CodeGenSelector::VisitAsEffect(Expression* expr) { |
- if (location_.is_effect()) { |
- Visit(expr); |
- } else { |
- Location saved = location_; |
- location_ = Location::Effect(); |
- Visit(expr); |
- location_ = saved; |
- } |
-} |
- |
- |
-void CodeGenSelector::VisitAsValue(Expression* expr) { |
- if (location_.is_value()) { |
- Visit(expr); |
- } else { |
- Location saved = location_; |
- location_ = Location::Value(); |
- Visit(expr); |
- location_ = saved; |
- } |
-} |
- |
- |
void CodeGenSelector::VisitDeclaration(Declaration* decl) { |
Variable* var = decl->proxy()->var(); |
if (!var->is_global() || var->mode() == Variable::CONST) { |
@@ -551,7 +528,7 @@ |
void CodeGenSelector::VisitExpressionStatement(ExpressionStatement* stmt) { |
- VisitAsEffect(stmt->expression()); |
+ ProcessExpression(Expression::kEffect, stmt->expression()); |
} |
@@ -576,7 +553,7 @@ |
void CodeGenSelector::VisitReturnStatement(ReturnStatement* stmt) { |
- VisitAsValue(stmt->expression()); |
+ ProcessExpression(Expression::kValue, stmt->expression()); |
} |
@@ -634,7 +611,6 @@ |
if (!expr->AllowsLazyCompilation()) { |
BAILOUT("FunctionLiteral does not allow lazy compilation"); |
} |
- expr->set_location(location_); |
} |
@@ -671,17 +647,16 @@ |
BAILOUT("non-parameter/non-local slot reference"); |
} |
} |
- expr->set_location(location_); |
} |
void CodeGenSelector::VisitLiteral(Literal* expr) { |
- expr->set_location(location_); |
+ /* Nothing to do. */ |
} |
void CodeGenSelector::VisitRegExpLiteral(RegExpLiteral* expr) { |
- expr->set_location(location_); |
+ /* Nothing to do. */ |
} |
@@ -711,14 +686,13 @@ |
case ObjectLiteral::Property::GETTER: // Fall through. |
case ObjectLiteral::Property::SETTER: // Fall through. |
case ObjectLiteral::Property::PROTOTYPE: |
- VisitAsValue(property->key()); |
+ ProcessExpression(Expression::kValue, property->key()); |
CHECK_BAILOUT; |
break; |
} |
- VisitAsValue(property->value()); |
+ ProcessExpression(Expression::kValue, property->value()); |
CHECK_BAILOUT; |
} |
- expr->set_location(location_); |
} |
@@ -728,10 +702,9 @@ |
Expression* subexpr = subexprs->at(i); |
if (subexpr->AsLiteral() != NULL) continue; |
if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; |
- VisitAsValue(subexpr); |
+ ProcessExpression(Expression::kValue, subexpr); |
CHECK_BAILOUT; |
} |
- expr->set_location(location_); |
} |
@@ -765,8 +738,7 @@ |
} |
} |
- VisitAsValue(expr->value()); |
- expr->set_location(location_); |
+ ProcessExpression(Expression::kValue, expr->value()); |
} |
@@ -776,10 +748,9 @@ |
void CodeGenSelector::VisitProperty(Property* expr) { |
- VisitAsValue(expr->obj()); |
+ ProcessExpression(Expression::kValue, expr->obj()); |
CHECK_BAILOUT; |
- VisitAsValue(expr->key()); |
- expr->set_location(location_); |
+ ProcessExpression(Expression::kValue, expr->key()); |
} |
@@ -800,23 +771,21 @@ |
} |
// Check all arguments to the call. (Relies on TEMP meaning STACK.) |
for (int i = 0; i < args->length(); i++) { |
- VisitAsValue(args->at(i)); |
+ ProcessExpression(Expression::kValue, args->at(i)); |
CHECK_BAILOUT; |
} |
- expr->set_location(location_); |
} |
void CodeGenSelector::VisitCallNew(CallNew* expr) { |
- VisitAsValue(expr->expression()); |
+ ProcessExpression(Expression::kValue, expr->expression()); |
CHECK_BAILOUT; |
ZoneList<Expression*>* args = expr->arguments(); |
// Check all arguments to the call |
for (int i = 0; i < args->length(); i++) { |
- VisitAsValue(args->at(i)); |
+ ProcessExpression(Expression::kValue, args->at(i)); |
CHECK_BAILOUT; |
} |
- expr->set_location(location_); |
} |
@@ -830,10 +799,9 @@ |
} |
// Check all arguments to the call. (Relies on TEMP meaning STACK.) |
for (int i = 0; i < expr->arguments()->length(); i++) { |
- VisitAsValue(expr->arguments()->at(i)); |
+ ProcessExpression(Expression::kValue, expr->arguments()->at(i)); |
CHECK_BAILOUT; |
} |
- expr->set_location(location_); |
} |
@@ -850,17 +818,15 @@ |
void CodeGenSelector::VisitBinaryOperation(BinaryOperation* expr) { |
switch (expr->op()) { |
case Token::COMMA: |
- VisitAsEffect(expr->left()); |
+ ProcessExpression(Expression::kEffect, expr->left()); |
CHECK_BAILOUT; |
- Visit(expr->right()); // Location is the same as the parent location. |
+ ProcessExpression(context_, expr->right()); |
break; |
case Token::OR: |
- VisitAsValue(expr->left()); |
+ ProcessExpression(Expression::kValue, expr->left()); |
CHECK_BAILOUT; |
- // The location for the right subexpression is the same as for the |
- // whole expression so we call Visit directly. |
- Visit(expr->right()); |
+ ProcessExpression(context_, expr->right()); |
break; |
case Token::ADD: |
@@ -874,15 +840,14 @@ |
case Token::SHL: |
case Token::SHR: |
case Token::SAR: |
- VisitAsValue(expr->left()); |
+ ProcessExpression(Expression::kValue, expr->left()); |
CHECK_BAILOUT; |
- VisitAsValue(expr->right()); |
+ ProcessExpression(Expression::kValue, expr->right()); |
break; |
default: |
BAILOUT("Unsupported binary operation"); |
} |
- expr->set_location(location_); |
} |