Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index dcc76181fe488a0aa27a7c734cb7a5be706df303..55ef80c50f28c01beae8b352e1289e3bc67c3741 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -139,148 +139,6 @@ namespace internal { |
static_cast<LanguageMode>(args.smi_at(index)); |
-MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate, |
- JSObject* boilerplate) { |
- StackLimitCheck check(isolate); |
- if (check.HasOverflowed()) return isolate->StackOverflow(); |
- |
- Heap* heap = isolate->heap(); |
- Object* result; |
- { MaybeObject* maybe_result = heap->CopyJSObject(boilerplate); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
- } |
- JSObject* copy = JSObject::cast(result); |
- |
- // Deep copy local properties. |
- if (copy->HasFastProperties()) { |
- FixedArray* properties = copy->properties(); |
- for (int i = 0; i < properties->length(); i++) { |
- Object* value = properties->get(i); |
- if (value->IsJSObject()) { |
- JSObject* js_object = JSObject::cast(value); |
- { MaybeObject* maybe_result = DeepCopyBoilerplate(isolate, js_object); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
- } |
- properties->set(i, result); |
- } |
- } |
- int nof = copy->map()->inobject_properties(); |
- for (int i = 0; i < nof; i++) { |
- Object* value = copy->InObjectPropertyAt(i); |
- if (value->IsJSObject()) { |
- JSObject* js_object = JSObject::cast(value); |
- { MaybeObject* maybe_result = DeepCopyBoilerplate(isolate, js_object); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
- } |
- copy->InObjectPropertyAtPut(i, result); |
- } |
- } |
- } else { |
- { MaybeObject* maybe_result = |
- heap->AllocateFixedArray(copy->NumberOfLocalProperties()); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
- } |
- FixedArray* names = FixedArray::cast(result); |
- copy->GetLocalPropertyNames(names, 0); |
- for (int i = 0; i < names->length(); i++) { |
- ASSERT(names->get(i)->IsString()); |
- String* key_string = String::cast(names->get(i)); |
- PropertyAttributes attributes = |
- copy->GetLocalPropertyAttribute(key_string); |
- // Only deep copy fields from the object literal expression. |
- // In particular, don't try to copy the length attribute of |
- // an array. |
- if (attributes != NONE) continue; |
- Object* value = |
- copy->GetProperty(key_string, &attributes)->ToObjectUnchecked(); |
- if (value->IsJSObject()) { |
- JSObject* js_object = JSObject::cast(value); |
- { MaybeObject* maybe_result = DeepCopyBoilerplate(isolate, js_object); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
- } |
- { MaybeObject* maybe_result = |
- // Creating object copy for literals. No strict mode needed. |
- copy->SetProperty(key_string, result, NONE, kNonStrictMode); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
- } |
- } |
- } |
- } |
- |
- // Deep copy local elements. |
- // Pixel elements cannot be created using an object literal. |
- ASSERT(!copy->HasExternalArrayElements()); |
- switch (copy->GetElementsKind()) { |
- case FAST_SMI_ELEMENTS: |
- case FAST_ELEMENTS: |
- case FAST_HOLEY_SMI_ELEMENTS: |
- case FAST_HOLEY_ELEMENTS: { |
- FixedArray* elements = FixedArray::cast(copy->elements()); |
- if (elements->map() == heap->fixed_cow_array_map()) { |
- isolate->counters()->cow_arrays_created_runtime()->Increment(); |
-#ifdef DEBUG |
- for (int i = 0; i < elements->length(); i++) { |
- ASSERT(!elements->get(i)->IsJSObject()); |
- } |
-#endif |
- } else { |
- for (int i = 0; i < elements->length(); i++) { |
- Object* value = elements->get(i); |
- ASSERT(value->IsSmi() || |
- value->IsTheHole() || |
- (IsFastObjectElementsKind(copy->GetElementsKind()))); |
- if (value->IsJSObject()) { |
- JSObject* js_object = JSObject::cast(value); |
- { MaybeObject* maybe_result = DeepCopyBoilerplate(isolate, |
- js_object); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
- } |
- elements->set(i, result); |
- } |
- } |
- } |
- break; |
- } |
- case DICTIONARY_ELEMENTS: { |
- SeededNumberDictionary* element_dictionary = copy->element_dictionary(); |
- int capacity = element_dictionary->Capacity(); |
- for (int i = 0; i < capacity; i++) { |
- Object* k = element_dictionary->KeyAt(i); |
- if (element_dictionary->IsKey(k)) { |
- Object* value = element_dictionary->ValueAt(i); |
- if (value->IsJSObject()) { |
- JSObject* js_object = JSObject::cast(value); |
- { MaybeObject* maybe_result = DeepCopyBoilerplate(isolate, |
- js_object); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
- } |
- element_dictionary->ValueAtPut(i, result); |
- } |
- } |
- } |
- break; |
- } |
- case NON_STRICT_ARGUMENTS_ELEMENTS: |
- UNIMPLEMENTED(); |
- break; |
- case EXTERNAL_PIXEL_ELEMENTS: |
- case EXTERNAL_BYTE_ELEMENTS: |
- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
- case EXTERNAL_SHORT_ELEMENTS: |
- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
- case EXTERNAL_INT_ELEMENTS: |
- case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
- case EXTERNAL_FLOAT_ELEMENTS: |
- case EXTERNAL_DOUBLE_ELEMENTS: |
- case FAST_DOUBLE_ELEMENTS: |
- case FAST_HOLEY_DOUBLE_ELEMENTS: |
- // No contained objects, nothing to do. |
- break; |
- } |
- return copy; |
-} |
- |
- |
static Handle<Map> ComputeObjectLiteralMap( |
Handle<Context> context, |
Handle<FixedArray> constant_properties, |
@@ -599,7 +457,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteral) { |
// Update the functions literal and return the boilerplate. |
literals->set(literals_index, *boilerplate); |
} |
- return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); |
+ return JSObject::cast(*boilerplate)->DeepCopy(isolate); |
} |
@@ -646,7 +504,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) { |
// Update the functions literal and return the boilerplate. |
literals->set(literals_index, *boilerplate); |
} |
- return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); |
+ return JSObject::cast(*boilerplate)->DeepCopy(isolate); |
} |