| Index: src/mips/stub-cache-mips.cc
|
| ===================================================================
|
| --- src/mips/stub-cache-mips.cc (revision 9277)
|
| +++ src/mips/stub-cache-mips.cc (working copy)
|
| @@ -554,9 +554,10 @@
|
| }
|
|
|
|
|
| -static MaybeObject* GenerateFastApiDirectCall(MacroAssembler* masm,
|
| - const CallOptimization& optimization,
|
| - int argc) {
|
| +static MaybeObject* GenerateFastApiDirectCall(
|
| + MacroAssembler* masm,
|
| + const CallOptimization& optimization,
|
| + int argc) {
|
| // ----------- S t a t e -------------
|
| // -- sp[0] : holder (set by CheckPrototypes)
|
| // -- sp[4] : callee js function
|
| @@ -626,6 +627,7 @@
|
| ExternalReference(&fun,
|
| ExternalReference::DIRECT_API_CALL,
|
| masm->isolate());
|
| + AllowExternalCallThatCantCauseGC scope(masm);
|
| return masm->TryCallApiFunctionAndReturn(ref, kStackUnwindSpace);
|
| }
|
|
|
| @@ -804,7 +806,7 @@
|
| miss_label);
|
|
|
| // Call a runtime function to load the interceptor property.
|
| - __ EnterInternalFrame();
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
| // Save the name_ register across the call.
|
| __ push(name_);
|
|
|
| @@ -822,7 +824,8 @@
|
|
|
| // Restore the name_ register.
|
| __ pop(name_);
|
| - __ LeaveInternalFrame();
|
| +
|
| + // Leave the internal frame.
|
| }
|
|
|
| void LoadWithInterceptor(MacroAssembler* masm,
|
| @@ -831,19 +834,20 @@
|
| JSObject* holder_obj,
|
| Register scratch,
|
| Label* interceptor_succeeded) {
|
| - __ EnterInternalFrame();
|
| + {
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
|
|
| - __ Push(holder, name_);
|
| + __ Push(holder, name_);
|
|
|
| - CompileCallLoadPropertyWithInterceptor(masm,
|
| - receiver,
|
| - holder,
|
| - name_,
|
| - holder_obj);
|
| + CompileCallLoadPropertyWithInterceptor(masm,
|
| + receiver,
|
| + holder,
|
| + name_,
|
| + holder_obj);
|
|
|
| - __ pop(name_); // Restore the name.
|
| - __ pop(receiver); // Restore the holder.
|
| - __ LeaveInternalFrame();
|
| + __ pop(name_); // Restore the name.
|
| + __ pop(receiver); // Restore the holder.
|
| + }
|
|
|
| // If interceptor returns no-result sentinel, call the constant function.
|
| __ LoadRoot(scratch, Heap::kNoInterceptorResultSentinelRootIndex);
|
| @@ -1317,41 +1321,43 @@
|
|
|
| // Save necessary data before invoking an interceptor.
|
| // Requires a frame to make GC aware of pushed pointers.
|
| - __ EnterInternalFrame();
|
| + {
|
| + FrameScope frame_scope(masm(), StackFrame::INTERNAL);
|
|
|
| - if (lookup->type() == CALLBACKS && !receiver.is(holder_reg)) {
|
| - // CALLBACKS case needs a receiver to be passed into C++ callback.
|
| - __ Push(receiver, holder_reg, name_reg);
|
| - } else {
|
| - __ Push(holder_reg, name_reg);
|
| - }
|
| + if (lookup->type() == CALLBACKS && !receiver.is(holder_reg)) {
|
| + // CALLBACKS case needs a receiver to be passed into C++ callback.
|
| + __ Push(receiver, holder_reg, name_reg);
|
| + } else {
|
| + __ Push(holder_reg, name_reg);
|
| + }
|
|
|
| - // Invoke an interceptor. Note: map checks from receiver to
|
| - // interceptor's holder has been compiled before (see a caller
|
| - // of this method).
|
| - CompileCallLoadPropertyWithInterceptor(masm(),
|
| - receiver,
|
| - holder_reg,
|
| - name_reg,
|
| - interceptor_holder);
|
| + // Invoke an interceptor. Note: map checks from receiver to
|
| + // interceptor's holder has been compiled before (see a caller
|
| + // of this method).
|
| + CompileCallLoadPropertyWithInterceptor(masm(),
|
| + receiver,
|
| + holder_reg,
|
| + name_reg,
|
| + interceptor_holder);
|
|
|
| - // Check if interceptor provided a value for property. If it's
|
| - // the case, return immediately.
|
| - Label interceptor_failed;
|
| - __ LoadRoot(scratch1, Heap::kNoInterceptorResultSentinelRootIndex);
|
| - __ Branch(&interceptor_failed, eq, v0, Operand(scratch1));
|
| - __ LeaveInternalFrame();
|
| - __ Ret();
|
| + // Check if interceptor provided a value for property. If it's
|
| + // the case, return immediately.
|
| + Label interceptor_failed;
|
| + __ LoadRoot(scratch1, Heap::kNoInterceptorResultSentinelRootIndex);
|
| + __ Branch(&interceptor_failed, eq, v0, Operand(scratch1));
|
| + frame_scope.GenerateLeaveFrame();
|
| + __ Ret();
|
|
|
| - __ bind(&interceptor_failed);
|
| - __ pop(name_reg);
|
| - __ pop(holder_reg);
|
| - if (lookup->type() == CALLBACKS && !receiver.is(holder_reg)) {
|
| - __ pop(receiver);
|
| + __ bind(&interceptor_failed);
|
| + __ pop(name_reg);
|
| + __ pop(holder_reg);
|
| + if (lookup->type() == CALLBACKS && !receiver.is(holder_reg)) {
|
| + __ pop(receiver);
|
| + }
|
| +
|
| + // Leave the internal frame.
|
| }
|
|
|
| - __ LeaveInternalFrame();
|
| -
|
| // Check that the maps from interceptor's holder to lookup's holder
|
| // haven't changed. And load lookup's holder into |holder| register.
|
| if (interceptor_holder != lookup->holder()) {
|
|
|