| Index: src/mips/lithium-codegen-mips.cc
|
| diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc
|
| index c05df82cdf8bbc1a0900a389083bb13af05b0d4f..acc33faa51da22ca51e55446a240e98d3b2ab172 100644
|
| --- a/src/mips/lithium-codegen-mips.cc
|
| +++ b/src/mips/lithium-codegen-mips.cc
|
| @@ -4217,6 +4217,44 @@ void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoAllocateObject(LAllocateObject* instr) {
|
| + class DeferredAllocateObject: public LDeferredCode {
|
| + public:
|
| + DeferredAllocateObject(LCodeGen* codegen, LAllocateObject* instr)
|
| + : LDeferredCode(codegen), instr_(instr) { }
|
| + virtual void Generate() { codegen()->DoDeferredAllocateObject(instr_); }
|
| + virtual LInstruction* instr() { return instr_; }
|
| + private:
|
| + LAllocateObject* instr_;
|
| + };
|
| +
|
| + DeferredAllocateObject* deferred = new DeferredAllocateObject(this, instr);
|
| +
|
| + // TODO(mstarzinger): Implement inlined version instead of jumping to
|
| + // deferred runtime call.
|
| + __ jmp(deferred->entry());
|
| +
|
| + __ bind(deferred->exit());
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoDeferredAllocateObject(LAllocateObject* instr) {
|
| + Register result = ToRegister(instr->result());
|
| + Handle<JSFunction> constructor = instr->hydrogen()->constructor();
|
| +
|
| + // TODO(3095996): Get rid of this. For now, we need to make the
|
| + // result register contain a valid pointer because it is already
|
| + // contained in the register pointer map.
|
| + __ mov(result, zero_reg);
|
| +
|
| + PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
|
| + __ LoadHeapObject(a0, constructor);
|
| + __ push(a0);
|
| + CallRuntimeFromDeferred(Runtime::kNewObject, 1, instr);
|
| + __ StoreToSafepointRegisterSlot(v0, result);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) {
|
| Heap* heap = isolate()->heap();
|
| ElementsKind boilerplate_elements_kind =
|
|
|