| Index: src/code-stubs-hydrogen.cc
|
| diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc
|
| index 97920967a27a3189a817f8835389958ddd63a66f..4d1c27c0e685cd0e8d7713a6c36026d1032cc448 100644
|
| --- a/src/code-stubs-hydrogen.cc
|
| +++ b/src/code-stubs-hydrogen.cc
|
| @@ -315,16 +315,17 @@ HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() {
|
| FastCloneShallowArrayStub::Mode mode = casted_stub()->mode();
|
| int length = casted_stub()->length();
|
|
|
| - HInstruction* boilerplate =
|
| + HInstruction* allocation_site =
|
| AddInstruction(new(zone) HLoadKeyed(GetParameter(0),
|
| GetParameter(1),
|
| NULL,
|
| FAST_ELEMENTS));
|
| -
|
| IfBuilder checker(this);
|
| - checker.IfNot<HCompareObjectEqAndBranch, HValue*>(boilerplate, undefined);
|
| + checker.IfNot<HCompareObjectEqAndBranch, HValue*>(allocation_site, undefined);
|
| checker.Then();
|
|
|
| + HObjectAccess access = HObjectAccess::ForAllocationSiteInfoSite();
|
| + HInstruction* boilerplate = AddLoad(allocation_site, access);
|
| if (mode == FastCloneShallowArrayStub::CLONE_ANY_ELEMENTS) {
|
| HValue* elements = AddLoadElements(boilerplate);
|
|
|
| @@ -333,6 +334,7 @@ HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() {
|
| if_fixed_cow.Then();
|
| environment()->Push(BuildCloneShallowArray(context(),
|
| boilerplate,
|
| + allocation_site,
|
| alloc_site_mode,
|
| FAST_ELEMENTS,
|
| 0/*copy-on-write*/));
|
| @@ -343,12 +345,14 @@ HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() {
|
| if_fixed.Then();
|
| environment()->Push(BuildCloneShallowArray(context(),
|
| boilerplate,
|
| + allocation_site,
|
| alloc_site_mode,
|
| FAST_ELEMENTS,
|
| length));
|
| if_fixed.Else();
|
| environment()->Push(BuildCloneShallowArray(context(),
|
| boilerplate,
|
| + allocation_site,
|
| alloc_site_mode,
|
| FAST_DOUBLE_ELEMENTS,
|
| length));
|
| @@ -356,6 +360,7 @@ HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() {
|
| ElementsKind elements_kind = casted_stub()->ComputeElementsKind();
|
| environment()->Push(BuildCloneShallowArray(context(),
|
| boilerplate,
|
| + allocation_site,
|
| alloc_site_mode,
|
| elements_kind,
|
| length));
|
| @@ -422,6 +427,45 @@ Handle<Code> FastCloneShallowObjectStub::GenerateCode() {
|
|
|
|
|
| template <>
|
| +HValue* CodeStubGraphBuilder<CreateAllocationSiteStub>::BuildCodeStub() {
|
| + Zone* zone = this->zone();
|
| +
|
| + HValue* size = AddInstruction(new(zone) HConstant(AllocationSite::kSize));
|
| + HAllocate::Flags flags = HAllocate::DefaultFlags();
|
| + flags = static_cast<HAllocate::Flags>(
|
| + flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE);
|
| + HInstruction* object = AddInstruction(new(zone)
|
| + HAllocate(context(), size, HType::JSObject(), flags));
|
| +
|
| + // Store the map
|
| + Handle<Map> allocation_site_map(isolate()->heap()->allocation_site_map(),
|
| + isolate());
|
| + AddStoreMapConstant(object, allocation_site_map);
|
| +
|
| + // Store the payload (smi elements kind)
|
| + HValue* initial_elements_kind = AddInstruction(new(zone) HConstant(
|
| + GetInitialFastElementsKind()));
|
| + AddInstruction(new(zone) HStoreNamedField(object,
|
| + HObjectAccess::ForAllocationSitePayload(), initial_elements_kind));
|
| +
|
| + // We use a hammer (SkipWriteBarrier()) to indicate that we know the input
|
| + // cell is really a Cell, and so no write barrier is needed.
|
| + // TODO(mvstanton): Add a debug_code check to verify the input cell is really
|
| + // a cell. (perhaps with a new instruction, HAssert).
|
| + HInstruction* cell = GetParameter(0);
|
| + HObjectAccess access = HObjectAccess::ForCellValue();
|
| + HStoreNamedField* store = AddStore(cell, access, object);
|
| + store->SkipWriteBarrier();
|
| + return cell;
|
| +}
|
| +
|
| +
|
| +Handle<Code> CreateAllocationSiteStub::GenerateCode() {
|
| + return DoGenerateCode(this);
|
| +}
|
| +
|
| +
|
| +template <>
|
| HValue* CodeStubGraphBuilder<KeyedLoadFastElementStub>::BuildCodeStub() {
|
| HInstruction* load = BuildUncheckedMonomorphicElementAccess(
|
| GetParameter(0), GetParameter(1), NULL, NULL,
|
| @@ -548,7 +592,10 @@ HValue* CodeStubGraphBuilderBase::BuildArrayConstructor(
|
| }
|
|
|
| HValue* property_cell = GetParameter(ArrayConstructorStubBase::kPropertyCell);
|
| - JSArrayBuilder array_builder(this, kind, property_cell, constructor,
|
| + // Walk through the property cell to the AllocationSite
|
| + HValue* alloc_site = AddInstruction(new(zone()) HLoadNamedField(property_cell,
|
| + HObjectAccess::ForCellValue()));
|
| + JSArrayBuilder array_builder(this, kind, alloc_site, constructor,
|
| override_mode);
|
| HValue* result = NULL;
|
| switch (argument_class) {
|
|
|