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 "lib/mirrors.h" | 5 #include "lib/mirrors.h" |
6 | 6 |
7 #include "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
8 #include "vm/bootstrap_natives.h" | 8 #include "vm/bootstrap_natives.h" |
9 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
11 #include "vm/dart_entry.h" | 11 #include "vm/dart_entry.h" |
12 #include "vm/exceptions.h" | 12 #include "vm/exceptions.h" |
13 #include "vm/object_store.h" | 13 #include "vm/object_store.h" |
14 #include "vm/parser.h" | 14 #include "vm/parser.h" |
15 #include "vm/port.h" | 15 #include "vm/port.h" |
16 #include "vm/resolver.h" | 16 #include "vm/resolver.h" |
17 #include "vm/symbols.h" | 17 #include "vm/symbols.h" |
18 | 18 |
19 namespace dart { | 19 namespace dart { |
20 | 20 |
21 #define PROPOGATE_IF_MALFOMRED(type) \ | |
22 ({ if (type.IsMalformed()) { \ | |
23 Exceptions::PropagateError(Error::Handle(type.error())); \ | |
24 } }) \ | |
siva
2015/04/22 17:28:00
why is the formatting done this way instead of jus
rmacnak
2015/04/22 18:05:44
I copied from a macro that was using its return va
| |
25 | |
21 static RawInstance* CreateMirror(const String& mirror_class_name, | 26 static RawInstance* CreateMirror(const String& mirror_class_name, |
22 const Array& constructor_arguments) { | 27 const Array& constructor_arguments) { |
23 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary()); | 28 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary()); |
24 const String& constructor_name = Symbols::Dot(); | 29 const String& constructor_name = Symbols::Dot(); |
25 | 30 |
26 const Object& result = Object::Handle( | 31 const Object& result = Object::Handle( |
27 DartLibraryCalls::InstanceCreate(mirrors_lib, | 32 DartLibraryCalls::InstanceCreate(mirrors_lib, |
28 mirror_class_name, | 33 mirror_class_name, |
29 constructor_name, | 34 constructor_name, |
30 constructor_arguments)); | 35 constructor_arguments)); |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
198 const TypeArguments& args = TypeArguments::Handle(cls.type_parameters()); | 203 const TypeArguments& args = TypeArguments::Handle(cls.type_parameters()); |
199 if (args.IsNull()) { | 204 if (args.IsNull()) { |
200 return Object::empty_array().raw(); | 205 return Object::empty_array().raw(); |
201 } | 206 } |
202 const Array& result = Array::Handle(Array::New(args.Length() * 2)); | 207 const Array& result = Array::Handle(Array::New(args.Length() * 2)); |
203 TypeParameter& type = TypeParameter::Handle(); | 208 TypeParameter& type = TypeParameter::Handle(); |
204 String& name = String::Handle(); | 209 String& name = String::Handle(); |
205 for (intptr_t i = 0; i < args.Length(); i++) { | 210 for (intptr_t i = 0; i < args.Length(); i++) { |
206 type ^= args.TypeAt(i); | 211 type ^= args.TypeAt(i); |
207 ASSERT(type.IsTypeParameter()); | 212 ASSERT(type.IsTypeParameter()); |
208 ASSERT(!type.IsMalformed()); | 213 PROPOGATE_IF_MALFOMRED(type); |
209 ASSERT(type.IsFinalized()); | 214 ASSERT(type.IsFinalized()); |
210 name ^= type.name(); | 215 name ^= type.name(); |
211 result.SetAt(2 * i, name); | 216 result.SetAt(2 * i, name); |
212 result.SetAt(2 * i + 1, type); | 217 result.SetAt(2 * i + 1, type); |
213 } | 218 } |
214 return result.raw(); | 219 return result.raw(); |
215 } | 220 } |
216 | 221 |
217 | 222 |
218 static RawInstance* CreateTypedefMirror(const Class& cls, | 223 static RawInstance* CreateTypedefMirror(const Class& cls, |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
375 bool is_show) { | 380 bool is_show) { |
376 const Array& args = Array::Handle(Array::New(2)); | 381 const Array& args = Array::Handle(Array::New(2)); |
377 args.SetAt(0, identifiers); | 382 args.SetAt(0, identifiers); |
378 args.SetAt(1, Bool::Get(is_show)); | 383 args.SetAt(1, Bool::Get(is_show)); |
379 return CreateMirror(Symbols::_LocalCombinatorMirror(), args); | 384 return CreateMirror(Symbols::_LocalCombinatorMirror(), args); |
380 } | 385 } |
381 | 386 |
382 | 387 |
383 static RawInstance* CreateLibraryDependencyMirror(const Instance& importer, | 388 static RawInstance* CreateLibraryDependencyMirror(const Instance& importer, |
384 const Namespace& ns, | 389 const Namespace& ns, |
385 const String& prefix, | 390 const LibraryPrefix& prefix, |
386 const bool is_import, | 391 const bool is_import, |
387 const bool is_deferred) { | 392 const bool is_deferred) { |
388 const Library& importee = Library::Handle(ns.library()); | 393 const Library& importee = Library::Handle(ns.library()); |
389 const Instance& importee_mirror = | 394 const Instance& importee_mirror = |
390 Instance::Handle(CreateLibraryMirror(importee)); | 395 Instance::Handle(CreateLibraryMirror(importee)); |
391 if (importee_mirror.IsNull()) { | 396 if (importee_mirror.IsNull()) { |
392 // Imported library is censored: censor the import. | 397 // Imported library is censored: censor the import. |
393 return Instance::null(); | 398 return Instance::null(); |
394 } | 399 } |
395 | 400 |
(...skipping 16 matching lines...) Expand all Loading... | |
412 } | 417 } |
413 | 418 |
414 Object& metadata = Object::Handle(ns.GetMetadata()); | 419 Object& metadata = Object::Handle(ns.GetMetadata()); |
415 if (metadata.IsError()) { | 420 if (metadata.IsError()) { |
416 Exceptions::PropagateError(Error::Cast(metadata)); | 421 Exceptions::PropagateError(Error::Cast(metadata)); |
417 UNREACHABLE(); | 422 UNREACHABLE(); |
418 } | 423 } |
419 | 424 |
420 const Array& args = Array::Handle(Array::New(7)); | 425 const Array& args = Array::Handle(Array::New(7)); |
421 args.SetAt(0, importer); | 426 args.SetAt(0, importer); |
422 args.SetAt(1, importee_mirror); | 427 args.SetAt(1, importee.Loaded() ? importee_mirror : prefix); |
423 args.SetAt(2, combinators); | 428 args.SetAt(2, combinators); |
424 args.SetAt(3, prefix); | 429 args.SetAt(3, prefix.IsNull() ? Object::null_object() |
430 : String::Handle(prefix.name())); | |
425 args.SetAt(4, Bool::Get(is_import)); | 431 args.SetAt(4, Bool::Get(is_import)); |
426 args.SetAt(5, Bool::Get(is_deferred)); | 432 args.SetAt(5, Bool::Get(is_deferred)); |
427 args.SetAt(6, metadata); | 433 args.SetAt(6, metadata); |
428 return CreateMirror(Symbols::_LocalLibraryDependencyMirror(), args); | 434 return CreateMirror(Symbols::_LocalLibraryDependencyMirror(), args); |
429 } | 435 } |
430 | 436 |
431 | 437 |
438 DEFINE_NATIVE_ENTRY(LibraryMirror_fromPrefix, 1) { | |
439 GET_NON_NULL_NATIVE_ARGUMENT(LibraryPrefix, prefix, | |
440 arguments->NativeArgAt(0)); | |
441 const Library& deferred_lib = Library::Handle(prefix.GetLibrary(0)); | |
442 if (!deferred_lib.Loaded()) { | |
443 return Instance::null(); | |
444 } | |
445 return CreateLibraryMirror(deferred_lib); | |
446 } | |
447 | |
448 | |
432 DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 2) { | 449 DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 2) { |
433 GET_NON_NULL_NATIVE_ARGUMENT(Instance, lib_mirror, arguments->NativeArgAt(0)); | 450 GET_NON_NULL_NATIVE_ARGUMENT(Instance, lib_mirror, arguments->NativeArgAt(0)); |
434 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 451 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
435 const Library& lib = Library::Handle(ref.GetLibraryReferent()); | 452 const Library& lib = Library::Handle(ref.GetLibraryReferent()); |
436 | 453 |
437 Array& ports = Array::Handle(); | 454 Array& ports = Array::Handle(); |
438 Namespace& ns = Namespace::Handle(); | 455 Namespace& ns = Namespace::Handle(); |
439 Instance& dep = Instance::Handle(); | 456 Instance& dep = Instance::Handle(); |
440 String& prefix = String::Handle(); | 457 LibraryPrefix& prefix = LibraryPrefix::Handle(); |
441 GrowableObjectArray& deps = | 458 GrowableObjectArray& deps = |
442 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 459 GrowableObjectArray::Handle(GrowableObjectArray::New()); |
443 | 460 |
444 // Unprefixed imports. | 461 // Unprefixed imports. |
445 ports = lib.imports(); | 462 ports = lib.imports(); |
446 for (intptr_t i = 0; i < ports.Length(); i++) { | 463 for (intptr_t i = 0; i < ports.Length(); i++) { |
447 ns ^= ports.At(i); | 464 ns ^= ports.At(i); |
448 if (!ns.IsNull()) { | 465 if (!ns.IsNull()) { |
449 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true, false); | 466 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true, false); |
450 if (!dep.IsNull()) { | 467 if (!dep.IsNull()) { |
(...skipping 11 matching lines...) Expand all Loading... | |
462 deps.Add(dep); | 479 deps.Add(dep); |
463 } | 480 } |
464 } | 481 } |
465 | 482 |
466 // Prefixed imports. | 483 // Prefixed imports. |
467 DictionaryIterator entries(lib); | 484 DictionaryIterator entries(lib); |
468 Object& entry = Object::Handle(); | 485 Object& entry = Object::Handle(); |
469 while (entries.HasNext()) { | 486 while (entries.HasNext()) { |
470 entry = entries.GetNext(); | 487 entry = entries.GetNext(); |
471 if (entry.IsLibraryPrefix()) { | 488 if (entry.IsLibraryPrefix()) { |
472 const LibraryPrefix& lib_prefix = LibraryPrefix::Cast(entry); | 489 prefix ^= entry.raw(); |
473 prefix = lib_prefix.name(); | 490 ports = prefix.imports(); |
474 ports = lib_prefix.imports(); | |
475 for (intptr_t i = 0; i < ports.Length(); i++) { | 491 for (intptr_t i = 0; i < ports.Length(); i++) { |
476 ns ^= ports.At(i); | 492 ns ^= ports.At(i); |
477 if (!ns.IsNull()) { | 493 if (!ns.IsNull()) { |
478 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true, | 494 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true, |
479 lib_prefix.is_deferred_load()); | 495 prefix.is_deferred_load()); |
480 if (!dep.IsNull()) { | 496 if (!dep.IsNull()) { |
481 deps.Add(dep); | 497 deps.Add(dep); |
482 } | 498 } |
483 } | 499 } |
484 } | 500 } |
485 } | 501 } |
486 } | 502 } |
487 | 503 |
488 return deps.raw(); | 504 return deps.raw(); |
489 } | 505 } |
490 | 506 |
507 | |
491 static RawInstance* CreateTypeMirror(const AbstractType& type) { | 508 static RawInstance* CreateTypeMirror(const AbstractType& type) { |
492 if (type.IsTypeRef()) { | 509 if (type.IsTypeRef()) { |
493 AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type()); | 510 AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type()); |
494 ASSERT(!ref_type.IsTypeRef()); | 511 ASSERT(!ref_type.IsTypeRef()); |
495 ASSERT(ref_type.IsCanonical()); | 512 ASSERT(ref_type.IsCanonical()); |
496 return CreateTypeMirror(ref_type); | 513 return CreateTypeMirror(ref_type); |
497 } | 514 } |
498 ASSERT(type.IsFinalized()); | 515 ASSERT(type.IsFinalized()); |
499 ASSERT(!type.IsMalformed()); | 516 PROPOGATE_IF_MALFOMRED(type); |
517 | |
500 if (type.HasResolvedTypeClass()) { | 518 if (type.HasResolvedTypeClass()) { |
501 const Class& cls = Class::Handle(type.type_class()); | 519 const Class& cls = Class::Handle(type.type_class()); |
502 // Handle void and dynamic types. | 520 // Handle void and dynamic types. |
503 if (cls.IsVoidClass()) { | 521 if (cls.IsVoidClass()) { |
504 Array& args = Array::Handle(Array::New(1)); | 522 Array& args = Array::Handle(Array::New(1)); |
505 args.SetAt(0, Symbols::Void()); | 523 args.SetAt(0, Symbols::Void()); |
506 // TODO(mlippautz): Create once in the VM isolate and retrieve from there. | |
507 return CreateMirror(Symbols::_SpecialTypeMirror(), args); | 524 return CreateMirror(Symbols::_SpecialTypeMirror(), args); |
508 } else if (cls.IsDynamicClass()) { | 525 } else if (cls.IsDynamicClass()) { |
509 Array& args = Array::Handle(Array::New(1)); | 526 Array& args = Array::Handle(Array::New(1)); |
510 args.SetAt(0, Symbols::Dynamic()); | 527 args.SetAt(0, Symbols::Dynamic()); |
511 // TODO(mlippautz): Create once in the VM isolate and retrieve from there. | |
512 return CreateMirror(Symbols::_SpecialTypeMirror(), args); | 528 return CreateMirror(Symbols::_SpecialTypeMirror(), args); |
513 } | 529 } |
514 return CreateClassMirror(cls, type, Bool::False(), Object::null_instance()); | 530 return CreateClassMirror(cls, type, Bool::False(), Object::null_instance()); |
515 } else if (type.IsTypeParameter()) { | 531 } else if (type.IsTypeParameter()) { |
516 return CreateTypeVariableMirror(TypeParameter::Cast(type), | 532 return CreateTypeVariableMirror(TypeParameter::Cast(type), |
517 Object::null_instance()); | 533 Object::null_instance()); |
518 } else if (type.IsBoundedType()) { | 534 } else if (type.IsBoundedType()) { |
519 AbstractType& actual_type = | 535 AbstractType& actual_type = |
520 AbstractType::Handle(BoundedType::Cast(type).type()); | 536 AbstractType::Handle(BoundedType::Cast(type).type()); |
521 return CreateTypeMirror(actual_type); | 537 return CreateTypeMirror(actual_type); |
(...skipping 11 matching lines...) Expand all Loading... | |
533 const Instance& root_library_mirror = | 549 const Instance& root_library_mirror = |
534 Instance::Handle(CreateLibraryMirror(root_library)); | 550 Instance::Handle(CreateLibraryMirror(root_library)); |
535 | 551 |
536 const Array& args = Array::Handle(Array::New(2)); | 552 const Array& args = Array::Handle(Array::New(2)); |
537 args.SetAt(0, debug_name); | 553 args.SetAt(0, debug_name); |
538 args.SetAt(1, root_library_mirror); | 554 args.SetAt(1, root_library_mirror); |
539 return CreateMirror(Symbols::_LocalIsolateMirror(), args); | 555 return CreateMirror(Symbols::_LocalIsolateMirror(), args); |
540 } | 556 } |
541 | 557 |
542 | 558 |
543 static RawInstance* CreateMirrorSystem() { | |
544 Isolate* isolate = Isolate::Current(); | |
545 const GrowableObjectArray& libraries = GrowableObjectArray::Handle( | |
546 isolate, isolate->object_store()->libraries()); | |
547 | |
548 const intptr_t num_libraries = libraries.Length(); | |
549 const GrowableObjectArray& library_mirrors = GrowableObjectArray::Handle( | |
550 isolate, GrowableObjectArray::New(num_libraries)); | |
551 Library& library = Library::Handle(isolate); | |
552 Instance& library_mirror = Instance::Handle(isolate); | |
553 | |
554 for (int i = 0; i < num_libraries; i++) { | |
555 library ^= libraries.At(i); | |
556 library_mirror = CreateLibraryMirror(library); | |
557 if (!library_mirror.IsNull()) { | |
558 library_mirrors.Add(library_mirror); | |
559 } | |
560 } | |
561 | |
562 const Instance& isolate_mirror = Instance::Handle(CreateIsolateMirror()); | |
563 | |
564 const Array& args = Array::Handle(Array::New(2)); | |
565 args.SetAt(0, library_mirrors); | |
566 args.SetAt(1, isolate_mirror); | |
567 return CreateMirror(Symbols::_LocalMirrorSystem(), args); | |
568 } | |
569 | |
570 | |
571 static RawInstance* ReturnResult(const Object& result) { | 559 static RawInstance* ReturnResult(const Object& result) { |
572 if (result.IsError()) { | 560 if (result.IsError()) { |
573 Exceptions::PropagateError(Error::Cast(result)); | 561 Exceptions::PropagateError(Error::Cast(result)); |
574 UNREACHABLE(); | 562 UNREACHABLE(); |
575 } | 563 } |
576 if (result.IsInstance()) { | 564 if (result.IsInstance()) { |
577 return Instance::Cast(result).raw(); | 565 return Instance::Cast(result).raw(); |
578 } | 566 } |
579 ASSERT(result.IsNull()); | 567 ASSERT(result.IsNull()); |
580 return Instance::null(); | 568 return Instance::null(); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
741 // Fall through case: Indicate that we didn't find any function or field using | 729 // Fall through case: Indicate that we didn't find any function or field using |
742 // a special null instance. This is different from a field being null. Callers | 730 // a special null instance. This is different from a field being null. Callers |
743 // make sure that this null does not leak into Dartland. | 731 // make sure that this null does not leak into Dartland. |
744 return Object::sentinel().raw(); | 732 return Object::sentinel().raw(); |
745 } | 733 } |
746 | 734 |
747 | 735 |
748 static RawAbstractType* InstantiateType(const AbstractType& type, | 736 static RawAbstractType* InstantiateType(const AbstractType& type, |
749 const AbstractType& instantiator) { | 737 const AbstractType& instantiator) { |
750 ASSERT(type.IsFinalized()); | 738 ASSERT(type.IsFinalized()); |
751 ASSERT(!type.IsMalformed()); | 739 PROPOGATE_IF_MALFOMRED(type); |
752 | 740 |
753 if (type.IsInstantiated() || instantiator.IsNull()) { | 741 if (type.IsInstantiated() || instantiator.IsNull()) { |
754 return type.Canonicalize(); | 742 return type.Canonicalize(); |
755 } | 743 } |
756 | 744 |
757 ASSERT(!instantiator.IsNull()); | 745 ASSERT(!instantiator.IsNull()); |
758 ASSERT(instantiator.IsFinalized()); | 746 ASSERT(instantiator.IsFinalized()); |
759 ASSERT(!instantiator.IsMalformed()); | 747 PROPOGATE_IF_MALFOMRED(instantiator); |
760 | 748 |
761 const TypeArguments& type_args = | 749 const TypeArguments& type_args = |
762 TypeArguments::Handle(instantiator.arguments()); | 750 TypeArguments::Handle(instantiator.arguments()); |
763 Error& bound_error = Error::Handle(); | 751 Error& bound_error = Error::Handle(); |
764 AbstractType& result = | 752 AbstractType& result = |
765 AbstractType::Handle(type.InstantiateFrom(type_args, &bound_error)); | 753 AbstractType::Handle(type.InstantiateFrom(type_args, &bound_error)); |
766 if (!bound_error.IsNull()) { | 754 if (!bound_error.IsNull()) { |
767 Exceptions::PropagateError(bound_error); | 755 Exceptions::PropagateError(bound_error); |
768 UNREACHABLE(); | 756 UNREACHABLE(); |
769 } | 757 } |
770 ASSERT(result.IsFinalized()); | 758 ASSERT(result.IsFinalized()); |
771 return result.Canonicalize(); | 759 return result.Canonicalize(); |
772 } | 760 } |
773 | 761 |
774 | 762 |
775 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalMirrorSystem, 0) { | 763 DEFINE_NATIVE_ENTRY(MirrorSystem_libraries, 0) { |
776 return CreateMirrorSystem(); | 764 const GrowableObjectArray& libraries = GrowableObjectArray::Handle( |
765 isolate, isolate->object_store()->libraries()); | |
766 | |
767 const intptr_t num_libraries = libraries.Length(); | |
768 const GrowableObjectArray& library_mirrors = GrowableObjectArray::Handle( | |
769 isolate, GrowableObjectArray::New(num_libraries)); | |
770 Library& library = Library::Handle(isolate); | |
771 Instance& library_mirror = Instance::Handle(isolate); | |
772 | |
773 for (int i = 0; i < num_libraries; i++) { | |
774 library ^= libraries.At(i); | |
775 library_mirror = CreateLibraryMirror(library); | |
776 if (!library_mirror.IsNull() && library.Loaded()) { | |
777 library_mirrors.Add(library_mirror); | |
778 } | |
779 } | |
780 return library_mirrors.raw(); | |
781 } | |
782 | |
783 | |
784 DEFINE_NATIVE_ENTRY(MirrorSystem_isolate, 0) { | |
785 return CreateIsolateMirror(); | |
777 } | 786 } |
778 | 787 |
779 | 788 |
780 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalClassMirror, 1) { | 789 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalClassMirror, 1) { |
781 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 790 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
782 ASSERT(!type.IsMalformed()); | 791 PROPOGATE_IF_MALFOMRED(type); |
783 ASSERT(type.IsFinalized()); | 792 ASSERT(type.IsFinalized()); |
784 ASSERT(type.HasResolvedTypeClass()); | 793 ASSERT(type.HasResolvedTypeClass()); |
785 const Class& cls = Class::Handle(type.type_class()); | 794 const Class& cls = Class::Handle(type.type_class()); |
786 ASSERT(!cls.IsNull()); | 795 ASSERT(!cls.IsNull()); |
787 if (cls.IsDynamicClass() || | 796 if (cls.IsDynamicClass() || |
788 cls.IsVoidClass() || | 797 cls.IsVoidClass() || |
789 (cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass())) { | 798 (cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass())) { |
790 Exceptions::ThrowArgumentError(type); | 799 Exceptions::ThrowArgumentError(type); |
791 UNREACHABLE(); | 800 UNREACHABLE(); |
792 } | 801 } |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
897 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 906 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
898 const Class& klass = Class::Handle(ref.GetClassReferent()); | 907 const Class& klass = Class::Handle(ref.GetClassReferent()); |
899 const Library& library = Library::Handle(klass.library()); | 908 const Library& library = Library::Handle(klass.library()); |
900 ASSERT(!library.IsNull()); | 909 ASSERT(!library.IsNull()); |
901 return CreateLibraryMirror(library); | 910 return CreateLibraryMirror(library); |
902 } | 911 } |
903 | 912 |
904 | 913 |
905 DEFINE_NATIVE_ENTRY(ClassMirror_supertype, 1) { | 914 DEFINE_NATIVE_ENTRY(ClassMirror_supertype, 1) { |
906 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 915 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
907 ASSERT(!type.IsMalformed()); | 916 PROPOGATE_IF_MALFOMRED(type); |
908 ASSERT(type.IsFinalized()); | 917 ASSERT(type.IsFinalized()); |
909 if (!type.HasResolvedTypeClass()) { | 918 if (!type.HasResolvedTypeClass()) { |
910 Exceptions::ThrowArgumentError(type); | 919 Exceptions::ThrowArgumentError(type); |
911 UNREACHABLE(); | 920 UNREACHABLE(); |
912 } | 921 } |
913 const Class& cls = Class::Handle(type.type_class()); | 922 const Class& cls = Class::Handle(type.type_class()); |
914 const AbstractType& super_type = AbstractType::Handle(cls.super_type()); | 923 const AbstractType& super_type = AbstractType::Handle(cls.super_type()); |
915 ASSERT(super_type.IsNull() || super_type.IsFinalized()); | 924 ASSERT(super_type.IsNull() || super_type.IsFinalized()); |
916 return super_type.raw(); | 925 return super_type.raw(); |
917 } | 926 } |
918 | 927 |
919 | 928 |
920 DEFINE_NATIVE_ENTRY(ClassMirror_supertype_instantiated, 1) { | 929 DEFINE_NATIVE_ENTRY(ClassMirror_supertype_instantiated, 1) { |
921 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 930 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
922 ASSERT(!type.IsMalformed()); | 931 PROPOGATE_IF_MALFOMRED(type); |
923 ASSERT(type.IsFinalized()); | 932 ASSERT(type.IsFinalized()); |
924 if (!type.HasResolvedTypeClass()) { | 933 if (!type.HasResolvedTypeClass()) { |
925 Exceptions::ThrowArgumentError(type); | 934 Exceptions::ThrowArgumentError(type); |
926 UNREACHABLE(); | 935 UNREACHABLE(); |
927 } | 936 } |
928 const Class& cls = Class::Handle(type.type_class()); | 937 const Class& cls = Class::Handle(type.type_class()); |
929 const AbstractType& super_type = AbstractType::Handle(cls.super_type()); | 938 const AbstractType& super_type = AbstractType::Handle(cls.super_type()); |
930 return InstantiateType(super_type, type); | 939 return InstantiateType(super_type, type); |
931 } | 940 } |
932 | 941 |
933 | 942 |
934 DEFINE_NATIVE_ENTRY(ClassMirror_interfaces, 1) { | 943 DEFINE_NATIVE_ENTRY(ClassMirror_interfaces, 1) { |
935 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 944 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
936 ASSERT(!type.IsMalformed()); | 945 PROPOGATE_IF_MALFOMRED(type); |
937 ASSERT(type.IsFinalized()); | 946 ASSERT(type.IsFinalized()); |
938 if (!type.HasResolvedTypeClass()) { | 947 if (!type.HasResolvedTypeClass()) { |
939 Exceptions::ThrowArgumentError(type); | 948 Exceptions::ThrowArgumentError(type); |
940 UNREACHABLE(); | 949 UNREACHABLE(); |
941 } | 950 } |
942 const Class& cls = Class::Handle(type.type_class()); | 951 const Class& cls = Class::Handle(type.type_class()); |
943 const Error& error = Error::Handle(cls.EnsureIsFinalized(isolate)); | 952 const Error& error = Error::Handle(cls.EnsureIsFinalized(isolate)); |
944 if (!error.IsNull()) { | 953 if (!error.IsNull()) { |
945 Exceptions::PropagateError(error); | 954 Exceptions::PropagateError(error); |
946 } | 955 } |
947 | 956 |
948 return cls.interfaces(); | 957 return cls.interfaces(); |
949 } | 958 } |
950 | 959 |
951 DEFINE_NATIVE_ENTRY(ClassMirror_interfaces_instantiated, 1) { | 960 DEFINE_NATIVE_ENTRY(ClassMirror_interfaces_instantiated, 1) { |
952 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 961 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
953 ASSERT(!type.IsMalformed()); | 962 PROPOGATE_IF_MALFOMRED(type); |
954 ASSERT(type.IsFinalized()); | 963 ASSERT(type.IsFinalized()); |
955 if (!type.HasResolvedTypeClass()) { | 964 if (!type.HasResolvedTypeClass()) { |
956 Exceptions::ThrowArgumentError(type); | 965 Exceptions::ThrowArgumentError(type); |
957 UNREACHABLE(); | 966 UNREACHABLE(); |
958 } | 967 } |
959 const Class& cls = Class::Handle(type.type_class()); | 968 const Class& cls = Class::Handle(type.type_class()); |
960 const Error& error = Error::Handle(cls.EnsureIsFinalized(isolate)); | 969 const Error& error = Error::Handle(cls.EnsureIsFinalized(isolate)); |
961 if (!error.IsNull()) { | 970 if (!error.IsNull()) { |
962 Exceptions::PropagateError(error); | 971 Exceptions::PropagateError(error); |
963 } | 972 } |
964 | 973 |
965 Array& interfaces = Array::Handle(cls.interfaces()); | 974 Array& interfaces = Array::Handle(cls.interfaces()); |
966 Array& interfaces_inst = Array::Handle(Array::New(interfaces.Length())); | 975 Array& interfaces_inst = Array::Handle(Array::New(interfaces.Length())); |
967 AbstractType& interface = AbstractType::Handle(); | 976 AbstractType& interface = AbstractType::Handle(); |
968 | 977 |
969 for (int i = 0; i < interfaces.Length(); i++) { | 978 for (int i = 0; i < interfaces.Length(); i++) { |
970 interface ^= interfaces.At(i); | 979 interface ^= interfaces.At(i); |
971 interface = InstantiateType(interface, type); | 980 interface = InstantiateType(interface, type); |
972 interfaces_inst.SetAt(i, interface); | 981 interfaces_inst.SetAt(i, interface); |
973 } | 982 } |
974 | 983 |
975 return interfaces_inst.raw(); | 984 return interfaces_inst.raw(); |
976 } | 985 } |
977 | 986 |
978 | 987 |
979 DEFINE_NATIVE_ENTRY(ClassMirror_mixin, 1) { | 988 DEFINE_NATIVE_ENTRY(ClassMirror_mixin, 1) { |
980 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 989 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
981 ASSERT(!type.IsMalformed()); | 990 PROPOGATE_IF_MALFOMRED(type); |
982 ASSERT(type.IsFinalized()); | 991 ASSERT(type.IsFinalized()); |
983 if (!type.HasResolvedTypeClass()) { | 992 if (!type.HasResolvedTypeClass()) { |
984 Exceptions::ThrowArgumentError(type); | 993 Exceptions::ThrowArgumentError(type); |
985 UNREACHABLE(); | 994 UNREACHABLE(); |
986 } | 995 } |
987 const Class& cls = Class::Handle(type.type_class()); | 996 const Class& cls = Class::Handle(type.type_class()); |
988 const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); | 997 const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); |
989 ASSERT(mixin_type.IsNull() || mixin_type.IsFinalized()); | 998 ASSERT(mixin_type.IsNull() || mixin_type.IsFinalized()); |
990 return mixin_type.raw(); | 999 return mixin_type.raw(); |
991 } | 1000 } |
992 | 1001 |
993 | 1002 |
994 DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) { | 1003 DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) { |
995 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 1004 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
996 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, | 1005 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, |
997 instantiator, | 1006 instantiator, |
998 arguments->NativeArgAt(1)); | 1007 arguments->NativeArgAt(1)); |
999 ASSERT(!type.IsMalformed()); | 1008 PROPOGATE_IF_MALFOMRED(type); |
1000 ASSERT(type.IsFinalized()); | 1009 ASSERT(type.IsFinalized()); |
1001 if (!type.HasResolvedTypeClass()) { | 1010 if (!type.HasResolvedTypeClass()) { |
1002 Exceptions::ThrowArgumentError(type); | 1011 Exceptions::ThrowArgumentError(type); |
1003 UNREACHABLE(); | 1012 UNREACHABLE(); |
1004 } | 1013 } |
1005 const Class& cls = Class::Handle(type.type_class()); | 1014 const Class& cls = Class::Handle(type.type_class()); |
1006 const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); | 1015 const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); |
1007 if (mixin_type.IsNull()) { | 1016 if (mixin_type.IsNull()) { |
1008 return mixin_type.raw(); | 1017 return mixin_type.raw(); |
1009 } | 1018 } |
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2034 } | 2043 } |
2035 | 2044 |
2036 DEFINE_NATIVE_ENTRY(TypeMirror_moreSpecificTest, 2) { | 2045 DEFINE_NATIVE_ENTRY(TypeMirror_moreSpecificTest, 2) { |
2037 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); | 2046 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); |
2038 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); | 2047 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); |
2039 return Bool::Get(a.IsMoreSpecificThan(b, NULL)).raw(); | 2048 return Bool::Get(a.IsMoreSpecificThan(b, NULL)).raw(); |
2040 } | 2049 } |
2041 | 2050 |
2042 | 2051 |
2043 } // namespace dart | 2052 } // namespace dart |
OLD | NEW |