Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Side by Side Diff: src/mips64/code-stubs-mips64.cc

Issue 1012103002: Delegate throwing in RegExpExecStub to CEntryStub. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Ported to all the architectures. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/mips/code-stubs-mips.cc ('k') | src/ppc/code-stubs-ppc.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_MIPS64 7 #if V8_TARGET_ARCH_MIPS64
8 8
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 isolate->set_fp_stubs_generated(true); 1026 isolate->set_fp_stubs_generated(true);
1027 } 1027 }
1028 1028
1029 1029
1030 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { 1030 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) {
1031 CEntryStub stub(isolate, 1, kDontSaveFPRegs); 1031 CEntryStub stub(isolate, 1, kDontSaveFPRegs);
1032 stub.GetCode(); 1032 stub.GetCode();
1033 } 1033 }
1034 1034
1035 1035
1036 static void ThrowPendingException(MacroAssembler* masm) {
1037 Isolate* isolate = masm->isolate();
1038
1039 ExternalReference pending_handler_context_address(
1040 Isolate::kPendingHandlerContextAddress, isolate);
1041 ExternalReference pending_handler_code_address(
1042 Isolate::kPendingHandlerCodeAddress, isolate);
1043 ExternalReference pending_handler_offset_address(
1044 Isolate::kPendingHandlerOffsetAddress, isolate);
1045 ExternalReference pending_handler_fp_address(
1046 Isolate::kPendingHandlerFPAddress, isolate);
1047 ExternalReference pending_handler_sp_address(
1048 Isolate::kPendingHandlerSPAddress, isolate);
1049
1050 // Ask the runtime for help to determine the handler. This will set v0 to
1051 // contain the current pending exception, don't clobber it.
1052 ExternalReference find_handler(Runtime::kFindExceptionHandler, isolate);
1053 {
1054 FrameScope scope(masm, StackFrame::MANUAL);
1055 __ PrepareCallCFunction(3, 0, a0);
1056 __ mov(a0, zero_reg);
1057 __ mov(a1, zero_reg);
1058 __ li(a2, Operand(ExternalReference::isolate_address(isolate)));
1059 __ CallCFunction(find_handler, 3);
1060 }
1061
1062 // Retrieve the handler context, SP and FP.
1063 __ li(cp, Operand(pending_handler_context_address));
1064 __ ld(cp, MemOperand(cp));
1065 __ li(sp, Operand(pending_handler_sp_address));
1066 __ ld(sp, MemOperand(sp));
1067 __ li(fp, Operand(pending_handler_fp_address));
1068 __ ld(fp, MemOperand(fp));
1069
1070 // If the handler is a JS frame, restore the context to the frame.
1071 // (kind == ENTRY) == (fp == 0) == (cp == 0), so we could test either fp
1072 // or cp.
1073 Label zero;
1074 __ Branch(&zero, eq, cp, Operand(zero_reg));
1075 __ sd(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
1076 __ bind(&zero);
1077
1078 // Compute the handler entry address and jump to it.
1079 __ li(a1, Operand(pending_handler_code_address));
1080 __ ld(a1, MemOperand(a1));
1081 __ li(a2, Operand(pending_handler_offset_address));
1082 __ ld(a2, MemOperand(a2));
1083 __ Daddu(a1, a1, Operand(Code::kHeaderSize - kHeapObjectTag));
1084 __ Daddu(t9, a1, a2);
1085 __ Jump(t9);
1086 }
1087
1088
1089 void CEntryStub::Generate(MacroAssembler* masm) { 1036 void CEntryStub::Generate(MacroAssembler* masm) {
1090 // Called from JavaScript; parameters are on stack as if calling JS function 1037 // Called from JavaScript; parameters are on stack as if calling JS function
1091 // a0: number of arguments including receiver 1038 // a0: number of arguments including receiver
1092 // a1: pointer to builtin function 1039 // a1: pointer to builtin function
1093 // fp: frame pointer (restored after C call) 1040 // fp: frame pointer (restored after C call)
1094 // sp: stack pointer (restored as callee's sp after C call) 1041 // sp: stack pointer (restored as callee's sp after C call)
1095 // cp: current context (C callee-saved) 1042 // cp: current context (C callee-saved)
1096 1043
1097 ProfileEntryHookStub::MaybeCallEntryHook(masm); 1044 ProfileEntryHookStub::MaybeCallEntryHook(masm);
1098 1045
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 1134
1188 // Exit C frame and return. 1135 // Exit C frame and return.
1189 // v0:v1: result 1136 // v0:v1: result
1190 // sp: stack pointer 1137 // sp: stack pointer
1191 // fp: frame pointer 1138 // fp: frame pointer
1192 // s0: still holds argc (callee-saved). 1139 // s0: still holds argc (callee-saved).
1193 __ LeaveExitFrame(save_doubles(), s0, true, EMIT_RETURN); 1140 __ LeaveExitFrame(save_doubles(), s0, true, EMIT_RETURN);
1194 1141
1195 // Handling of exception. 1142 // Handling of exception.
1196 __ bind(&exception_returned); 1143 __ bind(&exception_returned);
1197 ThrowPendingException(masm); 1144
1145 ExternalReference pending_handler_context_address(
1146 Isolate::kPendingHandlerContextAddress, isolate());
1147 ExternalReference pending_handler_code_address(
1148 Isolate::kPendingHandlerCodeAddress, isolate());
1149 ExternalReference pending_handler_offset_address(
1150 Isolate::kPendingHandlerOffsetAddress, isolate());
1151 ExternalReference pending_handler_fp_address(
1152 Isolate::kPendingHandlerFPAddress, isolate());
1153 ExternalReference pending_handler_sp_address(
1154 Isolate::kPendingHandlerSPAddress, isolate());
1155
1156 // Ask the runtime for help to determine the handler. This will set v0 to
1157 // contain the current pending exception, don't clobber it.
1158 ExternalReference find_handler(Runtime::kFindExceptionHandler, isolate());
1159 {
1160 FrameScope scope(masm, StackFrame::MANUAL);
1161 __ PrepareCallCFunction(3, 0, a0);
1162 __ mov(a0, zero_reg);
1163 __ mov(a1, zero_reg);
1164 __ li(a2, Operand(ExternalReference::isolate_address(isolate())));
1165 __ CallCFunction(find_handler, 3);
1166 }
1167
1168 // Retrieve the handler context, SP and FP.
1169 __ li(cp, Operand(pending_handler_context_address));
1170 __ ld(cp, MemOperand(cp));
1171 __ li(sp, Operand(pending_handler_sp_address));
1172 __ ld(sp, MemOperand(sp));
1173 __ li(fp, Operand(pending_handler_fp_address));
1174 __ ld(fp, MemOperand(fp));
1175
1176 // If the handler is a JS frame, restore the context to the frame.
1177 // (kind == ENTRY) == (fp == 0) == (cp == 0), so we could test either fp
1178 // or cp.
1179 Label zero;
1180 __ Branch(&zero, eq, cp, Operand(zero_reg));
1181 __ sd(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
1182 __ bind(&zero);
1183
1184 // Compute the handler entry address and jump to it.
1185 __ li(a1, Operand(pending_handler_code_address));
1186 __ ld(a1, MemOperand(a1));
1187 __ li(a2, Operand(pending_handler_offset_address));
1188 __ ld(a2, MemOperand(a2));
1189 __ Daddu(a1, a1, Operand(Code::kHeaderSize - kHeapObjectTag));
1190 __ Daddu(t9, a1, a2);
1191 __ Jump(t9);
1198 } 1192 }
1199 1193
1200 1194
1201 void JSEntryStub::Generate(MacroAssembler* masm) { 1195 void JSEntryStub::Generate(MacroAssembler* masm) {
1202 Label invoke, handler_entry, exit; 1196 Label invoke, handler_entry, exit;
1203 Isolate* isolate = masm->isolate(); 1197 Isolate* isolate = masm->isolate();
1204 1198
1205 // TODO(plind): unify the ABI description here. 1199 // TODO(plind): unify the ABI description here.
1206 // Registers: 1200 // Registers:
1207 // a0: entry address 1201 // a0: entry address
(...skipping 1194 matching lines...) Expand 10 before | Expand all | Expand 10 after
2402 // stack overflow (on the backtrack stack) was detected in RegExp code but 2396 // stack overflow (on the backtrack stack) was detected in RegExp code but
2403 // haven't created the exception yet. Handle that in the runtime system. 2397 // haven't created the exception yet. Handle that in the runtime system.
2404 // TODO(592): Rerunning the RegExp to get the stack overflow exception. 2398 // TODO(592): Rerunning the RegExp to get the stack overflow exception.
2405 __ li(a1, Operand(isolate()->factory()->the_hole_value())); 2399 __ li(a1, Operand(isolate()->factory()->the_hole_value()));
2406 __ li(a2, Operand(ExternalReference(Isolate::kPendingExceptionAddress, 2400 __ li(a2, Operand(ExternalReference(Isolate::kPendingExceptionAddress,
2407 isolate()))); 2401 isolate())));
2408 __ ld(v0, MemOperand(a2, 0)); 2402 __ ld(v0, MemOperand(a2, 0));
2409 __ Branch(&runtime, eq, v0, Operand(a1)); 2403 __ Branch(&runtime, eq, v0, Operand(a1));
2410 2404
2411 // For exception, throw the exception again. 2405 // For exception, throw the exception again.
2412 __ EnterExitFrame(false); 2406 __ TailCallRuntime(Runtime::kRegExpExecReThrow, 4, 1);
2413 ThrowPendingException(masm);
2414 2407
2415 __ bind(&failure); 2408 __ bind(&failure);
2416 // For failure and exception return null. 2409 // For failure and exception return null.
2417 __ li(v0, Operand(isolate()->factory()->null_value())); 2410 __ li(v0, Operand(isolate()->factory()->null_value()));
2418 __ DropAndRet(4); 2411 __ DropAndRet(4);
2419 2412
2420 // Process the result from the native regexp code. 2413 // Process the result from the native regexp code.
2421 __ bind(&success); 2414 __ bind(&success);
2422 2415
2423 __ lw(a1, UntagSmiFieldMemOperand( 2416 __ lw(a1, UntagSmiFieldMemOperand(
(...skipping 3122 matching lines...) Expand 10 before | Expand all | Expand 10 after
5546 kStackUnwindSpace, kInvalidStackOffset, 5539 kStackUnwindSpace, kInvalidStackOffset,
5547 MemOperand(fp, 6 * kPointerSize), NULL); 5540 MemOperand(fp, 6 * kPointerSize), NULL);
5548 } 5541 }
5549 5542
5550 5543
5551 #undef __ 5544 #undef __
5552 5545
5553 } } // namespace v8::internal 5546 } } // namespace v8::internal
5554 5547
5555 #endif // V8_TARGET_ARCH_MIPS64 5548 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips/code-stubs-mips.cc ('k') | src/ppc/code-stubs-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698