| Index: src/runtime.cc
|
| ===================================================================
|
| --- src/runtime.cc (revision 5316)
|
| +++ src/runtime.cc (working copy)
|
| @@ -1364,6 +1364,65 @@
|
| }
|
|
|
|
|
| +static Object* Runtime_RegExpCloneResult(Arguments args) {
|
| + ASSERT(args.length() == 1);
|
| + Map* regexp_result_map;
|
| + {
|
| + AssertNoAllocation no_gc;
|
| + HandleScope handles;
|
| + regexp_result_map = Top::global_context()->regexp_result_map();
|
| + }
|
| + if (!args[0]->IsJSArray()) return args[0];
|
| +
|
| + JSArray* result = JSArray::cast(args[0]);
|
| + // Arguments to RegExpCloneResult should always be fresh RegExp exec call
|
| + // results (either a fresh JSRegExpResult or null).
|
| + // If the argument is not a JSRegExpResult, or isn't unmodified, just return
|
| + // the argument uncloned.
|
| + if (result->map() != regexp_result_map) return result;
|
| +
|
| + // Having the original JSRegExpResult map guarantees that we have
|
| + // fast elements and no properties except the two in-object properties.
|
| + ASSERT(result->HasFastElements());
|
| + ASSERT(result->properties() == Heap::empty_fixed_array());
|
| + ASSERT_EQ(2, regexp_result_map->inobject_properties());
|
| +
|
| + Object* new_array_alloc = Heap::AllocateRaw(JSRegExpResult::kSize,
|
| + NEW_SPACE,
|
| + OLD_POINTER_SPACE);
|
| + if (new_array_alloc->IsFailure()) return new_array_alloc;
|
| +
|
| + // Set HeapObject map to JSRegExpResult map.
|
| + reinterpret_cast<HeapObject*>(new_array_alloc)->set_map(regexp_result_map);
|
| +
|
| + JSArray* new_array = JSArray::cast(new_array_alloc);
|
| +
|
| + // Copy JSObject properties.
|
| + new_array->set_properties(result->properties()); // Empty FixedArray.
|
| +
|
| + // Copy JSObject elements as copy-on-write.
|
| + FixedArray* elements = FixedArray::cast(result->elements());
|
| + if (elements != Heap::empty_fixed_array()) {
|
| + ASSERT(!Heap::InNewSpace(Heap::fixed_cow_array_map()));
|
| + // No write barrier is necessary when writing old-space pointer.
|
| + elements->set_map(Heap::fixed_cow_array_map());
|
| + }
|
| + new_array->set_elements(elements);
|
| +
|
| + // Copy JSArray length.
|
| + new_array->set_length(result->length());
|
| +
|
| + // Copy JSRegExpResult in-object property fields input and index.
|
| + new_array->FastPropertyAtPut(JSRegExpResult::kIndexIndex,
|
| + result->FastPropertyAt(
|
| + JSRegExpResult::kIndexIndex));
|
| + new_array->FastPropertyAtPut(JSRegExpResult::kInputIndex,
|
| + result->FastPropertyAt(
|
| + JSRegExpResult::kInputIndex));
|
| + return new_array;
|
| +}
|
| +
|
| +
|
| static Object* Runtime_RegExpInitializeObject(Arguments args) {
|
| AssertNoAllocation no_alloc;
|
| ASSERT(args.length() == 5);
|
| @@ -3524,7 +3583,7 @@
|
| if (required_registers < 0) return RegExpImpl::RE_EXCEPTION;
|
|
|
| OffsetsVector registers(required_registers);
|
| - Vector<int> register_vector(registers.vector(), registers.length());
|
| + Vector<int32_t> register_vector(registers.vector(), registers.length());
|
| int subject_length = subject->length();
|
|
|
| for (;;) { // Break on failure, return on exception.
|
| @@ -3586,7 +3645,7 @@
|
| if (required_registers < 0) return RegExpImpl::RE_EXCEPTION;
|
|
|
| OffsetsVector registers(required_registers);
|
| - Vector<int> register_vector(registers.vector(), registers.length());
|
| + Vector<int32_t> register_vector(registers.vector(), registers.length());
|
|
|
| RegExpImpl::IrregexpResult result =
|
| RegExpImpl::IrregexpExecOnce(regexp,
|
| @@ -3646,7 +3705,7 @@
|
| }
|
| // Swap register vectors, so the last successful match is in
|
| // prev_register_vector.
|
| - Vector<int> tmp = prev_register_vector;
|
| + Vector<int32_t> tmp = prev_register_vector;
|
| prev_register_vector = register_vector;
|
| register_vector = tmp;
|
|
|
|
|