OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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/runtime_entry.h" | 5 #include "vm/runtime_entry.h" |
6 | 6 |
7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
8 #include "vm/ast.h" | 8 #include "vm/ast.h" |
9 #include "vm/code_patcher.h" | 9 #include "vm/code_patcher.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 for (intptr_t i = 0; i < len; ++i) { | 511 for (intptr_t i = 0; i < len; ++i) { |
512 new_cache.GetCheck(i, &last_instance_class_id_or_function, | 512 new_cache.GetCheck(i, &last_instance_class_id_or_function, |
513 &last_instance_type_arguments, | 513 &last_instance_type_arguments, |
514 &last_instantiator_type_arguments, | 514 &last_instantiator_type_arguments, |
515 &last_function_type_arguments, &last_result); | 515 &last_function_type_arguments, &last_result); |
516 if ((last_instance_class_id_or_function.raw() == | 516 if ((last_instance_class_id_or_function.raw() == |
517 instance_class_id_or_function.raw()) && | 517 instance_class_id_or_function.raw()) && |
518 (last_instance_type_arguments.raw() == instance_type_arguments.raw()) && | 518 (last_instance_type_arguments.raw() == instance_type_arguments.raw()) && |
519 (last_instantiator_type_arguments.raw() == | 519 (last_instantiator_type_arguments.raw() == |
520 instantiator_type_arguments.raw()) && | 520 instantiator_type_arguments.raw()) && |
521 (last_function_type_arguments.raw() == | 521 (last_function_type_arguments.raw() == function_type_arguments.raw())) { |
522 last_function_type_arguments.raw())) { | |
523 OS::PrintErr(" Error in test cache %p ix: %" Pd ",", new_cache.raw(), i); | 522 OS::PrintErr(" Error in test cache %p ix: %" Pd ",", new_cache.raw(), i); |
524 PrintTypeCheck(" duplicate cache entry", instance, type, | 523 PrintTypeCheck(" duplicate cache entry", instance, type, |
525 instantiator_type_arguments, function_type_arguments, | 524 instantiator_type_arguments, function_type_arguments, |
526 result); | 525 result); |
527 UNREACHABLE(); | 526 UNREACHABLE(); |
528 return; | 527 return; |
529 } | 528 } |
530 } | 529 } |
531 #endif | 530 #endif |
532 new_cache.AddCheck(instance_class_id_or_function, instance_type_arguments, | 531 new_cache.AddCheck(instance_class_id_or_function, instance_type_arguments, |
533 instantiator_type_arguments, function_type_arguments, | 532 instantiator_type_arguments, function_type_arguments, |
534 result); | 533 result); |
535 if (FLAG_trace_type_checks) { | 534 if (FLAG_trace_type_checks) { |
536 AbstractType& test_type = AbstractType::Handle(type.raw()); | 535 AbstractType& test_type = AbstractType::Handle(type.raw()); |
537 if (!test_type.IsInstantiated()) { | 536 if (!test_type.IsInstantiated()) { |
538 Error& bound_error = Error::Handle(); | 537 Error& bound_error = Error::Handle(); |
539 test_type = type.InstantiateFrom(instantiator_type_arguments, | 538 test_type = type.InstantiateFrom(instantiator_type_arguments, |
540 function_type_arguments, &bound_error, | 539 function_type_arguments, &bound_error, |
541 NULL, NULL, Heap::kNew); | 540 NULL, NULL, Heap::kNew); |
542 ASSERT(bound_error.IsNull()); // Malbounded types are not optimized. | 541 ASSERT(bound_error.IsNull()); // Malbounded types are not optimized. |
543 } | 542 } |
544 OS::PrintErr( | 543 OS::PrintErr( |
545 " Updated test cache %p ix: %" Pd | 544 " Updated test cache %p ix: %" Pd |
546 " with " | 545 " with " |
547 "(cid-or-fun: %p, type-args: %p, i-type-args: %p, f-type-args: %p, " | 546 "(cid-or-fun: %p, type-args: %p, i-type-args: %p, f-type-args: %p, " |
548 "result: %s)\n" | 547 "result: %s)\n" |
549 " instance [class: (%p '%s' cid: %" Pd | 548 " instance [class: (%p '%s' cid: %" Pd |
550 "), type-args: %p %s]\n" | 549 "), type-args: %p %s]\n" |
551 " test-type [class: (%p '%s' cid: %" Pd | 550 " test-type [class: (%p '%s' cid: %" Pd |
552 "), i-type-args: %p %s, " | 551 "), i-type-args: %p %s, f-type-args: %p %s]\n", |
553 ", f-type-args: %p %s]\n", | |
554 new_cache.raw(), len, | 552 new_cache.raw(), len, |
555 | 553 |
556 instance_class_id_or_function.raw(), instance_type_arguments.raw(), | 554 instance_class_id_or_function.raw(), instance_type_arguments.raw(), |
557 instantiator_type_arguments.raw(), instantiator_type_arguments.raw(), | 555 instantiator_type_arguments.raw(), instantiator_type_arguments.raw(), |
558 result.ToCString(), | 556 result.ToCString(), |
559 | 557 |
560 instance_class.raw(), String::Handle(instance_class.Name()).ToCString(), | 558 instance_class.raw(), String::Handle(instance_class.Name()).ToCString(), |
561 instance_class.id(), instance_type_arguments.raw(), | 559 instance_class.id(), instance_type_arguments.raw(), |
562 instance_type_arguments.ToCString(), | 560 instance_type_arguments.ToCString(), |
563 | 561 |
564 test_type.type_class(), | 562 test_type.type_class(), |
565 String::Handle(Class::Handle(test_type.type_class()).Name()) | 563 String::Handle(Class::Handle(test_type.type_class()).Name()) |
566 .ToCString(), | 564 .ToCString(), |
567 Class::Handle(test_type.type_class()).id(), | 565 Class::Handle(test_type.type_class()).id(), |
568 instantiator_type_arguments.raw(), | 566 instantiator_type_arguments.raw(), |
569 instantiator_type_arguments.ToCString(), | 567 instantiator_type_arguments.ToCString(), function_type_arguments.raw(), |
570 instantiator_type_arguments.raw(), | 568 function_type_arguments.ToCString()); |
571 instantiator_type_arguments.ToCString()); | |
572 } | 569 } |
573 } | 570 } |
574 | 571 |
575 | 572 |
576 // Check that the given instance is an instance of the given type. | 573 // Check that the given instance is an instance of the given type. |
577 // Tested instance may not be null, because the null test is inlined. | 574 // Tested instance may not be null, because the null test is inlined. |
578 // Arg0: instance being checked. | 575 // Arg0: instance being checked. |
579 // Arg1: type. | 576 // Arg1: type. |
580 // Arg2: type arguments of the instantiator of the type. | 577 // Arg2: type arguments of the instantiator of the type. |
581 // Arg3: type arguments of the function of the type. | 578 // Arg3: type arguments of the function of the type. |
(...skipping 1772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2354 const intptr_t new_size = 2 * old_size; | 2351 const intptr_t new_size = 2 * old_size; |
2355 const intptr_t elm_size = old_data.ElementSizeInBytes(); | 2352 const intptr_t elm_size = old_data.ElementSizeInBytes(); |
2356 const TypedData& new_data = | 2353 const TypedData& new_data = |
2357 TypedData::Handle(TypedData::New(cid, new_size, Heap::kOld)); | 2354 TypedData::Handle(TypedData::New(cid, new_size, Heap::kOld)); |
2358 TypedData::Copy(new_data, 0, old_data, 0, old_size * elm_size); | 2355 TypedData::Copy(new_data, 0, old_data, 0, old_size * elm_size); |
2359 typed_data_cell.SetAt(0, new_data); | 2356 typed_data_cell.SetAt(0, new_data); |
2360 arguments.SetReturn(new_data); | 2357 arguments.SetReturn(new_data); |
2361 } | 2358 } |
2362 | 2359 |
2363 } // namespace dart | 2360 } // namespace dart |
OLD | NEW |