| 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 "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 1710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1721 library ^= library_ref.referent(); | 1721 library ^= library_ref.referent(); |
| 1722 | 1722 |
| 1723 const String& function_name = | 1723 const String& function_name = |
| 1724 String::CheckedHandle(arguments->NativeArgAt(2)); | 1724 String::CheckedHandle(arguments->NativeArgAt(2)); |
| 1725 | 1725 |
| 1726 const Array& positional_args = | 1726 const Array& positional_args = |
| 1727 Array::CheckedHandle(arguments->NativeArgAt(3)); | 1727 Array::CheckedHandle(arguments->NativeArgAt(3)); |
| 1728 intptr_t number_of_arguments = positional_args.Length(); | 1728 intptr_t number_of_arguments = positional_args.Length(); |
| 1729 | 1729 |
| 1730 | 1730 |
| 1731 String& ambiguity_error_msg = String::Handle(isolate); |
| 1731 const Function& function = Function::Handle( | 1732 const Function& function = Function::Handle( |
| 1732 library.LookupFunctionAllowPrivate(function_name)); | 1733 library.LookupFunctionAllowPrivate(function_name, &ambiguity_error_msg)); |
| 1733 | 1734 |
| 1734 if (function.IsNull()) { | 1735 if (function.IsNull()) { |
| 1735 const String& message = String::Handle( | 1736 if (ambiguity_error_msg.IsNull()) { |
| 1736 String::NewFormatted("%s: did not find top-level function '%s'.", | 1737 const String& message = String::Handle( |
| 1737 "LibraryMirror_invoke", | 1738 String::NewFormatted("%s: did not find top-level function '%s'.", |
| 1738 function_name.ToCString())); | 1739 "LibraryMirror_invoke", |
| 1739 ThrowMirroredCompilationError(message); | 1740 function_name.ToCString())); |
| 1741 ThrowMirroredCompilationError(message); |
| 1742 } else { |
| 1743 ThrowMirroredCompilationError(ambiguity_error_msg); |
| 1744 } |
| 1740 UNREACHABLE(); | 1745 UNREACHABLE(); |
| 1741 } | 1746 } |
| 1742 | 1747 |
| 1743 // LookupFunctionAllowPrivate does not check argument arity, so we | 1748 // LookupFunctionAllowPrivate does not check argument arity, so we |
| 1744 // do it here. | 1749 // do it here. |
| 1745 String& error_message = String::Handle(); | 1750 String& error_message = String::Handle(); |
| 1746 if (!function.AreValidArgumentCounts(number_of_arguments, | 1751 if (!function.AreValidArgumentCounts(number_of_arguments, |
| 1747 /* num_named_args */ 0, | 1752 /* num_named_args */ 0, |
| 1748 &error_message)) { | 1753 &error_message)) { |
| 1749 const String& message = String::Handle( | 1754 const String& message = String::Handle( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1774 MirrorReference::CheckedHandle(arguments->NativeArgAt(1)); | 1779 MirrorReference::CheckedHandle(arguments->NativeArgAt(1)); |
| 1775 Library& library = Library::Handle(); | 1780 Library& library = Library::Handle(); |
| 1776 library ^= library_ref.referent(); | 1781 library ^= library_ref.referent(); |
| 1777 | 1782 |
| 1778 const String& getter_name = | 1783 const String& getter_name = |
| 1779 String::CheckedHandle(arguments->NativeArgAt(2)); | 1784 String::CheckedHandle(arguments->NativeArgAt(2)); |
| 1780 | 1785 |
| 1781 // To access a top-level we may need to use the Field or the | 1786 // To access a top-level we may need to use the Field or the |
| 1782 // getter Function. The getter function may either be in the | 1787 // getter Function. The getter function may either be in the |
| 1783 // library or in the field's owner class, depending. | 1788 // library or in the field's owner class, depending. |
| 1784 const Field& field = | 1789 String& ambiguity_error_msg = String::Handle(isolate); |
| 1785 Field::Handle(library.LookupFieldAllowPrivate(getter_name)); | 1790 const Field& field = Field::Handle( |
| 1791 library.LookupFieldAllowPrivate(getter_name, &ambiguity_error_msg)); |
| 1786 Function& getter = Function::Handle(); | 1792 Function& getter = Function::Handle(); |
| 1787 if (field.IsNull()) { | 1793 if (field.IsNull() && ambiguity_error_msg.IsNull()) { |
| 1788 // No field found. Check for a getter in the lib. | 1794 // No field found and no ambiguity error. Check for a getter in the lib. |
| 1789 const String& internal_getter_name = | 1795 const String& internal_getter_name = |
| 1790 String::Handle(Field::GetterName(getter_name)); | 1796 String::Handle(Field::GetterName(getter_name)); |
| 1791 getter = library.LookupFunctionAllowPrivate(internal_getter_name); | 1797 getter = library.LookupFunctionAllowPrivate(internal_getter_name, |
| 1792 } else if (FieldIsUninitialized(field)) { | 1798 &ambiguity_error_msg); |
| 1799 } else if (!field.IsNull() && FieldIsUninitialized(field)) { |
| 1793 // A field was found. Check for a getter in the field's owner classs. | 1800 // A field was found. Check for a getter in the field's owner classs. |
| 1794 const Class& klass = Class::Handle(field.owner()); | 1801 const Class& klass = Class::Handle(field.owner()); |
| 1795 const String& internal_getter_name = | 1802 const String& internal_getter_name = |
| 1796 String::Handle(Field::GetterName(getter_name)); | 1803 String::Handle(Field::GetterName(getter_name)); |
| 1797 getter = klass.LookupStaticFunctionAllowPrivate(internal_getter_name); | 1804 getter = klass.LookupStaticFunctionAllowPrivate(internal_getter_name); |
| 1798 } | 1805 } |
| 1799 | 1806 |
| 1800 if (!getter.IsNull()) { | 1807 if (!getter.IsNull()) { |
| 1801 // Invoke the getter and return the result. | 1808 // Invoke the getter and return the result. |
| 1802 const Object& result = Object::Handle( | 1809 const Object& result = Object::Handle( |
| 1803 DartEntry::InvokeFunction(getter, Object::empty_array())); | 1810 DartEntry::InvokeFunction(getter, Object::empty_array())); |
| 1804 if (result.IsError()) { | 1811 if (result.IsError()) { |
| 1805 ThrowInvokeError(Error::Cast(result)); | 1812 ThrowInvokeError(Error::Cast(result)); |
| 1806 UNREACHABLE(); | 1813 UNREACHABLE(); |
| 1807 } | 1814 } |
| 1808 return result.raw(); | 1815 return result.raw(); |
| 1809 } else if (!field.IsNull()) { | 1816 } |
| 1817 if (!field.IsNull()) { |
| 1810 return field.value(); | 1818 return field.value(); |
| 1811 } else { | 1819 } |
| 1820 if (ambiguity_error_msg.IsNull()) { |
| 1812 const String& message = String::Handle( | 1821 const String& message = String::Handle( |
| 1813 String::NewFormatted("%s: did not find top-level variable '%s'.", | 1822 String::NewFormatted("%s: did not find top-level variable '%s'.", |
| 1814 "LibraryMirror_invokeGetter", | 1823 "LibraryMirror_invokeGetter", |
| 1815 getter_name.ToCString())); | 1824 getter_name.ToCString())); |
| 1816 ThrowMirroredCompilationError(message); | 1825 ThrowMirroredCompilationError(message); |
| 1817 UNREACHABLE(); | 1826 } else { |
| 1818 return Instance::null(); | 1827 ThrowMirroredCompilationError(ambiguity_error_msg); |
| 1819 } | 1828 } |
| 1829 UNREACHABLE(); |
| 1830 return Instance::null(); |
| 1820 } | 1831 } |
| 1821 | 1832 |
| 1822 | 1833 |
| 1823 DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) { | 1834 DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) { |
| 1824 // Argument 0 is the mirror, which is unused by the native. It exists | 1835 // Argument 0 is the mirror, which is unused by the native. It exists |
| 1825 // because this native is an instance method in order to be polymorphic | 1836 // because this native is an instance method in order to be polymorphic |
| 1826 // with its cousins. | 1837 // with its cousins. |
| 1827 | 1838 |
| 1828 const MirrorReference& library_ref = | 1839 const MirrorReference& library_ref = |
| 1829 MirrorReference::CheckedHandle(arguments->NativeArgAt(1)); | 1840 MirrorReference::CheckedHandle(arguments->NativeArgAt(1)); |
| 1830 Library& library = Library::Handle(); | 1841 Library& library = Library::Handle(); |
| 1831 library ^= library_ref.referent(); | 1842 library ^= library_ref.referent(); |
| 1832 | 1843 |
| 1833 const String& setter_name = | 1844 const String& setter_name = |
| 1834 String::CheckedHandle(arguments->NativeArgAt(2)); | 1845 String::CheckedHandle(arguments->NativeArgAt(2)); |
| 1835 | 1846 |
| 1836 const Instance& value = Instance::CheckedHandle(arguments->NativeArgAt(3)); | 1847 const Instance& value = Instance::CheckedHandle(arguments->NativeArgAt(3)); |
| 1837 | 1848 |
| 1838 // To access a top-level we may need to use the Field or the | 1849 // To access a top-level we may need to use the Field or the |
| 1839 // setter Function. The setter function may either be in the | 1850 // setter Function. The setter function may either be in the |
| 1840 // library or in the field's owner class, depending. | 1851 // library or in the field's owner class, depending. |
| 1841 const Field& field = | 1852 String& ambiguity_error_msg = String::Handle(isolate); |
| 1842 Field::Handle(library.LookupFieldAllowPrivate(setter_name)); | 1853 const Field& field = Field::Handle( |
| 1854 library.LookupFieldAllowPrivate(setter_name, &ambiguity_error_msg)); |
| 1843 | 1855 |
| 1844 if (field.IsNull()) { | 1856 if (field.IsNull() && ambiguity_error_msg.IsNull()) { |
| 1845 const String& internal_setter_name = | 1857 const String& internal_setter_name = |
| 1846 String::Handle(Field::SetterName(setter_name)); | 1858 String::Handle(Field::SetterName(setter_name)); |
| 1847 const Function& setter = Function::Handle( | 1859 const Function& setter = Function::Handle( |
| 1848 library.LookupFunctionAllowPrivate(internal_setter_name)); | 1860 library.LookupFunctionAllowPrivate(internal_setter_name, |
| 1849 | 1861 &ambiguity_error_msg)); |
| 1850 if (setter.IsNull()) { | 1862 if (setter.IsNull()) { |
| 1851 const String& message = String::Handle( | 1863 if (ambiguity_error_msg.IsNull()) { |
| 1852 String::NewFormatted("%s: did not find top-level variable '%s'.", | 1864 const String& message = String::Handle( |
| 1853 "LibraryMirror_invokeSetter", | 1865 String::NewFormatted("%s: did not find top-level variable '%s'.", |
| 1854 setter_name.ToCString())); | 1866 "LibraryMirror_invokeSetter", |
| 1855 ThrowMirroredCompilationError(message); | 1867 setter_name.ToCString())); |
| 1868 ThrowMirroredCompilationError(message); |
| 1869 } else { |
| 1870 ThrowMirroredCompilationError(ambiguity_error_msg); |
| 1871 } |
| 1856 UNREACHABLE(); | 1872 UNREACHABLE(); |
| 1857 } | 1873 } |
| 1858 | 1874 |
| 1859 // Invoke the setter and return the result. | 1875 // Invoke the setter and return the result. |
| 1860 const int kNumArgs = 1; | 1876 const int kNumArgs = 1; |
| 1861 const Array& args = Array::Handle(Array::New(kNumArgs)); | 1877 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 1862 args.SetAt(0, value); | 1878 args.SetAt(0, value); |
| 1863 const Object& result = Object::Handle( | 1879 const Object& result = Object::Handle( |
| 1864 DartEntry::InvokeFunction(setter, args)); | 1880 DartEntry::InvokeFunction(setter, args)); |
| 1865 if (result.IsError()) { | 1881 if (result.IsError()) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1912 DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 1) { | 1928 DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 1) { |
| 1913 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1929 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1914 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1930 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 1915 // We handle constructors in Dart code. | 1931 // We handle constructors in Dart code. |
| 1916 ASSERT(!func.IsConstructor()); | 1932 ASSERT(!func.IsConstructor()); |
| 1917 const AbstractType& return_type = AbstractType::Handle(func.result_type()); | 1933 const AbstractType& return_type = AbstractType::Handle(func.result_type()); |
| 1918 return CreateTypeMirror(return_type); | 1934 return CreateTypeMirror(return_type); |
| 1919 } | 1935 } |
| 1920 | 1936 |
| 1921 } // namespace dart | 1937 } // namespace dart |
| OLD | NEW |