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

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: 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
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/dart_entry.h" 8 #include "vm/dart_entry.h"
9 #include "vm/exceptions.h" 9 #include "vm/exceptions.h"
10 #include "vm/object_store.h" 10 #include "vm/object_store.h"
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 Bool::True(), // is_declaration 420 Bool::True(), // is_declaration
421 Object::null_instance()); 421 Object::null_instance());
422 } 422 }
423 423
424 424
425 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) { 425 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) {
426 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); 426 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
427 return CreateTypeMirror(type); 427 return CreateTypeMirror(type);
428 } 428 }
429 429
430 DEFINE_NATIVE_ENTRY(Mirrors_mangleName, 2) {
431 GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
432 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
433 const Library& lib = Library::Handle(ref.GetLibraryReferent());
434 return lib.IsPrivate(name) ? lib.PrivateName(name) : name.raw();
435 }
436
437 DEFINE_NATIVE_ENTRY(Mirrors_unmangleName, 1) {
438 GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
439 return Library::IsPrivate(name) ?
440 String::IdentifierPrettyName(name) : name.raw();
441 }
442
430 443
431 DEFINE_NATIVE_ENTRY(MirrorReference_equals, 2) { 444 DEFINE_NATIVE_ENTRY(MirrorReference_equals, 2) {
432 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, a, arguments->NativeArgAt(0)); 445 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, a, arguments->NativeArgAt(0));
433 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, b, arguments->NativeArgAt(1)); 446 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, b, arguments->NativeArgAt(1));
434 return Bool::Get(a.referent() == b.referent()).raw(); 447 return Bool::Get(a.referent() == b.referent()).raw();
435 } 448 }
436 449
437 450
438 DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) { 451 DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) {
439 GET_NON_NULL_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(0)); 452 GET_NON_NULL_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(0));
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 // because this native is an instance method in order to be polymorphic 809 // because this native is an instance method in order to be polymorphic
797 // with its cousins. 810 // with its cousins.
798 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); 811 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1));
799 GET_NON_NULL_NATIVE_ARGUMENT( 812 GET_NON_NULL_NATIVE_ARGUMENT(
800 String, function_name, arguments->NativeArgAt(2)); 813 String, function_name, arguments->NativeArgAt(2));
801 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); 814 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
802 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); 815 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
803 816
804 Class& klass = Class::Handle(reflectee.clazz()); 817 Class& klass = Class::Handle(reflectee.clazz());
805 Function& function = Function::Handle( 818 Function& function = Function::Handle(
806 Resolver::ResolveDynamicAnyArgsAllowPrivate(klass, function_name)); 819 Resolver::ResolveDynamicAnyArgs(klass, function_name));
807 820
808 const Array& args_descriptor = 821 const Array& args_descriptor =
809 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); 822 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
810 823
811 return ReflectivelyInvokeDynamicFunction(reflectee, 824 return ReflectivelyInvokeDynamicFunction(reflectee,
812 function, 825 function,
813 function_name, 826 function_name,
814 args, 827 args,
815 args_descriptor); 828 args_descriptor);
816 } 829 }
817 830
818 831
819 DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) { 832 DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) {
820 // Argument 0 is the mirror, which is unused by the native. It exists 833 // Argument 0 is the mirror, which is unused by the native. It exists
821 // because this native is an instance method in order to be polymorphic 834 // because this native is an instance method in order to be polymorphic
822 // with its cousins. 835 // with its cousins.
823 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); 836 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1));
824 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2)); 837 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2));
825 838
826 Class& klass = Class::Handle(reflectee.clazz()); 839 Class& klass = Class::Handle(reflectee.clazz());
827 String& internal_getter_name = String::Handle(Field::GetterName(getter_name)); 840 String& internal_getter_name = String::Handle(Field::GetterName(getter_name));
828 Function& function = Function::Handle( 841 Function& function = Function::Handle(
829 Resolver::ResolveDynamicAnyArgsAllowPrivate(klass, internal_getter_name)); 842 Resolver::ResolveDynamicAnyArgs(klass, internal_getter_name));
830 843
831 const int kNumArgs = 1; 844 const int kNumArgs = 1;
832 const Array& args = Array::Handle(Array::New(kNumArgs)); 845 const Array& args = Array::Handle(Array::New(kNumArgs));
833 args.SetAt(0, reflectee); 846 args.SetAt(0, reflectee);
834 const Array& args_descriptor = 847 const Array& args_descriptor =
835 Array::Handle(ArgumentsDescriptor::New(args.Length())); 848 Array::Handle(ArgumentsDescriptor::New(args.Length()));
836 849
837 return ReflectivelyInvokeDynamicFunction(reflectee, 850 return ReflectivelyInvokeDynamicFunction(reflectee,
838 function, 851 function,
839 internal_getter_name, 852 internal_getter_name,
(...skipping 20 matching lines...) Expand all
860 while (!klass.IsNull()) { 873 while (!klass.IsNull()) {
861 field = klass.LookupInstanceField(setter_name); 874 field = klass.LookupInstanceField(setter_name);
862 if (!field.IsNull() && field.is_final()) { 875 if (!field.IsNull() && field.is_final()) {
863 const String& message = String::Handle( 876 const String& message = String::Handle(
864 String::NewFormatted("%s: cannot set final field '%s'.", 877 String::NewFormatted("%s: cannot set final field '%s'.",
865 "InstanceMirror_invokeSetter", 878 "InstanceMirror_invokeSetter",
866 setter_name.ToCString())); 879 setter_name.ToCString()));
867 ThrowMirroredCompilationError(message); 880 ThrowMirroredCompilationError(message);
868 UNREACHABLE(); 881 UNREACHABLE();
869 } 882 }
870 setter = klass.LookupDynamicFunctionAllowPrivate(internal_setter_name); 883 setter = klass.LookupDynamicFunction(internal_setter_name);
871 if (!setter.IsNull()) { 884 if (!setter.IsNull()) {
872 break; 885 break;
873 } 886 }
874 klass = klass.SuperClass(); 887 klass = klass.SuperClass();
875 } 888 }
876 889
877 // Invoke the setter and return the result. 890 // Invoke the setter and return the result.
878 const int kNumArgs = 2; 891 const int kNumArgs = 2;
879 const Array& args = Array::Handle(Array::New(kNumArgs)); 892 const Array& args = Array::Handle(Array::New(kNumArgs));
880 args.SetAt(0, reflectee); 893 args.SetAt(0, reflectee);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 const Class& klass = Class::Handle(ref.GetClassReferent()); 942 const Class& klass = Class::Handle(ref.GetClassReferent());
930 GET_NON_NULL_NATIVE_ARGUMENT( 943 GET_NON_NULL_NATIVE_ARGUMENT(
931 String, function_name, arguments->NativeArgAt(2)); 944 String, function_name, arguments->NativeArgAt(2));
932 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); 945 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
933 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); 946 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
934 947
935 const Array& args_descriptor_array = 948 const Array& args_descriptor_array =
936 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); 949 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
937 950
938 const Function& function = Function::Handle( 951 const Function& function = Function::Handle(
939 klass.LookupStaticFunctionAllowPrivate(function_name)); 952 klass.LookupStaticFunction(function_name));
940
941 953
942 ArgumentsDescriptor args_descriptor(args_descriptor_array); 954 ArgumentsDescriptor args_descriptor(args_descriptor_array);
943 if (function.IsNull() || 955 if (function.IsNull() ||
944 !function.AreValidArguments(args_descriptor, NULL) || 956 !function.AreValidArguments(args_descriptor, NULL) ||
945 !function.is_visible()) { 957 !function.is_visible()) {
946 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), 958 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
947 function_name, 959 function_name,
948 function, 960 function,
949 InvocationMirror::kStatic, 961 InvocationMirror::kStatic,
950 InvocationMirror::kMethod); 962 InvocationMirror::kMethod);
(...skipping 17 matching lines...) Expand all
968 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); 980 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
969 const Class& klass = Class::Handle(ref.GetClassReferent()); 981 const Class& klass = Class::Handle(ref.GetClassReferent());
970 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2)); 982 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2));
971 983
972 // Note static fields do not have implicit getters. 984 // Note static fields do not have implicit getters.
973 const Field& field = Field::Handle(klass.LookupStaticField(getter_name)); 985 const Field& field = Field::Handle(klass.LookupStaticField(getter_name));
974 if (field.IsNull() || FieldIsUninitialized(field)) { 986 if (field.IsNull() || FieldIsUninitialized(field)) {
975 const String& internal_getter_name = String::Handle( 987 const String& internal_getter_name = String::Handle(
976 Field::GetterName(getter_name)); 988 Field::GetterName(getter_name));
977 Function& getter = Function::Handle( 989 Function& getter = Function::Handle(
978 klass.LookupStaticFunctionAllowPrivate(internal_getter_name)); 990 klass.LookupStaticFunction(internal_getter_name));
979 991
980 if (getter.IsNull() || !getter.is_visible()) { 992 if (getter.IsNull() || !getter.is_visible()) {
981 if (getter.IsNull()) { 993 if (getter.IsNull()) {
982 getter = klass.LookupStaticFunctionAllowPrivate(getter_name); 994 getter = klass.LookupStaticFunction(getter_name);
983 if (!getter.IsNull()) { 995 if (!getter.IsNull()) {
984 // Looking for a getter but found a regular method: closurize. 996 // Looking for a getter but found a regular method: closurize.
985 const Function& closure_function = 997 const Function& closure_function =
986 Function::Handle(getter.ImplicitClosureFunction()); 998 Function::Handle(getter.ImplicitClosureFunction());
987 return closure_function.ImplicitStaticClosure(); 999 return closure_function.ImplicitStaticClosure();
988 } 1000 }
989 } 1001 }
990 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), 1002 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
991 getter_name, 1003 getter_name,
992 getter, 1004 getter,
(...skipping 23 matching lines...) Expand all
1016 const Class& klass = Class::Handle(ref.GetClassReferent()); 1028 const Class& klass = Class::Handle(ref.GetClassReferent());
1017 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); 1029 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2));
1018 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); 1030 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3));
1019 1031
1020 // Check for real fields and user-defined setters. 1032 // Check for real fields and user-defined setters.
1021 const Field& field = Field::Handle(klass.LookupStaticField(setter_name)); 1033 const Field& field = Field::Handle(klass.LookupStaticField(setter_name));
1022 if (field.IsNull()) { 1034 if (field.IsNull()) {
1023 const String& internal_setter_name = String::Handle( 1035 const String& internal_setter_name = String::Handle(
1024 Field::SetterName(setter_name)); 1036 Field::SetterName(setter_name));
1025 const Function& setter = Function::Handle( 1037 const Function& setter = Function::Handle(
1026 klass.LookupStaticFunctionAllowPrivate(internal_setter_name)); 1038 klass.LookupStaticFunction(internal_setter_name));
1027 1039
1028 if (setter.IsNull() || !setter.is_visible()) { 1040 if (setter.IsNull() || !setter.is_visible()) {
1029 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), 1041 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
1030 setter_name, 1042 setter_name,
1031 setter, 1043 setter,
1032 InvocationMirror::kStatic, 1044 InvocationMirror::kStatic,
1033 InvocationMirror::kSetter); 1045 InvocationMirror::kSetter);
1034 UNREACHABLE(); 1046 UNREACHABLE();
1035 } 1047 }
1036 1048
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1077 // This convention prevents users from explicitly calling constructors. 1089 // This convention prevents users from explicitly calling constructors.
1078 const String& klass_name = String::Handle(klass.Name()); 1090 const String& klass_name = String::Handle(klass.Name());
1079 String& internal_constructor_name = 1091 String& internal_constructor_name =
1080 String::Handle(String::Concat(klass_name, Symbols::Dot())); 1092 String::Handle(String::Concat(klass_name, Symbols::Dot()));
1081 if (!constructor_name.IsNull()) { 1093 if (!constructor_name.IsNull()) {
1082 internal_constructor_name = 1094 internal_constructor_name =
1083 String::Concat(internal_constructor_name, constructor_name); 1095 String::Concat(internal_constructor_name, constructor_name);
1084 } 1096 }
1085 1097
1086 Function& lookup_constructor = Function::Handle( 1098 Function& lookup_constructor = Function::Handle(
1087 klass.LookupFunctionAllowPrivate(internal_constructor_name)); 1099 klass.LookupFunction(internal_constructor_name));
1088 1100
1089 if (lookup_constructor.IsNull() || 1101 if (lookup_constructor.IsNull() ||
1090 !(lookup_constructor.IsConstructor() || lookup_constructor.IsFactory()) || 1102 !(lookup_constructor.IsConstructor() || lookup_constructor.IsFactory()) ||
1091 !lookup_constructor.is_visible()) { 1103 !lookup_constructor.is_visible()) {
1092 // Pretend we didn't find the constructor at all when the arity is wrong 1104 // Pretend we didn't find the constructor at all when the arity is wrong
1093 // so as to produce the same NoSuchMethodError as the non-reflective case. 1105 // so as to produce the same NoSuchMethodError as the non-reflective case.
1094 lookup_constructor = Function::null(); 1106 lookup_constructor = Function::null();
1095 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), 1107 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
1096 internal_constructor_name, 1108 internal_constructor_name,
1097 lookup_constructor, 1109 lookup_constructor,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1193 const Library& library = Library::Handle(ref.GetLibraryReferent()); 1205 const Library& library = Library::Handle(ref.GetLibraryReferent());
1194 GET_NON_NULL_NATIVE_ARGUMENT( 1206 GET_NON_NULL_NATIVE_ARGUMENT(
1195 String, function_name, arguments->NativeArgAt(2)); 1207 String, function_name, arguments->NativeArgAt(2));
1196 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); 1208 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
1197 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); 1209 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
1198 1210
1199 const Array& args_descriptor_array = 1211 const Array& args_descriptor_array =
1200 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); 1212 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
1201 1213
1202 const Function& function = Function::Handle( 1214 const Function& function = Function::Handle(
1203 library.LookupFunctionAllowPrivate(function_name)); 1215 library.LookupLocalFunction(function_name));
1204 1216
1205 ArgumentsDescriptor args_descriptor(args_descriptor_array); 1217 ArgumentsDescriptor args_descriptor(args_descriptor_array);
1206 if (function.IsNull() || 1218 if (function.IsNull() ||
1207 !function.AreValidArguments(args_descriptor, NULL) || 1219 !function.AreValidArguments(args_descriptor, NULL) ||
1208 !function.is_visible()) { 1220 !function.is_visible()) {
1209 ThrowNoSuchMethod(Instance::null_instance(), 1221 ThrowNoSuchMethod(Instance::null_instance(),
1210 function_name, 1222 function_name,
1211 function, 1223 function,
1212 InvocationMirror::kTopLevel, 1224 InvocationMirror::kTopLevel,
1213 InvocationMirror::kMethod); 1225 InvocationMirror::kMethod);
(...skipping 15 matching lines...) Expand all
1229 // because this native is an instance method in order to be polymorphic 1241 // because this native is an instance method in order to be polymorphic
1230 // with its cousins. 1242 // with its cousins.
1231 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); 1243 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
1232 const Library& library = Library::Handle(ref.GetLibraryReferent()); 1244 const Library& library = Library::Handle(ref.GetLibraryReferent());
1233 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2)); 1245 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2));
1234 1246
1235 // To access a top-level we may need to use the Field or the 1247 // To access a top-level we may need to use the Field or the
1236 // getter Function. The getter function may either be in the 1248 // getter Function. The getter function may either be in the
1237 // library or in the field's owner class, depending. 1249 // library or in the field's owner class, depending.
1238 const Field& field = Field::Handle( 1250 const Field& field = Field::Handle(
1239 library.LookupFieldAllowPrivate(getter_name)); 1251 library.LookupLocalField(getter_name));
1240 Function& getter = Function::Handle(); 1252 Function& getter = Function::Handle();
1241 if (field.IsNull()) { 1253 if (field.IsNull()) {
1242 // No field found and no ambiguity error. Check for a getter in the lib. 1254 // No field found and no ambiguity error. Check for a getter in the lib.
1243 const String& internal_getter_name = 1255 const String& internal_getter_name =
1244 String::Handle(Field::GetterName(getter_name)); 1256 String::Handle(Field::GetterName(getter_name));
1245 getter = library.LookupFunctionAllowPrivate(internal_getter_name); 1257 getter = library.LookupLocalFunction(internal_getter_name);
1246 if (getter.IsNull()) { 1258 if (getter.IsNull()) {
1247 getter = library.LookupFunctionAllowPrivate(getter_name); 1259 getter = library.LookupLocalFunction(getter_name);
1248 if (!getter.IsNull()) { 1260 if (!getter.IsNull()) {
1249 // Looking for a getter but found a regular method: closurize. 1261 // Looking for a getter but found a regular method: closurize.
1250 const Function& closure_function = 1262 const Function& closure_function =
1251 Function::Handle(getter.ImplicitClosureFunction()); 1263 Function::Handle(getter.ImplicitClosureFunction());
1252 return closure_function.ImplicitStaticClosure(); 1264 return closure_function.ImplicitStaticClosure();
1253 } 1265 }
1254 } 1266 }
1255 } else if (!field.IsNull() && FieldIsUninitialized(field)) { 1267 } else if (!field.IsNull() && FieldIsUninitialized(field)) {
1256 // A field was found. Check for a getter in the field's owner classs. 1268 // A field was found. Check for a getter in the field's owner classs.
1257 const Class& klass = Class::Handle(field.owner()); 1269 const Class& klass = Class::Handle(field.owner());
1258 const String& internal_getter_name = 1270 const String& internal_getter_name =
1259 String::Handle(Field::GetterName(getter_name)); 1271 String::Handle(Field::GetterName(getter_name));
1260 getter = klass.LookupStaticFunctionAllowPrivate(internal_getter_name); 1272 getter = klass.LookupStaticFunction(internal_getter_name);
1261 } 1273 }
1262 1274
1263 if (!getter.IsNull() && getter.is_visible()) { 1275 if (!getter.IsNull() && getter.is_visible()) {
1264 // Invoke the getter and return the result. 1276 // Invoke the getter and return the result.
1265 const Object& result = Object::Handle( 1277 const Object& result = Object::Handle(
1266 DartEntry::InvokeFunction(getter, Object::empty_array())); 1278 DartEntry::InvokeFunction(getter, Object::empty_array()));
1267 if (result.IsError()) { 1279 if (result.IsError()) {
1268 ThrowInvokeError(Error::Cast(result)); 1280 ThrowInvokeError(Error::Cast(result));
1269 UNREACHABLE(); 1281 UNREACHABLE();
1270 } 1282 }
(...skipping 18 matching lines...) Expand all
1289 // with its cousins. 1301 // with its cousins.
1290 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); 1302 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
1291 const Library& library = Library::Handle(ref.GetLibraryReferent()); 1303 const Library& library = Library::Handle(ref.GetLibraryReferent());
1292 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); 1304 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2));
1293 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); 1305 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3));
1294 1306
1295 // To access a top-level we may need to use the Field or the 1307 // To access a top-level we may need to use the Field or the
1296 // setter Function. The setter function may either be in the 1308 // setter Function. The setter function may either be in the
1297 // library or in the field's owner class, depending. 1309 // library or in the field's owner class, depending.
1298 const Field& field = Field::Handle( 1310 const Field& field = Field::Handle(
1299 library.LookupFieldAllowPrivate(setter_name)); 1311 library.LookupLocalField(setter_name));
1300 1312
1301 if (field.IsNull()) { 1313 if (field.IsNull()) {
1302 const String& internal_setter_name = 1314 const String& internal_setter_name =
1303 String::Handle(Field::SetterName(setter_name)); 1315 String::Handle(Field::SetterName(setter_name));
1304 const Function& setter = Function::Handle( 1316 const Function& setter = Function::Handle(
1305 library.LookupFunctionAllowPrivate(internal_setter_name)); 1317 library.LookupLocalFunction(internal_setter_name));
1306 if (setter.IsNull() || !setter.is_visible()) { 1318 if (setter.IsNull() || !setter.is_visible()) {
1307 ThrowNoSuchMethod(Instance::null_instance(), 1319 ThrowNoSuchMethod(Instance::null_instance(),
1308 setter_name, 1320 setter_name,
1309 setter, 1321 setter,
1310 InvocationMirror::kTopLevel, 1322 InvocationMirror::kTopLevel,
1311 InvocationMirror::kSetter); 1323 InvocationMirror::kSetter);
1312 UNREACHABLE(); 1324 UNREACHABLE();
1313 } 1325 }
1314 1326
1315 // Invoke the setter and return the result. 1327 // Invoke the setter and return the result.
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 } 1431 }
1420 1432
1421 1433
1422 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { 1434 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) {
1423 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); 1435 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
1424 const Field& field = Field::Handle(ref.GetFieldReferent()); 1436 const Field& field = Field::Handle(ref.GetFieldReferent());
1425 return field.type(); 1437 return field.type();
1426 } 1438 }
1427 1439
1428 } // namespace dart 1440 } // namespace dart
OLDNEW
« no previous file with comments | « pkg/pkg.status ('k') | runtime/lib/mirrors_impl.dart » ('j') | sdk/lib/mirrors/mirrors.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698