Index: src/scopes.cc |
diff --git a/src/scopes.cc b/src/scopes.cc |
index 2c61a7523a6dc33402a346681dc5775eb86c2a41..ad6692e57fde763d4fa1fbfc7a9c0104130efb21 100644 |
--- a/src/scopes.cc |
+++ b/src/scopes.cc |
@@ -57,7 +57,9 @@ static bool Match(void* key1, void* key2) { |
} |
-VariableMap::VariableMap() : ZoneHashMap(Match, 8) {} |
+VariableMap::VariableMap(Zone* zone) |
+ : ZoneHashMap(Match, 8, ZoneAllocationPolicy(zone)), |
+ zone_(zone) {} |
VariableMap::~VariableMap() {} |
@@ -69,24 +71,26 @@ Variable* VariableMap::Declare( |
Variable::Kind kind, |
InitializationFlag initialization_flag, |
Interface* interface) { |
- Entry* p = ZoneHashMap::Lookup(name.location(), name->Hash(), true); |
+ Entry* p = ZoneHashMap::Lookup(name.location(), name->Hash(), true, |
+ ZoneAllocationPolicy(zone())); |
if (p->value == NULL) { |
// The variable has not been declared yet -> insert it. |
ASSERT(p->key == name.location()); |
- p->value = new Variable(scope, |
- name, |
- mode, |
- is_valid_lhs, |
- kind, |
- initialization_flag, |
- interface); |
+ p->value = new(zone()) Variable(scope, |
+ name, |
+ mode, |
+ is_valid_lhs, |
+ kind, |
+ initialization_flag, |
+ interface); |
} |
return reinterpret_cast<Variable*>(p->value); |
} |
Variable* VariableMap::Lookup(Handle<String> name) { |
- Entry* p = ZoneHashMap::Lookup(name.location(), name->Hash(), false); |
+ Entry* p = ZoneHashMap::Lookup(name.location(), name->Hash(), false, |
+ ZoneAllocationPolicy(NULL)); |
if (p != NULL) { |
ASSERT(*reinterpret_cast<String**>(p->key) == *name); |
ASSERT(p->value != NULL); |
@@ -99,18 +103,19 @@ Variable* VariableMap::Lookup(Handle<String> name) { |
// ---------------------------------------------------------------------------- |
// Implementation of Scope |
-Scope::Scope(Scope* outer_scope, ScopeType type) |
+Scope::Scope(Scope* outer_scope, ScopeType type, Zone* zone) |
: isolate_(Isolate::Current()), |
- inner_scopes_(4), |
- variables_(), |
- temps_(4), |
- params_(4), |
- unresolved_(16), |
- decls_(4), |
+ inner_scopes_(4, zone), |
+ variables_(zone), |
+ temps_(4, zone), |
+ params_(4, zone), |
+ unresolved_(16, zone), |
+ decls_(4, zone), |
interface_(FLAG_harmony_modules && |
(type == MODULE_SCOPE || type == GLOBAL_SCOPE) |
- ? Interface::NewModule() : NULL), |
- already_resolved_(false) { |
+ ? Interface::NewModule(zone) : NULL), |
+ already_resolved_(false), |
+ zone_(zone) { |
SetDefaults(type, outer_scope, Handle<ScopeInfo>::null()); |
// At some point we might want to provide outer scopes to |
// eval scopes (by walking the stack and reading the scope info). |
@@ -122,16 +127,18 @@ Scope::Scope(Scope* outer_scope, ScopeType type) |
Scope::Scope(Scope* inner_scope, |
ScopeType type, |
- Handle<ScopeInfo> scope_info) |
+ Handle<ScopeInfo> scope_info, |
+ Zone* zone) |
: isolate_(Isolate::Current()), |
- inner_scopes_(4), |
- variables_(), |
- temps_(4), |
- params_(4), |
- unresolved_(16), |
- decls_(4), |
+ inner_scopes_(4, zone), |
+ variables_(zone), |
+ temps_(4, zone), |
+ params_(4, zone), |
+ unresolved_(16, zone), |
+ decls_(4, zone), |
interface_(NULL), |
- already_resolved_(true) { |
+ already_resolved_(true), |
+ zone_(zone) { |
SetDefaults(type, NULL, scope_info); |
if (!scope_info.is_null()) { |
num_heap_slots_ = scope_info_->ContextLength(); |
@@ -143,16 +150,17 @@ Scope::Scope(Scope* inner_scope, |
} |
-Scope::Scope(Scope* inner_scope, Handle<String> catch_variable_name) |
+Scope::Scope(Scope* inner_scope, Handle<String> catch_variable_name, Zone* zone) |
: isolate_(Isolate::Current()), |
- inner_scopes_(1), |
- variables_(), |
- temps_(0), |
- params_(0), |
- unresolved_(0), |
- decls_(0), |
+ inner_scopes_(1, zone), |
+ variables_(zone), |
+ temps_(0, zone), |
+ params_(0, zone), |
+ unresolved_(0, zone), |
+ decls_(0, zone), |
interface_(NULL), |
- already_resolved_(true) { |
+ already_resolved_(true), |
+ zone_(zone) { |
SetDefaults(CATCH_SCOPE, NULL, Handle<ScopeInfo>::null()); |
AddInnerScope(inner_scope); |
++num_var_or_const_; |
@@ -200,16 +208,18 @@ void Scope::SetDefaults(ScopeType type, |
} |
-Scope* Scope::DeserializeScopeChain(Context* context, Scope* global_scope) { |
+Scope* Scope::DeserializeScopeChain(Context* context, Scope* global_scope, |
+ Zone* zone) { |
// Reconstruct the outer scope chain from a closure's context chain. |
Scope* current_scope = NULL; |
Scope* innermost_scope = NULL; |
bool contains_with = false; |
while (!context->IsGlobalContext()) { |
if (context->IsWithContext()) { |
- Scope* with_scope = new Scope(current_scope, |
- WITH_SCOPE, |
- Handle<ScopeInfo>::null()); |
+ Scope* with_scope = new(zone) Scope(current_scope, |
+ WITH_SCOPE, |
+ Handle<ScopeInfo>::null(), |
+ zone); |
current_scope = with_scope; |
// All the inner scopes are inside a with. |
contains_with = true; |
@@ -218,18 +228,21 @@ Scope* Scope::DeserializeScopeChain(Context* context, Scope* global_scope) { |
} |
} else if (context->IsFunctionContext()) { |
ScopeInfo* scope_info = context->closure()->shared()->scope_info(); |
- current_scope = new Scope(current_scope, |
- FUNCTION_SCOPE, |
- Handle<ScopeInfo>(scope_info)); |
+ current_scope = new(zone) Scope(current_scope, |
+ FUNCTION_SCOPE, |
+ Handle<ScopeInfo>(scope_info), |
+ zone); |
} else if (context->IsBlockContext()) { |
ScopeInfo* scope_info = ScopeInfo::cast(context->extension()); |
- current_scope = new Scope(current_scope, |
- BLOCK_SCOPE, |
- Handle<ScopeInfo>(scope_info)); |
+ current_scope = new(zone) Scope(current_scope, |
+ BLOCK_SCOPE, |
+ Handle<ScopeInfo>(scope_info), |
+ zone); |
} else { |
ASSERT(context->IsCatchContext()); |
String* name = String::cast(context->extension()); |
- current_scope = new Scope(current_scope, Handle<String>(name)); |
+ current_scope = new(zone) Scope( |
+ current_scope, Handle<String>(name), zone); |
} |
if (contains_with) current_scope->RecordWithStatement(); |
if (innermost_scope == NULL) innermost_scope = current_scope; |
@@ -305,7 +318,7 @@ void Scope::Initialize() { |
// Add this scope as a new inner scope of the outer scope. |
if (outer_scope_ != NULL) { |
- outer_scope_->inner_scopes_.Add(this); |
+ outer_scope_->inner_scopes_.Add(this, zone()); |
scope_inside_with_ = outer_scope_->scope_inside_with_ || is_with_scope(); |
} else { |
scope_inside_with_ = is_with_scope(); |
@@ -370,7 +383,7 @@ Scope* Scope::FinalizeBlockScope() { |
// Move unresolved variables |
for (int i = 0; i < unresolved_.length(); i++) { |
- outer_scope()->unresolved_.Add(unresolved_[i]); |
+ outer_scope()->unresolved_.Add(unresolved_[i], zone()); |
} |
return NULL; |
@@ -401,13 +414,8 @@ Variable* Scope::LocalLookup(Handle<String> name) { |
init_flag = kCreatedInitialized; |
} |
- Variable* var = |
- variables_.Declare(this, |
- name, |
- mode, |
- true, |
- Variable::NORMAL, |
- init_flag); |
+ Variable* var = variables_.Declare(this, name, mode, true, Variable::NORMAL, |
+ init_flag); |
var->AllocateTo(location, index); |
return var; |
} |
@@ -422,7 +430,7 @@ Variable* Scope::LookupFunctionVar(Handle<String> name, |
VariableMode mode; |
int index = scope_info_->FunctionContextSlotIndex(*name, &mode); |
if (index < 0) return NULL; |
- Variable* var = new Variable( |
+ Variable* var = new(zone()) Variable( |
this, name, mode, true /* is valid LHS */, |
Variable::NORMAL, kCreatedInitialized); |
VariableProxy* proxy = factory->NewVariableProxy(var); |
@@ -451,9 +459,9 @@ Variable* Scope::Lookup(Handle<String> name) { |
void Scope::DeclareParameter(Handle<String> name, VariableMode mode) { |
ASSERT(!already_resolved()); |
ASSERT(is_function_scope()); |
- Variable* var = variables_.Declare( |
- this, name, mode, true, Variable::NORMAL, kCreatedInitialized); |
- params_.Add(var); |
+ Variable* var = variables_.Declare(this, name, mode, true, Variable::NORMAL, |
+ kCreatedInitialized); |
+ params_.Add(var, zone()); |
} |
@@ -500,19 +508,19 @@ void Scope::RemoveUnresolved(VariableProxy* var) { |
Variable* Scope::NewTemporary(Handle<String> name) { |
ASSERT(!already_resolved()); |
- Variable* var = new Variable(this, |
- name, |
- TEMPORARY, |
- true, |
- Variable::NORMAL, |
- kCreatedInitialized); |
- temps_.Add(var); |
+ Variable* var = new(zone()) Variable(this, |
+ name, |
+ TEMPORARY, |
+ true, |
+ Variable::NORMAL, |
+ kCreatedInitialized); |
+ temps_.Add(var, zone()); |
return var; |
} |
void Scope::AddDeclaration(Declaration* declaration) { |
- decls_.Add(declaration); |
+ decls_.Add(declaration, zone()); |
} |
@@ -588,7 +596,7 @@ void Scope::CollectStackAndContextLocals(ZoneList<Variable*>* stack_locals, |
Variable* var = temps_[i]; |
if (var->is_used()) { |
ASSERT(var->IsStackLocal()); |
- stack_locals->Add(var); |
+ stack_locals->Add(var, zone()); |
} |
} |
@@ -599,9 +607,9 @@ void Scope::CollectStackAndContextLocals(ZoneList<Variable*>* stack_locals, |
Variable* var = reinterpret_cast<Variable*>(p->value); |
if (var->is_used()) { |
if (var->IsStackLocal()) { |
- stack_locals->Add(var); |
+ stack_locals->Add(var, zone()); |
} else if (var->IsContextSlot()) { |
- context_locals->Add(var); |
+ context_locals->Add(var, zone()); |
} |
} |
} |
@@ -699,7 +707,7 @@ Scope* Scope::DeclarationScope() { |
Handle<ScopeInfo> Scope::GetScopeInfo() { |
if (scope_info_.is_null()) { |
- scope_info_ = ScopeInfo::Create(this); |
+ scope_info_ = ScopeInfo::Create(this, zone()); |
} |
return scope_info_; |
} |
@@ -885,7 +893,7 @@ void Scope::Print(int n) { |
Variable* Scope::NonLocal(Handle<String> name, VariableMode mode) { |
- if (dynamics_ == NULL) dynamics_ = new DynamicScopePart(); |
+ if (dynamics_ == NULL) dynamics_ = new(zone()) DynamicScopePart(zone()); |
VariableMap* map = dynamics_->GetMap(mode); |
Variable* var = map->Lookup(name); |
if (var == NULL) { |
@@ -1019,7 +1027,7 @@ bool Scope::ResolveVariable(CompilationInfo* info, |
if (FLAG_print_interface_details) |
PrintF("# Resolve %s:\n", var->name()->ToAsciiArray()); |
#endif |
- proxy->interface()->Unify(var->interface(), &ok); |
+ proxy->interface()->Unify(var->interface(), zone(), &ok); |
if (!ok) { |
#ifdef DEBUG |
if (FLAG_print_interfaces) { |