| Index: test/cctest/test-inobject-slack-tracking.cc
|
| diff --git a/test/cctest/test-inobject-slack-tracking.cc b/test/cctest/test-inobject-slack-tracking.cc
|
| index 3c46fbee065cd08f1431aff7a9867c9aef9cc4a0..23e12e7249e513456827b516670fd4e44c8fbc75 100644
|
| --- a/test/cctest/test-inobject-slack-tracking.cc
|
| +++ b/test/cctest/test-inobject-slack-tracking.cc
|
| @@ -724,6 +724,112 @@ TEST(InobjectPropetiesCountOverflowInSubclass) {
|
| TestClassHierarchy(hierarchy_desc, kNoOverflowCount);
|
| }
|
|
|
| +static void CheckExpectedProperties(int expected, std::ostringstream& os) {
|
| + Handle<HeapObject> obj = Handle<HeapObject>::cast(
|
| + v8::Utils::OpenHandle(*CompileRun(os.str().c_str())));
|
| + CHECK_EQ(expected, obj->map()->GetInObjectProperties());
|
| +}
|
| +
|
| +TEST(ObjectLiteralPropertyBackingStoreSize) {
|
| + v8::HandleScope scope(CcTest::isolate());
|
| + LocalContext env;
|
| +
|
| + std::ostringstream os;
|
| +
|
| + // An index key does not require space in the property backing store.
|
| + os << "(function() {\n"
|
| + " function f() {\n"
|
| + " var o = {\n"
|
| + " '-1': 42,\n" // Allocate for non-index key.
|
| + " 1: 42,\n" // Do not allocate for index key.
|
| + " '2': 42\n" // Do not allocate for index key.
|
| + " };\n"
|
| + " return o;\n"
|
| + " }\n"
|
| + "\n"
|
| + " return f();\n"
|
| + "} )();";
|
| + CheckExpectedProperties(1, os);
|
| +
|
| + // Avoid over-/under-allocation for computed property names.
|
| + os << "(function() {\n"
|
| + " function f(x) {\n"
|
| + " var o = {\n"
|
| + " 1: 42,\n" // Do not allocate for index key.
|
| + " '2': 42,\n" // Do not allocate for index key.
|
| + " [x]: 42,\n" // Allocate for property with computed name.
|
| + " 3: 42\n" // Allocate for index key because we have seen a
|
| + // computed property.
|
| + " };\n"
|
| + " return o;\n"
|
| + " }\n"
|
| + "\n"
|
| + " var x = 'hello'\n"
|
| + "\n"
|
| + " return f(x);\n"
|
| + "} )();";
|
| + CheckExpectedProperties(2, os);
|
| +
|
| + os << "(function() {\n"
|
| + " function f() {\n"
|
| + " var o = {};\n"
|
| + " return o;\n"
|
| + " }\n"
|
| + "\n"
|
| + " return f();\n"
|
| + "} )();";
|
| + // Empty objects have slack for 4 properties.
|
| + CheckExpectedProperties(4, os);
|
| +
|
| + os << "(function() {\n"
|
| + " function f(x) {\n"
|
| + " var o = {\n"
|
| + " a: 42,\n" // Allocate for constant property.
|
| + " [x]: 42,\n" // Allocate for property with computed name.
|
| + " b: 42\n" // Allocate for constant property.
|
| + " };\n"
|
| + " return o;\n"
|
| + " }\n"
|
| + "\n"
|
| + " var x = 'hello'\n"
|
| + "\n"
|
| + " return f(x);\n"
|
| + "} )();";
|
| + CheckExpectedProperties(3, os);
|
| +
|
| + os << "(function() {\n"
|
| + " function f(x) {\n"
|
| + " var o = {\n"
|
| + " a: 42,\n" // Allocate for constant property.
|
| + " __proto__: 42,\n" // Do not allocate for __proto__.
|
| + " [x]: 42\n" // Allocate for property with computed name.
|
| + " };\n"
|
| + " return o;\n"
|
| + " }\n"
|
| + "\n"
|
| + " var x = 'hello'\n"
|
| + "\n"
|
| + " return f(x);\n"
|
| + "} )();";
|
| + // __proto__ is not allocated in the backing store.
|
| + CheckExpectedProperties(2, os);
|
| +
|
| + os << "(function() {\n"
|
| + " function f(x) {\n"
|
| + " var o = {\n"
|
| + " a: 42,\n" // Allocate for constant property.
|
| + " [x]: 42,\n" // Allocate for property with computed name.
|
| + " __proto__: 42\n" // Do not allocate for __proto__.
|
| + " };\n"
|
| + " return o;\n"
|
| + " }\n"
|
| + "\n"
|
| + " var x = 'hello'\n"
|
| + "\n"
|
| + " return f(x);\n"
|
| + "} )();";
|
| + CheckExpectedProperties(2, os);
|
| +}
|
|
|
| TEST(SlowModeSubclass) {
|
| // Avoid eventual completion of in-object slack tracking.
|
|
|