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 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 Handle<Object> object = GetInfo(id); | 306 Handle<Object> object = GetInfo(id); |
307 if (!object->IsCode()) return Type::None(zone()); | 307 if (!object->IsCode()) return Type::None(zone()); |
308 Handle<Code> code = Handle<Code>::cast(object); | 308 Handle<Code> code = Handle<Code>::cast(object); |
309 DCHECK_EQ(Code::BINARY_OP_IC, code->kind()); | 309 DCHECK_EQ(Code::BINARY_OP_IC, code->kind()); |
310 BinaryOpICState state(isolate(), code->extra_ic_state()); | 310 BinaryOpICState state(isolate(), code->extra_ic_state()); |
311 return state.GetLeftType(zone()); | 311 return state.GetLeftType(zone()); |
312 } | 312 } |
313 | 313 |
314 | 314 |
315 void TypeFeedbackOracle::PropertyReceiverTypes(TypeFeedbackId id, | 315 void TypeFeedbackOracle::PropertyReceiverTypes(TypeFeedbackId id, |
316 Handle<String> name, | 316 Handle<Name> name, |
317 SmallMapList* receiver_types) { | 317 SmallMapList* receiver_types) { |
318 receiver_types->Clear(); | 318 receiver_types->Clear(); |
319 Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC); | 319 Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC); |
320 CollectReceiverTypes(id, name, flags, receiver_types); | 320 CollectReceiverTypes(id, name, flags, receiver_types); |
321 } | 321 } |
322 | 322 |
323 | 323 |
324 bool TypeFeedbackOracle::HasOnlyStringMaps(SmallMapList* receiver_types) { | 324 bool TypeFeedbackOracle::HasOnlyStringMaps(SmallMapList* receiver_types) { |
325 bool all_strings = receiver_types->length() > 0; | 325 bool all_strings = receiver_types->length() > 0; |
326 for (int i = 0; i < receiver_types->length(); i++) { | 326 for (int i = 0; i < receiver_types->length(); i++) { |
327 all_strings &= receiver_types->at(i)->IsStringMap(); | 327 all_strings &= receiver_types->at(i)->IsStringMap(); |
328 } | 328 } |
329 return all_strings; | 329 return all_strings; |
330 } | 330 } |
331 | 331 |
332 | 332 |
333 void TypeFeedbackOracle::KeyedPropertyReceiverTypes( | 333 void TypeFeedbackOracle::KeyedPropertyReceiverTypes( |
334 TypeFeedbackId id, | 334 TypeFeedbackId id, |
335 SmallMapList* receiver_types, | 335 SmallMapList* receiver_types, |
336 bool* is_string, | 336 bool* is_string, |
337 IcCheckType* key_type) { | 337 IcCheckType* key_type) { |
338 receiver_types->Clear(); | 338 receiver_types->Clear(); |
339 CollectReceiverTypes(id, receiver_types); | 339 CollectReceiverTypes(id, receiver_types); |
340 *is_string = HasOnlyStringMaps(receiver_types); | 340 *is_string = HasOnlyStringMaps(receiver_types); |
341 GetLoadKeyType(id, key_type); | 341 GetLoadKeyType(id, key_type); |
342 } | 342 } |
343 | 343 |
344 | 344 |
345 void TypeFeedbackOracle::PropertyReceiverTypes(FeedbackVectorICSlot slot, | 345 void TypeFeedbackOracle::PropertyReceiverTypes(FeedbackVectorICSlot slot, |
346 Handle<String> name, | 346 Handle<Name> name, |
347 SmallMapList* receiver_types) { | 347 SmallMapList* receiver_types) { |
348 receiver_types->Clear(); | 348 receiver_types->Clear(); |
349 LoadICNexus nexus(feedback_vector_, slot); | 349 LoadICNexus nexus(feedback_vector_, slot); |
350 Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC); | 350 Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC); |
351 CollectReceiverTypes(&nexus, name, flags, receiver_types); | 351 CollectReceiverTypes(&nexus, name, flags, receiver_types); |
352 } | 352 } |
353 | 353 |
354 | 354 |
355 void TypeFeedbackOracle::KeyedPropertyReceiverTypes( | 355 void TypeFeedbackOracle::KeyedPropertyReceiverTypes( |
356 FeedbackVectorICSlot slot, SmallMapList* receiver_types, bool* is_string, | 356 FeedbackVectorICSlot slot, SmallMapList* receiver_types, bool* is_string, |
357 IcCheckType* key_type) { | 357 IcCheckType* key_type) { |
358 receiver_types->Clear(); | 358 receiver_types->Clear(); |
359 KeyedLoadICNexus nexus(feedback_vector_, slot); | 359 KeyedLoadICNexus nexus(feedback_vector_, slot); |
360 CollectReceiverTypes<FeedbackNexus>(&nexus, receiver_types); | 360 CollectReceiverTypes<FeedbackNexus>(&nexus, receiver_types); |
361 *is_string = HasOnlyStringMaps(receiver_types); | 361 *is_string = HasOnlyStringMaps(receiver_types); |
362 *key_type = nexus.FindFirstName() != NULL ? PROPERTY : ELEMENT; | 362 *key_type = nexus.FindFirstName() != NULL ? PROPERTY : ELEMENT; |
363 } | 363 } |
364 | 364 |
365 | 365 |
366 void TypeFeedbackOracle::AssignmentReceiverTypes( | 366 void TypeFeedbackOracle::AssignmentReceiverTypes(TypeFeedbackId id, |
367 TypeFeedbackId id, Handle<String> name, SmallMapList* receiver_types) { | 367 Handle<Name> name, |
| 368 SmallMapList* receiver_types) { |
368 receiver_types->Clear(); | 369 receiver_types->Clear(); |
369 Code::Flags flags = Code::ComputeHandlerFlags(Code::STORE_IC); | 370 Code::Flags flags = Code::ComputeHandlerFlags(Code::STORE_IC); |
370 CollectReceiverTypes(id, name, flags, receiver_types); | 371 CollectReceiverTypes(id, name, flags, receiver_types); |
371 } | 372 } |
372 | 373 |
373 | 374 |
374 void TypeFeedbackOracle::KeyedAssignmentReceiverTypes( | 375 void TypeFeedbackOracle::KeyedAssignmentReceiverTypes( |
375 TypeFeedbackId id, SmallMapList* receiver_types, | 376 TypeFeedbackId id, SmallMapList* receiver_types, |
376 KeyedAccessStoreMode* store_mode, IcCheckType* key_type) { | 377 KeyedAccessStoreMode* store_mode, IcCheckType* key_type) { |
377 receiver_types->Clear(); | 378 receiver_types->Clear(); |
378 CollectReceiverTypes(id, receiver_types); | 379 CollectReceiverTypes(id, receiver_types); |
379 GetStoreModeAndKeyType(id, store_mode, key_type); | 380 GetStoreModeAndKeyType(id, store_mode, key_type); |
380 } | 381 } |
381 | 382 |
382 | 383 |
383 void TypeFeedbackOracle::CountReceiverTypes(TypeFeedbackId id, | 384 void TypeFeedbackOracle::CountReceiverTypes(TypeFeedbackId id, |
384 SmallMapList* receiver_types) { | 385 SmallMapList* receiver_types) { |
385 receiver_types->Clear(); | 386 receiver_types->Clear(); |
386 CollectReceiverTypes(id, receiver_types); | 387 CollectReceiverTypes(id, receiver_types); |
387 } | 388 } |
388 | 389 |
389 | 390 |
390 void TypeFeedbackOracle::CollectReceiverTypes(TypeFeedbackId ast_id, | 391 void TypeFeedbackOracle::CollectReceiverTypes(TypeFeedbackId ast_id, |
391 Handle<String> name, | 392 Handle<Name> name, |
392 Code::Flags flags, | 393 Code::Flags flags, |
393 SmallMapList* types) { | 394 SmallMapList* types) { |
394 Handle<Object> object = GetInfo(ast_id); | 395 Handle<Object> object = GetInfo(ast_id); |
395 if (object->IsUndefined() || object->IsSmi()) return; | 396 if (object->IsUndefined() || object->IsSmi()) return; |
396 | 397 |
397 DCHECK(object->IsCode()); | 398 DCHECK(object->IsCode()); |
398 Handle<Code> code(Handle<Code>::cast(object)); | 399 Handle<Code> code(Handle<Code>::cast(object)); |
399 CollectReceiverTypes<Code>(*code, name, flags, types); | 400 CollectReceiverTypes<Code>(*code, name, flags, types); |
400 } | 401 } |
401 | 402 |
402 | 403 |
403 template <class T> | 404 template <class T> |
404 void TypeFeedbackOracle::CollectReceiverTypes(T* obj, Handle<String> name, | 405 void TypeFeedbackOracle::CollectReceiverTypes(T* obj, Handle<Name> name, |
405 Code::Flags flags, | 406 Code::Flags flags, |
406 SmallMapList* types) { | 407 SmallMapList* types) { |
407 if (FLAG_collect_megamorphic_maps_from_stub_cache && | 408 if (FLAG_collect_megamorphic_maps_from_stub_cache && |
408 obj->ic_state() == MEGAMORPHIC) { | 409 obj->ic_state() == MEGAMORPHIC) { |
409 types->Reserve(4, zone()); | 410 types->Reserve(4, zone()); |
410 isolate()->stub_cache()->CollectMatchingMaps( | 411 isolate()->stub_cache()->CollectMatchingMaps( |
411 types, name, flags, native_context_, zone()); | 412 types, name, flags, native_context_, zone()); |
412 } else { | 413 } else { |
413 CollectReceiverTypes<T>(obj, types); | 414 CollectReceiverTypes<T>(obj, types); |
414 } | 415 } |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 UnseededNumberDictionary::kNotFound); | 563 UnseededNumberDictionary::kNotFound); |
563 // Dictionary has been allocated with sufficient size for all elements. | 564 // Dictionary has been allocated with sufficient size for all elements. |
564 DisallowHeapAllocation no_need_to_resize_dictionary; | 565 DisallowHeapAllocation no_need_to_resize_dictionary; |
565 HandleScope scope(isolate()); | 566 HandleScope scope(isolate()); |
566 USE(UnseededNumberDictionary::AtNumberPut( | 567 USE(UnseededNumberDictionary::AtNumberPut( |
567 dictionary_, IdToKey(ast_id), handle(target, isolate()))); | 568 dictionary_, IdToKey(ast_id), handle(target, isolate()))); |
568 } | 569 } |
569 | 570 |
570 | 571 |
571 } } // namespace v8::internal | 572 } } // namespace v8::internal |
OLD | NEW |