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 "src/type-feedback-vector.h" | 5 #include "src/type-feedback-vector.h" |
6 | 6 |
7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/ic/ic-inl.h" | 8 #include "src/ic/ic-inl.h" |
9 #include "src/ic/ic-state.h" | 9 #include "src/ic/ic-state.h" |
10 #include "src/objects.h" | 10 #include "src/objects.h" |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 // It's important that the TypeFeedbackMetadata have a COW map, since it's | 111 // It's important that the TypeFeedbackMetadata have a COW map, since it's |
112 // pointed to by both a SharedFunctionInfo and indirectly by closures through | 112 // pointed to by both a SharedFunctionInfo and indirectly by closures through |
113 // the TypeFeedbackVector. The serializer uses the COW map type to decide | 113 // the TypeFeedbackVector. The serializer uses the COW map type to decide |
114 // this object belongs in the startup snapshot and not the partial | 114 // this object belongs in the startup snapshot and not the partial |
115 // snapshot(s). | 115 // snapshot(s). |
116 metadata->set_map(isolate->heap()->fixed_cow_array_map()); | 116 metadata->set_map(isolate->heap()->fixed_cow_array_map()); |
117 | 117 |
118 return metadata; | 118 return metadata; |
119 } | 119 } |
120 | 120 |
121 // static | |
122 void TypeFeedbackMetadata::EnsureAllocated(Isolate* isolate, | |
123 Handle<SharedFunctionInfo> sfi, | |
124 const FeedbackVectorSpec* spec) { | |
125 // If no type feedback metadata exists, create it. At this point the | |
126 // AstNumbering pass has already run. Note the snapshot can contain outdated | |
127 // vectors for a different configuration, hence we also recreate a new vector | |
128 // when the function is not compiled (i.e. no code was serialized). | |
129 | |
130 // TODO(mvstanton): reintroduce is_empty() predicate to feedback_metadata(). | |
131 if (sfi->feedback_metadata()->length() == 0 || !sfi->is_compiled()) { | |
132 Handle<TypeFeedbackMetadata> feedback_metadata = | |
133 TypeFeedbackMetadata::New(isolate, spec); | |
134 sfi->set_feedback_metadata(*feedback_metadata); | |
135 } | |
136 | |
137 // It's very important that recompiles do not alter the structure of the type | |
138 // feedback vector. Verify that the structure fits the function literal. | |
139 CHECK(!sfi->feedback_metadata()->SpecDiffersFrom(spec)); | |
140 } | |
141 | |
142 bool TypeFeedbackMetadata::SpecDiffersFrom( | 121 bool TypeFeedbackMetadata::SpecDiffersFrom( |
143 const FeedbackVectorSpec* other_spec) const { | 122 const FeedbackVectorSpec* other_spec) const { |
144 if (other_spec->slots() != slot_count()) { | 123 if (other_spec->slots() != slot_count()) { |
145 return true; | 124 return true; |
146 } | 125 } |
147 | 126 |
148 int slots = slot_count(); | 127 int slots = slot_count(); |
149 int parameter_index = 0; | 128 int parameter_index = 0; |
150 for (int i = 0; i < slots;) { | 129 for (int i = 0; i < slots;) { |
151 FeedbackVectorSlot slot(i); | 130 FeedbackVectorSlot slot(i); |
(...skipping 955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1107 void StoreDataPropertyInLiteralICNexus::ConfigureMonomorphic( | 1086 void StoreDataPropertyInLiteralICNexus::ConfigureMonomorphic( |
1108 Handle<Name> name, Handle<Map> receiver_map) { | 1087 Handle<Name> name, Handle<Map> receiver_map) { |
1109 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); | 1088 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); |
1110 | 1089 |
1111 SetFeedback(*cell); | 1090 SetFeedback(*cell); |
1112 SetFeedbackExtra(*name); | 1091 SetFeedbackExtra(*name); |
1113 } | 1092 } |
1114 | 1093 |
1115 } // namespace internal | 1094 } // namespace internal |
1116 } // namespace v8 | 1095 } // namespace v8 |
OLD | NEW |