Chromium Code Reviews| Index: src/runtime.cc | 
| diff --git a/src/runtime.cc b/src/runtime.cc | 
| index 288b2260215c281f5957f3afe470a67117ec3263..afb0df0f4774c8acecc3e59c2bff4a830f942cd1 100644 | 
| --- a/src/runtime.cc | 
| +++ b/src/runtime.cc | 
| @@ -1364,6 +1364,65 @@ static Object* Runtime_RegExpConstructResult(Arguments args) { | 
| } | 
| +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. | 
| 
 
Vitaly Repeshko
2010/08/20 13:29:49
I don't think we need to have this comment or asse
 
Lasse Reichstein
2010/08/23 12:52:11
True, maps are all in Map-space.
 
 | 
| + 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); |