Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index be0281b846e7520ab28b581ac18fb078bc4d8de9..fe4d089d7918c91c10882030db25675ab77c5e25 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -31,6 +31,7 @@ |
#include "v8.h" |
#include "accessors.h" |
+#include "allocation-site-scopes.h" |
#include "api.h" |
#include "arguments.h" |
#include "bootstrapper.h" |
@@ -488,25 +489,34 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteral) { |
// Check if boilerplate exists. If not, create it first. |
Handle<Object> literal_site(literals->get(literals_index), isolate); |
Handle<AllocationSite> site; |
- Handle<Object> boilerplate; |
+ Handle<JSObject> boilerplate; |
if (*literal_site == isolate->heap()->undefined_value()) { |
- boilerplate = CreateObjectLiteralBoilerplate(isolate, |
- literals, |
- constant_properties, |
- should_have_fast_elements, |
- has_function_literal); |
- RETURN_IF_EMPTY_HANDLE(isolate, boilerplate); |
- site = isolate->factory()->NewAllocationSite(); |
- site->set_transition_info(*boilerplate); |
+ Handle<Object> raw_boilerplate = CreateObjectLiteralBoilerplate( |
+ isolate, |
+ literals, |
+ constant_properties, |
+ should_have_fast_elements, |
+ has_function_literal); |
+ RETURN_IF_EMPTY_HANDLE(isolate, raw_boilerplate); |
+ boilerplate = Handle<JSObject>::cast(raw_boilerplate); |
+ |
+ AllocationSiteCreationContext creation_context(isolate); |
+ site = creation_context.EnterNewScope(); |
+ JSObject::DeepWalk(boilerplate, &creation_context); |
+ creation_context.ExitScope(site, boilerplate); |
// Update the functions literal and return the boilerplate. |
literals->set(literals_index, *site); |
} else { |
site = Handle<AllocationSite>::cast(literal_site); |
- boilerplate = Handle<JSObject>(JSObject::cast(site->transition_info())); |
+ boilerplate = Handle<JSObject>(JSObject::cast(site->transition_info()), |
+ isolate); |
} |
- Handle<Object> copy = JSObject::DeepCopy(Handle<JSObject>::cast(boilerplate)); |
+ AllocationSiteUsageContext usage_context(isolate, site, true); |
+ usage_context.EnterNewScope(); |
+ Handle<Object> copy = JSObject::DeepCopy(boilerplate, &usage_context); |
+ usage_context.ExitScope(site, boilerplate); |
RETURN_IF_EMPTY_HANDLE(isolate, copy); |
return *copy; |
} |
@@ -524,12 +534,13 @@ static Handle<AllocationSite> GetLiteralAllocationSite( |
ASSERT(*elements != isolate->heap()->empty_fixed_array()); |
Handle<Object> boilerplate = |
Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); |
- if (boilerplate.is_null()) { |
- ASSERT(site.is_null()); |
- return site; |
- } |
- site = isolate->factory()->NewAllocationSite(); |
- site->set_transition_info(*boilerplate); |
+ if (boilerplate.is_null()) return Handle<AllocationSite>::null(); |
+ |
+ AllocationSiteCreationContext creation_context(isolate); |
+ site = creation_context.EnterNewScope(); |
+ JSObject::DeepWalk(Handle<JSObject>::cast(boilerplate), &creation_context); |
+ creation_context.ExitScope(site, Handle<JSObject>::cast(boilerplate)); |
+ |
literals->set(literals_index, *site); |
} else { |
site = Handle<AllocationSite>::cast(literal_site); |
@@ -551,7 +562,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) { |
RETURN_IF_EMPTY_HANDLE(isolate, site); |
Handle<JSObject> boilerplate(JSObject::cast(site->transition_info())); |
- Handle<JSObject> copy = JSObject::DeepCopy(boilerplate); |
+ AllocationSiteUsageContext usage_context(isolate, site, true); |
+ usage_context.EnterNewScope(); |
+ Handle<JSObject> copy = JSObject::DeepCopy(boilerplate, &usage_context); |
+ usage_context.ExitScope(site, boilerplate); |
RETURN_IF_EMPTY_HANDLE(isolate, copy); |
return *copy; |
} |
@@ -574,9 +588,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) { |
isolate->counters()->cow_arrays_created_runtime()->Increment(); |
} |
- AllocationSiteMode mode = AllocationSite::GetMode( |
- boilerplate->GetElementsKind()); |
- if (mode == TRACK_ALLOCATION_SITE) { |
+ if (AllocationSite::GetMode(boilerplate->GetElementsKind()) == |
+ TRACK_ALLOCATION_SITE) { |
return isolate->heap()->CopyJSObject(boilerplate, *site); |
} |
@@ -14685,7 +14698,7 @@ static MaybeObject* ArrayConstructorCommon(Isolate* isolate, |
Handle<Cell> cell = Handle<Cell>::cast(type_info); |
Handle<AllocationSite> site = Handle<AllocationSite>( |
AllocationSite::cast(cell->value()), isolate); |
- ASSERT(!site->IsLiteralSite()); |
+ ASSERT(!site->SitePointsToLiteral()); |
ElementsKind to_kind = site->GetElementsKind(); |
if (holey && !IsFastHoleyElementsKind(to_kind)) { |
to_kind = GetHoleyElementsKind(to_kind); |