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

Side by Side Diff: src/ia32/regexp-macro-assembler-ia32.cc

Issue 14429003: Refactor ExternalReference::isolate_address() to not rely on Isolate::Current(). (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: addressed comments Created 7 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « src/ia32/regexp-macro-assembler-ia32.h ('k') | src/mips/code-stubs-mips.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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 __ PrepareCallCFunction(argument_count, ecx); 394 __ PrepareCallCFunction(argument_count, ecx);
395 // Put arguments into allocated stack area, last argument highest on stack. 395 // Put arguments into allocated stack area, last argument highest on stack.
396 // Parameters are 396 // Parameters are
397 // Address byte_offset1 - Address captured substring's start. 397 // Address byte_offset1 - Address captured substring's start.
398 // Address byte_offset2 - Address of current character position. 398 // Address byte_offset2 - Address of current character position.
399 // size_t byte_length - length of capture in bytes(!) 399 // size_t byte_length - length of capture in bytes(!)
400 // Isolate* isolate 400 // Isolate* isolate
401 401
402 // Set isolate. 402 // Set isolate.
403 __ mov(Operand(esp, 3 * kPointerSize), 403 __ mov(Operand(esp, 3 * kPointerSize),
404 Immediate(ExternalReference::isolate_address())); 404 Immediate(ExternalReference::isolate_address(isolate())));
405 // Set byte_length. 405 // Set byte_length.
406 __ mov(Operand(esp, 2 * kPointerSize), ebx); 406 __ mov(Operand(esp, 2 * kPointerSize), ebx);
407 // Set byte_offset2. 407 // Set byte_offset2.
408 // Found by adding negative string-end offset of current position (edi) 408 // Found by adding negative string-end offset of current position (edi)
409 // to end of string. 409 // to end of string.
410 __ add(edi, esi); 410 __ add(edi, esi);
411 __ mov(Operand(esp, 1 * kPointerSize), edi); 411 __ mov(Operand(esp, 1 * kPointerSize), edi);
412 // Set byte_offset1. 412 // Set byte_offset1.
413 // Start of capture, where edx already holds string-end negative offset. 413 // Start of capture, where edx already holds string-end negative offset.
414 __ add(edx, esi); 414 __ add(edx, esi);
415 __ mov(Operand(esp, 0 * kPointerSize), edx); 415 __ mov(Operand(esp, 0 * kPointerSize), edx);
416 416
417 { 417 {
418 AllowExternalCallThatCantCauseGC scope(masm_); 418 AllowExternalCallThatCantCauseGC scope(masm_);
419 ExternalReference compare = 419 ExternalReference compare =
420 ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate()); 420 ExternalReference::re_case_insensitive_compare_uc16(isolate());
421 __ CallCFunction(compare, argument_count); 421 __ CallCFunction(compare, argument_count);
422 } 422 }
423 // Pop original values before reacting on result value. 423 // Pop original values before reacting on result value.
424 __ pop(ebx); 424 __ pop(ebx);
425 __ pop(backtrack_stackpointer()); 425 __ pop(backtrack_stackpointer());
426 __ pop(edi); 426 __ pop(edi);
427 __ pop(esi); 427 __ pop(esi);
428 428
429 // Check if function returned non-zero for success or zero for failure. 429 // Check if function returned non-zero for success or zero for failure.
430 __ or_(eax, eax); 430 __ or_(eax, eax);
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 __ push(edi); 738 __ push(edi);
739 __ push(ebx); // Callee-save on MacOS. 739 __ push(ebx); // Callee-save on MacOS.
740 __ push(Immediate(0)); // Number of successful matches in a global regexp. 740 __ push(Immediate(0)); // Number of successful matches in a global regexp.
741 __ push(Immediate(0)); // Make room for "input start - 1" constant. 741 __ push(Immediate(0)); // Make room for "input start - 1" constant.
742 742
743 // Check if we have space on the stack for registers. 743 // Check if we have space on the stack for registers.
744 Label stack_limit_hit; 744 Label stack_limit_hit;
745 Label stack_ok; 745 Label stack_ok;
746 746
747 ExternalReference stack_limit = 747 ExternalReference stack_limit =
748 ExternalReference::address_of_stack_limit(masm_->isolate()); 748 ExternalReference::address_of_stack_limit(isolate());
749 __ mov(ecx, esp); 749 __ mov(ecx, esp);
750 __ sub(ecx, Operand::StaticVariable(stack_limit)); 750 __ sub(ecx, Operand::StaticVariable(stack_limit));
751 // Handle it if the stack pointer is already below the stack limit. 751 // Handle it if the stack pointer is already below the stack limit.
752 __ j(below_equal, &stack_limit_hit); 752 __ j(below_equal, &stack_limit_hit);
753 // Check if there is room for the variable number of registers above 753 // Check if there is room for the variable number of registers above
754 // the stack limit. 754 // the stack limit.
755 __ cmp(ecx, num_registers_ * kPointerSize); 755 __ cmp(ecx, num_registers_ * kPointerSize);
756 __ j(above_equal, &stack_ok); 756 __ j(above_equal, &stack_ok);
757 // Exit with OutOfMemory exception. There is not enough space on the stack 757 // Exit with OutOfMemory exception. There is not enough space on the stack
758 // for our working registers. 758 // for our working registers.
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 965
966 Label grow_failed; 966 Label grow_failed;
967 // Save registers before calling C function 967 // Save registers before calling C function
968 __ push(esi); 968 __ push(esi);
969 __ push(edi); 969 __ push(edi);
970 970
971 // Call GrowStack(backtrack_stackpointer()) 971 // Call GrowStack(backtrack_stackpointer())
972 static const int num_arguments = 3; 972 static const int num_arguments = 3;
973 __ PrepareCallCFunction(num_arguments, ebx); 973 __ PrepareCallCFunction(num_arguments, ebx);
974 __ mov(Operand(esp, 2 * kPointerSize), 974 __ mov(Operand(esp, 2 * kPointerSize),
975 Immediate(ExternalReference::isolate_address())); 975 Immediate(ExternalReference::isolate_address(isolate())));
976 __ lea(eax, Operand(ebp, kStackHighEnd)); 976 __ lea(eax, Operand(ebp, kStackHighEnd));
977 __ mov(Operand(esp, 1 * kPointerSize), eax); 977 __ mov(Operand(esp, 1 * kPointerSize), eax);
978 __ mov(Operand(esp, 0 * kPointerSize), backtrack_stackpointer()); 978 __ mov(Operand(esp, 0 * kPointerSize), backtrack_stackpointer());
979 ExternalReference grow_stack = 979 ExternalReference grow_stack =
980 ExternalReference::re_grow_stack(masm_->isolate()); 980 ExternalReference::re_grow_stack(isolate());
981 __ CallCFunction(grow_stack, num_arguments); 981 __ CallCFunction(grow_stack, num_arguments);
982 // If return NULL, we have failed to grow the stack, and 982 // If return NULL, we have failed to grow the stack, and
983 // must exit with a stack-overflow exception. 983 // must exit with a stack-overflow exception.
984 __ or_(eax, eax); 984 __ or_(eax, eax);
985 __ j(equal, &exit_with_exception); 985 __ j(equal, &exit_with_exception);
986 // Otherwise use return value as new stack pointer. 986 // Otherwise use return value as new stack pointer.
987 __ mov(backtrack_stackpointer(), eax); 987 __ mov(backtrack_stackpointer(), eax);
988 // Restore saved registers and continue. 988 // Restore saved registers and continue.
989 __ pop(edi); 989 __ pop(edi);
990 __ pop(esi); 990 __ pop(esi);
991 SafeReturn(); 991 SafeReturn();
992 } 992 }
993 993
994 if (exit_with_exception.is_linked()) { 994 if (exit_with_exception.is_linked()) {
995 // If any of the code above needed to exit with an exception. 995 // If any of the code above needed to exit with an exception.
996 __ bind(&exit_with_exception); 996 __ bind(&exit_with_exception);
997 // Exit with Result EXCEPTION(-1) to signal thrown exception. 997 // Exit with Result EXCEPTION(-1) to signal thrown exception.
998 __ mov(eax, EXCEPTION); 998 __ mov(eax, EXCEPTION);
999 __ jmp(&return_eax); 999 __ jmp(&return_eax);
1000 } 1000 }
1001 1001
1002 CodeDesc code_desc; 1002 CodeDesc code_desc;
1003 masm_->GetCode(&code_desc); 1003 masm_->GetCode(&code_desc);
1004 Handle<Code> code = 1004 Handle<Code> code =
1005 masm_->isolate()->factory()->NewCode(code_desc, 1005 isolate()->factory()->NewCode(code_desc,
1006 Code::ComputeFlags(Code::REGEXP), 1006 Code::ComputeFlags(Code::REGEXP),
1007 masm_->CodeObject()); 1007 masm_->CodeObject());
1008 PROFILE(masm_->isolate(), RegExpCodeCreateEvent(*code, *source)); 1008 PROFILE(isolate(), RegExpCodeCreateEvent(*code, *source));
1009 return Handle<HeapObject>::cast(code); 1009 return Handle<HeapObject>::cast(code);
1010 } 1010 }
1011 1011
1012 1012
1013 void RegExpMacroAssemblerIA32::GoTo(Label* to) { 1013 void RegExpMacroAssemblerIA32::GoTo(Label* to) {
1014 BranchOrBacktrack(no_condition, to); 1014 BranchOrBacktrack(no_condition, to);
1015 } 1015 }
1016 1016
1017 1017
1018 void RegExpMacroAssemblerIA32::IfRegisterGE(int reg, 1018 void RegExpMacroAssemblerIA32::IfRegisterGE(int reg,
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 static const int num_arguments = 3; 1154 static const int num_arguments = 3;
1155 __ PrepareCallCFunction(num_arguments, scratch); 1155 __ PrepareCallCFunction(num_arguments, scratch);
1156 // RegExp code frame pointer. 1156 // RegExp code frame pointer.
1157 __ mov(Operand(esp, 2 * kPointerSize), ebp); 1157 __ mov(Operand(esp, 2 * kPointerSize), ebp);
1158 // Code* of self. 1158 // Code* of self.
1159 __ mov(Operand(esp, 1 * kPointerSize), Immediate(masm_->CodeObject())); 1159 __ mov(Operand(esp, 1 * kPointerSize), Immediate(masm_->CodeObject()));
1160 // Next address on the stack (will be address of return address). 1160 // Next address on the stack (will be address of return address).
1161 __ lea(eax, Operand(esp, -kPointerSize)); 1161 __ lea(eax, Operand(esp, -kPointerSize));
1162 __ mov(Operand(esp, 0 * kPointerSize), eax); 1162 __ mov(Operand(esp, 0 * kPointerSize), eax);
1163 ExternalReference check_stack_guard = 1163 ExternalReference check_stack_guard =
1164 ExternalReference::re_check_stack_guard_state(masm_->isolate()); 1164 ExternalReference::re_check_stack_guard_state(isolate());
1165 __ CallCFunction(check_stack_guard, num_arguments); 1165 __ CallCFunction(check_stack_guard, num_arguments);
1166 } 1166 }
1167 1167
1168 1168
1169 // Helper function for reading a value out of a stack frame. 1169 // Helper function for reading a value out of a stack frame.
1170 template <typename T> 1170 template <typename T>
1171 static T& frame_entry(Address re_frame, int frame_offset) { 1171 static T& frame_entry(Address re_frame, int frame_offset) {
1172 return reinterpret_cast<T&>(Memory::int32_at(re_frame + frame_offset)); 1172 return reinterpret_cast<T&>(Memory::int32_at(re_frame + frame_offset));
1173 } 1173 }
1174 1174
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 __ mov(target, Operand(backtrack_stackpointer(), 0)); 1346 __ mov(target, Operand(backtrack_stackpointer(), 0));
1347 // Notice: This updates flags, unlike normal Pop. 1347 // Notice: This updates flags, unlike normal Pop.
1348 __ add(backtrack_stackpointer(), Immediate(kPointerSize)); 1348 __ add(backtrack_stackpointer(), Immediate(kPointerSize));
1349 } 1349 }
1350 1350
1351 1351
1352 void RegExpMacroAssemblerIA32::CheckPreemption() { 1352 void RegExpMacroAssemblerIA32::CheckPreemption() {
1353 // Check for preemption. 1353 // Check for preemption.
1354 Label no_preempt; 1354 Label no_preempt;
1355 ExternalReference stack_limit = 1355 ExternalReference stack_limit =
1356 ExternalReference::address_of_stack_limit(masm_->isolate()); 1356 ExternalReference::address_of_stack_limit(isolate());
1357 __ cmp(esp, Operand::StaticVariable(stack_limit)); 1357 __ cmp(esp, Operand::StaticVariable(stack_limit));
1358 __ j(above, &no_preempt); 1358 __ j(above, &no_preempt);
1359 1359
1360 SafeCall(&check_preempt_label_); 1360 SafeCall(&check_preempt_label_);
1361 1361
1362 __ bind(&no_preempt); 1362 __ bind(&no_preempt);
1363 } 1363 }
1364 1364
1365 1365
1366 void RegExpMacroAssemblerIA32::CheckStackLimit() { 1366 void RegExpMacroAssemblerIA32::CheckStackLimit() {
1367 Label no_stack_overflow; 1367 Label no_stack_overflow;
1368 ExternalReference stack_limit = 1368 ExternalReference stack_limit =
1369 ExternalReference::address_of_regexp_stack_limit(masm_->isolate()); 1369 ExternalReference::address_of_regexp_stack_limit(isolate());
1370 __ cmp(backtrack_stackpointer(), Operand::StaticVariable(stack_limit)); 1370 __ cmp(backtrack_stackpointer(), Operand::StaticVariable(stack_limit));
1371 __ j(above, &no_stack_overflow); 1371 __ j(above, &no_stack_overflow);
1372 1372
1373 SafeCall(&stack_overflow_label_); 1373 SafeCall(&stack_overflow_label_);
1374 1374
1375 __ bind(&no_stack_overflow); 1375 __ bind(&no_stack_overflow);
1376 } 1376 }
1377 1377
1378 1378
1379 void RegExpMacroAssemblerIA32::LoadCurrentCharacterUnchecked(int cp_offset, 1379 void RegExpMacroAssemblerIA32::LoadCurrentCharacterUnchecked(int cp_offset,
(...skipping 21 matching lines...) Expand all
1401 } 1401 }
1402 1402
1403 1403
1404 #undef __ 1404 #undef __
1405 1405
1406 #endif // V8_INTERPRETED_REGEXP 1406 #endif // V8_INTERPRETED_REGEXP
1407 1407
1408 }} // namespace v8::internal 1408 }} // namespace v8::internal
1409 1409
1410 #endif // V8_TARGET_ARCH_IA32 1410 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/regexp-macro-assembler-ia32.h ('k') | src/mips/code-stubs-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698