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; |