| Index: src/full-codegen/mips/full-codegen-mips.cc
|
| diff --git a/src/full-codegen/mips/full-codegen-mips.cc b/src/full-codegen/mips/full-codegen-mips.cc
|
| index a9402564f64d7e70b6a845adba2a96735fb36b98..3ecb553183f5be0ecae3887ca2d51c68ff330300 100644
|
| --- a/src/full-codegen/mips/full-codegen-mips.cc
|
| +++ b/src/full-codegen/mips/full-codegen-mips.cc
|
| @@ -1976,116 +1976,8 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| break;
|
| }
|
|
|
| - case Yield::kDelegating: {
|
| - VisitForStackValue(expr->generator_object());
|
| -
|
| - // Initial stack layout is as follows:
|
| - // [sp + 1 * kPointerSize] iter
|
| - // [sp + 0 * kPointerSize] g
|
| -
|
| - Label l_catch, l_try, l_suspend, l_continuation, l_resume;
|
| - Label l_next, l_call;
|
| - Register load_receiver = LoadDescriptor::ReceiverRegister();
|
| - Register load_name = LoadDescriptor::NameRegister();
|
| -
|
| - // Initial send value is undefined.
|
| - __ LoadRoot(a0, Heap::kUndefinedValueRootIndex);
|
| - __ Branch(&l_next);
|
| -
|
| - // catch (e) { receiver = iter; f = 'throw'; arg = e; goto l_call; }
|
| - __ bind(&l_catch);
|
| - __ mov(a0, v0);
|
| - __ LoadRoot(load_name, Heap::kthrow_stringRootIndex); // "throw"
|
| - __ lw(a3, MemOperand(sp, 1 * kPointerSize)); // iter
|
| - __ Push(load_name, a3, a0); // "throw", iter, except
|
| - __ jmp(&l_call);
|
| -
|
| - // try { received = %yield result }
|
| - // Shuffle the received result above a try handler and yield it without
|
| - // re-boxing.
|
| - __ bind(&l_try);
|
| - __ pop(a0); // result
|
| - int handler_index = NewHandlerTableEntry();
|
| - EnterTryBlock(handler_index, &l_catch);
|
| - const int try_block_size = TryCatch::kElementCount * kPointerSize;
|
| - __ push(a0); // result
|
| -
|
| - __ jmp(&l_suspend);
|
| - __ bind(&l_continuation);
|
| - __ RecordGeneratorContinuation();
|
| - __ mov(a0, v0);
|
| - __ jmp(&l_resume);
|
| -
|
| - __ bind(&l_suspend);
|
| - const int generator_object_depth = kPointerSize + try_block_size;
|
| - __ lw(a0, MemOperand(sp, generator_object_depth));
|
| - __ push(a0); // g
|
| - __ Push(Smi::FromInt(handler_index)); // handler-index
|
| - DCHECK(l_continuation.pos() > 0 && Smi::IsValid(l_continuation.pos()));
|
| - __ li(a1, Operand(Smi::FromInt(l_continuation.pos())));
|
| - __ sw(a1, FieldMemOperand(a0, JSGeneratorObject::kContinuationOffset));
|
| - __ sw(cp, FieldMemOperand(a0, JSGeneratorObject::kContextOffset));
|
| - __ mov(a1, cp);
|
| - __ RecordWriteField(a0, JSGeneratorObject::kContextOffset, a1, a2,
|
| - kRAHasBeenSaved, kDontSaveFPRegs);
|
| - __ CallRuntime(Runtime::kSuspendJSGeneratorObject, 2);
|
| - __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
|
| - __ pop(v0); // result
|
| - EmitReturnSequence();
|
| - __ mov(a0, v0);
|
| - __ bind(&l_resume); // received in a0
|
| - ExitTryBlock(handler_index);
|
| -
|
| - // receiver = iter; f = 'next'; arg = received;
|
| - __ bind(&l_next);
|
| -
|
| - __ LoadRoot(load_name, Heap::knext_stringRootIndex); // "next"
|
| - __ lw(a3, MemOperand(sp, 1 * kPointerSize)); // iter
|
| - __ Push(load_name, a3, a0); // "next", iter, received
|
| -
|
| - // result = receiver[f](arg);
|
| - __ bind(&l_call);
|
| - __ lw(load_receiver, MemOperand(sp, kPointerSize));
|
| - __ lw(load_name, MemOperand(sp, 2 * kPointerSize));
|
| - __ li(LoadDescriptor::SlotRegister(),
|
| - Operand(SmiFromSlot(expr->KeyedLoadFeedbackSlot())));
|
| - Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate(), SLOPPY).code();
|
| - CallIC(ic, TypeFeedbackId::None());
|
| - __ mov(a0, v0);
|
| - __ mov(a1, a0);
|
| - __ sw(a1, MemOperand(sp, 2 * kPointerSize));
|
| - SetCallPosition(expr);
|
| - __ li(a0, Operand(1));
|
| - __ Call(
|
| - isolate()->builtins()->Call(ConvertReceiverMode::kNotNullOrUndefined),
|
| - RelocInfo::CODE_TARGET);
|
| -
|
| - __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
|
| - __ Drop(1); // The function is still on the stack; drop it.
|
| -
|
| - // if (!result.done) goto l_try;
|
| - __ Move(load_receiver, v0);
|
| -
|
| - __ push(load_receiver); // save result
|
| - __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done"
|
| - __ li(LoadDescriptor::SlotRegister(),
|
| - Operand(SmiFromSlot(expr->DoneFeedbackSlot())));
|
| - CallLoadIC(NOT_INSIDE_TYPEOF); // v0=result.done
|
| - __ mov(a0, v0);
|
| - Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
|
| - CallIC(bool_ic);
|
| - __ LoadRoot(at, Heap::kTrueValueRootIndex);
|
| - __ Branch(&l_try, ne, result_register(), Operand(at));
|
| -
|
| - // result.value
|
| - __ pop(load_receiver); // result
|
| - __ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value"
|
| - __ li(LoadDescriptor::SlotRegister(),
|
| - Operand(SmiFromSlot(expr->ValueFeedbackSlot())));
|
| - CallLoadIC(NOT_INSIDE_TYPEOF); // v0=result.value
|
| - context()->DropAndPlug(2, v0); // drop iter and g
|
| - break;
|
| - }
|
| + case Yield::kDelegating:
|
| + UNREACHABLE();
|
| }
|
| }
|
|
|
|
|