Chromium Code Reviews| Index: src/runtime.cc |
| diff --git a/src/runtime.cc b/src/runtime.cc |
| index af3c39e45ed07f5650a0af2859d6dfa67e4f8997..d945550b641f5fff504706232779d1d532a68c09 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" |
| @@ -486,19 +487,35 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteral) { |
| bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; |
| // Check if boilerplate exists. If not, create it first. |
| - Handle<Object> boilerplate(literals->get(literals_index), isolate); |
| - if (*boilerplate == isolate->heap()->undefined_value()) { |
| + Handle<Object> literal_site(literals->get(literals_index), isolate); |
| + Handle<AllocationSite> site; |
| + Handle<Object> 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); |
| + |
| + AllocationSiteContext site_context(isolate, true); |
| + AllocationSiteCreationScope site_scope(&site_context); |
| + Handle<Object> same = JSObject::DeepWalk( |
| + Handle<JSObject>::cast(boilerplate), &site_context); |
| + site_scope.RecordTransitionInfo(same); |
| + site = site_context.top(); |
| + |
| // Update the functions literal and return the boilerplate. |
| - literals->set(literals_index, *boilerplate); |
| + literals->set(literals_index, *site); |
| + } else { |
| + site = Handle<AllocationSite>::cast(literal_site); |
| + boilerplate = Handle<Object>(site->transition_info(), isolate); |
| } |
| - Handle<Object> copy = JSObject::DeepCopy(Handle<JSObject>::cast(boilerplate)); |
| + AllocationSiteContext site_context(isolate, true); |
| + AllocationSiteUsageScope site_scope(&site_context, site, boilerplate); |
|
Hannes Payer (out of office)
2013/10/11 12:55:44
As discussed offline, right now we would emit meme
mvstanton
2013/10/11 13:41:47
Good catch. I added this TODO in HOptimizedGraphBu
|
| + Handle<Object> copy = JSObject::DeepCopy(Handle<JSObject>::cast(boilerplate), |
| + &site_context); |
| RETURN_IF_EMPTY_HANDLE(isolate, copy); |
| return *copy; |
| } |
| @@ -516,12 +533,15 @@ 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(); |
| + |
| + AllocationSiteContext site_context(isolate, true); |
| + AllocationSiteCreationScope site_scope(&site_context); |
| + Handle<Object> same = JSObject::DeepWalk( |
| + Handle<JSObject>::cast(boilerplate), &site_context); |
| + site_scope.RecordTransitionInfo(same); |
| + site = site_context.top(); |
| + |
| literals->set(literals_index, *site); |
| } else { |
| site = Handle<AllocationSite>::cast(literal_site); |
| @@ -543,7 +563,9 @@ 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); |
| + AllocationSiteContext site_context(isolate, true); |
| + AllocationSiteUsageScope site_scope(&site_context, site, boilerplate); |
| + Handle<JSObject> copy = JSObject::DeepCopy(boilerplate, &site_context); |
| RETURN_IF_EMPTY_HANDLE(isolate, copy); |
| return *copy; |
| } |
| @@ -566,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); |
| } |