Chromium Code Reviews| Index: src/code-stubs-hydrogen.cc | 
| diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc | 
| index aa3f50ddca174d6051bc089eb615b4b8728c3b09..2a992e00e85592eb1ba7f189f890823fd3095019 100644 | 
| --- a/src/code-stubs-hydrogen.cc | 
| +++ b/src/code-stubs-hydrogen.cc | 
| @@ -433,6 +433,62 @@ Handle<Code> TypeofStub::GenerateCode() { return DoGenerateCode(this); } | 
| template <> | 
| +HValue* CodeStubGraphBuilder<FastCloneRegExpStub>::BuildCodeStub() { | 
| + HValue* closure = GetParameter(0); | 
| + HValue* literal_index = GetParameter(1); | 
| + | 
| + // This stub is very performance sensitive, the generated code must be tuned | 
| + // so that it doesn't build and eager frame. | 
| 
 
Yang
2015/11/25 09:06:10
Haha! Found typo "build an eager frame" :)
 
 | 
| + info()->MarkMustNotHaveEagerFrame(); | 
| + | 
| + HValue* literals_array = Add<HLoadNamedField>( | 
| + closure, nullptr, HObjectAccess::ForLiteralsPointer()); | 
| + HInstruction* boilerplate = Add<HLoadKeyed>( | 
| + literals_array, literal_index, nullptr, FAST_ELEMENTS, NEVER_RETURN_HOLE, | 
| + LiteralsArray::kOffsetToFirstLiteral - kHeapObjectTag); | 
| + | 
| + IfBuilder if_notundefined(this); | 
| + if_notundefined.IfNot<HCompareObjectEqAndBranch>( | 
| + boilerplate, graph()->GetConstantUndefined()); | 
| + if_notundefined.Then(); | 
| + { | 
| + int result_size = | 
| + JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; | 
| + HValue* result = | 
| + Add<HAllocate>(Add<HConstant>(result_size), HType::JSObject(), | 
| + NOT_TENURED, JS_REGEXP_TYPE); | 
| + Add<HStoreNamedField>( | 
| + result, HObjectAccess::ForMap(), | 
| + Add<HLoadNamedField>(boilerplate, nullptr, HObjectAccess::ForMap())); | 
| + Add<HStoreNamedField>( | 
| + result, HObjectAccess::ForPropertiesPointer(), | 
| + Add<HLoadNamedField>(boilerplate, nullptr, | 
| + HObjectAccess::ForPropertiesPointer())); | 
| + Add<HStoreNamedField>( | 
| + result, HObjectAccess::ForElementsPointer(), | 
| + Add<HLoadNamedField>(boilerplate, nullptr, | 
| + HObjectAccess::ForElementsPointer())); | 
| + for (int offset = JSObject::kHeaderSize; offset < result_size; | 
| + offset += kPointerSize) { | 
| + HObjectAccess access = HObjectAccess::ForObservableJSObjectOffset(offset); | 
| + Add<HStoreNamedField>(result, access, | 
| + Add<HLoadNamedField>(boilerplate, nullptr, access)); | 
| + } | 
| + Push(result); | 
| + } | 
| + if_notundefined.ElseDeopt(Deoptimizer::kUninitializedBoilerplateInFastClone); | 
| + if_notundefined.End(); | 
| + | 
| + return Pop(); | 
| +} | 
| + | 
| + | 
| +Handle<Code> FastCloneRegExpStub::GenerateCode() { | 
| + return DoGenerateCode(this); | 
| +} | 
| + | 
| + | 
| +template <> | 
| HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() { | 
| Factory* factory = isolate()->factory(); | 
| HValue* undefined = graph()->GetConstantUndefined(); |