| 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 } }) \ |
| 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 |