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

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

Issue 19662003: Refactor resolution code in the vm to properly handle ambiguity errors. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 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 "include/dart_api.h" 5 #include "include/dart_api.h"
6 #include "include/dart_debugger_api.h" 6 #include "include/dart_debugger_api.h"
7 #include "include/dart_mirrors_api.h" 7 #include "include/dart_mirrors_api.h"
8 #include "vm/dart_api_impl.h" 8 #include "vm/dart_api_impl.h"
9 #include "vm/dart_api_state.h" // TODO(11742): Remove with CreateMirrorRef. 9 #include "vm/dart_api_state.h" // TODO(11742): Remove with CreateMirrorRef.
10 #include "vm/bootstrap_natives.h" 10 #include "vm/bootstrap_natives.h"
(...skipping 1610 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 library ^= library_ref.referent(); 1621 library ^= library_ref.referent();
1622 1622
1623 const String& function_name = 1623 const String& function_name =
1624 String::CheckedHandle(arguments->NativeArgAt(2)); 1624 String::CheckedHandle(arguments->NativeArgAt(2));
1625 1625
1626 const Array& positional_args = 1626 const Array& positional_args =
1627 Array::CheckedHandle(arguments->NativeArgAt(3)); 1627 Array::CheckedHandle(arguments->NativeArgAt(3));
1628 intptr_t number_of_arguments = positional_args.Length(); 1628 intptr_t number_of_arguments = positional_args.Length();
1629 1629
1630 1630
1631 String& ambiguity_error_msg = String::Handle(isolate);
1631 const Function& function = Function::Handle( 1632 const Function& function = Function::Handle(
1632 library.LookupFunctionAllowPrivate(function_name)); 1633 library.LookupFunctionAllowPrivate(function_name, &ambiguity_error_msg));
1633 1634
1634 if (function.IsNull()) { 1635 if (function.IsNull()) {
1635 const String& message = String::Handle( 1636 if (ambiguity_error_msg.IsNull()) {
1636 String::NewFormatted("%s: did not find top-level function '%s'.", 1637 const String& message = String::Handle(
1637 "LibraryMirror_invoke", 1638 String::NewFormatted("%s: did not find top-level function '%s'.",
1638 function_name.ToCString())); 1639 "LibraryMirror_invoke",
1639 ThrowMirroredCompilationError(message); 1640 function_name.ToCString()));
1641 ThrowMirroredCompilationError(message);
1642 } else {
1643 ThrowMirroredCompilationError(ambiguity_error_msg);
1644 }
1640 UNREACHABLE(); 1645 UNREACHABLE();
1641 } 1646 }
1642 1647
1643 // LookupFunctionAllowPrivate does not check argument arity, so we 1648 // LookupFunctionAllowPrivate does not check argument arity, so we
1644 // do it here. 1649 // do it here.
1645 String& error_message = String::Handle(); 1650 String& error_message = String::Handle();
1646 if (!function.AreValidArgumentCounts(number_of_arguments, 1651 if (!function.AreValidArgumentCounts(number_of_arguments,
1647 /* num_named_args */ 0, 1652 /* num_named_args */ 0,
1648 &error_message)) { 1653 &error_message)) {
1649 const String& message = String::Handle( 1654 const String& message = String::Handle(
(...skipping 24 matching lines...) Expand all
1674 MirrorReference::CheckedHandle(arguments->NativeArgAt(1)); 1679 MirrorReference::CheckedHandle(arguments->NativeArgAt(1));
1675 Library& library = Library::Handle(); 1680 Library& library = Library::Handle();
1676 library ^= library_ref.referent(); 1681 library ^= library_ref.referent();
1677 1682
1678 const String& getter_name = 1683 const String& getter_name =
1679 String::CheckedHandle(arguments->NativeArgAt(2)); 1684 String::CheckedHandle(arguments->NativeArgAt(2));
1680 1685
1681 // To access a top-level we may need to use the Field or the 1686 // To access a top-level we may need to use the Field or the
1682 // getter Function. The getter function may either be in the 1687 // getter Function. The getter function may either be in the
1683 // library or in the field's owner class, depending. 1688 // library or in the field's owner class, depending.
1684 const Field& field = 1689 String& ambiguity_error_msg = String::Handle(isolate);
1685 Field::Handle(library.LookupFieldAllowPrivate(getter_name)); 1690 const Field& field = Field::Handle(
1691 library.LookupFieldAllowPrivate(getter_name, &ambiguity_error_msg));
1686 Function& getter = Function::Handle(); 1692 Function& getter = Function::Handle();
1687 if (field.IsNull()) { 1693 if (field.IsNull() && ambiguity_error_msg.IsNull()) {
1688 // No field found. Check for a getter in the lib. 1694 // No field found and no ambiguity error. Check for a getter in the lib.
1689 const String& internal_getter_name = 1695 const String& internal_getter_name =
1690 String::Handle(Field::GetterName(getter_name)); 1696 String::Handle(Field::GetterName(getter_name));
1691 getter = library.LookupFunctionAllowPrivate(internal_getter_name); 1697 getter = library.LookupFunctionAllowPrivate(internal_getter_name,
1692 } else if (FieldIsUninitialized(field)) { 1698 &ambiguity_error_msg);
1699 } else if (!field.IsNull() && FieldIsUninitialized(field)) {
1693 // A field was found. Check for a getter in the field's owner classs. 1700 // A field was found. Check for a getter in the field's owner classs.
1694 const Class& klass = Class::Handle(field.owner()); 1701 const Class& klass = Class::Handle(field.owner());
1695 const String& internal_getter_name = 1702 const String& internal_getter_name =
1696 String::Handle(Field::GetterName(getter_name)); 1703 String::Handle(Field::GetterName(getter_name));
1697 getter = klass.LookupStaticFunctionAllowPrivate(internal_getter_name); 1704 getter = klass.LookupStaticFunctionAllowPrivate(internal_getter_name);
1698 } 1705 }
1699 1706
1700 if (!getter.IsNull()) { 1707 if (!getter.IsNull()) {
1701 // Invoke the getter and return the result. 1708 // Invoke the getter and return the result.
1702 const Object& result = Object::Handle( 1709 const Object& result = Object::Handle(
1703 DartEntry::InvokeFunction(getter, Object::empty_array())); 1710 DartEntry::InvokeFunction(getter, Object::empty_array()));
1704 if (result.IsError()) { 1711 if (result.IsError()) {
1705 ThrowInvokeError(Error::Cast(result)); 1712 ThrowInvokeError(Error::Cast(result));
1706 UNREACHABLE(); 1713 UNREACHABLE();
1707 } 1714 }
1708 return result.raw(); 1715 return result.raw();
1709 } else if (!field.IsNull()) { 1716 }
1717 if (!field.IsNull()) {
1710 return field.value(); 1718 return field.value();
1711 } else { 1719 }
1720 if (ambiguity_error_msg.IsNull()) {
1712 const String& message = String::Handle( 1721 const String& message = String::Handle(
1713 String::NewFormatted("%s: did not find top-level variable '%s'.", 1722 String::NewFormatted("%s: did not find top-level variable '%s'.",
1714 "LibraryMirror_invokeGetter", 1723 "LibraryMirror_invokeGetter",
1715 getter_name.ToCString())); 1724 getter_name.ToCString()));
1716 ThrowMirroredCompilationError(message); 1725 ThrowMirroredCompilationError(message);
1717 UNREACHABLE(); 1726 } else {
1718 return Instance::null(); 1727 ThrowMirroredCompilationError(ambiguity_error_msg);
1719 } 1728 }
1729 UNREACHABLE();
1730 return Instance::null();
1720 } 1731 }
1721 1732
1722 1733
1723 DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) { 1734 DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) {
1724 // Argument 0 is the mirror, which is unused by the native. It exists 1735 // Argument 0 is the mirror, which is unused by the native. It exists
1725 // because this native is an instance method in order to be polymorphic 1736 // because this native is an instance method in order to be polymorphic
1726 // with its cousins. 1737 // with its cousins.
1727 1738
1728 const MirrorReference& library_ref = 1739 const MirrorReference& library_ref =
1729 MirrorReference::CheckedHandle(arguments->NativeArgAt(1)); 1740 MirrorReference::CheckedHandle(arguments->NativeArgAt(1));
1730 Library& library = Library::Handle(); 1741 Library& library = Library::Handle();
1731 library ^= library_ref.referent(); 1742 library ^= library_ref.referent();
1732 1743
1733 const String& setter_name = 1744 const String& setter_name =
1734 String::CheckedHandle(arguments->NativeArgAt(2)); 1745 String::CheckedHandle(arguments->NativeArgAt(2));
1735 1746
1736 const Instance& value = Instance::CheckedHandle(arguments->NativeArgAt(3)); 1747 const Instance& value = Instance::CheckedHandle(arguments->NativeArgAt(3));
1737 1748
1738 // To access a top-level we may need to use the Field or the 1749 // To access a top-level we may need to use the Field or the
1739 // setter Function. The setter function may either be in the 1750 // setter Function. The setter function may either be in the
1740 // library or in the field's owner class, depending. 1751 // library or in the field's owner class, depending.
1741 const Field& field = 1752 String& ambiguity_error_msg = String::Handle(isolate);
1742 Field::Handle(library.LookupFieldAllowPrivate(setter_name)); 1753 const Field& field = Field::Handle(
1754 library.LookupFieldAllowPrivate(setter_name, &ambiguity_error_msg));
1743 1755
1744 if (field.IsNull()) { 1756 if (field.IsNull() && ambiguity_error_msg.IsNull()) {
1745 const String& internal_setter_name = 1757 const String& internal_setter_name =
1746 String::Handle(Field::SetterName(setter_name)); 1758 String::Handle(Field::SetterName(setter_name));
1747 const Function& setter = Function::Handle( 1759 const Function& setter = Function::Handle(
1748 library.LookupFunctionAllowPrivate(internal_setter_name)); 1760 library.LookupFunctionAllowPrivate(internal_setter_name,
1749 1761 &ambiguity_error_msg));
1750 if (setter.IsNull()) { 1762 if (setter.IsNull()) {
1751 const String& message = String::Handle( 1763 if (ambiguity_error_msg.IsNull()) {
1752 String::NewFormatted("%s: did not find top-level variable '%s'.", 1764 const String& message = String::Handle(
1753 "LibraryMirror_invokeSetter", 1765 String::NewFormatted("%s: did not find top-level variable '%s'.",
1754 setter_name.ToCString())); 1766 "LibraryMirror_invokeSetter",
1755 ThrowMirroredCompilationError(message); 1767 setter_name.ToCString()));
1768 ThrowMirroredCompilationError(message);
1769 } else {
1770 ThrowMirroredCompilationError(ambiguity_error_msg);
1771 }
1756 UNREACHABLE(); 1772 UNREACHABLE();
1757 } 1773 }
1758 1774
1759 // Invoke the setter and return the result. 1775 // Invoke the setter and return the result.
1760 const int kNumArgs = 1; 1776 const int kNumArgs = 1;
1761 const Array& args = Array::Handle(Array::New(kNumArgs)); 1777 const Array& args = Array::Handle(Array::New(kNumArgs));
1762 args.SetAt(0, value); 1778 args.SetAt(0, value);
1763 const Object& result = Object::Handle( 1779 const Object& result = Object::Handle(
1764 DartEntry::InvokeFunction(setter, args)); 1780 DartEntry::InvokeFunction(setter, args));
1765 if (result.IsError()) { 1781 if (result.IsError()) {
(...skipping 19 matching lines...) Expand all
1785 1801
1786 DEFINE_NATIVE_ENTRY(MethodMirror_name, 1) { 1802 DEFINE_NATIVE_ENTRY(MethodMirror_name, 1) {
1787 const MirrorReference& func_ref = 1803 const MirrorReference& func_ref =
1788 MirrorReference::CheckedHandle(arguments->NativeArgAt(0)); 1804 MirrorReference::CheckedHandle(arguments->NativeArgAt(0));
1789 Function& func = Function::Handle(); 1805 Function& func = Function::Handle();
1790 func ^= func_ref.referent(); 1806 func ^= func_ref.referent();
1791 return func.UserVisibleName(); 1807 return func.UserVisibleName();
1792 } 1808 }
1793 1809
1794 } // namespace dart 1810 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/lib/isolate.cc ('k') | runtime/vm/cha_test.cc » ('j') | runtime/vm/object.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698