| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|