| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include <stdlib.h> | 5 #include <stdlib.h> | 
| 6 #include <utility> | 6 #include <utility> | 
| 7 | 7 | 
| 8 #include "src/v8.h" | 8 #include "src/v8.h" | 
| 9 | 9 | 
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 60 | 60 | 
| 61   int next_field_offset = 0; | 61   int next_field_offset = 0; | 
| 62   for (int i = 0; i < kPropsCount; i++) { | 62   for (int i = 0; i < kPropsCount; i++) { | 
| 63     EmbeddedVector<char, 64> buffer; | 63     EmbeddedVector<char, 64> buffer; | 
| 64     SNPrintF(buffer, "prop%d", i); | 64     SNPrintF(buffer, "prop%d", i); | 
| 65     Handle<String> name = factory->InternalizeUtf8String(buffer.start()); | 65     Handle<String> name = factory->InternalizeUtf8String(buffer.start()); | 
| 66 | 66 | 
| 67     TestPropertyKind kind = props[i]; | 67     TestPropertyKind kind = props[i]; | 
| 68 | 68 | 
| 69     if (kind == PROP_CONSTANT) { | 69     if (kind == PROP_CONSTANT) { | 
| 70       ConstantDescriptor d(name, func, NONE); | 70       DataConstantDescriptor d(name, func, NONE); | 
| 71       descriptors->Append(&d); | 71       descriptors->Append(&d); | 
| 72 | 72 | 
| 73     } else { | 73     } else { | 
| 74       FieldDescriptor f(name, next_field_offset, NONE, representations[kind]); | 74       DataDescriptor f(name, next_field_offset, NONE, representations[kind]); | 
| 75       next_field_offset += f.GetDetails().field_width_in_words(); | 75       next_field_offset += f.GetDetails().field_width_in_words(); | 
| 76       descriptors->Append(&f); | 76       descriptors->Append(&f); | 
| 77     } | 77     } | 
| 78   } | 78   } | 
| 79   return descriptors; | 79   return descriptors; | 
| 80 } | 80 } | 
| 81 | 81 | 
| 82 | 82 | 
| 83 TEST(LayoutDescriptorBasicFast) { | 83 TEST(LayoutDescriptorBasicFast) { | 
| 84   CcTest::InitializeVM(); | 84   CcTest::InitializeVM(); | 
| (...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 534     DCHECK(layout_descriptor->IsConsistentWithMap(*map)); | 534     DCHECK(layout_descriptor->IsConsistentWithMap(*map)); | 
| 535   } | 535   } | 
| 536 | 536 | 
| 537   { | 537   { | 
| 538     int inobject_properties = kPropsCount / 2; | 538     int inobject_properties = kPropsCount / 2; | 
| 539     Handle<Map> map = Map::Create(isolate, inobject_properties); | 539     Handle<Map> map = Map::Create(isolate, inobject_properties); | 
| 540     layout_descriptor = LayoutDescriptor::New(map, descriptors, kPropsCount); | 540     layout_descriptor = LayoutDescriptor::New(map, descriptors, kPropsCount); | 
| 541     CHECK_NE(LayoutDescriptor::FastPointerLayout(), *layout_descriptor); | 541     CHECK_NE(LayoutDescriptor::FastPointerLayout(), *layout_descriptor); | 
| 542     CHECK(layout_descriptor->IsSlowLayout()); | 542     CHECK(layout_descriptor->IsSlowLayout()); | 
| 543     for (int i = 0; i < inobject_properties; i++) { | 543     for (int i = 0; i < inobject_properties; i++) { | 
| 544       // PROP_DOUBLE has index 1 among FIELD properties. | 544       // PROP_DOUBLE has index 1 among DATA properties. | 
| 545       const bool tagged = (i % (PROP_KIND_NUMBER - 1)) != 1; | 545       const bool tagged = (i % (PROP_KIND_NUMBER - 1)) != 1; | 
| 546       CHECK_EQ(tagged, layout_descriptor->IsTagged(i)); | 546       CHECK_EQ(tagged, layout_descriptor->IsTagged(i)); | 
| 547     } | 547     } | 
| 548     // Every property after inobject_properties must be tagged. | 548     // Every property after inobject_properties must be tagged. | 
| 549     for (int i = inobject_properties; i < kPropsCount; i++) { | 549     for (int i = inobject_properties; i < kPropsCount; i++) { | 
| 550       CHECK_EQ(true, layout_descriptor->IsTagged(i)); | 550       CHECK_EQ(true, layout_descriptor->IsTagged(i)); | 
| 551     } | 551     } | 
| 552     map->InitializeDescriptors(*descriptors, *layout_descriptor); | 552     map->InitializeDescriptors(*descriptors, *layout_descriptor); | 
| 553     DCHECK(layout_descriptor->IsConsistentWithMap(*map)); | 553     DCHECK(layout_descriptor->IsConsistentWithMap(*map)); | 
| 554 | 554 | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 593 | 593 | 
| 594   int next_field_offset = 0; | 594   int next_field_offset = 0; | 
| 595   for (int i = 0; i < kPropsCount; i++) { | 595   for (int i = 0; i < kPropsCount; i++) { | 
| 596     EmbeddedVector<char, 64> buffer; | 596     EmbeddedVector<char, 64> buffer; | 
| 597     SNPrintF(buffer, "prop%d", i); | 597     SNPrintF(buffer, "prop%d", i); | 
| 598     Handle<String> name = factory->InternalizeUtf8String(buffer.start()); | 598     Handle<String> name = factory->InternalizeUtf8String(buffer.start()); | 
| 599 | 599 | 
| 600     Handle<LayoutDescriptor> layout_descriptor; | 600     Handle<LayoutDescriptor> layout_descriptor; | 
| 601     TestPropertyKind kind = props[i]; | 601     TestPropertyKind kind = props[i]; | 
| 602     if (kind == PROP_CONSTANT) { | 602     if (kind == PROP_CONSTANT) { | 
| 603       ConstantDescriptor d(name, func, NONE); | 603       DataConstantDescriptor d(name, func, NONE); | 
| 604       layout_descriptor = LayoutDescriptor::Append(map, d.GetDetails()); | 604       layout_descriptor = LayoutDescriptor::Append(map, d.GetDetails()); | 
| 605       descriptors->Append(&d); | 605       descriptors->Append(&d); | 
| 606 | 606 | 
| 607     } else { | 607     } else { | 
| 608       FieldDescriptor f(name, next_field_offset, NONE, representations[kind]); | 608       DataDescriptor f(name, next_field_offset, NONE, representations[kind]); | 
| 609       int field_width_in_words = f.GetDetails().field_width_in_words(); | 609       int field_width_in_words = f.GetDetails().field_width_in_words(); | 
| 610       next_field_offset += field_width_in_words; | 610       next_field_offset += field_width_in_words; | 
| 611       layout_descriptor = LayoutDescriptor::Append(map, f.GetDetails()); | 611       layout_descriptor = LayoutDescriptor::Append(map, f.GetDetails()); | 
| 612       descriptors->Append(&f); | 612       descriptors->Append(&f); | 
| 613 | 613 | 
| 614       int field_index = f.GetDetails().field_index(); | 614       int field_index = f.GetDetails().field_index(); | 
| 615       bool is_inobject = field_index < map->inobject_properties(); | 615       bool is_inobject = field_index < map->inobject_properties(); | 
| 616       for (int bit = 0; bit < field_width_in_words; bit++) { | 616       for (int bit = 0; bit < field_width_in_words; bit++) { | 
| 617         CHECK_EQ(is_inobject && (kind == PROP_DOUBLE), | 617         CHECK_EQ(is_inobject && (kind == PROP_DOUBLE), | 
| 618                  !layout_descriptor->IsTagged(field_index + bit)); | 618                  !layout_descriptor->IsTagged(field_index + bit)); | 
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 729     map = Map::CopyInstallDescriptorsForTesting(map, i, descriptors, | 729     map = Map::CopyInstallDescriptorsForTesting(map, i, descriptors, | 
| 730                                                 full_layout_descriptor); | 730                                                 full_layout_descriptor); | 
| 731 | 731 | 
| 732     LayoutDescriptor* layout_desc = map->layout_descriptor(); | 732     LayoutDescriptor* layout_desc = map->layout_descriptor(); | 
| 733 | 733 | 
| 734     if (layout_desc->IsSlowLayout()) { | 734     if (layout_desc->IsSlowLayout()) { | 
| 735       switched_to_slow_mode = true; | 735       switched_to_slow_mode = true; | 
| 736       CHECK_EQ(*full_layout_descriptor, layout_desc); | 736       CHECK_EQ(*full_layout_descriptor, layout_desc); | 
| 737     } else { | 737     } else { | 
| 738       CHECK(!switched_to_slow_mode); | 738       CHECK(!switched_to_slow_mode); | 
| 739       if (details.type() == FIELD) { | 739       if (details.type() == DATA) { | 
| 740         nof++; | 740         nof++; | 
| 741         int field_index = details.field_index(); | 741         int field_index = details.field_index(); | 
| 742         int field_width_in_words = details.field_width_in_words(); | 742         int field_width_in_words = details.field_width_in_words(); | 
| 743 | 743 | 
| 744         bool is_inobject = field_index < map->inobject_properties(); | 744         bool is_inobject = field_index < map->inobject_properties(); | 
| 745         for (int bit = 0; bit < field_width_in_words; bit++) { | 745         for (int bit = 0; bit < field_width_in_words; bit++) { | 
| 746           CHECK_EQ(is_inobject && details.representation().IsDouble(), | 746           CHECK_EQ(is_inobject && details.representation().IsDouble(), | 
| 747                    !layout_desc->IsTagged(field_index + bit)); | 747                    !layout_desc->IsTagged(field_index + bit)); | 
| 748         } | 748         } | 
| 749         CHECK(layout_desc->IsTagged(field_index + field_width_in_words)); | 749         CHECK(layout_desc->IsTagged(field_index + field_width_in_words)); | 
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 964 | 964 | 
| 965   LayoutDescriptorHelper helper(*map); | 965   LayoutDescriptorHelper helper(*map); | 
| 966   bool all_fields_tagged = true; | 966   bool all_fields_tagged = true; | 
| 967 | 967 | 
| 968   int instance_size = map->instance_size(); | 968   int instance_size = map->instance_size(); | 
| 969 | 969 | 
| 970   int end_offset = instance_size * 2; | 970   int end_offset = instance_size * 2; | 
| 971   int first_non_tagged_field_offset = end_offset; | 971   int first_non_tagged_field_offset = end_offset; | 
| 972   for (int i = 0; i < number_of_descriptors; i++) { | 972   for (int i = 0; i < number_of_descriptors; i++) { | 
| 973     PropertyDetails details = descriptors->GetDetails(i); | 973     PropertyDetails details = descriptors->GetDetails(i); | 
| 974     if (details.type() != FIELD) continue; | 974     if (details.type() != DATA) continue; | 
| 975     FieldIndex index = FieldIndex::ForDescriptor(*map, i); | 975     FieldIndex index = FieldIndex::ForDescriptor(*map, i); | 
| 976     if (!index.is_inobject()) continue; | 976     if (!index.is_inobject()) continue; | 
| 977     all_fields_tagged &= !details.representation().IsDouble(); | 977     all_fields_tagged &= !details.representation().IsDouble(); | 
| 978     bool expected_tagged = !index.is_double(); | 978     bool expected_tagged = !index.is_double(); | 
| 979     if (!expected_tagged) { | 979     if (!expected_tagged) { | 
| 980       first_non_tagged_field_offset = | 980       first_non_tagged_field_offset = | 
| 981           Min(first_non_tagged_field_offset, index.offset()); | 981           Min(first_non_tagged_field_offset, index.offset()); | 
| 982     } | 982     } | 
| 983 | 983 | 
| 984     int end_of_region_offset; | 984     int end_of_region_offset; | 
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1153   MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address()); | 1153   MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address()); | 
| 1154   chunk->set_scan_on_scavenge(true); | 1154   chunk->set_scan_on_scavenge(true); | 
| 1155 | 1155 | 
| 1156   // Trigger GCs and force evacuation. Should not crash there. | 1156   // Trigger GCs and force evacuation. Should not crash there. | 
| 1157   CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 1157   CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 
| 1158 | 1158 | 
| 1159   CHECK_EQ(boom_value, GetDoubleFieldValue(*obj, field_index)); | 1159   CHECK_EQ(boom_value, GetDoubleFieldValue(*obj, field_index)); | 
| 1160 } | 1160 } | 
| 1161 | 1161 | 
| 1162 #endif | 1162 #endif | 
| OLD | NEW | 
|---|