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

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

Issue 24631003: Add proper API for creating private symbols wrt a library. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: maintain dart2js coverage Created 7 years, 2 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
« no previous file with comments | « no previous file | runtime/lib/mirrors_impl.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/invocation_mirror.h" 5 #include "lib/invocation_mirror.h"
6 #include "vm/bootstrap_natives.h" 6 #include "vm/bootstrap_natives.h"
7 #include "vm/class_finalizer.h" 7 #include "vm/class_finalizer.h"
8 #include "vm/compiler.h" 8 #include "vm/compiler.h"
9 #include "vm/dart_entry.h" 9 #include "vm/dart_entry.h"
10 #include "vm/exceptions.h" 10 #include "vm/exceptions.h"
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); 250 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
251 args.SetAt(1, type); 251 args.SetAt(1, type);
252 return CreateMirror(Symbols::_LocalFunctionTypeMirrorImpl(), args); 252 return CreateMirror(Symbols::_LocalFunctionTypeMirrorImpl(), args);
253 } 253 }
254 254
255 255
256 static RawInstance* CreateMethodMirror(const Function& func, 256 static RawInstance* CreateMethodMirror(const Function& func,
257 const Instance& owner_mirror) { 257 const Instance& owner_mirror) {
258 const Array& args = Array::Handle(Array::New(12)); 258 const Array& args = Array::Handle(Array::New(12));
259 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); 259 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func)));
260 args.SetAt(1, String::Handle(func.UserVisibleName())); 260
261 String& name = String::Handle(func.name());
262 name = String::IdentifierPrettyNameRetainPrivate(name);
263 args.SetAt(1, name);
264
261 args.SetAt(2, owner_mirror); 265 args.SetAt(2, owner_mirror);
262 args.SetAt(3, Bool::Get(func.is_static())); 266 args.SetAt(3, Bool::Get(func.is_static()));
263 args.SetAt(4, Bool::Get(func.is_abstract())); 267 args.SetAt(4, Bool::Get(func.is_abstract()));
264 args.SetAt(5, Bool::Get(func.IsGetterFunction())); 268 args.SetAt(5, Bool::Get(func.IsGetterFunction()));
265 args.SetAt(6, Bool::Get(func.IsSetterFunction())); 269 args.SetAt(6, Bool::Get(func.IsSetterFunction()));
266 270
267 bool isConstructor = (func.kind() == RawFunction::kConstructor); 271 bool isConstructor = (func.kind() == RawFunction::kConstructor);
268 args.SetAt(7, Bool::Get(isConstructor)); 272 args.SetAt(7, Bool::Get(isConstructor));
269 args.SetAt(8, Bool::Get(isConstructor && func.is_const())); 273 args.SetAt(8, Bool::Get(isConstructor && func.is_const()));
270 args.SetAt(9, Bool::Get(isConstructor && func.IsConstructor())); 274 args.SetAt(9, Bool::Get(isConstructor && func.IsConstructor()));
271 args.SetAt(10, Bool::Get(isConstructor && func.is_redirecting())); 275 args.SetAt(10, Bool::Get(isConstructor && func.is_redirecting()));
272 args.SetAt(11, Bool::Get(isConstructor && func.IsFactory())); 276 args.SetAt(11, Bool::Get(isConstructor && func.IsFactory()));
273 277
274 return CreateMirror(Symbols::_LocalMethodMirrorImpl(), args); 278 return CreateMirror(Symbols::_LocalMethodMirrorImpl(), args);
275 } 279 }
276 280
277 281
278 static RawInstance* CreateVariableMirror(const Field& field, 282 static RawInstance* CreateVariableMirror(const Field& field,
279 const Instance& owner_mirror) { 283 const Instance& owner_mirror) {
280 const MirrorReference& field_ref = 284 const MirrorReference& field_ref =
281 MirrorReference::Handle(MirrorReference::New(field)); 285 MirrorReference::Handle(MirrorReference::New(field));
282 286
283 const String& name = String::Handle(field.UserVisibleName()); 287 const String& name = String::Handle(field.name());
284 288
285 const Array& args = Array::Handle(Array::New(6)); 289 const Array& args = Array::Handle(Array::New(6));
286 args.SetAt(0, field_ref); 290 args.SetAt(0, field_ref);
287 args.SetAt(1, name); 291 args.SetAt(1, name);
288 args.SetAt(2, owner_mirror); 292 args.SetAt(2, owner_mirror);
289 args.SetAt(3, Object::null_instance()); // Null for type. 293 args.SetAt(3, Object::null_instance()); // Null for type.
290 args.SetAt(4, Bool::Get(field.is_static())); 294 args.SetAt(4, Bool::Get(field.is_static()));
291 args.SetAt(5, Bool::Get(field.is_final())); 295 args.SetAt(5, Bool::Get(field.is_final()));
292 296
293 return CreateMirror(Symbols::_LocalVariableMirrorImpl(), args); 297 return CreateMirror(Symbols::_LocalVariableMirrorImpl(), args);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 const Bool& is_generic = Bool::Get(cls.NumTypeParameters() != 0); 335 const Bool& is_generic = Bool::Get(cls.NumTypeParameters() != 0);
332 const Bool& is_mixin_typedef = Bool::Get(cls.is_mixin_typedef()); 336 const Bool& is_mixin_typedef = Bool::Get(cls.is_mixin_typedef());
333 337
334 const Array& args = Array::Handle(Array::New(6)); 338 const Array& args = Array::Handle(Array::New(6));
335 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); 339 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
336 args.SetAt(1, type); 340 args.SetAt(1, type);
337 // We do not set the names of anonymous mixin applications because the mirrors 341 // We do not set the names of anonymous mixin applications because the mirrors
338 // use a different naming convention than the VM (lib.S with lib.M and S&M 342 // use a different naming convention than the VM (lib.S with lib.M and S&M
339 // respectively). 343 // respectively).
340 if (!cls.IsMixinApplication() || cls.is_mixin_typedef()) { 344 if (!cls.IsMixinApplication() || cls.is_mixin_typedef()) {
341 args.SetAt(2, String::Handle(cls.UserVisibleName())); 345 args.SetAt(2, String::Handle(cls.Name()));
342 } 346 }
343 args.SetAt(3, is_generic); 347 args.SetAt(3, is_generic);
344 args.SetAt(4, is_mixin_typedef); 348 args.SetAt(4, is_mixin_typedef);
345 args.SetAt(5, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration); 349 args.SetAt(5, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration);
346 return CreateMirror(Symbols::_LocalClassMirrorImpl(), args); 350 return CreateMirror(Symbols::_LocalClassMirrorImpl(), args);
347 } 351 }
348 352
349 353
350 static RawInstance* CreateLibraryMirror(const Library& lib) { 354 static RawInstance* CreateLibraryMirror(const Library& lib) {
351 const Array& args = Array::Handle(Array::New(3)); 355 const Array& args = Array::Handle(Array::New(3));
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 476
473 477
474 static RawInstance* InvokeLibraryGetter(const Library& library, 478 static RawInstance* InvokeLibraryGetter(const Library& library,
475 const String& getter_name, 479 const String& getter_name,
476 const bool throw_nsm_if_absent) { 480 const bool throw_nsm_if_absent) {
477 // To access a top-level we may need to use the Field or the getter Function. 481 // To access a top-level we may need to use the Field or the getter Function.
478 // The getter function may either be in the library or in the field's owner 482 // The getter function may either be in the library or in the field's owner
479 // class, depending on whether it was an actual getter, or an uninitialized 483 // class, depending on whether it was an actual getter, or an uninitialized
480 // field. 484 // field.
481 const Field& field = Field::Handle( 485 const Field& field = Field::Handle(
486 library.LookupLocalField(getter_name));
487 Function& getter = Function::Handle();
488 if (field.IsNull()) {
489 // No field found. Check for a getter in the lib.
490 const String& internal_getter_name =
491 String::Handle(Field::GetterName(getter_name));
492 getter = library.LookupLocalFunction(internal_getter_name);
493 if (getter.IsNull()) {
494 getter = library.LookupLocalFunction(getter_name);
495 if (!getter.IsNull()) {
496 // Looking for a getter but found a regular method: closurize it.
497 const Function& closure_function =
498 Function::Handle(getter.ImplicitClosureFunction());
499 return closure_function.ImplicitStaticClosure();
500 }
501 }
502 } else {
503 if (!field.IsUninitialized()) {
504 return field.value();
505 }
506 // An uninitialized field was found. Check for a getter in the field's
507 // owner classs.
508 const Class& klass = Class::Handle(field.owner());
509 const String& internal_getter_name =
510 String::Handle(Field::GetterName(getter_name));
511 getter = klass.LookupStaticFunction(internal_getter_name);
512 }
513
514 if (!getter.IsNull() && getter.is_visible()) {
515 // Invoke the getter and return the result.
516 const Object& result = Object::Handle(
517 DartEntry::InvokeFunction(getter, Object::empty_array()));
518 return ReturnResult(result);
519 }
520
521 if (throw_nsm_if_absent) {
522 ThrowNoSuchMethod(Instance::null_instance(),
523 getter_name,
524 getter,
525 InvocationMirror::kTopLevel,
526 InvocationMirror::kGetter);
527 UNREACHABLE();
528 }
529
530 // Fall through case: Indicate that we didn't find any function or field using
531 // a special null instance. This is different from a field being null. Callers
532 // make sure that this null does not leak into Dartland.
533 return Object::sentinel().raw();
534 }
535
536
537 // TODO(13656): Remove AllowPrivate.
538 static RawInstance* InvokeLibraryGetterAllowImports(
539 const Library& library,
540 const String& getter_name,
541 const bool throw_nsm_if_absent) {
542 // To access a top-level we may need to use the Field or the getter Function.
543 // The getter function may either be in the library or in the field's owner
544 // class, depending on whether it was an actual getter, or an uninitialized
545 // field.
546 const Field& field = Field::Handle(
482 library.LookupFieldAllowPrivate(getter_name)); 547 library.LookupFieldAllowPrivate(getter_name));
483 Function& getter = Function::Handle(); 548 Function& getter = Function::Handle();
484 if (field.IsNull()) { 549 if (field.IsNull()) {
485 // No field found. Check for a getter in the lib. 550 // No field found. Check for a getter in the lib.
486 const String& internal_getter_name = 551 const String& internal_getter_name =
487 String::Handle(Field::GetterName(getter_name)); 552 String::Handle(Field::GetterName(getter_name));
488 getter = library.LookupFunctionAllowPrivate(internal_getter_name); 553 getter = library.LookupFunctionAllowPrivate(internal_getter_name);
489 if (getter.IsNull()) { 554 if (getter.IsNull()) {
490 getter = library.LookupFunctionAllowPrivate(getter_name); 555 getter = library.LookupFunctionAllowPrivate(getter_name);
491 if (!getter.IsNull()) { 556 if (!getter.IsNull()) {
492 // Looking for a getter but found a regular method: closurize it. 557 // Looking for a getter but found a regular method: closurize it.
493 const Function& closure_function = 558 const Function& closure_function =
494 Function::Handle(getter.ImplicitClosureFunction()); 559 Function::Handle(getter.ImplicitClosureFunction());
495 return closure_function.ImplicitStaticClosure(); 560 return closure_function.ImplicitStaticClosure();
496 } 561 }
497 } 562 }
498 } else { 563 } else {
499 if (!field.IsUninitialized()) { 564 if (!field.IsUninitialized()) {
500 return field.value(); 565 return field.value();
501 } 566 }
502 // An uninitialized field was found. Check for a getter in the field's 567 // An uninitialized field was found. Check for a getter in the field's
503 // owner classs. 568 // owner classs.
504 const Class& klass = Class::Handle(field.owner()); 569 const Class& klass = Class::Handle(field.owner());
505 const String& internal_getter_name = 570 const String& internal_getter_name =
506 String::Handle(Field::GetterName(getter_name)); 571 String::Handle(Field::GetterName(getter_name));
507 getter = klass.LookupStaticFunctionAllowPrivate(internal_getter_name); 572 getter = klass.LookupStaticFunction(internal_getter_name);
508 } 573 }
509 574
510 if (!getter.IsNull() && getter.is_visible()) { 575 if (!getter.IsNull() && getter.is_visible()) {
511 // Invoke the getter and return the result. 576 // Invoke the getter and return the result.
512 const Object& result = Object::Handle( 577 const Object& result = Object::Handle(
513 DartEntry::InvokeFunction(getter, Object::empty_array())); 578 DartEntry::InvokeFunction(getter, Object::empty_array()));
514 return ReturnResult(result); 579 return ReturnResult(result);
515 } 580 }
516 581
517 if (throw_nsm_if_absent) { 582 if (throw_nsm_if_absent) {
(...skipping 14 matching lines...) Expand all
532 597
533 static RawInstance* InvokeClassGetter(const Class& klass, 598 static RawInstance* InvokeClassGetter(const Class& klass,
534 const String& getter_name, 599 const String& getter_name,
535 const bool throw_nsm_if_absent) { 600 const bool throw_nsm_if_absent) {
536 // Note static fields do not have implicit getters. 601 // Note static fields do not have implicit getters.
537 const Field& field = Field::Handle(klass.LookupStaticField(getter_name)); 602 const Field& field = Field::Handle(klass.LookupStaticField(getter_name));
538 if (field.IsNull() || field.IsUninitialized()) { 603 if (field.IsNull() || field.IsUninitialized()) {
539 const String& internal_getter_name = String::Handle( 604 const String& internal_getter_name = String::Handle(
540 Field::GetterName(getter_name)); 605 Field::GetterName(getter_name));
541 Function& getter = Function::Handle( 606 Function& getter = Function::Handle(
542 klass.LookupStaticFunctionAllowPrivate(internal_getter_name)); 607 klass.LookupStaticFunction(internal_getter_name));
543 608
544 if (getter.IsNull() || !getter.is_visible()) { 609 if (getter.IsNull() || !getter.is_visible()) {
545 if (getter.IsNull()) { 610 if (getter.IsNull()) {
546 getter = klass.LookupStaticFunctionAllowPrivate(getter_name); 611 getter = klass.LookupStaticFunction(getter_name);
547 if (!getter.IsNull()) { 612 if (!getter.IsNull()) {
548 // Looking for a getter but found a regular method: closurize it. 613 // Looking for a getter but found a regular method: closurize it.
549 const Function& closure_function = 614 const Function& closure_function =
550 Function::Handle(getter.ImplicitClosureFunction()); 615 Function::Handle(getter.ImplicitClosureFunction());
551 return closure_function.ImplicitStaticClosure(); 616 return closure_function.ImplicitStaticClosure();
552 } 617 }
553 } 618 }
554 if (throw_nsm_if_absent) { 619 if (throw_nsm_if_absent) {
555 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), 620 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
556 getter_name, 621 getter_name,
(...skipping 19 matching lines...) Expand all
576 641
577 642
578 643
579 static RawInstance* InvokeInstanceGetter(const Class& klass, 644 static RawInstance* InvokeInstanceGetter(const Class& klass,
580 const Instance& reflectee, 645 const Instance& reflectee,
581 const String& getter_name, 646 const String& getter_name,
582 const bool throw_nsm_if_absent) { 647 const bool throw_nsm_if_absent) {
583 const String& internal_getter_name = String::Handle( 648 const String& internal_getter_name = String::Handle(
584 Field::GetterName(getter_name)); 649 Field::GetterName(getter_name));
585 Function& function = Function::Handle( 650 Function& function = Function::Handle(
586 Resolver::ResolveDynamicAnyArgsAllowPrivate(klass, internal_getter_name)); 651 Resolver::ResolveDynamicAnyArgs(klass, internal_getter_name));
587 652
588 if (!function.IsNull() || throw_nsm_if_absent) { 653 if (!function.IsNull() || throw_nsm_if_absent) {
589 const int kNumArgs = 1; 654 const int kNumArgs = 1;
590 const Array& args = Array::Handle(Array::New(kNumArgs)); 655 const Array& args = Array::Handle(Array::New(kNumArgs));
591 args.SetAt(0, reflectee); 656 args.SetAt(0, reflectee);
592 const Array& args_descriptor = 657 const Array& args_descriptor =
593 Array::Handle(ArgumentsDescriptor::New(args.Length())); 658 Array::Handle(ArgumentsDescriptor::New(args.Length()));
594 659
595 // InvokeDynamic invokes NoSuchMethod if the provided function is null. 660 // InvokeDynamic invokes NoSuchMethod if the provided function is null.
596 return InvokeDynamicFunction(reflectee, 661 return InvokeDynamicFunction(reflectee,
(...skipping 13 matching lines...) Expand all
610 static RawInstance* LookupFunctionOrFieldInLibraryPrefix( 675 static RawInstance* LookupFunctionOrFieldInLibraryPrefix(
611 const LibraryPrefix& prefix, 676 const LibraryPrefix& prefix,
612 const String& lookup_name) { 677 const String& lookup_name) {
613 const Object& entry = Object::Handle(prefix.LookupObject(lookup_name)); 678 const Object& entry = Object::Handle(prefix.LookupObject(lookup_name));
614 if (!entry.IsNull()) { 679 if (!entry.IsNull()) {
615 if (entry.IsField()) { 680 if (entry.IsField()) {
616 const Field& field = Field::Cast(entry); 681 const Field& field = Field::Cast(entry);
617 const Class& field_owner = Class::Handle(field.owner()); 682 const Class& field_owner = Class::Handle(field.owner());
618 const Library& field_library = Library::Handle(field_owner.library()); 683 const Library& field_library = Library::Handle(field_owner.library());
619 const Instance& result = Instance::Handle( 684 const Instance& result = Instance::Handle(
620 InvokeLibraryGetter(field_library, lookup_name, false)); 685 InvokeLibraryGetterAllowImports(field_library, lookup_name, false));
621 if (result.raw() != Object::sentinel().raw()) { 686 if (result.raw() != Object::sentinel().raw()) {
622 return result.raw(); 687 return result.raw();
623 } 688 }
624 } else if (entry.IsFunction()) { 689 } else if (entry.IsFunction()) {
625 const Function& func = Function::Cast(entry); 690 const Function& func = Function::Cast(entry);
626 const Function& closure_function = Function::Handle( 691 const Function& closure_function = Function::Handle(
627 func.ImplicitClosureFunction()); 692 func.ImplicitClosureFunction());
628 return closure_function.ImplicitStaticClosure(); 693 return closure_function.ImplicitStaticClosure();
629 } 694 }
630 } 695 }
(...skipping 10 matching lines...) Expand all
641 const String& lookup_name) { 706 const String& lookup_name) {
642 Instance& result = Instance::Handle( 707 Instance& result = Instance::Handle(
643 InvokeClassGetter(klass, lookup_name, false)); 708 InvokeClassGetter(klass, lookup_name, false));
644 if (result.raw() != Object::sentinel().raw()) { 709 if (result.raw() != Object::sentinel().raw()) {
645 return result.raw(); 710 return result.raw();
646 } 711 }
647 712
648 Function& func = Function::Handle(); 713 Function& func = Function::Handle();
649 Class& lookup_class = Class::Handle(klass.raw()); 714 Class& lookup_class = Class::Handle(klass.raw());
650 while (func.IsNull() && !lookup_class.IsNull()) { 715 while (func.IsNull() && !lookup_class.IsNull()) {
651 func ^= lookup_class.LookupStaticFunctionAllowPrivate(lookup_name); 716 func ^= lookup_class.LookupStaticFunction(lookup_name);
652 lookup_class = lookup_class.SuperClass(); 717 lookup_class = lookup_class.SuperClass();
653 } 718 }
654 if (!func.IsNull()) { 719 if (!func.IsNull()) {
655 const Function& closure_function = Function::Handle( 720 const Function& closure_function = Function::Handle(
656 func.ImplicitClosureFunction()); 721 func.ImplicitClosureFunction());
657 ASSERT(!closure_function.IsNull()); 722 ASSERT(!closure_function.IsNull());
658 return closure_function.ImplicitStaticClosure(); 723 return closure_function.ImplicitStaticClosure();
659 } 724 }
660 725
661 // Fall through case: Indicate that we didn't find any function or field using 726 // Fall through case: Indicate that we didn't find any function or field using
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 return Object::sentinel().raw(); 767 return Object::sentinel().raw();
703 } 768 }
704 769
705 770
706 static RawInstance* LookupFunctionOrFieldInLibraryHelper( 771 static RawInstance* LookupFunctionOrFieldInLibraryHelper(
707 const Library& library, 772 const Library& library,
708 const String& class_name, 773 const String& class_name,
709 const String& lookup_name) { 774 const String& lookup_name) {
710 if (class_name.IsNull()) { 775 if (class_name.IsNull()) {
711 const Instance& result = Instance::Handle( 776 const Instance& result = Instance::Handle(
712 InvokeLibraryGetter(library, lookup_name, false)); 777 InvokeLibraryGetterAllowImports(library, lookup_name, false));
713 if (result.raw() != Object::sentinel().raw()) { 778 if (result.raw() != Object::sentinel().raw()) {
714 return result.raw(); 779 return result.raw();
715 } 780 }
716 const Function& func = Function::Handle( 781 const Function& func = Function::Handle(
717 library.LookupFunctionAllowPrivate(lookup_name)); 782 library.LookupLocalFunction(lookup_name));
718 if (!func.IsNull()) { 783 if (!func.IsNull()) {
719 const Function& closure_function = Function::Handle( 784 const Function& closure_function = Function::Handle(
720 func.ImplicitClosureFunction()); 785 func.ImplicitClosureFunction());
721 return closure_function.ImplicitStaticClosure(); 786 return closure_function.ImplicitStaticClosure();
722 } 787 }
723 } else { 788 } else {
724 const Class& cls = Class::Handle( 789 const Class& cls = Class::Handle(
725 library.LookupClassAllowPrivate(class_name)); 790 library.LookupClass(class_name));
726 if (!cls.IsNull()) { 791 if (!cls.IsNull()) {
727 return LookupStaticFunctionOrFieldInClass(cls, lookup_name); 792 return LookupStaticFunctionOrFieldInClass(cls, lookup_name);
728 } 793 }
729 } 794 }
730 795
731 // Fall through case: Indicate that we didn't find any function or field using 796 // Fall through case: Indicate that we didn't find any function or field using
732 // a special null instance. This is different from a field being null. Callers 797 // a special null instance. This is different from a field being null. Callers
733 // make sure that this null does not leak into Dartland. 798 // make sure that this null does not leak into Dartland.
734 return Object::sentinel().raw(); 799 return Object::sentinel().raw();
735 } 800 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
784 Bool::True(), // is_declaration 849 Bool::True(), // is_declaration
785 Object::null_instance()); 850 Object::null_instance());
786 } 851 }
787 852
788 853
789 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) { 854 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) {
790 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); 855 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
791 return CreateTypeMirror(type); 856 return CreateTypeMirror(type);
792 } 857 }
793 858
859 DEFINE_NATIVE_ENTRY(Mirrors_mangleName, 2) {
860 GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
861 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
862 const Library& lib = Library::Handle(ref.GetLibraryReferent());
863 return lib.IsPrivate(name) ? lib.PrivateName(name) : name.raw();
864 }
865
866 DEFINE_NATIVE_ENTRY(Mirrors_unmangleName, 1) {
867 GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
868 // It would be nice to unconditionally use IdentifierPrettyName, alas it
869 // cannot cope with the symbols for the names of anonymous mixin applications.
870 if (Library::IsPrivate(name) ||
871 Field::IsGetterName(name) ||
872 Field::IsSetterName(name)) {
873 return String::IdentifierPrettyName(name);
874 }
875 return name.raw();
876 }
877
794 878
795 DEFINE_NATIVE_ENTRY(MirrorReference_equals, 2) { 879 DEFINE_NATIVE_ENTRY(MirrorReference_equals, 2) {
796 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, a, arguments->NativeArgAt(0)); 880 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, a, arguments->NativeArgAt(0));
797 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, b, arguments->NativeArgAt(1)); 881 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, b, arguments->NativeArgAt(1));
798 return Bool::Get(a.referent() == b.referent()).raw(); 882 return Bool::Get(a.referent() == b.referent()).raw();
799 } 883 }
800 884
801 885
802 DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) { 886 DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) {
803 GET_NON_NULL_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(0)); 887 GET_NON_NULL_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(0));
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
1149 // because this native is an instance method in order to be polymorphic 1233 // because this native is an instance method in order to be polymorphic
1150 // with its cousins. 1234 // with its cousins.
1151 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); 1235 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1));
1152 GET_NON_NULL_NATIVE_ARGUMENT( 1236 GET_NON_NULL_NATIVE_ARGUMENT(
1153 String, function_name, arguments->NativeArgAt(2)); 1237 String, function_name, arguments->NativeArgAt(2));
1154 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); 1238 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
1155 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); 1239 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
1156 1240
1157 Class& klass = Class::Handle(reflectee.clazz()); 1241 Class& klass = Class::Handle(reflectee.clazz());
1158 Function& function = Function::Handle( 1242 Function& function = Function::Handle(
1159 Resolver::ResolveDynamicAnyArgsAllowPrivate(klass, function_name)); 1243 Resolver::ResolveDynamicAnyArgs(klass, function_name));
1160 1244
1161 const Array& args_descriptor = 1245 const Array& args_descriptor =
1162 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); 1246 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
1163 1247
1164 return InvokeDynamicFunction(reflectee, 1248 return InvokeDynamicFunction(reflectee,
1165 function, 1249 function,
1166 function_name, 1250 function_name,
1167 args, 1251 args,
1168 args_descriptor); 1252 args_descriptor);
1169 } 1253 }
(...skipping 28 matching lines...) Expand all
1198 while (!klass.IsNull()) { 1282 while (!klass.IsNull()) {
1199 field = klass.LookupInstanceField(setter_name); 1283 field = klass.LookupInstanceField(setter_name);
1200 if (!field.IsNull() && field.is_final()) { 1284 if (!field.IsNull() && field.is_final()) {
1201 const String& message = String::Handle( 1285 const String& message = String::Handle(
1202 String::NewFormatted("%s: cannot set final field '%s'.", 1286 String::NewFormatted("%s: cannot set final field '%s'.",
1203 "InstanceMirror_invokeSetter", 1287 "InstanceMirror_invokeSetter",
1204 setter_name.ToCString())); 1288 setter_name.ToCString()));
1205 ThrowMirroredCompilationError(message); 1289 ThrowMirroredCompilationError(message);
1206 UNREACHABLE(); 1290 UNREACHABLE();
1207 } 1291 }
1208 setter = klass.LookupDynamicFunctionAllowPrivate(internal_setter_name); 1292 setter = klass.LookupDynamicFunction(internal_setter_name);
1209 if (!setter.IsNull()) { 1293 if (!setter.IsNull()) {
1210 break; 1294 break;
1211 } 1295 }
1212 klass = klass.SuperClass(); 1296 klass = klass.SuperClass();
1213 } 1297 }
1214 1298
1215 // Invoke the setter and return the result. 1299 // Invoke the setter and return the result.
1216 const int kNumArgs = 2; 1300 const int kNumArgs = 2;
1217 const Array& args = Array::Handle(Array::New(kNumArgs)); 1301 const Array& args = Array::Handle(Array::New(kNumArgs));
1218 args.SetAt(0, reflectee); 1302 args.SetAt(0, reflectee);
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 const Class& klass = Class::Handle(ref.GetClassReferent()); 1434 const Class& klass = Class::Handle(ref.GetClassReferent());
1351 GET_NON_NULL_NATIVE_ARGUMENT( 1435 GET_NON_NULL_NATIVE_ARGUMENT(
1352 String, function_name, arguments->NativeArgAt(2)); 1436 String, function_name, arguments->NativeArgAt(2));
1353 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); 1437 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
1354 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); 1438 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
1355 1439
1356 const Array& args_descriptor_array = 1440 const Array& args_descriptor_array =
1357 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); 1441 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
1358 1442
1359 const Function& function = Function::Handle( 1443 const Function& function = Function::Handle(
1360 klass.LookupStaticFunctionAllowPrivate(function_name)); 1444 klass.LookupStaticFunction(function_name));
1361
1362 1445
1363 ArgumentsDescriptor args_descriptor(args_descriptor_array); 1446 ArgumentsDescriptor args_descriptor(args_descriptor_array);
1364 if (function.IsNull() || 1447 if (function.IsNull() ||
1365 !function.AreValidArguments(args_descriptor, NULL) || 1448 !function.AreValidArguments(args_descriptor, NULL) ||
1366 !function.is_visible()) { 1449 !function.is_visible()) {
1367 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), 1450 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
1368 function_name, 1451 function_name,
1369 function, 1452 function,
1370 InvocationMirror::kStatic, 1453 InvocationMirror::kStatic,
1371 InvocationMirror::kMethod); 1454 InvocationMirror::kMethod);
(...skipping 29 matching lines...) Expand all
1401 const Class& klass = Class::Handle(ref.GetClassReferent()); 1484 const Class& klass = Class::Handle(ref.GetClassReferent());
1402 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); 1485 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2));
1403 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); 1486 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3));
1404 1487
1405 // Check for real fields and user-defined setters. 1488 // Check for real fields and user-defined setters.
1406 const Field& field = Field::Handle(klass.LookupStaticField(setter_name)); 1489 const Field& field = Field::Handle(klass.LookupStaticField(setter_name));
1407 if (field.IsNull()) { 1490 if (field.IsNull()) {
1408 const String& internal_setter_name = String::Handle( 1491 const String& internal_setter_name = String::Handle(
1409 Field::SetterName(setter_name)); 1492 Field::SetterName(setter_name));
1410 const Function& setter = Function::Handle( 1493 const Function& setter = Function::Handle(
1411 klass.LookupStaticFunctionAllowPrivate(internal_setter_name)); 1494 klass.LookupStaticFunction(internal_setter_name));
1412 1495
1413 if (setter.IsNull() || !setter.is_visible()) { 1496 if (setter.IsNull() || !setter.is_visible()) {
1414 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), 1497 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
1415 setter_name, 1498 setter_name,
1416 setter, 1499 setter,
1417 InvocationMirror::kStatic, 1500 InvocationMirror::kStatic,
1418 InvocationMirror::kSetter); 1501 InvocationMirror::kSetter);
1419 UNREACHABLE(); 1502 UNREACHABLE();
1420 } 1503 }
1421 1504
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 // This convention prevents users from explicitly calling constructors. 1545 // This convention prevents users from explicitly calling constructors.
1463 const String& klass_name = String::Handle(klass.Name()); 1546 const String& klass_name = String::Handle(klass.Name());
1464 String& internal_constructor_name = 1547 String& internal_constructor_name =
1465 String::Handle(String::Concat(klass_name, Symbols::Dot())); 1548 String::Handle(String::Concat(klass_name, Symbols::Dot()));
1466 if (!constructor_name.IsNull()) { 1549 if (!constructor_name.IsNull()) {
1467 internal_constructor_name = 1550 internal_constructor_name =
1468 String::Concat(internal_constructor_name, constructor_name); 1551 String::Concat(internal_constructor_name, constructor_name);
1469 } 1552 }
1470 1553
1471 Function& lookup_constructor = Function::Handle( 1554 Function& lookup_constructor = Function::Handle(
1472 klass.LookupFunctionAllowPrivate(internal_constructor_name)); 1555 klass.LookupFunction(internal_constructor_name));
1473 1556
1474 if (lookup_constructor.IsNull() || 1557 if (lookup_constructor.IsNull() ||
1475 !(lookup_constructor.IsConstructor() || lookup_constructor.IsFactory()) || 1558 !(lookup_constructor.IsConstructor() || lookup_constructor.IsFactory()) ||
1476 !lookup_constructor.is_visible()) { 1559 !lookup_constructor.is_visible()) {
1477 // Pretend we didn't find the constructor at all when the arity is wrong 1560 // Pretend we didn't find the constructor at all when the arity is wrong
1478 // so as to produce the same NoSuchMethodError as the non-reflective case. 1561 // so as to produce the same NoSuchMethodError as the non-reflective case.
1479 lookup_constructor = Function::null(); 1562 lookup_constructor = Function::null();
1480 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), 1563 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
1481 internal_constructor_name, 1564 internal_constructor_name,
1482 lookup_constructor, 1565 lookup_constructor,
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1594 const Library& library = Library::Handle(ref.GetLibraryReferent()); 1677 const Library& library = Library::Handle(ref.GetLibraryReferent());
1595 GET_NON_NULL_NATIVE_ARGUMENT( 1678 GET_NON_NULL_NATIVE_ARGUMENT(
1596 String, function_name, arguments->NativeArgAt(2)); 1679 String, function_name, arguments->NativeArgAt(2));
1597 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); 1680 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
1598 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); 1681 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
1599 1682
1600 const Array& args_descriptor_array = 1683 const Array& args_descriptor_array =
1601 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); 1684 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
1602 1685
1603 const Function& function = Function::Handle( 1686 const Function& function = Function::Handle(
1604 library.LookupFunctionAllowPrivate(function_name)); 1687 library.LookupLocalFunction(function_name));
1605 1688
1606 ArgumentsDescriptor args_descriptor(args_descriptor_array); 1689 ArgumentsDescriptor args_descriptor(args_descriptor_array);
1607 if (function.IsNull() || 1690 if (function.IsNull() ||
1608 !function.AreValidArguments(args_descriptor, NULL) || 1691 !function.AreValidArguments(args_descriptor, NULL) ||
1609 !function.is_visible()) { 1692 !function.is_visible()) {
1610 ThrowNoSuchMethod(Instance::null_instance(), 1693 ThrowNoSuchMethod(Instance::null_instance(),
1611 function_name, 1694 function_name,
1612 function, 1695 function,
1613 InvocationMirror::kTopLevel, 1696 InvocationMirror::kTopLevel,
1614 InvocationMirror::kMethod); 1697 InvocationMirror::kMethod);
(...skipping 27 matching lines...) Expand all
1642 // with its cousins. 1725 // with its cousins.
1643 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); 1726 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
1644 const Library& library = Library::Handle(ref.GetLibraryReferent()); 1727 const Library& library = Library::Handle(ref.GetLibraryReferent());
1645 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); 1728 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2));
1646 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); 1729 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3));
1647 1730
1648 // To access a top-level we may need to use the Field or the 1731 // To access a top-level we may need to use the Field or the
1649 // setter Function. The setter function may either be in the 1732 // setter Function. The setter function may either be in the
1650 // library or in the field's owner class, depending. 1733 // library or in the field's owner class, depending.
1651 const Field& field = Field::Handle( 1734 const Field& field = Field::Handle(
1652 library.LookupFieldAllowPrivate(setter_name)); 1735 library.LookupLocalField(setter_name));
1653 1736
1654 if (field.IsNull()) { 1737 if (field.IsNull()) {
1655 const String& internal_setter_name = 1738 const String& internal_setter_name =
1656 String::Handle(Field::SetterName(setter_name)); 1739 String::Handle(Field::SetterName(setter_name));
1657 const Function& setter = Function::Handle( 1740 const Function& setter = Function::Handle(
1658 library.LookupFunctionAllowPrivate(internal_setter_name)); 1741 library.LookupLocalFunction(internal_setter_name));
1659 if (setter.IsNull() || !setter.is_visible()) { 1742 if (setter.IsNull() || !setter.is_visible()) {
1660 ThrowNoSuchMethod(Instance::null_instance(), 1743 ThrowNoSuchMethod(Instance::null_instance(),
1661 setter_name, 1744 setter_name,
1662 setter, 1745 setter,
1663 InvocationMirror::kTopLevel, 1746 InvocationMirror::kTopLevel,
1664 InvocationMirror::kSetter); 1747 InvocationMirror::kSetter);
1665 UNREACHABLE(); 1748 UNREACHABLE();
1666 } 1749 }
1667 1750
1668 // Invoke the setter and return the result. 1751 // Invoke the setter and return the result.
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1772 } 1855 }
1773 1856
1774 1857
1775 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { 1858 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) {
1776 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); 1859 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
1777 const Field& field = Field::Handle(ref.GetFieldReferent()); 1860 const Field& field = Field::Handle(ref.GetFieldReferent());
1778 return field.type(); 1861 return field.type();
1779 } 1862 }
1780 1863
1781 } // namespace dart 1864 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/lib/mirrors_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698