| 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 6824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6835 } | 6835 } |
| 6836 } | 6836 } |
| 6837 return GetHeap()->undefined_value(); | 6837 return GetHeap()->undefined_value(); |
| 6838 } else { | 6838 } else { |
| 6839 return property_dictionary()->SlowReverseLookup(value); | 6839 return property_dictionary()->SlowReverseLookup(value); |
| 6840 } | 6840 } |
| 6841 } | 6841 } |
| 6842 | 6842 |
| 6843 | 6843 |
| 6844 Handle<Map> Map::RawCopy(Handle<Map> map, int instance_size) { | 6844 Handle<Map> Map::RawCopy(Handle<Map> map, int instance_size) { |
| 6845 Handle<Map> result = map->GetIsolate()->factory()->NewMap( | 6845 Isolate* isolate = map->GetIsolate(); |
| 6846 map->instance_type(), instance_size); | 6846 Handle<Map> result = |
| 6847 result->SetPrototype(handle(map->prototype(), map->GetIsolate())); | 6847 isolate->factory()->NewMap(map->instance_type(), instance_size); |
| 6848 Handle<Object> prototype(map->prototype(), isolate); |
| 6849 Map::SetPrototype(result, prototype); |
| 6848 result->set_constructor_or_backpointer(map->GetConstructor()); | 6850 result->set_constructor_or_backpointer(map->GetConstructor()); |
| 6849 result->set_bit_field(map->bit_field()); | 6851 result->set_bit_field(map->bit_field()); |
| 6850 result->set_bit_field2(map->bit_field2()); | 6852 result->set_bit_field2(map->bit_field2()); |
| 6851 int new_bit_field3 = map->bit_field3(); | 6853 int new_bit_field3 = map->bit_field3(); |
| 6852 new_bit_field3 = OwnsDescriptors::update(new_bit_field3, true); | 6854 new_bit_field3 = OwnsDescriptors::update(new_bit_field3, true); |
| 6853 new_bit_field3 = NumberOfOwnDescriptorsBits::update(new_bit_field3, 0); | 6855 new_bit_field3 = NumberOfOwnDescriptorsBits::update(new_bit_field3, 0); |
| 6854 new_bit_field3 = EnumLengthBits::update(new_bit_field3, | 6856 new_bit_field3 = EnumLengthBits::update(new_bit_field3, |
| 6855 kInvalidEnumCacheSentinel); | 6857 kInvalidEnumCacheSentinel); |
| 6856 new_bit_field3 = Deprecated::update(new_bit_field3, false); | 6858 new_bit_field3 = Deprecated::update(new_bit_field3, false); |
| 6857 if (!map->is_dictionary_map()) { | 6859 if (!map->is_dictionary_map()) { |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7032 parent->set_owns_descriptors(false); | 7034 parent->set_owns_descriptors(false); |
| 7033 if (parent->is_prototype_map()) { | 7035 if (parent->is_prototype_map()) { |
| 7034 DCHECK(child->is_prototype_map()); | 7036 DCHECK(child->is_prototype_map()); |
| 7035 #if TRACE_MAPS | 7037 #if TRACE_MAPS |
| 7036 Map::TraceTransition("NoTransition", *parent, *child, *name); | 7038 Map::TraceTransition("NoTransition", *parent, *child, *name); |
| 7037 #endif | 7039 #endif |
| 7038 } else { | 7040 } else { |
| 7039 TransitionArray::Insert(parent, name, child, flag); | 7041 TransitionArray::Insert(parent, name, child, flag); |
| 7040 if (child->prototype()->IsJSObject()) { | 7042 if (child->prototype()->IsJSObject()) { |
| 7041 Handle<JSObject> proto(JSObject::cast(child->prototype())); | 7043 Handle<JSObject> proto(JSObject::cast(child->prototype())); |
| 7042 if (!child->ShouldRegisterAsPrototypeUser(proto)) { | 7044 if (!ShouldRegisterAsPrototypeUser(child, proto)) { |
| 7043 JSObject::UnregisterPrototypeUser(proto, child); | 7045 JSObject::UnregisterPrototypeUser(proto, child); |
| 7044 } | 7046 } |
| 7045 } | 7047 } |
| 7046 #if TRACE_MAPS | 7048 #if TRACE_MAPS |
| 7047 Map::TraceTransition("Transition", *parent, *child, *name); | 7049 Map::TraceTransition("Transition", *parent, *child, *name); |
| 7048 #endif | 7050 #endif |
| 7049 } | 7051 } |
| 7050 } | 7052 } |
| 7051 | 7053 |
| 7052 | 7054 |
| (...skipping 2980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10033 Object* maybe_proto_info = prototype->map()->prototype_info(); | 10035 Object* maybe_proto_info = prototype->map()->prototype_info(); |
| 10034 if (!maybe_proto_info->IsPrototypeInfo()) return; | 10036 if (!maybe_proto_info->IsPrototypeInfo()) return; |
| 10035 Handle<PrototypeInfo> proto_info(PrototypeInfo::cast(maybe_proto_info), | 10037 Handle<PrototypeInfo> proto_info(PrototypeInfo::cast(maybe_proto_info), |
| 10036 isolate); | 10038 isolate); |
| 10037 Object* maybe_registry = proto_info->prototype_users(); | 10039 Object* maybe_registry = proto_info->prototype_users(); |
| 10038 if (!maybe_registry->IsWeakFixedArray()) return; | 10040 if (!maybe_registry->IsWeakFixedArray()) return; |
| 10039 WeakFixedArray::cast(maybe_registry)->Remove(user); | 10041 WeakFixedArray::cast(maybe_registry)->Remove(user); |
| 10040 } | 10042 } |
| 10041 | 10043 |
| 10042 | 10044 |
| 10043 void Map::SetPrototype(Handle<Object> prototype, | 10045 // static |
| 10046 void Map::SetPrototype(Handle<Map> map, Handle<Object> prototype, |
| 10044 PrototypeOptimizationMode proto_mode) { | 10047 PrototypeOptimizationMode proto_mode) { |
| 10045 if (this->prototype()->IsJSObject() && FLAG_track_prototype_users) { | 10048 if (map->prototype()->IsJSObject() && FLAG_track_prototype_users) { |
| 10046 Handle<JSObject> old_prototype(JSObject::cast(this->prototype())); | 10049 Handle<JSObject> old_prototype(JSObject::cast(map->prototype())); |
| 10047 JSObject::UnregisterPrototypeUser(old_prototype, handle(this)); | 10050 JSObject::UnregisterPrototypeUser(old_prototype, map); |
| 10048 } | 10051 } |
| 10049 if (prototype->IsJSObject()) { | 10052 if (prototype->IsJSObject()) { |
| 10050 Handle<JSObject> prototype_jsobj = Handle<JSObject>::cast(prototype); | 10053 Handle<JSObject> prototype_jsobj = Handle<JSObject>::cast(prototype); |
| 10051 if (ShouldRegisterAsPrototypeUser(prototype_jsobj)) { | 10054 if (ShouldRegisterAsPrototypeUser(map, prototype_jsobj)) { |
| 10052 JSObject::RegisterPrototypeUser(prototype_jsobj, handle(this)); | 10055 JSObject::RegisterPrototypeUser(prototype_jsobj, map); |
| 10053 } | 10056 } |
| 10054 JSObject::OptimizeAsPrototype(prototype_jsobj, proto_mode); | 10057 JSObject::OptimizeAsPrototype(prototype_jsobj, proto_mode); |
| 10055 } | 10058 } |
| 10056 WriteBarrierMode wb_mode = | 10059 WriteBarrierMode wb_mode = |
| 10057 prototype->IsNull() ? SKIP_WRITE_BARRIER : UPDATE_WRITE_BARRIER; | 10060 prototype->IsNull() ? SKIP_WRITE_BARRIER : UPDATE_WRITE_BARRIER; |
| 10058 set_prototype(*prototype, wb_mode); | 10061 map->set_prototype(*prototype, wb_mode); |
| 10059 } | 10062 } |
| 10060 | 10063 |
| 10061 | 10064 |
| 10062 bool Map::ShouldRegisterAsPrototypeUser(Handle<JSObject> prototype) { | 10065 // static |
| 10066 bool Map::ShouldRegisterAsPrototypeUser(Handle<Map> map, |
| 10067 Handle<JSObject> prototype) { |
| 10063 if (!FLAG_track_prototype_users) return false; | 10068 if (!FLAG_track_prototype_users) return false; |
| 10064 if (this->is_prototype_map()) return true; | 10069 if (map->is_prototype_map()) return true; |
| 10065 Object* back = GetBackPointer(); | 10070 Object* back = map->GetBackPointer(); |
| 10066 if (!back->IsMap()) return true; | 10071 if (!back->IsMap()) return true; |
| 10067 if (Map::cast(back)->prototype() != *prototype) return true; | 10072 if (Map::cast(back)->prototype() != *prototype) return true; |
| 10068 return false; | 10073 return false; |
| 10069 } | 10074 } |
| 10070 | 10075 |
| 10071 | 10076 |
| 10072 Handle<Object> CacheInitialJSArrayMaps( | 10077 Handle<Object> CacheInitialJSArrayMaps( |
| 10073 Handle<Context> native_context, Handle<Map> initial_map) { | 10078 Handle<Context> native_context, Handle<Map> initial_map) { |
| 10074 // Replace all of the cached initial array maps in the native context with | 10079 // Replace all of the cached initial array maps in the native context with |
| 10075 // the appropriate transitioned elements kind maps. | 10080 // the appropriate transitioned elements kind maps. |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10208 | 10213 |
| 10209 set_map(no_prototype_map); | 10214 set_map(no_prototype_map); |
| 10210 set_prototype_or_initial_map(no_prototype_map->GetHeap()->the_hole_value()); | 10215 set_prototype_or_initial_map(no_prototype_map->GetHeap()->the_hole_value()); |
| 10211 return true; | 10216 return true; |
| 10212 } | 10217 } |
| 10213 | 10218 |
| 10214 | 10219 |
| 10215 void JSFunction::SetInitialMap(Handle<JSFunction> function, Handle<Map> map, | 10220 void JSFunction::SetInitialMap(Handle<JSFunction> function, Handle<Map> map, |
| 10216 Handle<Object> prototype) { | 10221 Handle<Object> prototype) { |
| 10217 if (map->prototype() != *prototype) { | 10222 if (map->prototype() != *prototype) { |
| 10218 map->SetPrototype(prototype, FAST_PROTOTYPE); | 10223 Map::SetPrototype(map, prototype, FAST_PROTOTYPE); |
| 10219 } | 10224 } |
| 10220 function->set_prototype_or_initial_map(*map); | 10225 function->set_prototype_or_initial_map(*map); |
| 10221 map->SetConstructor(*function); | 10226 map->SetConstructor(*function); |
| 10222 #if TRACE_MAPS | 10227 #if TRACE_MAPS |
| 10223 if (FLAG_trace_maps) { | 10228 if (FLAG_trace_maps) { |
| 10224 PrintF("[TraceMaps: InitialMap map= %p SFI= %d_%s ]\n", | 10229 PrintF("[TraceMaps: InitialMap map= %p SFI= %d_%s ]\n", |
| 10225 reinterpret_cast<void*>(*map), function->shared()->unique_id(), | 10230 reinterpret_cast<void*>(*map), function->shared()->unique_id(), |
| 10226 function->shared()->DebugName()->ToCString().get()); | 10231 function->shared()->DebugName()->ToCString().get()); |
| 10227 } | 10232 } |
| 10228 #endif | 10233 #endif |
| (...skipping 2110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12339 } | 12344 } |
| 12340 | 12345 |
| 12341 | 12346 |
| 12342 Handle<Map> Map::TransitionToPrototype(Handle<Map> map, | 12347 Handle<Map> Map::TransitionToPrototype(Handle<Map> map, |
| 12343 Handle<Object> prototype, | 12348 Handle<Object> prototype, |
| 12344 PrototypeOptimizationMode mode) { | 12349 PrototypeOptimizationMode mode) { |
| 12345 Handle<Map> new_map = TransitionArray::GetPrototypeTransition(map, prototype); | 12350 Handle<Map> new_map = TransitionArray::GetPrototypeTransition(map, prototype); |
| 12346 if (new_map.is_null()) { | 12351 if (new_map.is_null()) { |
| 12347 new_map = Copy(map, "TransitionToPrototype"); | 12352 new_map = Copy(map, "TransitionToPrototype"); |
| 12348 TransitionArray::PutPrototypeTransition(map, prototype, new_map); | 12353 TransitionArray::PutPrototypeTransition(map, prototype, new_map); |
| 12349 new_map->SetPrototype(prototype, mode); | 12354 Map::SetPrototype(new_map, prototype, mode); |
| 12350 } | 12355 } |
| 12351 return new_map; | 12356 return new_map; |
| 12352 } | 12357 } |
| 12353 | 12358 |
| 12354 | 12359 |
| 12355 MaybeHandle<Object> JSObject::SetPrototype(Handle<JSObject> object, | 12360 MaybeHandle<Object> JSObject::SetPrototype(Handle<JSObject> object, |
| 12356 Handle<Object> value, | 12361 Handle<Object> value, |
| 12357 bool from_javascript) { | 12362 bool from_javascript) { |
| 12358 #ifdef DEBUG | 12363 #ifdef DEBUG |
| 12359 int size = object->Size(); | 12364 int size = object->Size(); |
| (...skipping 4686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17046 CompilationInfo* info) { | 17051 CompilationInfo* info) { |
| 17047 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( | 17052 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( |
| 17048 handle(cell->dependent_code(), info->isolate()), | 17053 handle(cell->dependent_code(), info->isolate()), |
| 17049 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); | 17054 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); |
| 17050 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 17055 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
| 17051 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 17056 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
| 17052 cell, info->zone()); | 17057 cell, info->zone()); |
| 17053 } | 17058 } |
| 17054 | 17059 |
| 17055 } } // namespace v8::internal | 17060 } } // namespace v8::internal |
| OLD | NEW |