Chromium Code Reviews| Index: src/ia32/codegen-ia32.cc | 
| =================================================================== | 
| --- src/ia32/codegen-ia32.cc (revision 3730) | 
| +++ src/ia32/codegen-ia32.cc (working copy) | 
| @@ -5134,7 +5134,7 @@ | 
| // flat string in a cons string). If that is not the case we would rather go | 
| // to the runtime system now, to flatten the string. | 
| __ mov(temp.reg(), FieldOperand(object.reg(), ConsString::kSecondOffset)); | 
| - __ cmp(Operand(temp.reg()), Immediate(Handle<String>(Heap::empty_string()))); | 
| + __ cmp(Operand(temp.reg()), Factory::empty_string()); | 
| __ j(not_equal, &slow_case); | 
| // Get the first of the two strings. | 
| __ mov(object.reg(), FieldOperand(object.reg(), ConsString::kFirstOffset)); | 
| @@ -8397,8 +8397,12 @@ | 
| void RegExpExecStub::Generate(MacroAssembler* masm) { | 
| - // Just jump directly to runtime if regexp entry in generated code is turned | 
| - // off. | 
| + // Just jump directly to runtime if native RegExp is not selected at compile | 
| + // time or if regexp entry in generated code is turned off runtime switch or | 
| + // at compilation. | 
| +#ifndef V8_NATIVE_REGEXP | 
| + __ TailCallRuntime(ExternalReference(Runtime::kRegExpExec), 4, 1); | 
| +#endif | 
| 
 
Lasse Reichstein
2010/01/29 08:09:08
Perhaps use #else to make all the following code g
 
Søren Thygesen Gjesse
2010/01/29 13:06:53
Done.
 
 | 
| if (!FLAG_regexp_entry_native) { | 
| __ TailCallRuntime(ExternalReference(Runtime::kRegExpExec), 4, 1); | 
| return; | 
| @@ -8436,12 +8440,12 @@ | 
| __ j(not_equal, &runtime); | 
| // Check that the RegExp has been compiled (data contains a fixed array). | 
| __ mov(ecx, FieldOperand(eax, JSRegExp::kDataOffset)); | 
| -#ifdef DEBUG | 
| - __ test(ecx, Immediate(kSmiTagMask)); | 
| - __ Check(not_zero, "Unexpected type for RegExp data, FixedArray expected"); | 
| - __ CmpObjectType(ecx, FIXED_ARRAY_TYPE, ebx); | 
| - __ Check(equal, "Unexpected type for RegExp data, FixedArray expected"); | 
| -#endif | 
| + if (FLAG_debug_code) { | 
| + __ test(ecx, Immediate(kSmiTagMask)); | 
| + __ Check(not_zero, "Unexpected type for RegExp data, FixedArray expected"); | 
| + __ CmpObjectType(ecx, FIXED_ARRAY_TYPE, ebx); | 
| + __ Check(equal, "Unexpected type for RegExp data, FixedArray expected"); | 
| + } | 
| // ecx: RegExp data (FixedArray) | 
| // Check the type of the RegExp. Only continue if type is JSRegExp::IRREGEXP. | 
| @@ -8476,10 +8480,9 @@ | 
| // ecx: RegExp data (FixedArray) | 
| // edx: Number of capture registers | 
| // Check that the third argument is a positive smi. | 
| + // Check that the third argument is a positive smi less than the subject | 
| + // string length. A negative value will be greater (usigned comparison). | 
| __ mov(eax, Operand(esp, kPreviousIndexOffset)); | 
| - __ test(eax, Immediate(kSmiTagMask | 0x80000000)); | 
| - __ j(not_zero, &runtime); | 
| - // Check that it is not greater than the subject string length. | 
| __ SmiUntag(eax); | 
| __ cmp(eax, Operand(ebx)); | 
| __ j(greater, &runtime); | 
| @@ -8524,17 +8527,20 @@ | 
| // A flat cons string is a cons string where the second part is the empty | 
| // string. In that case the subject string is just the first part of the cons | 
| // string. Also in this case the first part of the cons string is known to be | 
| - // a sequential string. | 
| + // a sequential string or an external string. | 
| __ mov(edx, ebx); | 
| __ and_(edx, kStringRepresentationMask); | 
| __ cmp(edx, kConsStringTag); | 
| __ j(not_equal, &runtime); | 
| __ mov(edx, FieldOperand(eax, ConsString::kSecondOffset)); | 
| - __ cmp(Operand(edx), Immediate(Handle<String>(Heap::empty_string()))); | 
| + __ cmp(Operand(edx), Factory::empty_string()); | 
| __ j(not_equal, &runtime); | 
| __ mov(eax, FieldOperand(eax, ConsString::kFirstOffset)); | 
| __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); | 
| __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); | 
| + ASSERT_EQ(0, kSequentialStringTag); | 
| + __ test(ebx, Immediate(kStringRepresentationMask)); | 
| + __ j(not_zero, &runtime); | 
| __ and_(ebx, kStringRepresentationEncodingMask); | 
| __ bind(&seq_string); | 
| @@ -8545,10 +8551,10 @@ | 
| // it has, the field contains a code object otherwise it contains the hole. | 
| __ cmp(ebx, kStringTag | kSeqStringTag | kTwoByteStringTag); | 
| __ j(equal, &seq_two_byte_string); | 
| -#ifdef DEBUG | 
| - __ cmp(ebx, kStringTag | kSeqStringTag | kAsciiStringTag); | 
| - __ Check(equal, "Expected sequential ascii string"); | 
| -#endif | 
| + if (FLAG_debug_code) { | 
| + __ cmp(ebx, kStringTag | kSeqStringTag | kAsciiStringTag); | 
| + __ Check(equal, "Expected sequential ascii string"); | 
| + } | 
| __ mov(edx, FieldOperand(ecx, JSRegExp::kDataAsciiCodeOffset)); | 
| __ Set(edi, Immediate(1)); // Type is ascii. | 
| __ jmp(&check_code); | 
| @@ -8560,23 +8566,24 @@ | 
| __ Set(edi, Immediate(0)); // Type is two byte. | 
| __ bind(&check_code); | 
| - // Check that the irregexp code has been generated for If it has, the field | 
| - // contains a code object otherwise it contains the hole. | 
| + // Check that the irregexp code has been generated for the actual string | 
| + // encoding. If it has, the field contains a code object otherwise it contains | 
| + // the hole. | 
| __ CmpObjectType(edx, CODE_TYPE, ebx); | 
| __ j(not_equal, &runtime); | 
| // eax: subject string | 
| // edx: code | 
| - // edi: encoding of subject string (1 if ascii 0 if two_byte); | 
| + // edi: encoding of subject string (1 if ascii, 0 if two_byte); | 
| // Load used arguments before starting to push arguments for call to native | 
| // RegExp code to avoid handling changing stack height. | 
| __ mov(ebx, Operand(esp, kPreviousIndexOffset)); | 
| - __ mov(ecx, Operand(esp, kJSRegExpOffset)); | 
| __ SmiUntag(ebx); // Previous index from smi. | 
| // eax: subject string | 
| // ebx: previous index | 
| // edx: code | 
| + // edi: encoding of subject string (1 if ascii 0 if two_byte); | 
| // All checks done. Now push arguments for native regexp code. | 
| __ IncrementCounter(&Counters::regexp_entry_native, 1); | 
| @@ -8604,7 +8611,6 @@ | 
| __ jmp(&push_rest); | 
| __ bind(&push_two_byte); | 
| - ASSERT(kShortSize == 2); | 
| __ lea(ecx, FieldOperand(eax, edi, times_2, SeqTwoByteString::kHeaderSize)); | 
| __ push(ecx); // Argument 4. | 
| __ lea(ecx, FieldOperand(eax, ebx, times_2, SeqTwoByteString::kHeaderSize)); | 
| @@ -8637,6 +8643,7 @@ | 
| // Result must now be exception. If there is no pending exception already a | 
| // stack overflow (on the backtrack stack) was detected in RegExp code but | 
| // haven't created the exception yet. Handle that in the runtime system. | 
| + // TODO(592) Rerunning the RegExp to get the stack overflow exception. | 
| ExternalReference pending_exception(Top::k_pending_exception_address); | 
| __ mov(eax, | 
| Operand::StaticVariable(ExternalReference::the_hole_value_location())); | 
| @@ -8653,6 +8660,8 @@ | 
| __ mov(ecx, FieldOperand(eax, JSRegExp::kDataOffset)); | 
| __ mov(edx, FieldOperand(ecx, JSRegExp::kIrregexpCaptureCountOffset)); | 
| // Calculate number of capture registers (number_of_captures + 1) * 2. | 
| + ASSERT_EQ(0, kSmiTag); | 
| + ASSERT_EQ(1, kSmiTagSize + kSmiShiftSize); | 
| __ add(Operand(edx), Immediate(2)); // edx was a smi. | 
| // edx: Number of capture registers | 
| @@ -8692,7 +8701,7 @@ | 
| __ sub(Operand(edx), Immediate(1)); | 
| __ j(negative, &done); | 
| // Read the value from the static offsets vector buffer. | 
| - __ mov(edi, Operand(ecx, edx, times_pointer_size, 0)); | 
| + __ mov(edi, Operand(ecx, edx, times_int_size, 0)); | 
| // Perform explicit shift | 
| ASSERT_EQ(0, kSmiTag); | 
| __ shl(edi, kSmiTagSize); |