Merged r15047, r15048, r15049 into trunk branch.
MIPS: add a default value for return value
MIPS: Fix LoadIC calling convention.
MIPS: Generator object "next" method takes optional send value.
BUG=v8:2355, v8:2715
R=jkummerow@chromium.org
Review URL: https://codereview.chromium.org/16703007
git-svn-id: http://v8.googlecode.com/svn/trunk@15051 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc
index 10afeb1..2d8c694 100644
--- a/src/mips/full-codegen-mips.cc
+++ b/src/mips/full-codegen-mips.cc
@@ -2036,10 +2036,10 @@
// [sp + 1 * kPointerSize] iter
// [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.
__ LoadRoot(a0, Heap::kUndefinedValueRootIndex);
- __ Branch(&l_send);
+ __ Branch(&l_next);
// catch (e) { receiver = iter; f = iter.throw; arg = e; goto l_call; }
__ bind(&l_catch);
@@ -2049,12 +2049,10 @@
__ push(a3); // iter
__ push(a0); // exception
__ mov(a0, a3); // iter
- __ push(a0); // push LoadIC state
__ LoadRoot(a2, Heap::kthrow_stringRootIndex); // "throw"
Handle<Code> throw_ic = isolate()->builtins()->LoadIC_Initialize();
CallIC(throw_ic); // iter.throw in a0
__ mov(a0, v0);
- __ Addu(sp, sp, Operand(kPointerSize)); // drop LoadIC state
__ jmp(&l_call);
// try { received = yield result.value }
@@ -2076,18 +2074,16 @@
__ bind(&l_resume); // received in a0
__ PopTryHandler();
- // receiver = iter; f = iter.send; arg = received;
- __ bind(&l_send);
+ // receiver = iter; f = iter.next; arg = received;
+ __ bind(&l_next);
__ lw(a3, MemOperand(sp, 1 * kPointerSize)); // iter
__ push(a3); // iter
__ push(a0); // received
__ mov(a0, a3); // iter
- __ push(a0); // push LoadIC state
- __ LoadRoot(a2, Heap::ksend_stringRootIndex); // "send"
- Handle<Code> send_ic = isolate()->builtins()->LoadIC_Initialize();
- CallIC(send_ic); // iter.send in a0
+ __ LoadRoot(a2, Heap::knext_stringRootIndex); // "next"
+ Handle<Code> next_ic = isolate()->builtins()->LoadIC_Initialize();
+ CallIC(next_ic); // iter.next in a0
__ mov(a0, v0);
- __ Addu(sp, sp, Operand(kPointerSize)); // drop LoadIC state
// result = f.call(receiver, arg);
__ bind(&l_call);
@@ -2117,11 +2113,9 @@
__ pop(a1); // result
__ push(a0); // result.value
__ mov(a0, a1); // result
- __ push(a0); // push LoadIC state
__ LoadRoot(a2, Heap::kdone_stringRootIndex); // "done"
Handle<Code> done_ic = isolate()->builtins()->LoadIC_Initialize();
CallIC(done_ic); // result.done in v0
- __ Addu(sp, sp, Operand(kPointerSize)); // drop LoadIC state
__ mov(a0, v0);
Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
CallIC(bool_ic);
@@ -2193,7 +2187,7 @@
// If we are sending a value and there is no operand stack, we can jump back
// in directly.
- if (resume_mode == JSGeneratorObject::SEND) {
+ if (resume_mode == JSGeneratorObject::NEXT) {
Label slow_resume;
__ Branch(&slow_resume, ne, a3, Operand(zero_reg));
__ lw(a3, FieldMemOperand(t0, JSFunction::kCodeEntryOffset));
diff --git a/src/mips/ic-mips.cc b/src/mips/ic-mips.cc
index a4dc9e4..c1b4e1e 100644
--- a/src/mips/ic-mips.cc
+++ b/src/mips/ic-mips.cc
@@ -651,7 +651,6 @@
// -- a2 : name
// -- ra : return address
// -- a0 : receiver
- // -- sp[0] : receiver
// -----------------------------------
// Probe the stub cache.
@@ -671,7 +670,6 @@
// -- a2 : name
// -- lr : return address
// -- a0 : receiver
- // -- sp[0] : receiver
// -----------------------------------
Label miss;
@@ -692,7 +690,6 @@
// -- a2 : name
// -- ra : return address
// -- a0 : receiver
- // -- sp[0] : receiver
// -----------------------------------
Isolate* isolate = masm->isolate();
@@ -712,7 +709,6 @@
// -- a2 : name
// -- ra : return address
// -- a0 : receiver
- // -- sp[0] : receiver
// -----------------------------------
__ mov(a3, a0);
diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc
index b2c78a3..be32744 100644
--- a/src/mips/stub-cache-mips.cc
+++ b/src/mips/stub-cache-mips.cc
@@ -883,11 +883,12 @@
// -- sp[4] : callee JS function
// -- sp[8] : call data
// -- sp[12] : isolate
- // -- sp[16] : ReturnValue
- // -- sp[20] : last JS argument
+ // -- sp[16] : ReturnValue default value
+ // -- sp[20] : ReturnValue
+ // -- sp[24] : last JS argument
// -- ...
- // -- sp[(argc + 4) * 4] : first JS argument
- // -- sp[(argc + 5) * 4] : receiver
+ // -- sp[(argc + 5) * 4] : first JS argument
+ // -- sp[(argc + 6) * 4] : receiver
// -----------------------------------
// Get the function and setup the context.
Handle<JSFunction> function = optimization.constant_function();
@@ -905,15 +906,16 @@
}
__ li(t3, Operand(ExternalReference::isolate_address(masm->isolate())));
- // Store JS function, call data, isolate and ReturnValue.
+ // Store JS function, call data, isolate ReturnValue default and ReturnValue.
__ sw(t1, MemOperand(sp, 1 * kPointerSize));
__ sw(t2, MemOperand(sp, 2 * kPointerSize));
__ sw(t3, MemOperand(sp, 3 * kPointerSize));
__ LoadRoot(t1, Heap::kUndefinedValueRootIndex);
__ sw(t1, MemOperand(sp, 4 * kPointerSize));
+ __ sw(t1, MemOperand(sp, 5 * kPointerSize));
// Prepare arguments.
- __ Addu(a2, sp, Operand(4 * kPointerSize));
+ __ Addu(a2, sp, Operand(5 * kPointerSize));
// Allocate the v8::Arguments structure in the arguments' space since
// it's not controlled by GC.
@@ -1435,13 +1437,14 @@
} else {
__ li(scratch3(), Handle<Object>(callback->data(), isolate()));
}
- __ Subu(sp, sp, 5 * kPointerSize);
- __ sw(reg, MemOperand(sp, 4 * kPointerSize));
- __ sw(scratch3(), MemOperand(sp, 3 * kPointerSize));
+ __ Subu(sp, sp, 6 * kPointerSize);
+ __ sw(reg, MemOperand(sp, 5 * kPointerSize));
+ __ sw(scratch3(), MemOperand(sp, 4 * kPointerSize));
__ LoadRoot(scratch3(), Heap::kUndefinedValueRootIndex);
+ __ sw(scratch3(), MemOperand(sp, 3 * kPointerSize));
+ __ sw(scratch3(), MemOperand(sp, 2 * kPointerSize));
__ li(scratch4(),
Operand(ExternalReference::isolate_address(isolate())));
- __ sw(scratch3(), MemOperand(sp, 2 * kPointerSize));
__ sw(scratch4(), MemOperand(sp, 1 * kPointerSize));
__ sw(name(), MemOperand(sp, 0 * kPointerSize));
@@ -1481,7 +1484,7 @@
__ CallApiFunctionAndReturn(ref,
kStackUnwindSpace,
returns_handle,
- 4);
+ 5);
}
diff --git a/src/version.cc b/src/version.cc
index e7a3dc8..7f424e4 100644
--- a/src/version.cc
+++ b/src/version.cc
@@ -35,7 +35,7 @@
#define MAJOR_VERSION 3
#define MINOR_VERSION 19
#define BUILD_NUMBER 12
-#define PATCH_LEVEL 0
+#define PATCH_LEVEL 1
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
#define IS_CANDIDATE_VERSION 0