Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 568ada8a1165e3c1d2989263cb6ba03cf8df1288..c08c1e67029cf1a15f099b037fadf1a4eb534c50 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -245,13 +245,14 @@ MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate( |
int length = constant_properties->length(); |
bool should_transform = |
!is_result_from_cache && boilerplate->HasFastProperties(); |
- if (should_transform || has_function_literal) { |
- // Normalize the properties of object to avoid n^2 behavior |
- // when extending the object multiple properties. Indicate the number of |
- // properties to be added. |
+ bool should_normalize = should_transform || has_function_literal; |
+ if (should_normalize) { |
+ // TODO(verwaest): We might not want to ever normalize here. |
JSObject::NormalizeProperties( |
boilerplate, KEEP_INOBJECT_PROPERTIES, length / 2); |
} |
+ Object::ValueType value_type = should_normalize |
+ ? Object::FORCE_TAGGED : Object::OPTIMAL_REPRESENTATION; |
// TODO(verwaest): Support tracking representations in the boilerplate. |
for (int index = 0; index < length; index +=2) { |
@@ -279,7 +280,7 @@ MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate( |
ASSERT(!name->AsArrayIndex(&element_index)); |
maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( |
boilerplate, name, value, NONE, |
- Object::OPTIMAL_REPRESENTATION, mode); |
+ value_type, mode); |
} |
} else if (key->ToArrayIndex(&element_index)) { |
// Array index (uint32). |
@@ -295,7 +296,7 @@ MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate( |
Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str); |
maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( |
boilerplate, name, value, NONE, |
- Object::OPTIMAL_REPRESENTATION, mode); |
+ value_type, mode); |
} |
// If setting the property on the boilerplate throws an |
// exception, the exception is converted to an empty handle in |