| 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/compiler.h" | 8 #include "vm/compiler.h" |
| 9 #include "vm/dart_entry.h" | 9 #include "vm/dart_entry.h" |
| 10 #include "vm/exceptions.h" | 10 #include "vm/exceptions.h" |
| (...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 // Fall through case: Indicate that we didn't find any function or field using | 834 // Fall through case: Indicate that we didn't find any function or field using |
| 835 // a special null instance. This is different from a field being null. Callers | 835 // a special null instance. This is different from a field being null. Callers |
| 836 // make sure that this null does not leak into Dartland. | 836 // make sure that this null does not leak into Dartland. |
| 837 return Object::sentinel().raw(); | 837 return Object::sentinel().raw(); |
| 838 } | 838 } |
| 839 | 839 |
| 840 | 840 |
| 841 static RawAbstractType* InstantiateType(const AbstractType& type, | 841 static RawAbstractType* InstantiateType(const AbstractType& type, |
| 842 const AbstractType& instantiator) { | 842 const AbstractType& instantiator) { |
| 843 ASSERT(type.IsFinalized()); | 843 ASSERT(type.IsFinalized()); |
| 844 ASSERT(instantiator.IsFinalized()); | |
| 845 ASSERT(!type.IsMalformed()); | 844 ASSERT(!type.IsMalformed()); |
| 846 ASSERT(!instantiator.IsMalformed()); | |
| 847 | 845 |
| 848 if (type.IsInstantiated()) { | 846 if (type.IsInstantiated()) { |
| 849 return type.Canonicalize(); | 847 return type.Canonicalize(); |
| 850 } | 848 } |
| 851 | 849 |
| 850 ASSERT(!instantiator.IsNull()); |
| 851 ASSERT(instantiator.IsFinalized()); |
| 852 ASSERT(!instantiator.IsMalformed()); |
| 853 |
| 852 const AbstractTypeArguments& type_args = | 854 const AbstractTypeArguments& type_args = |
| 853 AbstractTypeArguments::Handle(instantiator.arguments()); | 855 AbstractTypeArguments::Handle(instantiator.arguments()); |
| 854 Error& bound_error = Error::Handle(); | 856 Error& bound_error = Error::Handle(); |
| 855 AbstractType& result = | 857 AbstractType& result = |
| 856 AbstractType::Handle(type.InstantiateFrom(type_args, &bound_error)); | 858 AbstractType::Handle(type.InstantiateFrom(type_args, &bound_error)); |
| 857 if (!bound_error.IsNull()) { | 859 if (!bound_error.IsNull()) { |
| 858 ThrowInvokeError(bound_error); | 860 ThrowInvokeError(bound_error); |
| 859 UNREACHABLE(); | 861 UNREACHABLE(); |
| 860 } | 862 } |
| 861 ASSERT(result.IsFinalized()); | 863 ASSERT(result.IsFinalized()); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 | 977 |
| 976 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) { | 978 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) { |
| 977 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); | 979 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); |
| 978 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 980 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 979 const Class& cls = Class::Handle(ref.GetClassReferent()); | 981 const Class& cls = Class::Handle(ref.GetClassReferent()); |
| 980 const Function& func = Function::Handle(cls.signature_function()); | 982 const Function& func = Function::Handle(cls.signature_function()); |
| 981 return CreateParameterMirrorList(func, owner); | 983 return CreateParameterMirrorList(func, owner); |
| 982 } | 984 } |
| 983 | 985 |
| 984 | 986 |
| 985 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 1) { | 987 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 2) { |
| 986 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 988 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 989 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, |
| 990 instantiator, |
| 991 arguments->NativeArgAt(1)); |
| 987 const Class& cls = Class::Handle(ref.GetClassReferent()); | 992 const Class& cls = Class::Handle(ref.GetClassReferent()); |
| 988 const Function& func = Function::Handle(CallMethod(cls)); | 993 const Function& func = Function::Handle(CallMethod(cls)); |
| 989 ASSERT(!func.IsNull()); | 994 ASSERT(!func.IsNull()); |
| 990 return func.result_type(); | 995 AbstractType& type = AbstractType::Handle(func.result_type()); |
| 996 return InstantiateType(type, instantiator); |
| 991 } | 997 } |
| 992 | 998 |
| 993 | 999 |
| 994 DEFINE_NATIVE_ENTRY(ClassMirror_library, 1) { | 1000 DEFINE_NATIVE_ENTRY(ClassMirror_library, 1) { |
| 995 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1001 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 996 const Class& klass = Class::Handle(ref.GetClassReferent()); | 1002 const Class& klass = Class::Handle(ref.GetClassReferent()); |
| 997 const Library& library = Library::Handle(klass.library()); | 1003 const Library& library = Library::Handle(klass.library()); |
| 998 ASSERT(!library.IsNull()); | 1004 ASSERT(!library.IsNull()); |
| 999 return CreateLibraryMirror(library); | 1005 return CreateLibraryMirror(library); |
| 1000 } | 1006 } |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1294 Instance::null_instance()); | 1300 Instance::null_instance()); |
| 1295 } | 1301 } |
| 1296 | 1302 |
| 1297 | 1303 |
| 1298 DEFINE_NATIVE_ENTRY(TypeVariableMirror_upper_bound, 1) { | 1304 DEFINE_NATIVE_ENTRY(TypeVariableMirror_upper_bound, 1) { |
| 1299 GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0)); | 1305 GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0)); |
| 1300 return param.bound(); | 1306 return param.bound(); |
| 1301 } | 1307 } |
| 1302 | 1308 |
| 1303 | 1309 |
| 1304 DEFINE_NATIVE_ENTRY(TypeVariableMirror_instantiate_from, 2) { | |
| 1305 GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0)); | |
| 1306 GET_NON_NULL_NATIVE_ARGUMENT(Type, instantiator, arguments->NativeArgAt(1)); | |
| 1307 ASSERT(param.parameterized_class() == instantiator.type_class()); | |
| 1308 return InstantiateType(param, instantiator); | |
| 1309 } | |
| 1310 | |
| 1311 | |
| 1312 DEFINE_NATIVE_ENTRY(TypedefMirror_instantiate_from, 2) { | |
| 1313 GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0)); | |
| 1314 GET_NON_NULL_NATIVE_ARGUMENT(Type, instantiator, arguments->NativeArgAt(1)); | |
| 1315 const Class& cls = Class::Handle(type.type_class()); | |
| 1316 // We represent typedefs as non-canonical signature classes. | |
| 1317 ASSERT(cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass()); | |
| 1318 return InstantiateType(type, instantiator); | |
| 1319 } | |
| 1320 | |
| 1321 | |
| 1322 | |
| 1323 DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) { | 1310 DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) { |
| 1324 GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0)); | 1311 GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0)); |
| 1325 const Class& cls = Class::Handle(type.type_class()); | 1312 const Class& cls = Class::Handle(type.type_class()); |
| 1326 // We represent typedefs as non-canonical signature classes. | 1313 // We represent typedefs as non-canonical signature classes. |
| 1327 ASSERT(cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass()); | 1314 ASSERT(cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass()); |
| 1328 return CreateTypedefMirror(cls, | 1315 return CreateTypedefMirror(cls, |
| 1329 AbstractType::Handle(cls.DeclarationType()), | 1316 AbstractType::Handle(cls.DeclarationType()), |
| 1330 Bool::True(), // is_declaration | 1317 Bool::True(), // is_declaration |
| 1331 Object::null_instance()); | 1318 Object::null_instance()); |
| 1332 } | 1319 } |
| (...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1894 | 1881 |
| 1895 | 1882 |
| 1896 DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 2) { | 1883 DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 2) { |
| 1897 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); | 1884 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); |
| 1898 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 1885 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 1899 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1886 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 1900 return CreateParameterMirrorList(func, owner); | 1887 return CreateParameterMirrorList(func, owner); |
| 1901 } | 1888 } |
| 1902 | 1889 |
| 1903 | 1890 |
| 1904 DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 1) { | 1891 DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 2) { |
| 1905 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1892 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1906 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1893 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 1894 GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); |
| 1907 // We handle constructors in Dart code. | 1895 // We handle constructors in Dart code. |
| 1908 ASSERT(!func.IsConstructor()); | 1896 ASSERT(!func.IsConstructor()); |
| 1909 return func.result_type(); | 1897 const AbstractType& type = AbstractType::Handle(func.result_type()); |
| 1898 return InstantiateType(type, instantiator); |
| 1910 } | 1899 } |
| 1911 | 1900 |
| 1912 | 1901 |
| 1913 DEFINE_NATIVE_ENTRY(MethodMirror_source, 1) { | 1902 DEFINE_NATIVE_ENTRY(MethodMirror_source, 1) { |
| 1914 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1903 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1915 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1904 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 1916 const Script& script = Script::Handle(func.script()); | 1905 const Script& script = Script::Handle(func.script()); |
| 1917 const TokenStream& stream = TokenStream::Handle(script.tokens()); | 1906 const TokenStream& stream = TokenStream::Handle(script.tokens()); |
| 1918 const TokenStream::Iterator tkit(stream, func.end_token_pos()); | 1907 const TokenStream::Iterator tkit(stream, func.end_token_pos()); |
| 1919 intptr_t from_line; | 1908 intptr_t from_line; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1945 const Function& sig_func = Function::Handle(cls.signature_function()); | 1934 const Function& sig_func = Function::Handle(cls.signature_function()); |
| 1946 const Class& sig_cls = Class::Handle(sig_func.signature_class()); | 1935 const Class& sig_cls = Class::Handle(sig_func.signature_class()); |
| 1947 | 1936 |
| 1948 AbstractType& referent_type = AbstractType::Handle(sig_cls.DeclarationType()); | 1937 AbstractType& referent_type = AbstractType::Handle(sig_cls.DeclarationType()); |
| 1949 referent_type = InstantiateType(referent_type, type); | 1938 referent_type = InstantiateType(referent_type, type); |
| 1950 | 1939 |
| 1951 return CreateFunctionTypeMirror(sig_cls, referent_type); | 1940 return CreateFunctionTypeMirror(sig_cls, referent_type); |
| 1952 } | 1941 } |
| 1953 | 1942 |
| 1954 | 1943 |
| 1955 DEFINE_NATIVE_ENTRY(ParameterMirror_type, 2) { | 1944 DEFINE_NATIVE_ENTRY(ParameterMirror_type, 3) { |
| 1956 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1945 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1957 GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1)); | 1946 GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1)); |
| 1947 GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(2)); |
| 1958 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1948 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 1959 return func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value()); | 1949 const AbstractType& type = AbstractType::Handle( |
| 1950 func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value())); |
| 1951 return InstantiateType(type, instantiator); |
| 1960 } | 1952 } |
| 1961 | 1953 |
| 1962 | 1954 |
| 1963 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { | 1955 DEFINE_NATIVE_ENTRY(VariableMirror_type, 2) { |
| 1964 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1956 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1965 const Field& field = Field::Handle(ref.GetFieldReferent()); | 1957 const Field& field = Field::Handle(ref.GetFieldReferent()); |
| 1966 return field.type(); | 1958 GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); |
| 1959 const AbstractType& type = AbstractType::Handle(field.type()); |
| 1960 return InstantiateType(type, instantiator); |
| 1967 } | 1961 } |
| 1968 | 1962 |
| 1969 } // namespace dart | 1963 } // namespace dart |
| OLD | NEW |