Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index 48d0bfac066857f92b2f386903a157575f09fd82..2b38b18a97de4cb052591b354f1b98095fdb3527 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -193,6 +193,11 @@ class Expression: public AstNode { |
// names because [] for string objects is handled only by keyed ICs. |
virtual bool IsPropertyName() { return false; } |
+ // True if the expression does not have (evaluated) subexpressions. |
+ // Function literals are leaves because their subexpressions are not |
+ // evaluated. |
+ virtual bool IsLeaf() { return false; } |
+ |
// Mark the expression as being compiled as an expression |
// statement. This is used to transform postfix increments to |
// (faster) prefix increments. |
@@ -720,6 +725,8 @@ class Literal: public Expression { |
return false; |
} |
+ virtual bool IsLeaf() { return true; } |
+ |
// Identity testers. |
bool IsNull() const { return handle_.is_identical_to(Factory::null_value()); } |
bool IsTrue() const { return handle_.is_identical_to(Factory::true_value()); } |
@@ -802,6 +809,8 @@ class ObjectLiteral: public MaterializedLiteral { |
virtual ObjectLiteral* AsObjectLiteral() { return this; } |
virtual void Accept(AstVisitor* v); |
+ virtual bool IsLeaf() { return properties()->is_empty(); } |
+ |
Handle<FixedArray> constant_properties() const { |
return constant_properties_; |
} |
@@ -825,6 +834,8 @@ class RegExpLiteral: public MaterializedLiteral { |
virtual void Accept(AstVisitor* v); |
+ virtual bool IsLeaf() { return true; } |
+ |
Handle<String> pattern() const { return pattern_; } |
Handle<String> flags() const { return flags_; } |
@@ -849,6 +860,8 @@ class ArrayLiteral: public MaterializedLiteral { |
virtual void Accept(AstVisitor* v); |
virtual ArrayLiteral* AsArrayLiteral() { return this; } |
+ virtual bool IsLeaf() { return values()->is_empty(); } |
+ |
Handle<FixedArray> constant_elements() const { return constant_elements_; } |
ZoneList<Expression*>* values() const { return values_; } |
@@ -896,6 +909,11 @@ class VariableProxy: public Expression { |
return var_ == NULL ? true : var_->IsValidLeftHandSide(); |
} |
+ virtual bool IsLeaf() { |
+ ASSERT(var_ != NULL); // Variable must be resolved. |
+ return var()->is_global() || var()->rewrite()->IsLeaf(); |
+ } |
+ |
bool IsVariable(Handle<String> n) { |
return !is_this() && name().is_identical_to(n); |
} |
@@ -981,6 +999,8 @@ class Slot: public Expression { |
// Type testing & conversion |
virtual Slot* AsSlot() { return this; } |
+ virtual bool IsLeaf() { return true; } |
+ |
// Accessors |
Variable* var() const { return var_; } |
Type type() const { return type_; } |
@@ -1337,6 +1357,8 @@ class FunctionLiteral: public Expression { |
// Type testing & conversion |
virtual FunctionLiteral* AsFunctionLiteral() { return this; } |
+ virtual bool IsLeaf() { return true; } |
+ |
Handle<String> name() const { return name_; } |
Scope* scope() const { return scope_; } |
ZoneList<Statement*>* body() const { return body_; } |
@@ -1403,6 +1425,8 @@ class FunctionBoilerplateLiteral: public Expression { |
Handle<JSFunction> boilerplate() const { return boilerplate_; } |
+ virtual bool IsLeaf() { return true; } |
+ |
virtual void Accept(AstVisitor* v); |
private: |
@@ -1413,6 +1437,7 @@ class FunctionBoilerplateLiteral: public Expression { |
class ThisFunction: public Expression { |
public: |
virtual void Accept(AstVisitor* v); |
+ virtual bool IsLeaf() { return true; } |
}; |