OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/ast.h" | 7 #include "src/ast.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 *store_mode = KeyedStoreIC::GetKeyedAccessStoreMode(extra_ic_state); | 123 *store_mode = KeyedStoreIC::GetKeyedAccessStoreMode(extra_ic_state); |
124 *key_type = KeyedStoreIC::GetKeyType(extra_ic_state); | 124 *key_type = KeyedStoreIC::GetKeyType(extra_ic_state); |
125 return; | 125 return; |
126 } | 126 } |
127 } | 127 } |
128 *store_mode = STANDARD_STORE; | 128 *store_mode = STANDARD_STORE; |
129 *key_type = ELEMENT; | 129 *key_type = ELEMENT; |
130 } | 130 } |
131 | 131 |
132 | 132 |
| 133 void TypeFeedbackOracle::GetLoadKeyType( |
| 134 TypeFeedbackId ast_id, IcCheckType* key_type) { |
| 135 Handle<Object> maybe_code = GetInfo(ast_id); |
| 136 if (maybe_code->IsCode()) { |
| 137 Handle<Code> code = Handle<Code>::cast(maybe_code); |
| 138 if (code->kind() == Code::KEYED_LOAD_IC) { |
| 139 ExtraICState extra_ic_state = code->extra_ic_state(); |
| 140 *key_type = KeyedLoadIC::GetKeyType(extra_ic_state); |
| 141 return; |
| 142 } |
| 143 } |
| 144 *key_type = ELEMENT; |
| 145 } |
| 146 |
| 147 |
133 Handle<JSFunction> TypeFeedbackOracle::GetCallTarget( | 148 Handle<JSFunction> TypeFeedbackOracle::GetCallTarget( |
134 FeedbackVectorICSlot slot) { | 149 FeedbackVectorICSlot slot) { |
135 Handle<Object> info = GetInfo(slot); | 150 Handle<Object> info = GetInfo(slot); |
136 if (info->IsAllocationSite()) { | 151 if (info->IsAllocationSite()) { |
137 return Handle<JSFunction>(isolate()->native_context()->array_function()); | 152 return Handle<JSFunction>(isolate()->native_context()->array_function()); |
138 } | 153 } |
139 | 154 |
140 return Handle<JSFunction>::cast(info); | 155 return Handle<JSFunction>::cast(info); |
141 } | 156 } |
142 | 157 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 void TypeFeedbackOracle::PropertyReceiverTypes(TypeFeedbackId id, | 278 void TypeFeedbackOracle::PropertyReceiverTypes(TypeFeedbackId id, |
264 Handle<String> name, | 279 Handle<String> name, |
265 SmallMapList* receiver_types) { | 280 SmallMapList* receiver_types) { |
266 receiver_types->Clear(); | 281 receiver_types->Clear(); |
267 Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC); | 282 Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC); |
268 CollectReceiverTypes(id, name, flags, receiver_types); | 283 CollectReceiverTypes(id, name, flags, receiver_types); |
269 } | 284 } |
270 | 285 |
271 | 286 |
272 void TypeFeedbackOracle::KeyedPropertyReceiverTypes( | 287 void TypeFeedbackOracle::KeyedPropertyReceiverTypes( |
273 TypeFeedbackId id, SmallMapList* receiver_types, bool* is_string) { | 288 TypeFeedbackId id, |
| 289 SmallMapList* receiver_types, |
| 290 bool* is_string, |
| 291 IcCheckType* key_type) { |
274 receiver_types->Clear(); | 292 receiver_types->Clear(); |
275 CollectReceiverTypes(id, receiver_types); | 293 CollectReceiverTypes(id, receiver_types); |
276 | 294 |
277 // Are all the receiver maps string maps? | 295 // Are all the receiver maps string maps? |
278 bool all_strings = receiver_types->length() > 0; | 296 bool all_strings = receiver_types->length() > 0; |
279 for (int i = 0; i < receiver_types->length(); i++) { | 297 for (int i = 0; i < receiver_types->length(); i++) { |
280 all_strings &= receiver_types->at(i)->IsStringMap(); | 298 all_strings &= receiver_types->at(i)->IsStringMap(); |
281 } | 299 } |
282 *is_string = all_strings; | 300 *is_string = all_strings; |
| 301 |
| 302 GetLoadKeyType(id, key_type); |
283 } | 303 } |
284 | 304 |
285 | 305 |
286 void TypeFeedbackOracle::AssignmentReceiverTypes( | 306 void TypeFeedbackOracle::AssignmentReceiverTypes( |
287 TypeFeedbackId id, Handle<String> name, SmallMapList* receiver_types) { | 307 TypeFeedbackId id, Handle<String> name, SmallMapList* receiver_types) { |
288 receiver_types->Clear(); | 308 receiver_types->Clear(); |
289 Code::Flags flags = Code::ComputeHandlerFlags(Code::STORE_IC); | 309 Code::Flags flags = Code::ComputeHandlerFlags(Code::STORE_IC); |
290 CollectReceiverTypes(id, name, flags, receiver_types); | 310 CollectReceiverTypes(id, name, flags, receiver_types); |
291 } | 311 } |
292 | 312 |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 UnseededNumberDictionary::kNotFound); | 489 UnseededNumberDictionary::kNotFound); |
470 // Dictionary has been allocated with sufficient size for all elements. | 490 // Dictionary has been allocated with sufficient size for all elements. |
471 DisallowHeapAllocation no_need_to_resize_dictionary; | 491 DisallowHeapAllocation no_need_to_resize_dictionary; |
472 HandleScope scope(isolate()); | 492 HandleScope scope(isolate()); |
473 USE(UnseededNumberDictionary::AtNumberPut( | 493 USE(UnseededNumberDictionary::AtNumberPut( |
474 dictionary_, IdToKey(ast_id), handle(target, isolate()))); | 494 dictionary_, IdToKey(ast_id), handle(target, isolate()))); |
475 } | 495 } |
476 | 496 |
477 | 497 |
478 } } // namespace v8::internal | 498 } } // namespace v8::internal |
OLD | NEW |