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 |