| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index be0281b846e7520ab28b581ac18fb078bc4d8de9..62766a8febe890375e78cd050758360cd1aa4b47 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,35 @@ 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();
|
| + RETURN_IF_EMPTY_HANDLE(isolate,
|
| + 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 +535,16 @@ 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;
|
| + if (boilerplate.is_null()) return Handle<AllocationSite>::null();
|
| +
|
| + AllocationSiteCreationContext creation_context(isolate);
|
| + site = creation_context.EnterNewScope();
|
| + if (JSObject::DeepWalk(Handle<JSObject>::cast(boilerplate),
|
| + &creation_context).is_null()) {
|
| + return Handle<AllocationSite>::null();
|
| }
|
| - site = isolate->factory()->NewAllocationSite();
|
| - site->set_transition_info(*boilerplate);
|
| + creation_context.ExitScope(site, Handle<JSObject>::cast(boilerplate));
|
| +
|
| literals->set(literals_index, *site);
|
| } else {
|
| site = Handle<AllocationSite>::cast(literal_site);
|
| @@ -551,7 +566,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 +592,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 +14702,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);
|
|
|