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

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

Issue 23484020: Update handling of ambiguous name references (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 3 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 | « runtime/lib/isolate.cc ('k') | runtime/vm/cha_test.cc » ('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/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
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
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
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
OLDNEW
« no previous file with comments | « runtime/lib/isolate.cc ('k') | runtime/vm/cha_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698