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 |