Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(350)

Side by Side Diff: runtime/lib/mirrors.cc

Issue 1095903002: Deal with deferred loading in the VM mirrors. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698