OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 "src/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
11 #include "src/objects-inl.h" | 11 #include "src/objects-inl.h" |
12 | 12 |
13 #include "src/accessors.h" | 13 #include "src/accessors.h" |
14 #include "src/allocation-site-scopes.h" | 14 #include "src/allocation-site-scopes.h" |
15 #include "src/api-arguments.h" | 15 #include "src/api-arguments.h" |
16 #include "src/api-natives.h" | 16 #include "src/api-natives.h" |
17 #include "src/api.h" | 17 #include "src/api.h" |
18 #include "src/base/bits.h" | 18 #include "src/base/bits.h" |
19 #include "src/base/utils/random-number-generator.h" | 19 #include "src/base/utils/random-number-generator.h" |
20 #include "src/bootstrapper.h" | 20 #include "src/bootstrapper.h" |
21 #include "src/code-stubs.h" | 21 #include "src/code-stubs.h" |
22 #include "src/codegen.h" | 22 #include "src/codegen.h" |
23 #include "src/compilation-dependencies.h" | 23 #include "src/compilation-dependencies.h" |
24 #include "src/compiler.h" | 24 #include "src/compiler.h" |
| 25 #include "src/counters-inl.h" |
| 26 #include "src/counters.h" |
25 #include "src/date.h" | 27 #include "src/date.h" |
26 #include "src/debug/debug.h" | 28 #include "src/debug/debug.h" |
27 #include "src/deoptimizer.h" | 29 #include "src/deoptimizer.h" |
28 #include "src/elements.h" | 30 #include "src/elements.h" |
29 #include "src/execution.h" | 31 #include "src/execution.h" |
30 #include "src/field-index-inl.h" | 32 #include "src/field-index-inl.h" |
31 #include "src/field-index.h" | 33 #include "src/field-index.h" |
32 #include "src/field-type.h" | 34 #include "src/field-type.h" |
33 #include "src/frames-inl.h" | 35 #include "src/frames-inl.h" |
34 #include "src/full-codegen/full-codegen.h" | 36 #include "src/full-codegen/full-codegen.h" |
(...skipping 8976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9011 DCHECK(!map->is_dictionary_map()); | 9013 DCHECK(!map->is_dictionary_map()); |
9012 // Update to the newest map before storing the property. | 9014 // Update to the newest map before storing the property. |
9013 return UpdateDescriptorForValue(Update(map), descriptor, value); | 9015 return UpdateDescriptorForValue(Update(map), descriptor, value); |
9014 } | 9016 } |
9015 | 9017 |
9016 | 9018 |
9017 Handle<Map> Map::TransitionToDataProperty(Handle<Map> map, Handle<Name> name, | 9019 Handle<Map> Map::TransitionToDataProperty(Handle<Map> map, Handle<Name> name, |
9018 Handle<Object> value, | 9020 Handle<Object> value, |
9019 PropertyAttributes attributes, | 9021 PropertyAttributes attributes, |
9020 StoreFromKeyed store_mode) { | 9022 StoreFromKeyed store_mode) { |
| 9023 RuntimeCallTimerScope stats_scope( |
| 9024 *map, map->is_prototype_map() |
| 9025 ? &RuntimeCallStats::PrototypeMap_TransitionToDataProperty |
| 9026 : &RuntimeCallStats::Map_TransitionToDataProperty); |
| 9027 |
9021 DCHECK(name->IsUniqueName()); | 9028 DCHECK(name->IsUniqueName()); |
9022 DCHECK(!map->is_dictionary_map()); | 9029 DCHECK(!map->is_dictionary_map()); |
9023 | 9030 |
9024 // Migrate to the newest map before storing the property. | 9031 // Migrate to the newest map before storing the property. |
9025 map = Update(map); | 9032 map = Update(map); |
9026 | 9033 |
9027 Map* maybe_transition = | 9034 Map* maybe_transition = |
9028 TransitionArray::SearchTransition(*map, kData, *name, attributes); | 9035 TransitionArray::SearchTransition(*map, kData, *name, attributes); |
9029 if (maybe_transition != NULL) { | 9036 if (maybe_transition != NULL) { |
9030 Handle<Map> transition(maybe_transition); | 9037 Handle<Map> transition(maybe_transition); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9091 map, descriptor, kind, attributes, Representation::None(), | 9098 map, descriptor, kind, attributes, Representation::None(), |
9092 FieldType::None(isolate), FORCE_FIELD); | 9099 FieldType::None(isolate), FORCE_FIELD); |
9093 return new_map; | 9100 return new_map; |
9094 } | 9101 } |
9095 | 9102 |
9096 Handle<Map> Map::TransitionToAccessorProperty(Isolate* isolate, Handle<Map> map, | 9103 Handle<Map> Map::TransitionToAccessorProperty(Isolate* isolate, Handle<Map> map, |
9097 Handle<Name> name, int descriptor, | 9104 Handle<Name> name, int descriptor, |
9098 Handle<Object> getter, | 9105 Handle<Object> getter, |
9099 Handle<Object> setter, | 9106 Handle<Object> setter, |
9100 PropertyAttributes attributes) { | 9107 PropertyAttributes attributes) { |
| 9108 RuntimeCallTimerScope stats_scope( |
| 9109 isolate, |
| 9110 map->is_prototype_map() |
| 9111 ? &RuntimeCallStats::PrototypeMap_TransitionToAccessorProperty |
| 9112 : &RuntimeCallStats::Map_TransitionToAccessorProperty); |
| 9113 |
9101 // At least one of the accessors needs to be a new value. | 9114 // At least one of the accessors needs to be a new value. |
9102 DCHECK(!getter->IsNull() || !setter->IsNull()); | 9115 DCHECK(!getter->IsNull() || !setter->IsNull()); |
9103 DCHECK(name->IsUniqueName()); | 9116 DCHECK(name->IsUniqueName()); |
9104 | 9117 |
9105 // Dictionary maps can always have additional data properties. | 9118 // Dictionary maps can always have additional data properties. |
9106 if (map->is_dictionary_map()) return map; | 9119 if (map->is_dictionary_map()) return map; |
9107 | 9120 |
9108 // Migrate to the newest map before transitioning to the new property. | 9121 // Migrate to the newest map before transitioning to the new property. |
9109 map = Update(map); | 9122 map = Update(map); |
9110 | 9123 |
(...skipping 2549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11660 Handle<Cell> cell = isolate->factory()->NewCell( | 11673 Handle<Cell> cell = isolate->factory()->NewCell( |
11661 handle(Smi::FromInt(Map::kPrototypeChainValid), isolate)); | 11674 handle(Smi::FromInt(Map::kPrototypeChainValid), isolate)); |
11662 proto_info->set_validity_cell(*cell); | 11675 proto_info->set_validity_cell(*cell); |
11663 return cell; | 11676 return cell; |
11664 } | 11677 } |
11665 | 11678 |
11666 | 11679 |
11667 // static | 11680 // static |
11668 void Map::SetPrototype(Handle<Map> map, Handle<Object> prototype, | 11681 void Map::SetPrototype(Handle<Map> map, Handle<Object> prototype, |
11669 PrototypeOptimizationMode proto_mode) { | 11682 PrototypeOptimizationMode proto_mode) { |
| 11683 RuntimeCallTimerScope stats_scope(*map, &RuntimeCallStats::Map_SetPrototype); |
| 11684 |
11670 bool is_hidden = false; | 11685 bool is_hidden = false; |
11671 if (prototype->IsJSObject()) { | 11686 if (prototype->IsJSObject()) { |
11672 Handle<JSObject> prototype_jsobj = Handle<JSObject>::cast(prototype); | 11687 Handle<JSObject> prototype_jsobj = Handle<JSObject>::cast(prototype); |
11673 JSObject::OptimizeAsPrototype(prototype_jsobj, proto_mode); | 11688 JSObject::OptimizeAsPrototype(prototype_jsobj, proto_mode); |
11674 | 11689 |
11675 Object* maybe_constructor = prototype_jsobj->map()->GetConstructor(); | 11690 Object* maybe_constructor = prototype_jsobj->map()->GetConstructor(); |
11676 if (maybe_constructor->IsJSFunction()) { | 11691 if (maybe_constructor->IsJSFunction()) { |
11677 JSFunction* constructor = JSFunction::cast(maybe_constructor); | 11692 JSFunction* constructor = JSFunction::cast(maybe_constructor); |
11678 Object* data = constructor->shared()->function_data(); | 11693 Object* data = constructor->shared()->function_data(); |
11679 is_hidden = (data->IsFunctionTemplateInfo() && | 11694 is_hidden = (data->IsFunctionTemplateInfo() && |
(...skipping 6578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18258 if (cell->value() != *new_value) { | 18273 if (cell->value() != *new_value) { |
18259 cell->set_value(*new_value); | 18274 cell->set_value(*new_value); |
18260 Isolate* isolate = cell->GetIsolate(); | 18275 Isolate* isolate = cell->GetIsolate(); |
18261 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18276 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
18262 isolate, DependentCode::kPropertyCellChangedGroup); | 18277 isolate, DependentCode::kPropertyCellChangedGroup); |
18263 } | 18278 } |
18264 } | 18279 } |
18265 | 18280 |
18266 } // namespace internal | 18281 } // namespace internal |
18267 } // namespace v8 | 18282 } // namespace v8 |
OLD | NEW |