| Index: test/cctest/test-unboxed-doubles.cc
|
| diff --git a/test/cctest/test-unboxed-doubles.cc b/test/cctest/test-unboxed-doubles.cc
|
| index 81ca9992879cbe5591b1d6b4e53a9e9722659830..7b466621e32d601f8cb60ff75376ca0e77b2329b 100644
|
| --- a/test/cctest/test-unboxed-doubles.cc
|
| +++ b/test/cctest/test-unboxed-doubles.cc
|
| @@ -7,6 +7,7 @@
|
|
|
| #include "src/v8.h"
|
|
|
| +#include "src/accessors.h"
|
| #include "src/compilation-cache.h"
|
| #include "src/execution.h"
|
| #include "src/factory.h"
|
| @@ -78,9 +79,8 @@ void WriteToField(JSObject* object, int descriptor, Object* value) {
|
|
|
| const int kNumberOfBits = 32;
|
|
|
| -
|
| enum TestPropertyKind {
|
| - PROP_CONSTANT,
|
| + PROP_ACCESSOR_INFO,
|
| PROP_SMI,
|
| PROP_DOUBLE,
|
| PROP_TAGGED,
|
| @@ -97,9 +97,6 @@ static Handle<DescriptorArray> CreateDescriptorArray(Isolate* isolate,
|
| int kPropsCount) {
|
| Factory* factory = isolate->factory();
|
|
|
| - Handle<String> func_name = factory->InternalizeUtf8String("func");
|
| - Handle<JSFunction> func = factory->NewFunction(func_name);
|
| -
|
| Handle<DescriptorArray> descriptors =
|
| DescriptorArray::Allocate(isolate, 0, kPropsCount);
|
|
|
| @@ -111,15 +108,20 @@ static Handle<DescriptorArray> CreateDescriptorArray(Isolate* isolate,
|
|
|
| TestPropertyKind kind = props[i];
|
|
|
| - if (kind == PROP_CONSTANT) {
|
| - Descriptor d = Descriptor::DataConstant(name, func, NONE);
|
| - descriptors->Append(&d);
|
| + Descriptor d;
|
| + if (kind == PROP_ACCESSOR_INFO) {
|
| + Handle<AccessorInfo> info =
|
| + Accessors::MakeAccessor(isolate, name, nullptr, nullptr, NONE);
|
| + d = Descriptor::AccessorConstant(name, info, NONE);
|
|
|
| } else {
|
| - Descriptor d = Descriptor::DataField(name, next_field_offset, NONE,
|
| - representations[kind]);
|
| - next_field_offset += d.GetDetails().field_width_in_words();
|
| - descriptors->Append(&d);
|
| + d = Descriptor::DataField(name, next_field_offset, NONE,
|
| + representations[kind]);
|
| + }
|
| + descriptors->Append(&d);
|
| + PropertyDetails details = d.GetDetails();
|
| + if (details.location() == kField) {
|
| + next_field_offset += details.field_width_in_words();
|
| }
|
| }
|
| return descriptors;
|
| @@ -488,13 +490,13 @@ TEST(LayoutDescriptorCreateNewFast) {
|
|
|
| Handle<LayoutDescriptor> layout_descriptor;
|
| TestPropertyKind props[] = {
|
| - PROP_CONSTANT,
|
| + PROP_ACCESSOR_INFO,
|
| PROP_TAGGED, // field #0
|
| - PROP_CONSTANT,
|
| + PROP_ACCESSOR_INFO,
|
| PROP_DOUBLE, // field #1
|
| - PROP_CONSTANT,
|
| + PROP_ACCESSOR_INFO,
|
| PROP_TAGGED, // field #2
|
| - PROP_CONSTANT,
|
| + PROP_ACCESSOR_INFO,
|
| };
|
| const int kPropsCount = arraysize(props);
|
|
|
| @@ -616,9 +618,6 @@ static Handle<LayoutDescriptor> TestLayoutDescriptorAppend(
|
| int kPropsCount) {
|
| Factory* factory = isolate->factory();
|
|
|
| - Handle<String> func_name = factory->InternalizeUtf8String("func");
|
| - Handle<JSFunction> func = factory->NewFunction(func_name);
|
| -
|
| Handle<DescriptorArray> descriptors =
|
| DescriptorArray::Allocate(isolate, 0, kPropsCount);
|
|
|
| @@ -634,20 +633,24 @@ static Handle<LayoutDescriptor> TestLayoutDescriptorAppend(
|
|
|
| Handle<LayoutDescriptor> layout_descriptor;
|
| TestPropertyKind kind = props[i];
|
| - if (kind == PROP_CONSTANT) {
|
| - Descriptor d = Descriptor::DataConstant(name, func, NONE);
|
| - layout_descriptor = LayoutDescriptor::ShareAppend(map, d.GetDetails());
|
| - descriptors->Append(&d);
|
| + Descriptor d;
|
| + if (kind == PROP_ACCESSOR_INFO) {
|
| + Handle<AccessorInfo> info =
|
| + Accessors::MakeAccessor(isolate, name, nullptr, nullptr, NONE);
|
| + d = Descriptor::AccessorConstant(name, info, NONE);
|
|
|
| } else {
|
| - Descriptor d = Descriptor::DataField(name, next_field_offset, NONE,
|
| - representations[kind]);
|
| - int field_width_in_words = d.GetDetails().field_width_in_words();
|
| + d = Descriptor::DataField(name, next_field_offset, NONE,
|
| + representations[kind]);
|
| + }
|
| + PropertyDetails details = d.GetDetails();
|
| + layout_descriptor = LayoutDescriptor::ShareAppend(map, details);
|
| + descriptors->Append(&d);
|
| + if (details.location() == kField) {
|
| + int field_width_in_words = details.field_width_in_words();
|
| next_field_offset += field_width_in_words;
|
| - layout_descriptor = LayoutDescriptor::ShareAppend(map, d.GetDetails());
|
| - descriptors->Append(&d);
|
|
|
| - int field_index = d.GetDetails().field_index();
|
| + int field_index = details.field_index();
|
| bool is_inobject = field_index < map->GetInObjectProperties();
|
| for (int bit = 0; bit < field_width_in_words; bit++) {
|
| CHECK_EQ(is_inobject && (kind == PROP_DOUBLE),
|
| @@ -958,13 +961,14 @@ TEST(DescriptorArrayTrimming) {
|
| Handle<FieldType> any_type = FieldType::Any(isolate);
|
| Handle<Map> map = Map::Create(isolate, kFieldCount);
|
| for (int i = 0; i < kSplitFieldIndex; i++) {
|
| - map = Map::CopyWithField(map, MakeName("prop", i), any_type, NONE,
|
| - Representation::Smi(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + map = Map::CopyWithField(map, MakeName("prop", i), any_type, NONE, kMutable,
|
| + Representation::Smi(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| }
|
| - map = Map::CopyWithField(map, MakeName("dbl", kSplitFieldIndex), any_type,
|
| - NONE, Representation::Double(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + map =
|
| + Map::CopyWithField(map, MakeName("dbl", kSplitFieldIndex), any_type, NONE,
|
| + kMutable, Representation::Double(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| CHECK(map->layout_descriptor()->IsConsistentWithMap(*map, true));
|
| CHECK(map->layout_descriptor()->IsSlowLayout());
|
| CHECK(map->owns_descriptors());
|
| @@ -977,8 +981,9 @@ TEST(DescriptorArrayTrimming) {
|
| Handle<Map> tmp_map = map;
|
| for (int i = kSplitFieldIndex + 1; i < kFieldCount; i++) {
|
| tmp_map = Map::CopyWithField(tmp_map, MakeName("dbl", i), any_type, NONE,
|
| - Representation::Double(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + kMutable, Representation::Double(),
|
| + INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| CHECK(tmp_map->layout_descriptor()->IsConsistentWithMap(*tmp_map, true));
|
| }
|
| // Check that descriptors are shared.
|
| @@ -1016,13 +1021,15 @@ TEST(DescriptorArrayTrimming) {
|
| Handle<Map> tmp_map = map;
|
| for (int i = kSplitFieldIndex + 1; i < kFieldCount - 1; i++) {
|
| tmp_map = Map::CopyWithField(tmp_map, MakeName("tagged", i), any_type,
|
| - NONE, Representation::Tagged(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + NONE, kMutable, Representation::Tagged(),
|
| + INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| CHECK(tmp_map->layout_descriptor()->IsConsistentWithMap(*tmp_map, true));
|
| }
|
| - tmp_map = Map::CopyWithField(tmp_map, MakeString("dbl"), any_type, NONE,
|
| - Representation::Double(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + tmp_map =
|
| + Map::CopyWithField(tmp_map, MakeString("dbl"), any_type, NONE, kMutable,
|
| + Representation::Double(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| CHECK(tmp_map->layout_descriptor()->IsConsistentWithMap(*tmp_map, true));
|
| // Check that descriptors are shared.
|
| CHECK(tmp_map->owns_descriptors());
|
| @@ -1045,9 +1052,9 @@ TEST(DoScavenge) {
|
|
|
| Handle<FieldType> any_type = FieldType::Any(isolate);
|
| Handle<Map> map = Map::Create(isolate, 10);
|
| - map = Map::CopyWithField(map, MakeName("prop", 0), any_type, NONE,
|
| - Representation::Double(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + map = Map::CopyWithField(map, MakeName("prop", 0), any_type, NONE, kMutable,
|
| + Representation::Double(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
|
|
| // Create object in new space.
|
| Handle<JSObject> obj = factory->NewJSObjectFromMap(map, NOT_TENURED);
|
| @@ -1107,12 +1114,12 @@ TEST(DoScavengeWithIncrementalWriteBarrier) {
|
|
|
| Handle<FieldType> any_type = FieldType::Any(isolate);
|
| Handle<Map> map = Map::Create(isolate, 10);
|
| - map = Map::CopyWithField(map, MakeName("prop", 0), any_type, NONE,
|
| - Representation::Double(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| - map = Map::CopyWithField(map, MakeName("prop", 1), any_type, NONE,
|
| - Representation::Tagged(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + map = Map::CopyWithField(map, MakeName("prop", 0), any_type, NONE, kMutable,
|
| + Representation::Double(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| + map = Map::CopyWithField(map, MakeName("prop", 1), any_type, NONE, kMutable,
|
| + Representation::Tagged(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
|
|
| // Create |obj_value| in old space.
|
| Handle<HeapObject> obj_value;
|
| @@ -1335,12 +1342,14 @@ TEST(LayoutDescriptorSharing) {
|
| Handle<Map> map = Map::Create(isolate, 64);
|
| for (int i = 0; i < 32; i++) {
|
| Handle<String> name = MakeName("prop", i);
|
| - map = Map::CopyWithField(map, name, any_type, NONE, Representation::Smi(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + map = Map::CopyWithField(map, name, any_type, NONE, kMutable,
|
| + Representation::Smi(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| }
|
| - split_map = Map::CopyWithField(map, MakeString("dbl"), any_type, NONE,
|
| - Representation::Double(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + split_map =
|
| + Map::CopyWithField(map, MakeString("dbl"), any_type, NONE, kMutable,
|
| + Representation::Double(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| }
|
| Handle<LayoutDescriptor> split_layout_descriptor(
|
| split_map->layout_descriptor(), isolate);
|
| @@ -1348,9 +1357,10 @@ TEST(LayoutDescriptorSharing) {
|
| CHECK(split_layout_descriptor->IsSlowLayout());
|
| CHECK(split_map->owns_descriptors());
|
|
|
| - Handle<Map> map1 = Map::CopyWithField(split_map, MakeString("foo"), any_type,
|
| - NONE, Representation::Double(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + Handle<Map> map1 =
|
| + Map::CopyWithField(split_map, MakeString("foo"), any_type, NONE, kMutable,
|
| + Representation::Double(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| CHECK(!split_map->owns_descriptors());
|
| CHECK_EQ(*split_layout_descriptor, split_map->layout_descriptor());
|
|
|
| @@ -1359,9 +1369,10 @@ TEST(LayoutDescriptorSharing) {
|
| CHECK_EQ(*split_layout_descriptor, map1->layout_descriptor());
|
| CHECK(map1->layout_descriptor()->IsConsistentWithMap(*map1, true));
|
|
|
| - Handle<Map> map2 = Map::CopyWithField(split_map, MakeString("bar"), any_type,
|
| - NONE, Representation::Tagged(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + Handle<Map> map2 =
|
| + Map::CopyWithField(split_map, MakeString("bar"), any_type, NONE, kMutable,
|
| + Representation::Tagged(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
|
|
| // Layout descriptors should not be shared with |split_map|.
|
| CHECK(map2->owns_descriptors());
|
| @@ -1531,12 +1542,12 @@ static void TestWriteBarrierObjectShiftFieldsRight(
|
| Handle<Map> map = Map::Create(isolate, 10);
|
| map = Map::CopyWithConstant(map, MakeName("prop", 0), func, NONE,
|
| INSERT_TRANSITION).ToHandleChecked();
|
| - map = Map::CopyWithField(map, MakeName("prop", 1), any_type, NONE,
|
| - Representation::Double(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| - map = Map::CopyWithField(map, MakeName("prop", 2), any_type, NONE,
|
| - Representation::Tagged(),
|
| - INSERT_TRANSITION).ToHandleChecked();
|
| + map = Map::CopyWithField(map, MakeName("prop", 1), any_type, NONE, kMutable,
|
| + Representation::Double(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
| + map = Map::CopyWithField(map, MakeName("prop", 2), any_type, NONE, kMutable,
|
| + Representation::Tagged(), INSERT_TRANSITION)
|
| + .ToHandleChecked();
|
|
|
| // Shift fields right by turning constant property to a field.
|
| Handle<Map> new_map = Map::ReconfigureProperty(
|
|
|