| 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" |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 args.SetAt(3, owner_mirror); | 347 args.SetAt(3, owner_mirror); |
| 348 args.SetAt(4, Bool::Get(cls.is_abstract())); | 348 args.SetAt(4, Bool::Get(cls.is_abstract())); |
| 349 args.SetAt(5, Bool::Get(cls.IsGeneric())); | 349 args.SetAt(5, Bool::Get(cls.IsGeneric())); |
| 350 args.SetAt(6, Bool::Get(cls.is_mixin_app_alias())); | 350 args.SetAt(6, Bool::Get(cls.is_mixin_app_alias())); |
| 351 args.SetAt(7, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration); | 351 args.SetAt(7, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration); |
| 352 args.SetAt(8, Bool::Get(cls.is_enum_class())); | 352 args.SetAt(8, Bool::Get(cls.is_enum_class())); |
| 353 return CreateMirror(Symbols::_LocalClassMirror(), args); | 353 return CreateMirror(Symbols::_LocalClassMirror(), args); |
| 354 } | 354 } |
| 355 | 355 |
| 356 | 356 |
| 357 static RawInstance* CreateLibraryMirror(const Library& lib) { | 357 static RawInstance* CreateLibraryMirror(Thread* thread, const Library& lib) { |
| 358 Thread* thread = Thread::Current(); | |
| 359 Zone* zone = thread->zone(); | 358 Zone* zone = thread->zone(); |
| 360 ASSERT(!lib.IsNull()); | 359 ASSERT(!lib.IsNull()); |
| 361 const Array& args = Array::Handle(zone, Array::New(3)); | 360 const Array& args = Array::Handle(zone, Array::New(3)); |
| 362 args.SetAt(0, MirrorReference::Handle(zone, MirrorReference::New(lib))); | 361 args.SetAt(0, MirrorReference::Handle(zone, MirrorReference::New(lib))); |
| 363 String& str = String::Handle(zone); | 362 String& str = String::Handle(zone); |
| 364 str = lib.name(); | 363 str = lib.name(); |
| 365 args.SetAt(1, str); | 364 args.SetAt(1, str); |
| 366 str = lib.url(); | 365 str = lib.url(); |
| 367 const char* censored_libraries[] = { | 366 const char* censored_libraries[] = { |
| 368 "dart:_builtin", | 367 "dart:_builtin", |
| (...skipping 29 matching lines...) Expand all Loading... |
| 398 | 397 |
| 399 static RawInstance* CreateCombinatorMirror(const Object& identifiers, | 398 static RawInstance* CreateCombinatorMirror(const Object& identifiers, |
| 400 bool is_show) { | 399 bool is_show) { |
| 401 const Array& args = Array::Handle(Array::New(2)); | 400 const Array& args = Array::Handle(Array::New(2)); |
| 402 args.SetAt(0, identifiers); | 401 args.SetAt(0, identifiers); |
| 403 args.SetAt(1, Bool::Get(is_show)); | 402 args.SetAt(1, Bool::Get(is_show)); |
| 404 return CreateMirror(Symbols::_LocalCombinatorMirror(), args); | 403 return CreateMirror(Symbols::_LocalCombinatorMirror(), args); |
| 405 } | 404 } |
| 406 | 405 |
| 407 | 406 |
| 408 static RawInstance* CreateLibraryDependencyMirror(const Instance& importer, | 407 static RawInstance* CreateLibraryDependencyMirror(Thread* thread, |
| 408 const Instance& importer, |
| 409 const Namespace& ns, | 409 const Namespace& ns, |
| 410 const LibraryPrefix& prefix, | 410 const LibraryPrefix& prefix, |
| 411 const bool is_import, | 411 const bool is_import, |
| 412 const bool is_deferred) { | 412 const bool is_deferred) { |
| 413 const Library& importee = Library::Handle(ns.library()); | 413 const Library& importee = Library::Handle(ns.library()); |
| 414 const Instance& importee_mirror = | 414 const Instance& importee_mirror = |
| 415 Instance::Handle(CreateLibraryMirror(importee)); | 415 Instance::Handle(CreateLibraryMirror(thread, importee)); |
| 416 if (importee_mirror.IsNull()) { | 416 if (importee_mirror.IsNull()) { |
| 417 // Imported library is censored: censor the import. | 417 // Imported library is censored: censor the import. |
| 418 return Instance::null(); | 418 return Instance::null(); |
| 419 } | 419 } |
| 420 | 420 |
| 421 const Array& show_names = Array::Handle(ns.show_names()); | 421 const Array& show_names = Array::Handle(ns.show_names()); |
| 422 const Array& hide_names = Array::Handle(ns.hide_names()); | 422 const Array& hide_names = Array::Handle(ns.hide_names()); |
| 423 intptr_t n = show_names.IsNull() ? 0 : show_names.Length(); | 423 intptr_t n = show_names.IsNull() ? 0 : show_names.Length(); |
| 424 intptr_t m = hide_names.IsNull() ? 0 : hide_names.Length(); | 424 intptr_t m = hide_names.IsNull() ? 0 : hide_names.Length(); |
| 425 const Array& combinators = Array::Handle(Array::New(n + m)); | 425 const Array& combinators = Array::Handle(Array::New(n + m)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 455 } | 455 } |
| 456 | 456 |
| 457 | 457 |
| 458 DEFINE_NATIVE_ENTRY(LibraryMirror_fromPrefix, 1) { | 458 DEFINE_NATIVE_ENTRY(LibraryMirror_fromPrefix, 1) { |
| 459 GET_NON_NULL_NATIVE_ARGUMENT(LibraryPrefix, prefix, | 459 GET_NON_NULL_NATIVE_ARGUMENT(LibraryPrefix, prefix, |
| 460 arguments->NativeArgAt(0)); | 460 arguments->NativeArgAt(0)); |
| 461 const Library& deferred_lib = Library::Handle(prefix.GetLibrary(0)); | 461 const Library& deferred_lib = Library::Handle(prefix.GetLibrary(0)); |
| 462 if (!deferred_lib.Loaded()) { | 462 if (!deferred_lib.Loaded()) { |
| 463 return Instance::null(); | 463 return Instance::null(); |
| 464 } | 464 } |
| 465 return CreateLibraryMirror(deferred_lib); | 465 return CreateLibraryMirror(thread, deferred_lib); |
| 466 } | 466 } |
| 467 | 467 |
| 468 | 468 |
| 469 DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 2) { | 469 DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 2) { |
| 470 GET_NON_NULL_NATIVE_ARGUMENT(Instance, lib_mirror, arguments->NativeArgAt(0)); | 470 GET_NON_NULL_NATIVE_ARGUMENT(Instance, lib_mirror, arguments->NativeArgAt(0)); |
| 471 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 471 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 472 const Library& lib = Library::Handle(ref.GetLibraryReferent()); | 472 const Library& lib = Library::Handle(ref.GetLibraryReferent()); |
| 473 | 473 |
| 474 Array& ports = Array::Handle(); | 474 Array& ports = Array::Handle(); |
| 475 Namespace& ns = Namespace::Handle(); | 475 Namespace& ns = Namespace::Handle(); |
| 476 Instance& dep = Instance::Handle(); | 476 Instance& dep = Instance::Handle(); |
| 477 LibraryPrefix& prefix = LibraryPrefix::Handle(); | 477 LibraryPrefix& prefix = LibraryPrefix::Handle(); |
| 478 GrowableObjectArray& deps = | 478 GrowableObjectArray& deps = |
| 479 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 479 GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| 480 | 480 |
| 481 // Unprefixed imports. | 481 // Unprefixed imports. |
| 482 ports = lib.imports(); | 482 ports = lib.imports(); |
| 483 for (intptr_t i = 0; i < ports.Length(); i++) { | 483 for (intptr_t i = 0; i < ports.Length(); i++) { |
| 484 ns ^= ports.At(i); | 484 ns ^= ports.At(i); |
| 485 if (!ns.IsNull()) { | 485 if (!ns.IsNull()) { |
| 486 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true, false); | 486 dep = CreateLibraryDependencyMirror( |
| 487 thread, lib_mirror, ns, prefix, true, false); |
| 487 if (!dep.IsNull()) { | 488 if (!dep.IsNull()) { |
| 488 deps.Add(dep); | 489 deps.Add(dep); |
| 489 } | 490 } |
| 490 } | 491 } |
| 491 } | 492 } |
| 492 | 493 |
| 493 // Exports. | 494 // Exports. |
| 494 ports = lib.exports(); | 495 ports = lib.exports(); |
| 495 for (intptr_t i = 0; i < ports.Length(); i++) { | 496 for (intptr_t i = 0; i < ports.Length(); i++) { |
| 496 ns ^= ports.At(i); | 497 ns ^= ports.At(i); |
| 497 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, false, false); | 498 dep = CreateLibraryDependencyMirror( |
| 499 thread, lib_mirror, ns, prefix, false, false); |
| 498 if (!dep.IsNull()) { | 500 if (!dep.IsNull()) { |
| 499 deps.Add(dep); | 501 deps.Add(dep); |
| 500 } | 502 } |
| 501 } | 503 } |
| 502 | 504 |
| 503 // Prefixed imports. | 505 // Prefixed imports. |
| 504 DictionaryIterator entries(lib); | 506 DictionaryIterator entries(lib); |
| 505 Object& entry = Object::Handle(); | 507 Object& entry = Object::Handle(); |
| 506 while (entries.HasNext()) { | 508 while (entries.HasNext()) { |
| 507 entry = entries.GetNext(); | 509 entry = entries.GetNext(); |
| 508 if (entry.IsLibraryPrefix()) { | 510 if (entry.IsLibraryPrefix()) { |
| 509 prefix ^= entry.raw(); | 511 prefix ^= entry.raw(); |
| 510 ports = prefix.imports(); | 512 ports = prefix.imports(); |
| 511 for (intptr_t i = 0; i < ports.Length(); i++) { | 513 for (intptr_t i = 0; i < ports.Length(); i++) { |
| 512 ns ^= ports.At(i); | 514 ns ^= ports.At(i); |
| 513 if (!ns.IsNull()) { | 515 if (!ns.IsNull()) { |
| 514 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true, | 516 dep = CreateLibraryDependencyMirror( |
| 515 prefix.is_deferred_load()); | 517 thread, lib_mirror, ns, prefix, true, prefix.is_deferred_load()); |
| 516 if (!dep.IsNull()) { | 518 if (!dep.IsNull()) { |
| 517 deps.Add(dep); | 519 deps.Add(dep); |
| 518 } | 520 } |
| 519 } | 521 } |
| 520 } | 522 } |
| 521 } | 523 } |
| 522 } | 524 } |
| 523 | 525 |
| 524 return deps.raw(); | 526 return deps.raw(); |
| 525 } | 527 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 } | 573 } |
| 572 | 574 |
| 573 | 575 |
| 574 static RawInstance* CreateIsolateMirror() { | 576 static RawInstance* CreateIsolateMirror() { |
| 575 Thread* thread = Thread::Current(); | 577 Thread* thread = Thread::Current(); |
| 576 Isolate* isolate = thread->isolate(); | 578 Isolate* isolate = thread->isolate(); |
| 577 const String& debug_name = String::Handle(String::New(isolate->name())); | 579 const String& debug_name = String::Handle(String::New(isolate->name())); |
| 578 const Library& root_library = Library::Handle(thread->zone(), | 580 const Library& root_library = Library::Handle(thread->zone(), |
| 579 isolate->object_store()->root_library()); | 581 isolate->object_store()->root_library()); |
| 580 const Instance& root_library_mirror = | 582 const Instance& root_library_mirror = |
| 581 Instance::Handle(CreateLibraryMirror(root_library)); | 583 Instance::Handle(CreateLibraryMirror(thread, root_library)); |
| 582 | 584 |
| 583 const Array& args = Array::Handle(Array::New(2)); | 585 const Array& args = Array::Handle(Array::New(2)); |
| 584 args.SetAt(0, debug_name); | 586 args.SetAt(0, debug_name); |
| 585 args.SetAt(1, root_library_mirror); | 587 args.SetAt(1, root_library_mirror); |
| 586 return CreateMirror(Symbols::_LocalIsolateMirror(), args); | 588 return CreateMirror(Symbols::_LocalIsolateMirror(), args); |
| 587 } | 589 } |
| 588 | 590 |
| 589 | 591 |
| 590 static void VerifyMethodKindShifts() { | 592 static void VerifyMethodKindShifts() { |
| 591 #ifdef DEBUG | 593 #ifdef DEBUG |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 zone, isolate->object_store()->libraries()); | 795 zone, isolate->object_store()->libraries()); |
| 794 | 796 |
| 795 const intptr_t num_libraries = libraries.Length(); | 797 const intptr_t num_libraries = libraries.Length(); |
| 796 const GrowableObjectArray& library_mirrors = GrowableObjectArray::Handle( | 798 const GrowableObjectArray& library_mirrors = GrowableObjectArray::Handle( |
| 797 zone, GrowableObjectArray::New(num_libraries)); | 799 zone, GrowableObjectArray::New(num_libraries)); |
| 798 Library& library = Library::Handle(zone); | 800 Library& library = Library::Handle(zone); |
| 799 Instance& library_mirror = Instance::Handle(zone); | 801 Instance& library_mirror = Instance::Handle(zone); |
| 800 | 802 |
| 801 for (int i = 0; i < num_libraries; i++) { | 803 for (int i = 0; i < num_libraries; i++) { |
| 802 library ^= libraries.At(i); | 804 library ^= libraries.At(i); |
| 803 library_mirror = CreateLibraryMirror(library); | 805 library_mirror = CreateLibraryMirror(thread, library); |
| 804 if (!library_mirror.IsNull() && library.Loaded()) { | 806 if (!library_mirror.IsNull() && library.Loaded()) { |
| 805 library_mirrors.Add(library_mirror); | 807 library_mirrors.Add(library_mirror); |
| 806 } | 808 } |
| 807 } | 809 } |
| 808 return library_mirrors.raw(); | 810 return library_mirrors.raw(); |
| 809 } | 811 } |
| 810 | 812 |
| 811 | 813 |
| 812 DEFINE_NATIVE_ENTRY(MirrorSystem_isolate, 0) { | 814 DEFINE_NATIVE_ENTRY(MirrorSystem_isolate, 0) { |
| 813 VerifyMethodKindShifts(); | 815 VerifyMethodKindShifts(); |
| (...skipping 1110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1924 DEFINE_NATIVE_ENTRY(MethodMirror_owner, 2) { | 1926 DEFINE_NATIVE_ENTRY(MethodMirror_owner, 2) { |
| 1925 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1927 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1926 GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); | 1928 GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); |
| 1927 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1929 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 1928 if (func.IsNonImplicitClosureFunction()) { | 1930 if (func.IsNonImplicitClosureFunction()) { |
| 1929 return CreateMethodMirror(Function::Handle( | 1931 return CreateMethodMirror(Function::Handle( |
| 1930 func.parent_function()), Object::null_instance(), instantiator); | 1932 func.parent_function()), Object::null_instance(), instantiator); |
| 1931 } | 1933 } |
| 1932 const Class& owner = Class::Handle(func.Owner()); | 1934 const Class& owner = Class::Handle(func.Owner()); |
| 1933 if (owner.IsTopLevel()) { | 1935 if (owner.IsTopLevel()) { |
| 1934 return CreateLibraryMirror(Library::Handle(owner.library())); | 1936 return CreateLibraryMirror(thread, Library::Handle(owner.library())); |
| 1935 } | 1937 } |
| 1936 | 1938 |
| 1937 AbstractType& type = AbstractType::Handle(owner.DeclarationType()); | 1939 AbstractType& type = AbstractType::Handle(owner.DeclarationType()); |
| 1938 return CreateClassMirror(owner, type, Bool::True(), Object::null_instance()); | 1940 return CreateClassMirror(owner, type, Bool::True(), Object::null_instance()); |
| 1939 } | 1941 } |
| 1940 | 1942 |
| 1941 | 1943 |
| 1942 DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 2) { | 1944 DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 2) { |
| 1943 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); | 1945 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); |
| 1944 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 1946 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2095 | 2097 |
| 2096 DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 2) { | 2098 DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 2) { |
| 2097 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); | 2099 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); |
| 2098 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); | 2100 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); |
| 2099 return Bool::Get(a.IsSubtypeOf(b, NULL, NULL, Heap::kNew)).raw(); | 2101 return Bool::Get(a.IsSubtypeOf(b, NULL, NULL, Heap::kNew)).raw(); |
| 2100 } | 2102 } |
| 2101 | 2103 |
| 2102 #endif // !PRODUCT | 2104 #endif // !PRODUCT |
| 2103 | 2105 |
| 2104 } // namespace dart | 2106 } // namespace dart |
| OLD | NEW |