| Index: src/code-stubs-hydrogen.cc
|
| diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc
|
| index 3421ef87175cc6fda92269c1c204c451801bf46c..d02715f7f139e49dba0e7c46f47d380de295b2e9 100644
|
| --- a/src/code-stubs-hydrogen.cc
|
| +++ b/src/code-stubs-hydrogen.cc
|
| @@ -138,6 +138,60 @@ class CodeStubGraphBuilder: public CodeStubGraphBuilderBase {
|
|
|
|
|
| template <>
|
| +void CodeStubGraphBuilder<FastCloneShallowObjectStub>::BuildCodeStub() {
|
| + Zone* zone = this->zone();
|
| + Factory* factory = isolate()->factory();
|
| +
|
| + HInstruction* boilerplate =
|
| + AddInstruction(new(zone) HLoadKeyed(GetParameter(0),
|
| + GetParameter(1),
|
| + NULL,
|
| + FAST_ELEMENTS));
|
| +
|
| + CheckBuilder builder(this, BailoutId::StubEntry());
|
| + builder.CheckNotUndefined(boilerplate);
|
| +
|
| + int size = JSObject::kHeaderSize + casted_stub()->length() * kPointerSize;
|
| + HValue* boilerplate_size =
|
| + AddInstruction(new(zone) HInstanceSize(boilerplate));
|
| + HValue* size_in_words =
|
| + AddInstruction(new(zone) HConstant(size >> kPointerSizeLog2,
|
| + Representation::Integer32()));
|
| + builder.CheckIntegerEq(boilerplate_size, size_in_words);
|
| +
|
| + HValue* size_in_bytes =
|
| + AddInstruction(new(zone) HConstant(size, Representation::Integer32()));
|
| + HInstruction* object =
|
| + AddInstruction(new(zone) HAllocate(context(),
|
| + size_in_bytes,
|
| + HType::JSObject(),
|
| + HAllocate::CAN_ALLOCATE_IN_NEW_SPACE));
|
| +
|
| + for (int i = 0; i < size; i += kPointerSize) {
|
| + HInstruction* value =
|
| + AddInstruction(new(zone) HLoadNamedField(boilerplate, true, i));
|
| + AddInstruction(new(zone) HStoreNamedField(object,
|
| + factory->empty_symbol(),
|
| + value,
|
| + true, i));
|
| + AddSimulate(BailoutId::StubEntry());
|
| + }
|
| +
|
| + builder.End();
|
| +
|
| + HReturn* ret = new(zone) HReturn(object, context());
|
| + current_block()->Finish(ret);
|
| +}
|
| +
|
| +
|
| +Handle<Code> FastCloneShallowObjectStub::GenerateCode() {
|
| + CodeStubGraphBuilder<FastCloneShallowObjectStub> builder(this);
|
| + LChunk* chunk = OptimizeGraph(builder.CreateGraph());
|
| + return chunk->Codegen(Code::COMPILED_STUB);
|
| +}
|
| +
|
| +
|
| +template <>
|
| void CodeStubGraphBuilder<KeyedLoadFastElementStub>::BuildCodeStub() {
|
| Zone* zone = this->zone();
|
|
|
| @@ -189,7 +243,7 @@ void CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() {
|
| new(zone) HBoundsCheck(array_length, max_alloc_size,
|
| DONT_ALLOW_SMI_KEY, Representation::Integer32()));
|
|
|
| - IfBuilder if_builder(this);
|
| + IfBuilder if_builder(this, BailoutId::StubEntry());
|
|
|
| if_builder.BeginTrue(array_length, graph()->GetConstant0(), Token::EQ);
|
|
|
| @@ -219,7 +273,8 @@ void CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() {
|
| : AddInstruction(new(zone) HConstant(nan_double,
|
| Representation::Double()));
|
|
|
| - LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement);
|
| + LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement,
|
| + BailoutId::StubEntry());
|
|
|
| HValue* zero = graph()->GetConstant0();
|
| HValue* start = IsFastElementsKind(to_kind) ? zero : array_length;
|
|
|