OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/precompiler.h" | 5 #include "vm/precompiler.h" |
6 | 6 |
7 #include "vm/code_patcher.h" | 7 #include "vm/code_patcher.h" |
8 #include "vm/compiler.h" | 8 #include "vm/compiler.h" |
9 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
10 #include "vm/log.h" | 10 #include "vm/log.h" |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 AddFunction(target); | 350 AddFunction(target); |
351 } | 351 } |
352 } | 352 } |
353 | 353 |
354 #if defined(TARGET_ARCH_IA32) | 354 #if defined(TARGET_ARCH_IA32) |
355 FATAL("Callee scanning unimplemented for IA32"); | 355 FATAL("Callee scanning unimplemented for IA32"); |
356 #endif | 356 #endif |
357 | 357 |
358 const ObjectPool& pool = ObjectPool::Handle(Z, code.GetObjectPool()); | 358 const ObjectPool& pool = ObjectPool::Handle(Z, code.GetObjectPool()); |
359 ICData& call_site = ICData::Handle(Z); | 359 ICData& call_site = ICData::Handle(Z); |
| 360 MegamorphicCache& cache = MegamorphicCache::Handle(Z); |
360 String& selector = String::Handle(Z); | 361 String& selector = String::Handle(Z); |
361 Field& field = Field::Handle(Z); | 362 Field& field = Field::Handle(Z); |
362 Class& cls = Class::Handle(Z); | 363 Class& cls = Class::Handle(Z); |
363 Instance& instance = Instance::Handle(Z); | 364 Instance& instance = Instance::Handle(Z); |
364 Code& target_code = Code::Handle(Z); | 365 Code& target_code = Code::Handle(Z); |
365 for (intptr_t i = 0; i < pool.Length(); i++) { | 366 for (intptr_t i = 0; i < pool.Length(); i++) { |
366 if (pool.InfoAt(i) == ObjectPool::kTaggedObject) { | 367 if (pool.InfoAt(i) == ObjectPool::kTaggedObject) { |
367 entry = pool.ObjectAt(i); | 368 entry = pool.ObjectAt(i); |
368 if (entry.IsICData()) { | 369 if (entry.IsICData()) { |
369 call_site ^= entry.raw(); | 370 call_site ^= entry.raw(); |
370 if (call_site.NumberOfChecks() == 1) { | 371 if (call_site.NumberOfChecks() == 1) { |
371 // Probably a static call. | 372 // Probably a static call. |
372 target = call_site.GetTargetAt(0); | 373 target = call_site.GetTargetAt(0); |
373 AddFunction(target); | 374 AddFunction(target); |
374 if (!target.is_static()) { | 375 if (!target.is_static()) { |
375 // Super call (should not enqueue selector) or dynamic call with a | 376 // Super call (should not enqueue selector) or dynamic call with a |
376 // CHA prediction (should enqueue selector). | 377 // CHA prediction (should enqueue selector). |
377 selector = call_site.target_name(); | 378 selector = call_site.target_name(); |
378 AddSelector(selector); | 379 AddSelector(selector); |
379 } | 380 } |
380 } else { | 381 } else { |
381 // A dynamic call. | 382 // A dynamic call. |
382 selector = call_site.target_name(); | 383 selector = call_site.target_name(); |
383 AddSelector(selector); | 384 AddSelector(selector); |
384 if (selector.raw() == Symbols::Call().raw()) { | 385 if (selector.raw() == Symbols::Call().raw()) { |
385 // Potential closure call. | 386 // Potential closure call. |
386 AddClosureCall(call_site); | 387 AddClosureCall(call_site); |
387 } | 388 } |
388 } | 389 } |
| 390 } else if (entry.IsMegamorphicCache()) { |
| 391 // A dynamic call. |
| 392 cache ^= entry.raw(); |
| 393 selector = cache.target_name(); |
| 394 AddSelector(selector); |
389 } else if (entry.IsField()) { | 395 } else if (entry.IsField()) { |
390 // Potential need for field initializer. | 396 // Potential need for field initializer. |
391 field ^= entry.raw(); | 397 field ^= entry.raw(); |
392 AddField(field); | 398 AddField(field); |
393 } else if (entry.IsInstance()) { | 399 } else if (entry.IsInstance()) { |
394 // Const object, literal or args descriptor. | 400 // Const object, literal or args descriptor. |
395 instance ^= entry.raw(); | 401 instance ^= entry.raw(); |
396 AddConstObject(instance); | 402 AddConstObject(instance); |
397 } else if (entry.IsFunction()) { | 403 } else if (entry.IsFunction()) { |
398 // Local closure function. | 404 // Local closure function. |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
873 continue; // class 'dynamic' is in the read-only VM isolate. | 879 continue; // class 'dynamic' is in the read-only VM isolate. |
874 } | 880 } |
875 cls.EnsureIsFinalized(T); | 881 cls.EnsureIsFinalized(T); |
876 } | 882 } |
877 } | 883 } |
878 I->set_all_classes_finalized(true); | 884 I->set_all_classes_finalized(true); |
879 } | 885 } |
880 | 886 |
881 | 887 |
882 } // namespace dart | 888 } // namespace dart |
OLD | NEW |