Chromium Code Reviews| Index: src/ia32/full-codegen-ia32.cc |
| diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc |
| index 6e2391110b2346903d53b6d365fbe3d405afe3c1..9894c86bdde2770736ba7e1c5ad1af26dc4bb589 100644 |
| --- a/src/ia32/full-codegen-ia32.cc |
| +++ b/src/ia32/full-codegen-ia32.cc |
| @@ -2321,13 +2321,31 @@ void FullCodeGenerator::VisitCallNew(CallNew* expr) { |
| // constructor invocation. |
| SetSourcePosition(expr->position()); |
| - // Load function and argument count into edi and eax. |
| + // Load function and argument count into edi and eax. Record call targets |
| + // in unoptimized code, but not in the snapshot. |
| + bool record_call_target = !Serializer::enabled(); |
| + CallFunctionFlags flags = |
| + record_call_target ? RECORD_CALL_TARGET : NO_CALL_FUNCTION_FLAGS; |
| + CallConstructStub stub(flags); |
| __ SafeSet(eax, Immediate(arg_count)); |
| __ mov(edi, Operand(esp, arg_count * kPointerSize)); |
| + __ call(stub.GetCode(), RelocInfo::CODE_TARGET, expr->id()); |
|
Vyacheslav Egorov (Chromium)
2012/01/23 10:39:52
RelocInfo::CONSTRUCT_CALL
Michael Starzinger
2012/01/25 11:42:29
Done. Required some changes in the debugger.
|
| + |
| + // There is a one element cache in the instruction stream. |
| + if (record_call_target) { |
|
Vyacheslav Egorov (Chromium)
2012/01/23 10:39:52
I am curious if you can introduce helper method (e
Michael Starzinger
2012/01/25 11:42:29
Done. No longer needed with new approach.
|
| +#ifdef DEBUG |
| + int return_site_offset = masm()->pc_offset(); |
| +#endif |
| + Handle<Object> uninitialized = |
| + CallConstructStub::UninitializedSentinel(isolate()); |
| + Handle<JSGlobalPropertyCell> cell = |
| + isolate()->factory()->NewJSGlobalPropertyCell(uninitialized); |
| + __ test(eax, Immediate(cell)); |
| + // Patching code in the stub assumes the opcode is 1 byte and there is |
| + // word for a pointer in the operand. |
| + ASSERT(masm()->pc_offset() - return_site_offset >= 1 + kPointerSize); |
| + } |
| - Handle<Code> construct_builtin = |
| - isolate()->builtins()->JSConstructCall(); |
| - __ call(construct_builtin, RelocInfo::CONSTRUCT_CALL); |
| context()->Plug(eax); |
| } |