Index: src/ast.h |
=================================================================== |
--- src/ast.h (revision 1544) |
+++ src/ast.h (working copy) |
@@ -95,6 +95,7 @@ |
// Forward declarations |
class TargetCollector; |
+class MaterializedLiteral; |
#define DEF_FORWARD_DECLARATION(type) class type; |
NODE_LIST(DEF_FORWARD_DECLARATION) |
@@ -129,6 +130,9 @@ |
virtual BinaryOperation* AsBinaryOperation() { return NULL; } |
virtual Assignment* AsAssignment() { return NULL; } |
virtual FunctionLiteral* AsFunctionLiteral() { return NULL; } |
+ virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } |
+ virtual ObjectLiteral* AsObjectLiteral() { return NULL; } |
+ virtual ArrayLiteral* AsArrayLiteral() { return NULL; } |
void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; } |
int statement_pos() const { return statement_pos_; } |
@@ -636,11 +640,23 @@ |
// Base class for literals that needs space in the corresponding JSFunction. |
class MaterializedLiteral: public Expression { |
public: |
- explicit MaterializedLiteral(int literal_index) |
- : literal_index_(literal_index) {} |
+ explicit MaterializedLiteral(int literal_index, bool is_simple, int depth) |
+ : literal_index_(literal_index), is_simple_(is_simple), depth_(depth) {} |
+ |
+ virtual MaterializedLiteral* AsMaterializedLiteral() { return this; } |
+ |
int literal_index() { return literal_index_; } |
+ |
+ // A materialized literal is simple if the values consist of only |
+ // constants and simple object and array literals. |
+ bool is_simple() const { return is_simple_; } |
+ |
+ int depth() const { return depth_; } |
+ |
private: |
int literal_index_; |
+ bool is_simple_; |
+ int depth_; |
}; |
@@ -655,10 +671,11 @@ |
public: |
enum Kind { |
- CONSTANT, // Property with constant value (at compile time). |
- COMPUTED, // Property with computed value (at execution time). |
- GETTER, SETTER, // Property is an accessor function. |
- PROTOTYPE // Property is __proto__. |
+ CONSTANT, // Property with constant value (compile time). |
+ COMPUTED, // Property with computed value (execution time). |
+ MATERIALIZED_LITERAL, // Property value is a materialized literal. |
+ GETTER, SETTER, // Property is an accessor function. |
+ PROTOTYPE // Property is __proto__. |
}; |
Property(Literal* key, Expression* value); |
@@ -676,12 +693,14 @@ |
ObjectLiteral(Handle<FixedArray> constant_properties, |
ZoneList<Property*>* properties, |
- int literal_index) |
- : MaterializedLiteral(literal_index), |
+ int literal_index, |
+ bool is_simple, |
+ int depth) |
+ : MaterializedLiteral(literal_index, is_simple, depth), |
constant_properties_(constant_properties), |
- properties_(properties) { |
- } |
+ properties_(properties) {} |
+ virtual ObjectLiteral* AsObjectLiteral() { return this; } |
virtual void Accept(AstVisitor* v); |
Handle<FixedArray> constant_properties() const { |
@@ -701,7 +720,7 @@ |
RegExpLiteral(Handle<String> pattern, |
Handle<String> flags, |
int literal_index) |
- : MaterializedLiteral(literal_index), |
+ : MaterializedLiteral(literal_index, false, 1), |
pattern_(pattern), |
flags_(flags) {} |
@@ -717,14 +736,19 @@ |
// An array literal has a literals object that is used |
// for minimizing the work when constructing it at runtime. |
-class ArrayLiteral: public Expression { |
+class ArrayLiteral: public MaterializedLiteral { |
public: |
ArrayLiteral(Handle<FixedArray> literals, |
- ZoneList<Expression*>* values) |
- : literals_(literals), values_(values) { |
- } |
+ ZoneList<Expression*>* values, |
+ int literal_index, |
+ bool is_simple, |
+ int depth) |
+ : MaterializedLiteral(literal_index, is_simple, depth), |
+ literals_(literals), |
+ values_(values) {} |
virtual void Accept(AstVisitor* v); |
+ virtual ArrayLiteral* AsArrayLiteral() { return this; } |
Handle<FixedArray> literals() const { return literals_; } |
ZoneList<Expression*>* values() const { return values_; } |