OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 "include/dart_debugger_api.h" | 5 #include "include/dart_debugger_api.h" |
6 | 6 |
7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
9 #include "vm/dart_api_state.h" | 9 #include "vm/dart_api_state.h" |
10 #include "vm/debugger.h" | 10 #include "vm/debugger.h" |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 UNWRAP_AND_CHECK_PARAM(Class, cls, cls_in); | 516 UNWRAP_AND_CHECK_PARAM(Class, cls, cls_in); |
517 return Api::NewHandle(isolate, cls.SuperClass()); | 517 return Api::NewHandle(isolate, cls.SuperClass()); |
518 } | 518 } |
519 | 519 |
520 | 520 |
521 DART_EXPORT Dart_Handle Dart_GetSupertype(Dart_Handle type_in) { | 521 DART_EXPORT Dart_Handle Dart_GetSupertype(Dart_Handle type_in) { |
522 Isolate* isolate = Isolate::Current(); | 522 Isolate* isolate = Isolate::Current(); |
523 DARTSCOPE(isolate); | 523 DARTSCOPE(isolate); |
524 | 524 |
525 UNWRAP_AND_CHECK_PARAM(Type, type, type_in); | 525 UNWRAP_AND_CHECK_PARAM(Type, type, type_in); |
| 526 if (!type.IsFinalized()) { |
| 527 return Api::NewError("%s: type in 'type_in' is not a finalized type", |
| 528 CURRENT_FUNC); |
| 529 } |
| 530 if (!type.IsInstantiated()) { |
| 531 return Api::NewError("%s: type in 'type_in' is not an instantiated type", |
| 532 CURRENT_FUNC); |
| 533 } |
526 const Class& cls= Class::Handle(type.type_class()); | 534 const Class& cls= Class::Handle(type.type_class()); |
527 intptr_t num_expected_type_arguments = cls.NumTypeParameters(); | 535 if (cls.NumTypeParameters() == 0) { |
528 if (num_expected_type_arguments == 0) { | |
529 // The super type has no type parameters or it is already instantiated | 536 // The super type has no type parameters or it is already instantiated |
530 // just return it. | 537 // just return it. |
531 const AbstractType& type = AbstractType::Handle(cls.super_type()); | 538 const AbstractType& type = AbstractType::Handle(cls.super_type()); |
532 if (type.IsNull()) { | 539 if (type.IsNull()) { |
533 return Dart_Null(); | 540 return Dart_Null(); |
534 } | 541 } |
535 return Api::NewHandle(isolate, type.Canonicalize()); | 542 return Api::NewHandle(isolate, type.Canonicalize()); |
536 } | 543 } |
537 // Set up the type arguments array for the super class type. | 544 // Set up the type arguments array for the super class type. |
538 const Class& super_cls = Class::Handle(cls.SuperClass()); | 545 const Class& super_cls = Class::Handle(cls.SuperClass()); |
539 num_expected_type_arguments = super_cls.NumTypeParameters(); | 546 intptr_t num_expected_type_arguments = super_cls.NumTypeArguments(); |
| 547 TypeArguments& super_type_args_array = TypeArguments::Handle(); |
540 const AbstractTypeArguments& type_args_array = | 548 const AbstractTypeArguments& type_args_array = |
541 AbstractTypeArguments::Handle(type.arguments()); | 549 AbstractTypeArguments::Handle(type.arguments()); |
542 const TypeArguments& super_type_args_array = | 550 if (!type_args_array.IsNull() && (num_expected_type_arguments > 0)) { |
543 TypeArguments::Handle(TypeArguments::New(num_expected_type_arguments)); | 551 super_type_args_array = TypeArguments::New(num_expected_type_arguments); |
544 AbstractType& type_arg = AbstractType::Handle(); | 552 AbstractType& type_arg = AbstractType::Handle(); |
545 intptr_t index_offset = | 553 for (intptr_t i = 0; i < num_expected_type_arguments; i++) { |
546 super_cls.NumTypeArguments() - num_expected_type_arguments; | 554 type_arg ^= type_args_array.TypeAt(i); |
547 for (intptr_t i = 0; i < num_expected_type_arguments; i++) { | 555 super_type_args_array.SetTypeAt(i, type_arg); |
548 type_arg ^= type_args_array.TypeAt(i + index_offset); | 556 } |
549 super_type_args_array.SetTypeAt(i, type_arg); | |
550 } | 557 } |
551 | 558 |
552 // Construct the super type object, canonicalize it and return. | 559 // Construct the super type object, canonicalize it and return. |
553 Type& instantiated_type = Type::Handle( | 560 Type& instantiated_type = Type::Handle( |
554 Type::New(super_cls, super_type_args_array, Scanner::kDummyTokenIndex)); | 561 Type::New(super_cls, super_type_args_array, Scanner::kDummyTokenIndex)); |
555 ASSERT(!instantiated_type.IsNull()); | 562 ASSERT(!instantiated_type.IsNull()); |
556 instantiated_type ^= ClassFinalizer::FinalizeType( | 563 instantiated_type.SetIsFinalized(); |
557 super_cls, instantiated_type, ClassFinalizer::kCanonicalize); | 564 return Api::NewHandle(isolate, instantiated_type.Canonicalize()); |
558 return Api::NewHandle(isolate, instantiated_type.raw()); | |
559 } | 565 } |
560 | 566 |
561 | 567 |
562 DART_EXPORT Dart_Handle Dart_GetClassInfo( | 568 DART_EXPORT Dart_Handle Dart_GetClassInfo( |
563 intptr_t cls_id, | 569 intptr_t cls_id, |
564 Dart_Handle* class_name, | 570 Dart_Handle* class_name, |
565 intptr_t* library_id, | 571 intptr_t* library_id, |
566 intptr_t* super_class_id, | 572 intptr_t* super_class_id, |
567 Dart_Handle* static_fields) { | 573 Dart_Handle* static_fields) { |
568 Isolate* isolate = Isolate::Current(); | 574 Isolate* isolate = Isolate::Current(); |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 | 833 |
828 | 834 |
829 DART_EXPORT char* Dart_GetVmStatus(const char* request) { | 835 DART_EXPORT char* Dart_GetVmStatus(const char* request) { |
830 if (strncmp(request, "/isolate/", 9) == 0) { | 836 if (strncmp(request, "/isolate/", 9) == 0) { |
831 return Isolate::GetStatus(request); | 837 return Isolate::GetStatus(request); |
832 } | 838 } |
833 return NULL; | 839 return NULL; |
834 } | 840 } |
835 | 841 |
836 } // namespace dart | 842 } // namespace dart |
OLD | NEW |