| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 <iomanip> | 5 #include <iomanip> |
| 6 #include <sstream> | 6 #include <sstream> |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 } | 66 } |
| 67 return HeapType::Any(isolate); | 67 return HeapType::Any(isolate); |
| 68 } | 68 } |
| 69 | 69 |
| 70 | 70 |
| 71 MaybeHandle<JSReceiver> Object::ToObject(Isolate* isolate, | 71 MaybeHandle<JSReceiver> Object::ToObject(Isolate* isolate, |
| 72 Handle<Object> object, | 72 Handle<Object> object, |
| 73 Handle<Context> native_context) { | 73 Handle<Context> native_context) { |
| 74 if (object->IsJSReceiver()) return Handle<JSReceiver>::cast(object); | 74 if (object->IsJSReceiver()) return Handle<JSReceiver>::cast(object); |
| 75 Handle<JSFunction> constructor; | 75 Handle<JSFunction> constructor; |
| 76 if (object->IsNumber()) { | 76 if (object->IsSmi()) { |
| 77 constructor = handle(native_context->number_function(), isolate); | 77 constructor = handle(native_context->number_function(), isolate); |
| 78 } else if (object->IsBoolean()) { | 78 } else { |
| 79 constructor = handle(native_context->boolean_function(), isolate); | 79 int constructor_function_index = |
| 80 } else if (object->IsString()) { | 80 Handle<HeapObject>::cast(object)->map()->GetConstructorFunctionIndex(); |
| 81 constructor = handle(native_context->string_function(), isolate); | 81 if (constructor_function_index == Map::kNoConstructorFunctionIndex) { |
| 82 } else if (object->IsSymbol()) { | 82 return MaybeHandle<JSReceiver>(); |
| 83 constructor = handle(native_context->symbol_function(), isolate); | |
| 84 } else if (object->IsSimd128Value()) { | |
| 85 if (object->IsFloat32x4()) { | |
| 86 constructor = handle(native_context->float32x4_function(), isolate); | |
| 87 } else if (object->IsInt32x4()) { | |
| 88 constructor = handle(native_context->int32x4_function(), isolate); | |
| 89 } else if (object->IsBool32x4()) { | |
| 90 constructor = handle(native_context->bool32x4_function(), isolate); | |
| 91 } else if (object->IsInt16x8()) { | |
| 92 constructor = handle(native_context->int16x8_function(), isolate); | |
| 93 } else if (object->IsBool16x8()) { | |
| 94 constructor = handle(native_context->bool16x8_function(), isolate); | |
| 95 } else if (object->IsInt8x16()) { | |
| 96 constructor = handle(native_context->int8x16_function(), isolate); | |
| 97 } else if (object->IsBool8x16()) { | |
| 98 constructor = handle(native_context->bool8x16_function(), isolate); | |
| 99 } else { | |
| 100 UNREACHABLE(); | |
| 101 } | 83 } |
| 102 } else { | 84 constructor = handle( |
| 103 return MaybeHandle<JSReceiver>(); | 85 JSFunction::cast(native_context->get(constructor_function_index)), |
| 86 isolate); |
| 104 } | 87 } |
| 105 Handle<JSObject> result = isolate->factory()->NewJSObject(constructor); | 88 Handle<JSObject> result = isolate->factory()->NewJSObject(constructor); |
| 106 Handle<JSValue>::cast(result)->set_value(*object); | 89 Handle<JSValue>::cast(result)->set_value(*object); |
| 107 return result; | 90 return result; |
| 108 } | 91 } |
| 109 | 92 |
| 110 | 93 |
| 111 bool Object::BooleanValue() { | 94 bool Object::BooleanValue() { |
| 112 if (IsBoolean()) return IsTrue(); | 95 if (IsBoolean()) return IsTrue(); |
| 113 if (IsSmi()) return Smi::cast(this)->value() != 0; | 96 if (IsSmi()) return Smi::cast(this)->value() != 0; |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 details = details.set_index(enumeration_index); | 595 details = details.set_index(enumeration_index); |
| 613 property_dictionary->SetEntry(entry, name, value, details); | 596 property_dictionary->SetEntry(entry, name, value, details); |
| 614 } | 597 } |
| 615 } | 598 } |
| 616 } | 599 } |
| 617 | 600 |
| 618 | 601 |
| 619 Map* Object::GetRootMap(Isolate* isolate) { | 602 Map* Object::GetRootMap(Isolate* isolate) { |
| 620 DisallowHeapAllocation no_alloc; | 603 DisallowHeapAllocation no_alloc; |
| 621 if (IsSmi()) { | 604 if (IsSmi()) { |
| 622 Context* context = isolate->context()->native_context(); | 605 Context* native_context = isolate->context()->native_context(); |
| 623 return context->number_function()->initial_map(); | 606 return native_context->number_function()->initial_map(); |
| 624 } | 607 } |
| 625 | 608 |
| 626 HeapObject* heap_object = HeapObject::cast(this); | |
| 627 | |
| 628 // The object is either a number, a string, a symbol, a boolean, a SIMD value, | 609 // The object is either a number, a string, a symbol, a boolean, a SIMD value, |
| 629 // a real JS object, or a Harmony proxy. | 610 // a real JS object, or a Harmony proxy. |
| 611 HeapObject* heap_object = HeapObject::cast(this); |
| 630 if (heap_object->IsJSReceiver()) { | 612 if (heap_object->IsJSReceiver()) { |
| 631 return heap_object->map(); | 613 return heap_object->map(); |
| 632 } | 614 } |
| 633 Context* context = isolate->context()->native_context(); | 615 int constructor_function_index = |
| 634 | 616 heap_object->map()->GetConstructorFunctionIndex(); |
| 635 if (heap_object->IsHeapNumber()) { | 617 if (constructor_function_index != Map::kNoConstructorFunctionIndex) { |
| 636 return context->number_function()->initial_map(); | 618 Context* native_context = isolate->context()->native_context(); |
| 637 } | 619 JSFunction* constructor_function = |
| 638 if (heap_object->IsString()) { | 620 JSFunction::cast(native_context->get(constructor_function_index)); |
| 639 return context->string_function()->initial_map(); | 621 return constructor_function->initial_map(); |
| 640 } | |
| 641 if (heap_object->IsSymbol()) { | |
| 642 return context->symbol_function()->initial_map(); | |
| 643 } | |
| 644 if (heap_object->IsBoolean()) { | |
| 645 return context->boolean_function()->initial_map(); | |
| 646 } | |
| 647 if (heap_object->IsSimd128Value()) { | |
| 648 if (heap_object->IsFloat32x4()) { | |
| 649 return context->float32x4_function()->initial_map(); | |
| 650 } else if (heap_object->IsInt32x4()) { | |
| 651 return context->int32x4_function()->initial_map(); | |
| 652 } else if (heap_object->IsBool32x4()) { | |
| 653 return context->bool32x4_function()->initial_map(); | |
| 654 } else if (heap_object->IsInt16x8()) { | |
| 655 return context->int16x8_function()->initial_map(); | |
| 656 } else if (heap_object->IsBool16x8()) { | |
| 657 return context->bool16x8_function()->initial_map(); | |
| 658 } else if (heap_object->IsInt8x16()) { | |
| 659 return context->int8x16_function()->initial_map(); | |
| 660 } else if (heap_object->IsBool8x16()) { | |
| 661 return context->bool8x16_function()->initial_map(); | |
| 662 } else { | |
| 663 UNREACHABLE(); | |
| 664 } | |
| 665 } | 622 } |
| 666 return isolate->heap()->null_value()->map(); | 623 return isolate->heap()->null_value()->map(); |
| 667 } | 624 } |
| 668 | 625 |
| 669 | 626 |
| 670 Object* Object::GetHash() { | 627 Object* Object::GetHash() { |
| 671 Object* hash = GetSimpleHash(); | 628 Object* hash = GetSimpleHash(); |
| 672 if (hash->IsSmi()) return hash; | 629 if (hash->IsSmi()) return hash; |
| 673 | 630 |
| 674 DCHECK(IsJSReceiver()); | 631 DCHECK(IsJSReceiver()); |
| (...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1857 int limit = NumberOfOwnDescriptors(); | 1814 int limit = NumberOfOwnDescriptors(); |
| 1858 for (int i = 0; i < limit; i++) { | 1815 for (int i = 0; i < limit; i++) { |
| 1859 if (new_desc->GetDetails(i).representation().IsDouble() != | 1816 if (new_desc->GetDetails(i).representation().IsDouble() != |
| 1860 old_desc->GetDetails(i).representation().IsDouble()) { | 1817 old_desc->GetDetails(i).representation().IsDouble()) { |
| 1861 return true; | 1818 return true; |
| 1862 } | 1819 } |
| 1863 } | 1820 } |
| 1864 | 1821 |
| 1865 // If no fields were added, and no inobject properties were removed, setting | 1822 // If no fields were added, and no inobject properties were removed, setting |
| 1866 // the map is sufficient. | 1823 // the map is sufficient. |
| 1867 if (target_inobject == inobject_properties()) return false; | 1824 if (target_inobject == GetInObjectProperties()) return false; |
| 1868 // In-object slack tracking may have reduced the object size of the new map. | 1825 // In-object slack tracking may have reduced the object size of the new map. |
| 1869 // In that case, succeed if all existing fields were inobject, and they still | 1826 // In that case, succeed if all existing fields were inobject, and they still |
| 1870 // fit within the new inobject size. | 1827 // fit within the new inobject size. |
| 1871 DCHECK(target_inobject < inobject_properties()); | 1828 DCHECK(target_inobject < GetInObjectProperties()); |
| 1872 if (target_number_of_fields <= target_inobject) { | 1829 if (target_number_of_fields <= target_inobject) { |
| 1873 DCHECK(target_number_of_fields + target_unused == target_inobject); | 1830 DCHECK(target_number_of_fields + target_unused == target_inobject); |
| 1874 return false; | 1831 return false; |
| 1875 } | 1832 } |
| 1876 // Otherwise, properties will need to be moved to the backing store. | 1833 // Otherwise, properties will need to be moved to the backing store. |
| 1877 return true; | 1834 return true; |
| 1878 } | 1835 } |
| 1879 | 1836 |
| 1880 | 1837 |
| 1881 static void UpdatePrototypeUserRegistration(Handle<Map> old_map, | 1838 static void UpdatePrototypeUserRegistration(Handle<Map> old_map, |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1968 // frees inobject properties that moved to the backing store. | 1925 // frees inobject properties that moved to the backing store. |
| 1969 // * If there are properties left in the backing store, trim of the space used | 1926 // * If there are properties left in the backing store, trim of the space used |
| 1970 // to temporarily store the inobject properties. | 1927 // to temporarily store the inobject properties. |
| 1971 // * If there are properties left in the backing store, install the backing | 1928 // * If there are properties left in the backing store, install the backing |
| 1972 // store. | 1929 // store. |
| 1973 void JSObject::MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map) { | 1930 void JSObject::MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map) { |
| 1974 Isolate* isolate = object->GetIsolate(); | 1931 Isolate* isolate = object->GetIsolate(); |
| 1975 Handle<Map> old_map(object->map()); | 1932 Handle<Map> old_map(object->map()); |
| 1976 int old_number_of_fields; | 1933 int old_number_of_fields; |
| 1977 int number_of_fields = new_map->NumberOfFields(); | 1934 int number_of_fields = new_map->NumberOfFields(); |
| 1978 int inobject = new_map->inobject_properties(); | 1935 int inobject = new_map->GetInObjectProperties(); |
| 1979 int unused = new_map->unused_property_fields(); | 1936 int unused = new_map->unused_property_fields(); |
| 1980 | 1937 |
| 1981 // Nothing to do if no functions were converted to fields and no smis were | 1938 // Nothing to do if no functions were converted to fields and no smis were |
| 1982 // converted to doubles. | 1939 // converted to doubles. |
| 1983 if (!old_map->InstancesNeedRewriting(*new_map, number_of_fields, inobject, | 1940 if (!old_map->InstancesNeedRewriting(*new_map, number_of_fields, inobject, |
| 1984 unused, &old_number_of_fields)) { | 1941 unused, &old_number_of_fields)) { |
| 1985 object->synchronized_set_map(*new_map); | 1942 object->synchronized_set_map(*new_map); |
| 1986 return; | 1943 return; |
| 1987 } | 1944 } |
| 1988 | 1945 |
| (...skipping 2186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4175 Object); | 4132 Object); |
| 4176 } | 4133 } |
| 4177 trap = Handle<Object>(derived); | 4134 trap = Handle<Object>(derived); |
| 4178 } | 4135 } |
| 4179 | 4136 |
| 4180 return Execution::Call(isolate, trap, handler, argc, argv); | 4137 return Execution::Call(isolate, trap, handler, argc, argv); |
| 4181 } | 4138 } |
| 4182 | 4139 |
| 4183 | 4140 |
| 4184 void JSObject::AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map) { | 4141 void JSObject::AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map) { |
| 4185 DCHECK(object->map()->inobject_properties() == map->inobject_properties()); | 4142 DCHECK(object->map()->GetInObjectProperties() == |
| 4143 map->GetInObjectProperties()); |
| 4186 ElementsKind obj_kind = object->map()->elements_kind(); | 4144 ElementsKind obj_kind = object->map()->elements_kind(); |
| 4187 ElementsKind map_kind = map->elements_kind(); | 4145 ElementsKind map_kind = map->elements_kind(); |
| 4188 if (map_kind != obj_kind) { | 4146 if (map_kind != obj_kind) { |
| 4189 ElementsKind to_kind = map_kind; | 4147 ElementsKind to_kind = map_kind; |
| 4190 if (IsMoreGeneralElementsKindTransition(map_kind, obj_kind) || | 4148 if (IsMoreGeneralElementsKindTransition(map_kind, obj_kind) || |
| 4191 IsDictionaryElementsKind(obj_kind)) { | 4149 IsDictionaryElementsKind(obj_kind)) { |
| 4192 to_kind = obj_kind; | 4150 to_kind = obj_kind; |
| 4193 } | 4151 } |
| 4194 if (IsDictionaryElementsKind(to_kind)) { | 4152 if (IsDictionaryElementsKind(to_kind)) { |
| 4195 NormalizeElements(object); | 4153 NormalizeElements(object); |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4687 } | 4645 } |
| 4688 | 4646 |
| 4689 // We are storing the new map using release store after creating a filler for | 4647 // We are storing the new map using release store after creating a filler for |
| 4690 // the left-over space to avoid races with the sweeper thread. | 4648 // the left-over space to avoid races with the sweeper thread. |
| 4691 object->synchronized_set_map(*new_map); | 4649 object->synchronized_set_map(*new_map); |
| 4692 | 4650 |
| 4693 object->set_properties(*dictionary); | 4651 object->set_properties(*dictionary); |
| 4694 | 4652 |
| 4695 // Ensure that in-object space of slow-mode object does not contain random | 4653 // Ensure that in-object space of slow-mode object does not contain random |
| 4696 // garbage. | 4654 // garbage. |
| 4697 int inobject_properties = new_map->inobject_properties(); | 4655 int inobject_properties = new_map->GetInObjectProperties(); |
| 4698 for (int i = 0; i < inobject_properties; i++) { | 4656 for (int i = 0; i < inobject_properties; i++) { |
| 4699 FieldIndex index = FieldIndex::ForPropertyIndex(*new_map, i); | 4657 FieldIndex index = FieldIndex::ForPropertyIndex(*new_map, i); |
| 4700 object->RawFastPropertyAtPut(index, Smi::FromInt(0)); | 4658 object->RawFastPropertyAtPut(index, Smi::FromInt(0)); |
| 4701 } | 4659 } |
| 4702 | 4660 |
| 4703 isolate->counters()->props_to_dictionary()->Increment(); | 4661 isolate->counters()->props_to_dictionary()->Increment(); |
| 4704 | 4662 |
| 4705 #ifdef DEBUG | 4663 #ifdef DEBUG |
| 4706 if (FLAG_trace_normalization) { | 4664 if (FLAG_trace_normalization) { |
| 4707 OFStream os(stdout); | 4665 OFStream os(stdout); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4744 | 4702 |
| 4745 Object* value = dictionary->ValueAt(index); | 4703 Object* value = dictionary->ValueAt(index); |
| 4746 PropertyType type = dictionary->DetailsAt(index).type(); | 4704 PropertyType type = dictionary->DetailsAt(index).type(); |
| 4747 if (type == DATA && !value->IsJSFunction()) { | 4705 if (type == DATA && !value->IsJSFunction()) { |
| 4748 number_of_fields += 1; | 4706 number_of_fields += 1; |
| 4749 } | 4707 } |
| 4750 } | 4708 } |
| 4751 | 4709 |
| 4752 Handle<Map> old_map(object->map(), isolate); | 4710 Handle<Map> old_map(object->map(), isolate); |
| 4753 | 4711 |
| 4754 int inobject_props = old_map->inobject_properties(); | 4712 int inobject_props = old_map->GetInObjectProperties(); |
| 4755 | 4713 |
| 4756 // Allocate new map. | 4714 // Allocate new map. |
| 4757 Handle<Map> new_map = Map::CopyDropDescriptors(old_map); | 4715 Handle<Map> new_map = Map::CopyDropDescriptors(old_map); |
| 4758 new_map->set_dictionary_map(false); | 4716 new_map->set_dictionary_map(false); |
| 4759 | 4717 |
| 4760 UpdatePrototypeUserRegistration(old_map, new_map, isolate); | 4718 UpdatePrototypeUserRegistration(old_map, new_map, isolate); |
| 4761 | 4719 |
| 4762 #if TRACE_MAPS | 4720 #if TRACE_MAPS |
| 4763 if (FLAG_trace_maps) { | 4721 if (FLAG_trace_maps) { |
| 4764 PrintF("[TraceMaps: SlowToFast from= %p to= %p reason= %s ]\n", | 4722 PrintF("[TraceMaps: SlowToFast from= %p to= %p reason= %s ]\n", |
| (...skipping 1867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6632 } | 6590 } |
| 6633 fast_map->NotifyLeafMapLayoutChange(); | 6591 fast_map->NotifyLeafMapLayoutChange(); |
| 6634 return new_map; | 6592 return new_map; |
| 6635 } | 6593 } |
| 6636 | 6594 |
| 6637 | 6595 |
| 6638 Handle<Map> Map::CopyNormalized(Handle<Map> map, | 6596 Handle<Map> Map::CopyNormalized(Handle<Map> map, |
| 6639 PropertyNormalizationMode mode) { | 6597 PropertyNormalizationMode mode) { |
| 6640 int new_instance_size = map->instance_size(); | 6598 int new_instance_size = map->instance_size(); |
| 6641 if (mode == CLEAR_INOBJECT_PROPERTIES) { | 6599 if (mode == CLEAR_INOBJECT_PROPERTIES) { |
| 6642 new_instance_size -= map->inobject_properties() * kPointerSize; | 6600 new_instance_size -= map->GetInObjectProperties() * kPointerSize; |
| 6643 } | 6601 } |
| 6644 | 6602 |
| 6645 Handle<Map> result = RawCopy(map, new_instance_size); | 6603 Handle<Map> result = RawCopy(map, new_instance_size); |
| 6646 | 6604 |
| 6647 if (mode != CLEAR_INOBJECT_PROPERTIES) { | 6605 if (mode != CLEAR_INOBJECT_PROPERTIES) { |
| 6648 result->set_inobject_properties(map->inobject_properties()); | 6606 result->SetInObjectProperties(map->GetInObjectProperties()); |
| 6649 } | 6607 } |
| 6650 | 6608 |
| 6651 result->set_dictionary_map(true); | 6609 result->set_dictionary_map(true); |
| 6652 result->set_migration_target(false); | 6610 result->set_migration_target(false); |
| 6653 | 6611 |
| 6654 #ifdef VERIFY_HEAP | 6612 #ifdef VERIFY_HEAP |
| 6655 if (FLAG_verify_heap) result->DictionaryMapVerify(); | 6613 if (FLAG_verify_heap) result->DictionaryMapVerify(); |
| 6656 #endif | 6614 #endif |
| 6657 | 6615 |
| 6658 return result; | 6616 return result; |
| 6659 } | 6617 } |
| 6660 | 6618 |
| 6661 | 6619 |
| 6662 Handle<Map> Map::CopyDropDescriptors(Handle<Map> map) { | 6620 Handle<Map> Map::CopyDropDescriptors(Handle<Map> map) { |
| 6663 Handle<Map> result = RawCopy(map, map->instance_size()); | 6621 Handle<Map> result = RawCopy(map, map->instance_size()); |
| 6664 | 6622 |
| 6665 // Please note instance_type and instance_size are set when allocated. | 6623 // Please note instance_type and instance_size are set when allocated. |
| 6666 result->set_inobject_properties(map->inobject_properties()); | 6624 result->SetInObjectProperties(map->GetInObjectProperties()); |
| 6667 result->set_unused_property_fields(map->unused_property_fields()); | 6625 result->set_unused_property_fields(map->unused_property_fields()); |
| 6668 | 6626 |
| 6669 result->ClearCodeCache(map->GetHeap()); | 6627 result->ClearCodeCache(map->GetHeap()); |
| 6670 map->NotifyLeafMapLayoutChange(); | 6628 map->NotifyLeafMapLayoutChange(); |
| 6671 return result; | 6629 return result; |
| 6672 } | 6630 } |
| 6673 | 6631 |
| 6674 | 6632 |
| 6675 Handle<Map> Map::ShareDescriptor(Handle<Map> map, | 6633 Handle<Map> Map::ShareDescriptor(Handle<Map> map, |
| 6676 Handle<DescriptorArray> descriptors, | 6634 Handle<DescriptorArray> descriptors, |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6968 (JSObject::kMaxInstanceSize - JSObject::kHeaderSize) >> kPointerSizeLog2; | 6926 (JSObject::kMaxInstanceSize - JSObject::kHeaderSize) >> kPointerSizeLog2; |
| 6969 | 6927 |
| 6970 if (inobject_properties > max_extra_properties) { | 6928 if (inobject_properties > max_extra_properties) { |
| 6971 inobject_properties = max_extra_properties; | 6929 inobject_properties = max_extra_properties; |
| 6972 } | 6930 } |
| 6973 | 6931 |
| 6974 int new_instance_size = | 6932 int new_instance_size = |
| 6975 JSObject::kHeaderSize + kPointerSize * inobject_properties; | 6933 JSObject::kHeaderSize + kPointerSize * inobject_properties; |
| 6976 | 6934 |
| 6977 // Adjust the map with the extra inobject properties. | 6935 // Adjust the map with the extra inobject properties. |
| 6978 copy->set_inobject_properties(inobject_properties); | 6936 copy->SetInObjectProperties(inobject_properties); |
| 6979 copy->set_unused_property_fields(inobject_properties); | 6937 copy->set_unused_property_fields(inobject_properties); |
| 6980 copy->set_instance_size(new_instance_size); | 6938 copy->set_instance_size(new_instance_size); |
| 6981 copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy)); | 6939 copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy)); |
| 6982 return copy; | 6940 return copy; |
| 6983 } | 6941 } |
| 6984 | 6942 |
| 6985 | 6943 |
| 6986 Handle<Map> Map::CopyForPreventExtensions(Handle<Map> map, | 6944 Handle<Map> Map::CopyForPreventExtensions(Handle<Map> map, |
| 6987 PropertyAttributes attrs_to_add, | 6945 PropertyAttributes attrs_to_add, |
| 6988 Handle<Symbol> transition_marker, | 6946 Handle<Symbol> transition_marker, |
| (...skipping 2373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9362 } | 9320 } |
| 9363 | 9321 |
| 9364 | 9322 |
| 9365 bool Map::EquivalentToForTransition(Map* other) { | 9323 bool Map::EquivalentToForTransition(Map* other) { |
| 9366 return CheckEquivalent(this, other); | 9324 return CheckEquivalent(this, other); |
| 9367 } | 9325 } |
| 9368 | 9326 |
| 9369 | 9327 |
| 9370 bool Map::EquivalentToForNormalization(Map* other, | 9328 bool Map::EquivalentToForNormalization(Map* other, |
| 9371 PropertyNormalizationMode mode) { | 9329 PropertyNormalizationMode mode) { |
| 9372 int properties = mode == CLEAR_INOBJECT_PROPERTIES | 9330 int properties = |
| 9373 ? 0 : other->inobject_properties(); | 9331 mode == CLEAR_INOBJECT_PROPERTIES ? 0 : other->GetInObjectProperties(); |
| 9374 return CheckEquivalent(this, other) && bit_field2() == other->bit_field2() && | 9332 return CheckEquivalent(this, other) && bit_field2() == other->bit_field2() && |
| 9375 inobject_properties() == properties; | 9333 GetInObjectProperties() == properties; |
| 9376 } | 9334 } |
| 9377 | 9335 |
| 9378 | 9336 |
| 9379 void JSFunction::JSFunctionIterateBody(int object_size, ObjectVisitor* v) { | 9337 void JSFunction::JSFunctionIterateBody(int object_size, ObjectVisitor* v) { |
| 9380 // Iterate over all fields in the body but take care in dealing with | 9338 // Iterate over all fields in the body but take care in dealing with |
| 9381 // the code entry. | 9339 // the code entry. |
| 9382 IteratePointers(v, kPropertiesOffset, kCodeEntryOffset); | 9340 IteratePointers(v, kPropertiesOffset, kCodeEntryOffset); |
| 9383 v->VisitCodeEntry(this->address() + kCodeEntryOffset); | 9341 v->VisitCodeEntry(this->address() + kCodeEntryOffset); |
| 9384 IteratePointers(v, kCodeEntryOffset + kPointerSize, object_size); | 9342 IteratePointers(v, kCodeEntryOffset + kPointerSize, object_size); |
| 9385 } | 9343 } |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9623 static void GetMinInobjectSlack(Map* map, void* data) { | 9581 static void GetMinInobjectSlack(Map* map, void* data) { |
| 9624 int slack = map->unused_property_fields(); | 9582 int slack = map->unused_property_fields(); |
| 9625 if (*reinterpret_cast<int*>(data) > slack) { | 9583 if (*reinterpret_cast<int*>(data) > slack) { |
| 9626 *reinterpret_cast<int*>(data) = slack; | 9584 *reinterpret_cast<int*>(data) = slack; |
| 9627 } | 9585 } |
| 9628 } | 9586 } |
| 9629 | 9587 |
| 9630 | 9588 |
| 9631 static void ShrinkInstanceSize(Map* map, void* data) { | 9589 static void ShrinkInstanceSize(Map* map, void* data) { |
| 9632 int slack = *reinterpret_cast<int*>(data); | 9590 int slack = *reinterpret_cast<int*>(data); |
| 9633 map->set_inobject_properties(map->inobject_properties() - slack); | 9591 map->SetInObjectProperties(map->GetInObjectProperties() - slack); |
| 9634 map->set_unused_property_fields(map->unused_property_fields() - slack); | 9592 map->set_unused_property_fields(map->unused_property_fields() - slack); |
| 9635 map->set_instance_size(map->instance_size() - slack * kPointerSize); | 9593 map->set_instance_size(map->instance_size() - slack * kPointerSize); |
| 9636 | 9594 |
| 9637 // Visitor id might depend on the instance size, recalculate it. | 9595 // Visitor id might depend on the instance size, recalculate it. |
| 9638 map->set_visitor_id(StaticVisitorBase::GetVisitorId(map)); | 9596 map->set_visitor_id(StaticVisitorBase::GetVisitorId(map)); |
| 9639 } | 9597 } |
| 9640 | 9598 |
| 9641 | 9599 |
| 9642 void JSFunction::CompleteInobjectSlackTracking() { | 9600 void JSFunction::CompleteInobjectSlackTracking() { |
| 9643 DCHECK(has_initial_map()); | 9601 DCHECK(has_initial_map()); |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10105 } | 10063 } |
| 10106 Handle<Map> map = isolate->factory()->NewMap(instance_type, instance_size); | 10064 Handle<Map> map = isolate->factory()->NewMap(instance_type, instance_size); |
| 10107 | 10065 |
| 10108 // Fetch or allocate prototype. | 10066 // Fetch or allocate prototype. |
| 10109 Handle<Object> prototype; | 10067 Handle<Object> prototype; |
| 10110 if (function->has_instance_prototype()) { | 10068 if (function->has_instance_prototype()) { |
| 10111 prototype = handle(function->instance_prototype(), isolate); | 10069 prototype = handle(function->instance_prototype(), isolate); |
| 10112 } else { | 10070 } else { |
| 10113 prototype = isolate->factory()->NewFunctionPrototype(function); | 10071 prototype = isolate->factory()->NewFunctionPrototype(function); |
| 10114 } | 10072 } |
| 10115 map->set_inobject_properties(in_object_properties); | 10073 map->SetInObjectProperties(in_object_properties); |
| 10116 map->set_unused_property_fields(in_object_properties); | 10074 map->set_unused_property_fields(in_object_properties); |
| 10117 DCHECK(map->has_fast_object_elements()); | 10075 DCHECK(map->has_fast_object_elements()); |
| 10118 | 10076 |
| 10119 // Finally link initial map and constructor function. | 10077 // Finally link initial map and constructor function. |
| 10120 JSFunction::SetInitialMap(function, map, Handle<JSReceiver>::cast(prototype)); | 10078 JSFunction::SetInitialMap(function, map, Handle<JSReceiver>::cast(prototype)); |
| 10121 | 10079 |
| 10122 if (!function->shared()->is_generator()) { | 10080 if (!function->shared()->is_generator()) { |
| 10123 function->StartInobjectSlackTracking(); | 10081 function->StartInobjectSlackTracking(); |
| 10124 } | 10082 } |
| 10125 } | 10083 } |
| (...skipping 5738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15864 if (cell->value() != *new_value) { | 15822 if (cell->value() != *new_value) { |
| 15865 cell->set_value(*new_value); | 15823 cell->set_value(*new_value); |
| 15866 Isolate* isolate = cell->GetIsolate(); | 15824 Isolate* isolate = cell->GetIsolate(); |
| 15867 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 15825 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 15868 isolate, DependentCode::kPropertyCellChangedGroup); | 15826 isolate, DependentCode::kPropertyCellChangedGroup); |
| 15869 } | 15827 } |
| 15870 } | 15828 } |
| 15871 | 15829 |
| 15872 } // namespace internal | 15830 } // namespace internal |
| 15873 } // namespace v8 | 15831 } // namespace v8 |
| OLD | NEW |