| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 10790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10801 __ test(eax, Immediate(kSmiTagMask)); | 10801 __ test(eax, Immediate(kSmiTagMask)); |
| 10802 __ j(zero, &runtime); | 10802 __ j(zero, &runtime); |
| 10803 Condition is_string = masm->IsObjectStringType(eax, ebx, ebx); | 10803 Condition is_string = masm->IsObjectStringType(eax, ebx, ebx); |
| 10804 __ j(NegateCondition(is_string), &runtime); | 10804 __ j(NegateCondition(is_string), &runtime); |
| 10805 // Get the length of the string to ebx. | 10805 // Get the length of the string to ebx. |
| 10806 __ mov(ebx, FieldOperand(eax, String::kLengthOffset)); | 10806 __ mov(ebx, FieldOperand(eax, String::kLengthOffset)); |
| 10807 | 10807 |
| 10808 // ebx: Length of subject string | 10808 // ebx: Length of subject string |
| 10809 // ecx: RegExp data (FixedArray) | 10809 // ecx: RegExp data (FixedArray) |
| 10810 // edx: Number of capture registers | 10810 // edx: Number of capture registers |
| 10811 // Check that the third argument is a positive smi. | |
| 10812 // Check that the third argument is a positive smi less than the subject | 10811 // Check that the third argument is a positive smi less than the subject |
| 10813 // string length. A negative value will be greater (usigned comparison). | 10812 // string length. A negative value will be greater (unsigned comparison). |
| 10814 __ mov(eax, Operand(esp, kPreviousIndexOffset)); | 10813 __ mov(eax, Operand(esp, kPreviousIndexOffset)); |
| 10815 __ SmiUntag(eax); | 10814 __ SmiUntag(eax); |
| 10816 __ cmp(eax, Operand(ebx)); | 10815 __ cmp(eax, Operand(ebx)); |
| 10817 __ j(above, &runtime); | 10816 __ j(above, &runtime); |
| 10818 | 10817 |
| 10819 // ecx: RegExp data (FixedArray) | 10818 // ecx: RegExp data (FixedArray) |
| 10820 // edx: Number of capture registers | 10819 // edx: Number of capture registers |
| 10821 // Check that the fourth object is a JSArray object. | 10820 // Check that the fourth object is a JSArray object. |
| 10822 __ mov(eax, Operand(esp, kLastMatchInfoOffset)); | 10821 __ mov(eax, Operand(esp, kLastMatchInfoOffset)); |
| 10823 __ test(eax, Immediate(kSmiTagMask)); | 10822 __ test(eax, Immediate(kSmiTagMask)); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 10850 ASSERT_EQ(0, kSeqStringTag); | 10849 ASSERT_EQ(0, kSeqStringTag); |
| 10851 __ test(Operand(ebx), | 10850 __ test(Operand(ebx), |
| 10852 Immediate(kIsNotStringMask | kStringRepresentationMask)); | 10851 Immediate(kIsNotStringMask | kStringRepresentationMask)); |
| 10853 __ j(zero, &seq_string); | 10852 __ j(zero, &seq_string); |
| 10854 | 10853 |
| 10855 // Check for flat cons string. | 10854 // Check for flat cons string. |
| 10856 // A flat cons string is a cons string where the second part is the empty | 10855 // A flat cons string is a cons string where the second part is the empty |
| 10857 // string. In that case the subject string is just the first part of the cons | 10856 // string. In that case the subject string is just the first part of the cons |
| 10858 // string. Also in this case the first part of the cons string is known to be | 10857 // string. Also in this case the first part of the cons string is known to be |
| 10859 // a sequential string or an external string. | 10858 // a sequential string or an external string. |
| 10860 __ mov(edx, ebx); | 10859 __ and_(ebx, kStringRepresentationMask); |
| 10861 __ and_(edx, kStringRepresentationMask); | 10860 __ cmp(ebx, kConsStringTag); |
| 10862 __ cmp(edx, kConsStringTag); | |
| 10863 __ j(not_equal, &runtime); | 10861 __ j(not_equal, &runtime); |
| 10864 __ mov(edx, FieldOperand(eax, ConsString::kSecondOffset)); | 10862 __ mov(edx, FieldOperand(eax, ConsString::kSecondOffset)); |
| 10865 __ cmp(Operand(edx), Factory::empty_string()); | 10863 __ cmp(Operand(edx), Factory::empty_string()); |
| 10866 __ j(not_equal, &runtime); | 10864 __ j(not_equal, &runtime); |
| 10867 __ mov(eax, FieldOperand(eax, ConsString::kFirstOffset)); | 10865 __ mov(eax, FieldOperand(eax, ConsString::kFirstOffset)); |
| 10868 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); | 10866 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); |
| 10869 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); | 10867 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); |
| 10870 ASSERT_EQ(0, kSeqStringTag); | 10868 ASSERT_EQ(0, kSeqStringTag); |
| 10871 __ test(ebx, Immediate(kStringRepresentationMask)); | 10869 __ test(ebx, Immediate(kStringRepresentationMask)); |
| 10872 __ j(not_zero, &runtime); | 10870 __ j(not_zero, &runtime); |
| 10873 __ and_(ebx, kStringRepresentationEncodingMask); | 10871 __ and_(ebx, kStringRepresentationEncodingMask); |
| 10874 | 10872 |
| 10875 __ bind(&seq_string); | 10873 __ bind(&seq_string); |
| 10876 // eax: subject string (sequential either ascii to two byte) | 10874 // eax: subject string (sequential either ascii to two byte) |
| 10877 // ebx: suject string type & kStringRepresentationEncodingMask | 10875 // ebx: suject string type & kStringRepresentationEncodingMask |
| 10878 // ecx: RegExp data (FixedArray) | 10876 // ecx: RegExp data (FixedArray) |
| 10879 // Check that the irregexp code has been generated for an ascii string. If | 10877 // Check that the irregexp code has been generated for an ascii string. If |
| 10880 // it has, the field contains a code object otherwise it contains the hole. | 10878 // it has, the field contains a code object otherwise it contains the hole. |
| 10881 __ cmp(ebx, kStringTag | kSeqStringTag | kTwoByteStringTag); | 10879 const int kSeqTwoByteString = kStringTag | kSeqStringTag | kTwoByteStringTag; |
| 10880 __ cmp(ebx, kSeqTwoByteString); |
| 10882 __ j(equal, &seq_two_byte_string); | 10881 __ j(equal, &seq_two_byte_string); |
| 10883 if (FLAG_debug_code) { | 10882 if (FLAG_debug_code) { |
| 10884 __ cmp(ebx, kStringTag | kSeqStringTag | kAsciiStringTag); | 10883 __ cmp(ebx, kStringTag | kSeqStringTag | kAsciiStringTag); |
| 10885 __ Check(equal, "Expected sequential ascii string"); | 10884 __ Check(equal, "Expected sequential ascii string"); |
| 10886 } | 10885 } |
| 10887 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataAsciiCodeOffset)); | 10886 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataAsciiCodeOffset)); |
| 10888 __ Set(edi, Immediate(1)); // Type is ascii. | 10887 __ Set(edi, Immediate(1)); // Type is ascii. |
| 10889 __ jmp(&check_code); | 10888 __ jmp(&check_code); |
| 10890 | 10889 |
| 10891 __ bind(&seq_two_byte_string); | 10890 __ bind(&seq_two_byte_string); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10967 __ j(equal, &success, taken); | 10966 __ j(equal, &success, taken); |
| 10968 Label failure; | 10967 Label failure; |
| 10969 __ cmp(eax, NativeRegExpMacroAssembler::FAILURE); | 10968 __ cmp(eax, NativeRegExpMacroAssembler::FAILURE); |
| 10970 __ j(equal, &failure, taken); | 10969 __ j(equal, &failure, taken); |
| 10971 __ cmp(eax, NativeRegExpMacroAssembler::EXCEPTION); | 10970 __ cmp(eax, NativeRegExpMacroAssembler::EXCEPTION); |
| 10972 // If not exception it can only be retry. Handle that in the runtime system. | 10971 // If not exception it can only be retry. Handle that in the runtime system. |
| 10973 __ j(not_equal, &runtime); | 10972 __ j(not_equal, &runtime); |
| 10974 // Result must now be exception. If there is no pending exception already a | 10973 // Result must now be exception. If there is no pending exception already a |
| 10975 // stack overflow (on the backtrack stack) was detected in RegExp code but | 10974 // stack overflow (on the backtrack stack) was detected in RegExp code but |
| 10976 // haven't created the exception yet. Handle that in the runtime system. | 10975 // haven't created the exception yet. Handle that in the runtime system. |
| 10977 // TODO(592) Rerunning the RegExp to get the stack overflow exception. | 10976 // TODO(592): Rerunning the RegExp to get the stack overflow exception. |
| 10978 ExternalReference pending_exception(Top::k_pending_exception_address); | 10977 ExternalReference pending_exception(Top::k_pending_exception_address); |
| 10979 __ mov(eax, | 10978 __ mov(eax, |
| 10980 Operand::StaticVariable(ExternalReference::the_hole_value_location())); | 10979 Operand::StaticVariable(ExternalReference::the_hole_value_location())); |
| 10981 __ cmp(eax, Operand::StaticVariable(pending_exception)); | 10980 __ cmp(eax, Operand::StaticVariable(pending_exception)); |
| 10982 __ j(equal, &runtime); | 10981 __ j(equal, &runtime); |
| 10983 __ bind(&failure); | 10982 __ bind(&failure); |
| 10984 // For failure and exception return null. | 10983 // For failure and exception return null. |
| 10985 __ mov(Operand(eax), Factory::null_value()); | 10984 __ mov(Operand(eax), Factory::null_value()); |
| 10986 __ ret(4 * kPointerSize); | 10985 __ ret(4 * kPointerSize); |
| 10987 | 10986 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 11018 | 11017 |
| 11019 // Get the static offsets vector filled by the native regexp code. | 11018 // Get the static offsets vector filled by the native regexp code. |
| 11020 ExternalReference address_of_static_offsets_vector = | 11019 ExternalReference address_of_static_offsets_vector = |
| 11021 ExternalReference::address_of_static_offsets_vector(); | 11020 ExternalReference::address_of_static_offsets_vector(); |
| 11022 __ mov(ecx, Immediate(address_of_static_offsets_vector)); | 11021 __ mov(ecx, Immediate(address_of_static_offsets_vector)); |
| 11023 | 11022 |
| 11024 // ebx: last_match_info backing store (FixedArray) | 11023 // ebx: last_match_info backing store (FixedArray) |
| 11025 // ecx: offsets vector | 11024 // ecx: offsets vector |
| 11026 // edx: number of capture registers | 11025 // edx: number of capture registers |
| 11027 Label next_capture, done; | 11026 Label next_capture, done; |
| 11028 __ mov(eax, Operand(esp, kPreviousIndexOffset)); | |
| 11029 // Capture register counter starts from number of capture registers and | 11027 // Capture register counter starts from number of capture registers and |
| 11030 // counts down until wraping after zero. | 11028 // counts down until wraping after zero. |
| 11031 __ bind(&next_capture); | 11029 __ bind(&next_capture); |
| 11032 __ sub(Operand(edx), Immediate(1)); | 11030 __ sub(Operand(edx), Immediate(1)); |
| 11033 __ j(negative, &done); | 11031 __ j(negative, &done); |
| 11034 // Read the value from the static offsets vector buffer. | 11032 // Read the value from the static offsets vector buffer. |
| 11035 __ mov(edi, Operand(ecx, edx, times_int_size, 0)); | 11033 __ mov(edi, Operand(ecx, edx, times_int_size, 0)); |
| 11036 __ SmiTag(edi); | 11034 __ SmiTag(edi); |
| 11037 // Store the smi value in the last match info. | 11035 // Store the smi value in the last match info. |
| 11038 __ mov(FieldOperand(ebx, | 11036 __ mov(FieldOperand(ebx, |
| (...skipping 1761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12800 | 12798 |
| 12801 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 12799 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
| 12802 // tagged as a small integer. | 12800 // tagged as a small integer. |
| 12803 __ bind(&runtime); | 12801 __ bind(&runtime); |
| 12804 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 12802 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 12805 } | 12803 } |
| 12806 | 12804 |
| 12807 #undef __ | 12805 #undef __ |
| 12808 | 12806 |
| 12809 } } // namespace v8::internal | 12807 } } // namespace v8::internal |
| OLD | NEW |