Commit eb7e2771 authored by palfia@homejinni.com's avatar palfia@homejinni.com

MIPS: Generator object "next" method takes optional send value.

Port r15028 (258a047)

Original commit message:
Update the generators implementation to make "next" also do the job of
what was previously called "send" by taking an optional argument.
Remove send, and do a bunch of renamings.

BUG=v8:2355, v8:2715

Review URL: https://codereview.chromium.org/16735005
Patch from Balazs Kilvady <kilvadyb@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15049 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 2ebb9507
...@@ -2036,10 +2036,10 @@ void FullCodeGenerator::VisitYield(Yield* expr) { ...@@ -2036,10 +2036,10 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
// [sp + 1 * kPointerSize] iter // [sp + 1 * kPointerSize] iter
// [sp + 0 * kPointerSize] g // [sp + 0 * kPointerSize] g
Label l_catch, l_try, l_resume, l_send, l_call, l_loop; Label l_catch, l_try, l_resume, l_next, l_call, l_loop;
// Initial send value is undefined. // Initial send value is undefined.
__ LoadRoot(a0, Heap::kUndefinedValueRootIndex); __ LoadRoot(a0, Heap::kUndefinedValueRootIndex);
__ Branch(&l_send); __ Branch(&l_next);
// catch (e) { receiver = iter; f = iter.throw; arg = e; goto l_call; } // catch (e) { receiver = iter; f = iter.throw; arg = e; goto l_call; }
__ bind(&l_catch); __ bind(&l_catch);
...@@ -2074,15 +2074,15 @@ void FullCodeGenerator::VisitYield(Yield* expr) { ...@@ -2074,15 +2074,15 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
__ bind(&l_resume); // received in a0 __ bind(&l_resume); // received in a0
__ PopTryHandler(); __ PopTryHandler();
// receiver = iter; f = iter.send; arg = received; // receiver = iter; f = iter.next; arg = received;
__ bind(&l_send); __ bind(&l_next);
__ lw(a3, MemOperand(sp, 1 * kPointerSize)); // iter __ lw(a3, MemOperand(sp, 1 * kPointerSize)); // iter
__ push(a3); // iter __ push(a3); // iter
__ push(a0); // received __ push(a0); // received
__ mov(a0, a3); // iter __ mov(a0, a3); // iter
__ LoadRoot(a2, Heap::ksend_stringRootIndex); // "send" __ LoadRoot(a2, Heap::knext_stringRootIndex); // "next"
Handle<Code> send_ic = isolate()->builtins()->LoadIC_Initialize(); Handle<Code> next_ic = isolate()->builtins()->LoadIC_Initialize();
CallIC(send_ic); // iter.send in a0 CallIC(next_ic); // iter.next in a0
__ mov(a0, v0); __ mov(a0, v0);
// result = f.call(receiver, arg); // result = f.call(receiver, arg);
...@@ -2187,7 +2187,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator, ...@@ -2187,7 +2187,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
// If we are sending a value and there is no operand stack, we can jump back // If we are sending a value and there is no operand stack, we can jump back
// in directly. // in directly.
if (resume_mode == JSGeneratorObject::SEND) { if (resume_mode == JSGeneratorObject::NEXT) {
Label slow_resume; Label slow_resume;
__ Branch(&slow_resume, ne, a3, Operand(zero_reg)); __ Branch(&slow_resume, ne, a3, Operand(zero_reg));
__ lw(a3, FieldMemOperand(t0, JSFunction::kCodeEntryOffset)); __ lw(a3, FieldMemOperand(t0, JSFunction::kCodeEntryOffset));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment