Index: runtime/vm/dart_api_impl.cc |
=================================================================== |
--- runtime/vm/dart_api_impl.cc (revision 25321) |
+++ runtime/vm/dart_api_impl.cc (working copy) |
@@ -57,7 +57,7 @@ |
if (obj.IsInstance()) { |
const Library& core_lib = Library::Handle(Library::CoreLibrary()); |
const Class& list_class = |
- Class::Handle(core_lib.LookupClass(Symbols::List())); |
+ Class::Handle(core_lib.LookupClass(Symbols::List(), NULL)); |
ASSERT(!list_class.IsNull()); |
const Instance& instance = Instance::Cast(obj); |
const Class& obj_class = Class::Handle(isolate, obj.clazz()); |
@@ -1050,7 +1050,8 @@ |
function_name, |
kNumArguments, |
Object::empty_array(), |
- Resolver::kIsQualified)); |
+ Resolver::kIsQualified, |
+ NULL)); // No ambiguity error expected. |
ASSERT(!function.IsNull()); |
const Array& args = Array::Handle(isolate, Array::New(kNumArguments)); |
args.SetAt(0, Integer::Handle(isolate, Integer::New(port_id))); |
@@ -2061,15 +2062,9 @@ |
CURRENT_FUNC, lib_url.ToCString())); |
return ApiError::New(message); |
} |
- const Class& cls = Class::Handle(isolate, |
- lib.LookupClassAllowPrivate(class_name)); |
- if (cls.IsNull()) { |
- const String& message = String::Handle( |
- String::NewFormatted("%s: class '%s' not found in library '%s'.", |
- CURRENT_FUNC, class_name.ToCString(), |
- lib_url.ToCString())); |
- return ApiError::New(message); |
- } |
+ const Class& cls = Class::Handle( |
+ isolate, lib.LookupClassAllowPrivate(class_name, NULL)); |
+ ASSERT(!cls.IsNull()); |
Object& result = Object::Handle(isolate); |
String& dot_name = String::Handle(String::New(".")); |
String& constr_name = String::Handle(String::Concat(class_name, dot_name)); |
@@ -2418,8 +2413,8 @@ |
const Library& lib = |
Library::Handle(isolate->object_store()->typed_data_library()); |
ASSERT(!lib.IsNull()); |
- const Class& cls = |
- Class::Handle(isolate, lib.LookupClassAllowPrivate(Symbols::ByteData())); |
+ const Class& cls = Class::Handle( |
+ isolate, lib.LookupClassAllowPrivate(Symbols::ByteData(), NULL)); |
ASSERT(!cls.IsNull()); |
return ResolveConstructor(CURRENT_FUNC, |
cls, |
@@ -3008,9 +3003,14 @@ |
return state; |
} |
+ String& ambiguity_error_msg = String::Handle(isolate); |
Function& function = Function::Handle(isolate); |
- function = lib.LookupFunctionAllowPrivate(function_name); |
+ function = lib.LookupFunctionAllowPrivate(function_name, |
+ &ambiguity_error_msg); |
if (function.IsNull()) { |
+ if (!ambiguity_error_msg.IsNull()) { |
+ return Api::NewError("%s.", ambiguity_error_msg.ToCString()); |
+ } |
return Api::NewError("%s: did not find top-level function '%s'.", |
CURRENT_FUNC, |
function_name.ToCString()); |
@@ -3169,14 +3169,16 @@ |
// To access a top-level we may need to use the Field or the |
// getter Function. The getter function may either be in the |
// library or in the field's owner class, depending. |
+ String& ambiguity_error_msg = String::Handle(isolate); |
const Library& lib = Library::Cast(obj); |
- field = lib.LookupFieldAllowPrivate(field_name); |
- if (field.IsNull()) { |
- // No field found. Check for a getter in the lib. |
+ field = lib.LookupFieldAllowPrivate(field_name, &ambiguity_error_msg); |
+ if (field.IsNull() && ambiguity_error_msg.IsNull()) { |
+ // No field found and no ambiguity error. Check for a getter in the lib. |
const String& getter_name = |
String::Handle(isolate, Field::GetterName(field_name)); |
- getter = lib.LookupFunctionAllowPrivate(getter_name); |
- } else if (FieldIsUninitialized(isolate, field)) { |
+ getter = lib.LookupFunctionAllowPrivate(getter_name, |
+ &ambiguity_error_msg); |
+ } else if (!field.IsNull() && FieldIsUninitialized(isolate, field)) { |
// A field was found. Check for a getter in the field's owner classs. |
const Class& cls = Class::Handle(isolate, field.owner()); |
const String& getter_name = |
@@ -3188,12 +3190,15 @@ |
// Invoke the getter and return the result. |
return Api::NewHandle( |
isolate, DartEntry::InvokeFunction(getter, Object::empty_array())); |
- } else if (!field.IsNull()) { |
+ } |
+ if (!field.IsNull()) { |
return Api::NewHandle(isolate, field.value()); |
- } else { |
- return Api::NewError("%s: did not find top-level variable '%s'.", |
- CURRENT_FUNC, field_name.ToCString()); |
} |
+ if (!ambiguity_error_msg.IsNull()) { |
+ return Api::NewError("%s.", ambiguity_error_msg.ToCString()); |
+ } |
+ return Api::NewError("%s: did not find top-level variable '%s'.", |
+ CURRENT_FUNC, field_name.ToCString()); |
} else if (obj.IsError()) { |
return container; |
@@ -3321,12 +3326,14 @@ |
// To access a top-level we may need to use the Field or the |
// setter Function. The setter function may either be in the |
// library or in the field's owner class, depending. |
+ String& ambiguity_error_msg = String::Handle(isolate); |
const Library& lib = Library::Cast(obj); |
- field = lib.LookupFieldAllowPrivate(field_name); |
- if (field.IsNull()) { |
+ field = lib.LookupFieldAllowPrivate(field_name, &ambiguity_error_msg); |
+ if (field.IsNull() && ambiguity_error_msg.IsNull()) { |
const String& setter_name = |
String::Handle(isolate, Field::SetterName(field_name)); |
- setter ^= lib.LookupFunctionAllowPrivate(setter_name); |
+ setter ^= lib.LookupFunctionAllowPrivate(setter_name, |
+ &ambiguity_error_msg); |
} |
if (!setter.IsNull()) { |
@@ -3338,29 +3345,29 @@ |
Object::Handle(isolate, DartEntry::InvokeFunction(setter, args)); |
if (result.IsError()) { |
return Api::NewHandle(isolate, result.raw()); |
- } else { |
- return Api::Success(); |
} |
- } else if (!field.IsNull()) { |
+ return Api::Success(); |
+ } |
+ if (!field.IsNull()) { |
if (field.is_final()) { |
return Api::NewError("%s: cannot set final top-level variable '%s'.", |
CURRENT_FUNC, field_name.ToCString()); |
- } else { |
- field.set_value(value_instance); |
- return Api::Success(); |
} |
- } else { |
- return Api::NewError("%s: did not find top-level variable '%s'.", |
- CURRENT_FUNC, field_name.ToCString()); |
+ field.set_value(value_instance); |
+ return Api::Success(); |
} |
+ if (!ambiguity_error_msg.IsNull()) { |
+ return Api::NewError("%s.", ambiguity_error_msg.ToCString()); |
+ } |
+ return Api::NewError("%s: did not find top-level variable '%s'.", |
+ CURRENT_FUNC, field_name.ToCString()); |
} else if (obj.IsError()) { |
- return container; |
- } else { |
- return Api::NewError( |
- "%s expects argument 'container' to be an object, type, or library.", |
- CURRENT_FUNC); |
+ return container; |
} |
+ return Api::NewError( |
+ "%s expects argument 'container' to be an object, type, or library.", |
+ CURRENT_FUNC); |
} |
@@ -3707,9 +3714,13 @@ |
if (cls_name.IsNull()) { |
RETURN_TYPE_ERROR(isolate, class_name, String); |
} |
- const Class& cls = |
- Class::Handle(isolate, lib.LookupClassAllowPrivate(cls_name)); |
+ String& ambiguity_error_msg = String::Handle(isolate); |
+ const Class& cls = Class::Handle( |
+ isolate, lib.LookupClassAllowPrivate(cls_name, &ambiguity_error_msg)); |
if (cls.IsNull()) { |
+ if (!ambiguity_error_msg.IsNull()) { |
+ return Api::NewError("%s.", ambiguity_error_msg.ToCString()); |
+ } |
// TODO(turnidge): Return null or error in this case? |
const String& lib_name = String::Handle(isolate, lib.name()); |
return Api::NewError("Class '%s' not found in library '%s'.", |
@@ -3740,9 +3751,14 @@ |
if (::Dart_IsError(state)) { |
return state; |
} |
+ String& ambiguity_error_msg = String::Handle(isolate); |
const Class& cls = |
- Class::Handle(isolate, lib.LookupClassAllowPrivate(name_str)); |
+ Class::Handle(isolate, lib.LookupClassAllowPrivate(name_str, |
+ &ambiguity_error_msg)); |
if (cls.IsNull()) { |
+ if (!ambiguity_error_msg.IsNull()) { |
+ return Api::NewError("%s.", ambiguity_error_msg.ToCString()); |
+ } |
const String& lib_name = String::Handle(isolate, lib.name()); |
return Api::NewError("Type '%s' not found in library '%s'.", |
name_str.ToCString(), lib_name.ToCString()); |