| 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/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 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1204 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 1204 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 1205 const Library& library = Library::Handle(ref.GetLibraryReferent()); | 1205 const Library& library = Library::Handle(ref.GetLibraryReferent()); |
| 1206 GET_NON_NULL_NATIVE_ARGUMENT( | 1206 GET_NON_NULL_NATIVE_ARGUMENT( |
| 1207 String, function_name, arguments->NativeArgAt(2)); | 1207 String, function_name, arguments->NativeArgAt(2)); |
| 1208 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); | 1208 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); |
| 1209 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); | 1209 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); |
| 1210 | 1210 |
| 1211 const Array& args_descriptor_array = | 1211 const Array& args_descriptor_array = |
| 1212 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); | 1212 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); |
| 1213 | 1213 |
| 1214 String& ambiguity_error_msg = String::Handle(isolate); | |
| 1215 const Function& function = Function::Handle( | 1214 const Function& function = Function::Handle( |
| 1216 library.LookupFunctionAllowPrivate(function_name, &ambiguity_error_msg)); | 1215 library.LookupFunctionAllowPrivate(function_name)); |
| 1217 | |
| 1218 if (function.IsNull() && !ambiguity_error_msg.IsNull()) { | |
| 1219 ThrowMirroredCompilationError(ambiguity_error_msg); | |
| 1220 UNREACHABLE(); | |
| 1221 } | |
| 1222 | 1216 |
| 1223 ArgumentsDescriptor args_descriptor(args_descriptor_array); | 1217 ArgumentsDescriptor args_descriptor(args_descriptor_array); |
| 1224 if (function.IsNull() || | 1218 if (function.IsNull() || |
| 1225 !function.AreValidArguments(args_descriptor, NULL) || | 1219 !function.AreValidArguments(args_descriptor, NULL) || |
| 1226 !function.is_visible()) { | 1220 !function.is_visible()) { |
| 1227 ThrowNoSuchMethod(Instance::null_instance(), | 1221 ThrowNoSuchMethod(Instance::null_instance(), |
| 1228 function_name, | 1222 function_name, |
| 1229 function, | 1223 function, |
| 1230 InvocationMirror::kTopLevel, | 1224 InvocationMirror::kTopLevel, |
| 1231 InvocationMirror::kMethod); | 1225 InvocationMirror::kMethod); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1246 // Argument 0 is the mirror, which is unused by the native. It exists | 1240 // Argument 0 is the mirror, which is unused by the native. It exists |
| 1247 // 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 |
| 1248 // with its cousins. | 1242 // with its cousins. |
| 1249 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 1243 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 1250 const Library& library = Library::Handle(ref.GetLibraryReferent()); | 1244 const Library& library = Library::Handle(ref.GetLibraryReferent()); |
| 1251 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2)); | 1245 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2)); |
| 1252 | 1246 |
| 1253 // 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 |
| 1254 // getter Function. The getter function may either be in the | 1248 // getter Function. The getter function may either be in the |
| 1255 // library or in the field's owner class, depending. | 1249 // library or in the field's owner class, depending. |
| 1256 String& ambiguity_error_msg = String::Handle(isolate); | |
| 1257 const Field& field = Field::Handle( | 1250 const Field& field = Field::Handle( |
| 1258 library.LookupFieldAllowPrivate(getter_name, &ambiguity_error_msg)); | 1251 library.LookupFieldAllowPrivate(getter_name)); |
| 1259 Function& getter = Function::Handle(); | 1252 Function& getter = Function::Handle(); |
| 1260 if (field.IsNull() && ambiguity_error_msg.IsNull()) { | 1253 if (field.IsNull()) { |
| 1261 // 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. |
| 1262 const String& internal_getter_name = | 1255 const String& internal_getter_name = |
| 1263 String::Handle(Field::GetterName(getter_name)); | 1256 String::Handle(Field::GetterName(getter_name)); |
| 1264 getter = library.LookupFunctionAllowPrivate(internal_getter_name, | 1257 getter = library.LookupFunctionAllowPrivate(internal_getter_name); |
| 1265 &ambiguity_error_msg); | |
| 1266 } else if (!field.IsNull() && FieldIsUninitialized(field)) { | 1258 } else if (!field.IsNull() && FieldIsUninitialized(field)) { |
| 1267 // A field was found. Check for a getter in the field's owner classs. | 1259 // A field was found. Check for a getter in the field's owner classs. |
| 1268 const Class& klass = Class::Handle(field.owner()); | 1260 const Class& klass = Class::Handle(field.owner()); |
| 1269 const String& internal_getter_name = | 1261 const String& internal_getter_name = |
| 1270 String::Handle(Field::GetterName(getter_name)); | 1262 String::Handle(Field::GetterName(getter_name)); |
| 1271 getter = klass.LookupStaticFunctionAllowPrivate(internal_getter_name); | 1263 getter = klass.LookupStaticFunctionAllowPrivate(internal_getter_name); |
| 1272 } | 1264 } |
| 1273 | 1265 |
| 1274 if (!getter.IsNull() && getter.is_visible()) { | 1266 if (!getter.IsNull() && getter.is_visible()) { |
| 1275 // Invoke the getter and return the result. | 1267 // Invoke the getter and return the result. |
| 1276 const Object& result = Object::Handle( | 1268 const Object& result = Object::Handle( |
| 1277 DartEntry::InvokeFunction(getter, Object::empty_array())); | 1269 DartEntry::InvokeFunction(getter, Object::empty_array())); |
| 1278 if (result.IsError()) { | 1270 if (result.IsError()) { |
| 1279 ThrowInvokeError(Error::Cast(result)); | 1271 ThrowInvokeError(Error::Cast(result)); |
| 1280 UNREACHABLE(); | 1272 UNREACHABLE(); |
| 1281 } | 1273 } |
| 1282 return result.raw(); | 1274 return result.raw(); |
| 1283 } | 1275 } |
| 1284 if (!field.IsNull()) { | 1276 if (!field.IsNull()) { |
| 1285 return field.value(); | 1277 return field.value(); |
| 1286 } | 1278 } |
| 1287 if (ambiguity_error_msg.IsNull()) { | 1279 ThrowNoSuchMethod(Instance::null_instance(), |
| 1288 ThrowNoSuchMethod(Instance::null_instance(), | 1280 getter_name, |
| 1289 getter_name, | 1281 getter, |
| 1290 getter, | 1282 InvocationMirror::kTopLevel, |
| 1291 InvocationMirror::kTopLevel, | 1283 InvocationMirror::kGetter); |
| 1292 InvocationMirror::kGetter); | |
| 1293 } else { | |
| 1294 ThrowMirroredCompilationError(ambiguity_error_msg); | |
| 1295 } | |
| 1296 UNREACHABLE(); | 1284 UNREACHABLE(); |
| 1297 return Instance::null(); | 1285 return Instance::null(); |
| 1298 } | 1286 } |
| 1299 | 1287 |
| 1300 | 1288 |
| 1301 DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) { | 1289 DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) { |
| 1302 // Argument 0 is the mirror, which is unused by the native. It exists | 1290 // Argument 0 is the mirror, which is unused by the native. It exists |
| 1303 // because this native is an instance method in order to be polymorphic | 1291 // because this native is an instance method in order to be polymorphic |
| 1304 // with its cousins. | 1292 // with its cousins. |
| 1305 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 1293 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 1306 const Library& library = Library::Handle(ref.GetLibraryReferent()); | 1294 const Library& library = Library::Handle(ref.GetLibraryReferent()); |
| 1307 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); | 1295 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); |
| 1308 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); | 1296 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); |
| 1309 | 1297 |
| 1310 // To access a top-level we may need to use the Field or the | 1298 // To access a top-level we may need to use the Field or the |
| 1311 // setter Function. The setter function may either be in the | 1299 // setter Function. The setter function may either be in the |
| 1312 // library or in the field's owner class, depending. | 1300 // library or in the field's owner class, depending. |
| 1313 String& ambiguity_error_msg = String::Handle(isolate); | |
| 1314 const Field& field = Field::Handle( | 1301 const Field& field = Field::Handle( |
| 1315 library.LookupFieldAllowPrivate(setter_name, &ambiguity_error_msg)); | 1302 library.LookupFieldAllowPrivate(setter_name)); |
| 1316 | 1303 |
| 1317 if (field.IsNull() && ambiguity_error_msg.IsNull()) { | 1304 if (field.IsNull()) { |
| 1318 const String& internal_setter_name = | 1305 const String& internal_setter_name = |
| 1319 String::Handle(Field::SetterName(setter_name)); | 1306 String::Handle(Field::SetterName(setter_name)); |
| 1320 const Function& setter = Function::Handle( | 1307 const Function& setter = Function::Handle( |
| 1321 library.LookupFunctionAllowPrivate(internal_setter_name, | 1308 library.LookupFunctionAllowPrivate(internal_setter_name)); |
| 1322 &ambiguity_error_msg)); | |
| 1323 if (setter.IsNull() || !setter.is_visible()) { | 1309 if (setter.IsNull() || !setter.is_visible()) { |
| 1324 if (ambiguity_error_msg.IsNull()) { | 1310 ThrowNoSuchMethod(Instance::null_instance(), |
| 1325 ThrowNoSuchMethod(Instance::null_instance(), | 1311 setter_name, |
| 1326 setter_name, | 1312 setter, |
| 1327 setter, | 1313 InvocationMirror::kTopLevel, |
| 1328 InvocationMirror::kTopLevel, | 1314 InvocationMirror::kSetter); |
| 1329 InvocationMirror::kSetter); | |
| 1330 } else { | |
| 1331 ThrowMirroredCompilationError(ambiguity_error_msg); | |
| 1332 } | |
| 1333 UNREACHABLE(); | 1315 UNREACHABLE(); |
| 1334 } | 1316 } |
| 1335 | 1317 |
| 1336 // Invoke the setter and return the result. | 1318 // Invoke the setter and return the result. |
| 1337 const int kNumArgs = 1; | 1319 const int kNumArgs = 1; |
| 1338 const Array& args = Array::Handle(Array::New(kNumArgs)); | 1320 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 1339 args.SetAt(0, value); | 1321 args.SetAt(0, value); |
| 1340 const Object& result = Object::Handle( | 1322 const Object& result = Object::Handle( |
| 1341 DartEntry::InvokeFunction(setter, args)); | 1323 DartEntry::InvokeFunction(setter, args)); |
| 1342 if (result.IsError()) { | 1324 if (result.IsError()) { |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1444 } | 1426 } |
| 1445 | 1427 |
| 1446 | 1428 |
| 1447 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { | 1429 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { |
| 1448 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1430 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1449 const Field& field = Field::Handle(ref.GetFieldReferent()); | 1431 const Field& field = Field::Handle(ref.GetFieldReferent()); |
| 1450 return field.type(); | 1432 return field.type(); |
| 1451 } | 1433 } |
| 1452 | 1434 |
| 1453 } // namespace dart | 1435 } // namespace dart |
| OLD | NEW |