Index: src/parser.cc |
=================================================================== |
--- src/parser.cc (revision 5323) |
+++ src/parser.cc (working copy) |
@@ -341,10 +341,8 @@ |
template <typename T, int initial_size> |
class BufferedZoneList { |
public: |
+ BufferedZoneList() : list_(NULL), last_(NULL) {} |
- BufferedZoneList() : |
- list_(NULL), last_(NULL) {} |
- |
// Adds element at end of list. This element is buffered and can |
// be read using last() or removed using RemoveLast until a new Add or until |
// RemoveLast or GetList has been called. |
@@ -414,6 +412,7 @@ |
T* last_; |
}; |
+ |
// Accumulates RegExp atoms and assertions into lists of terms and alternatives. |
class RegExpBuilder: public ZoneObject { |
public: |
@@ -652,6 +651,7 @@ |
static const int kMaxCaptures = 1 << 16; |
static const uc32 kEndMarker = (1 << 21); |
+ |
private: |
enum SubexpressionType { |
INITIAL, |
@@ -747,6 +747,10 @@ |
void AddProperty() { expected_property_count_++; } |
int expected_property_count() { return expected_property_count_; } |
+ |
+ void AddLoop() { loop_count_++; } |
+ bool ContainsLoops() const { return loop_count_ > 0; } |
+ |
private: |
// Captures the number of literals that need materialization in the |
// function. Includes regexp literals, and boilerplate for object |
@@ -756,9 +760,14 @@ |
// Properties count estimation. |
int expected_property_count_; |
+ // Keeps track of assignments to properties of this. Used for |
+ // optimizing constructors. |
bool only_simple_this_property_assignments_; |
Handle<FixedArray> this_property_assignments_; |
+ // Captures the number of loops inside the scope. |
+ int loop_count_; |
+ |
// Bookkeeping |
Parser* parser_; |
TemporaryScope* parent_; |
@@ -772,6 +781,7 @@ |
expected_property_count_(0), |
only_simple_this_property_assignments_(false), |
this_property_assignments_(Factory::empty_fixed_array()), |
+ loop_count_(0), |
parser_(parser), |
parent_(parser->temp_scope_) { |
parser->temp_scope_ = this; |
@@ -1282,7 +1292,8 @@ |
0, |
0, |
source->length(), |
- false)); |
+ false, |
+ temp_scope.ContainsLoops())); |
} else if (scanner().stack_overflow()) { |
Top::StackOverflow(); |
} |
@@ -1382,7 +1393,8 @@ |
0, |
0, |
source->length(), |
- false)); |
+ false, |
+ temp_scope.ContainsLoops())); |
} else if (scanner().stack_overflow()) { |
Top::StackOverflow(); |
} |
@@ -2653,6 +2665,7 @@ |
// DoStatement :: |
// 'do' Statement 'while' '(' Expression ')' ';' |
+ temp_scope_->AddLoop(); |
DoWhileStatement* loop = NEW(DoWhileStatement(labels)); |
Target target(this, loop); |
@@ -2685,6 +2698,7 @@ |
// WhileStatement :: |
// 'while' '(' Expression ')' Statement |
+ temp_scope_->AddLoop(); |
WhileStatement* loop = NEW(WhileStatement(labels)); |
Target target(this, loop); |
@@ -2704,6 +2718,7 @@ |
// ForStatement :: |
// 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement |
+ temp_scope_->AddLoop(); |
Statement* init = NULL; |
Expect(Token::FOR, CHECK_OK); |
@@ -3955,7 +3970,8 @@ |
num_parameters, |
start_pos, |
end_pos, |
- function_name->length() > 0)); |
+ function_name->length() > 0, |
+ temp_scope.ContainsLoops())); |
if (!is_pre_parsing_) { |
function_literal->set_function_token_position(function_token_position); |
} |