| 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/mirrors.h" | 5 #include "lib/mirrors.h" | 
| 6 | 6 | 
| 7 #include "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" | 
| 8 #include "vm/bootstrap_natives.h" | 8 #include "vm/bootstrap_natives.h" | 
| 9 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" | 
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" | 
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 132   EnsureConstructorsAreCompiled(func); | 132   EnsureConstructorsAreCompiled(func); | 
| 133 | 133 | 
| 134   bool has_extra_parameter_info = true; | 134   bool has_extra_parameter_info = true; | 
| 135   if (non_implicit_param_count == 0) { | 135   if (non_implicit_param_count == 0) { | 
| 136     has_extra_parameter_info = false; | 136     has_extra_parameter_info = false; | 
| 137   } | 137   } | 
| 138   if (func.IsImplicitConstructor()) { | 138   if (func.IsImplicitConstructor()) { | 
| 139     // This covers the default constructor and forwarding constructors. | 139     // This covers the default constructor and forwarding constructors. | 
| 140     has_extra_parameter_info = false; | 140     has_extra_parameter_info = false; | 
| 141   } | 141   } | 
|  | 142   if (func.IsSignatureFunction() && | 
|  | 143       (func.token_pos() == Token::kNoSourcePos)) { | 
|  | 144     // Signature functions (except those describing typedefs) get canonicalized, | 
|  | 145     // hence do not have a token position, and therefore cannot be reparsed. | 
|  | 146     has_extra_parameter_info = false; | 
|  | 147   } | 
| 142 | 148 | 
| 143   Array& param_descriptor = Array::Handle(); | 149   Array& param_descriptor = Array::Handle(); | 
| 144   if (has_extra_parameter_info) { | 150   if (has_extra_parameter_info) { | 
| 145     // Reparse the function for the following information: | 151     // Reparse the function for the following information: | 
| 146     // * The default value of a parameter. | 152     // * The default value of a parameter. | 
| 147     // * Whether a parameters has been deflared as final. | 153     // * Whether a parameters has been declared as final. | 
| 148     // * Any metadata associated with the parameter. | 154     // * Any metadata associated with the parameter. | 
| 149     const Object& result = | 155     const Object& result = | 
| 150         Object::Handle(Parser::ParseFunctionParameters(func)); | 156         Object::Handle(Parser::ParseFunctionParameters(func)); | 
| 151     if (result.IsError()) { | 157     if (result.IsError()) { | 
| 152       Exceptions::PropagateError(Error::Cast(result)); | 158       Exceptions::PropagateError(Error::Cast(result)); | 
| 153       UNREACHABLE(); | 159       UNREACHABLE(); | 
| 154     } | 160     } | 
| 155     param_descriptor ^= result.raw(); | 161     param_descriptor ^= result.raw(); | 
| 156     ASSERT(param_descriptor.Length() == | 162     ASSERT(param_descriptor.Length() == | 
| 157            (Parser::kParameterEntrySize * non_implicit_param_count)); | 163            (Parser::kParameterEntrySize * non_implicit_param_count)); | 
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 230 | 236 | 
| 231 | 237 | 
| 232 static RawInstance* CreateTypedefMirror(const Class& cls, | 238 static RawInstance* CreateTypedefMirror(const Class& cls, | 
| 233                                         const AbstractType& type, | 239                                         const AbstractType& type, | 
| 234                                         const Bool& is_declaration, | 240                                         const Bool& is_declaration, | 
| 235                                         const Instance& owner_mirror) { | 241                                         const Instance& owner_mirror) { | 
| 236   const Array& args = Array::Handle(Array::New(6)); | 242   const Array& args = Array::Handle(Array::New(6)); | 
| 237   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); | 243   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); | 
| 238   args.SetAt(1, type); | 244   args.SetAt(1, type); | 
| 239   args.SetAt(2, String::Handle(cls.Name())); | 245   args.SetAt(2, String::Handle(cls.Name())); | 
| 240   args.SetAt(3, Bool::Get(cls.NumTypeParameters() != 0)); | 246   args.SetAt(3, Bool::Get(cls.IsGeneric())); | 
| 241   args.SetAt(4, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration); | 247   args.SetAt(4, cls.IsGeneric() ? is_declaration : Bool::False()); | 
| 242   args.SetAt(5, owner_mirror); | 248   args.SetAt(5, owner_mirror); | 
| 243   return CreateMirror(Symbols::_LocalTypedefMirror(), args); | 249   return CreateMirror(Symbols::_LocalTypedefMirror(), args); | 
| 244 } | 250 } | 
| 245 | 251 | 
| 246 | 252 | 
| 247 static RawInstance* CreateFunctionTypeMirror(const Class& cls, | 253 static RawInstance* CreateFunctionTypeMirror(const AbstractType& type) { | 
| 248                                              const AbstractType& type) { | 254   ASSERT(type.IsFunctionType()); | 
| 249   const Array& args = Array::Handle(Array::New(2)); | 255   const Class& cls = Class::Handle(FunctionType::Cast(type).scope_class()); | 
|  | 256   const Function& func = Function::Handle(FunctionType::Cast(type).signature()); | 
|  | 257   const Array& args = Array::Handle(Array::New(3)); | 
| 250   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); | 258   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); | 
| 251   args.SetAt(1, type); | 259   args.SetAt(1, MirrorReference::Handle(MirrorReference::New(func))); | 
|  | 260   args.SetAt(2, type); | 
| 252   return CreateMirror(Symbols::_LocalFunctionTypeMirror(), args); | 261   return CreateMirror(Symbols::_LocalFunctionTypeMirror(), args); | 
| 253 } | 262 } | 
| 254 | 263 | 
| 255 | 264 | 
| 256 static RawInstance* CreateMethodMirror(const Function& func, | 265 static RawInstance* CreateMethodMirror(const Function& func, | 
| 257                                        const Instance& owner_mirror, | 266                                        const Instance& owner_mirror, | 
| 258                                        const AbstractType& instantiator) { | 267                                        const AbstractType& instantiator) { | 
| 259   const Array& args = Array::Handle(Array::New(6)); | 268   const Array& args = Array::Handle(Array::New(6)); | 
| 260   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); | 269   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); | 
| 261 | 270 | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 297   args.SetAt(1, name); | 306   args.SetAt(1, name); | 
| 298   args.SetAt(2, owner_mirror); | 307   args.SetAt(2, owner_mirror); | 
| 299   args.SetAt(3, Object::null_instance());  // Null for type. | 308   args.SetAt(3, Object::null_instance());  // Null for type. | 
| 300   args.SetAt(4, Bool::Get(field.is_static())); | 309   args.SetAt(4, Bool::Get(field.is_static())); | 
| 301   args.SetAt(5, Bool::Get(field.is_final())); | 310   args.SetAt(5, Bool::Get(field.is_final())); | 
| 302   args.SetAt(6, Bool::Get(field.is_const())); | 311   args.SetAt(6, Bool::Get(field.is_const())); | 
| 303 | 312 | 
| 304   return CreateMirror(Symbols::_LocalVariableMirror(), args); | 313   return CreateMirror(Symbols::_LocalVariableMirror(), args); | 
| 305 } | 314 } | 
| 306 | 315 | 
| 307 static RawFunction* CallMethod(const Class& cls) { |  | 
| 308   if (cls.IsSignatureClass()) { |  | 
| 309     return cls.signature_function(); |  | 
| 310   } |  | 
| 311 |  | 
| 312   Class& lookup_cls = Class::Handle(cls.raw()); |  | 
| 313   Function& call_function = Function::Handle(); |  | 
| 314   do { |  | 
| 315     call_function = lookup_cls.LookupDynamicFunction(Symbols::Call()); |  | 
| 316     if (!call_function.IsNull()) { |  | 
| 317       return call_function.raw(); |  | 
| 318     } |  | 
| 319     lookup_cls = lookup_cls.SuperClass(); |  | 
| 320   } while (!lookup_cls.IsNull()); |  | 
| 321   return Function::null(); |  | 
| 322 } |  | 
| 323 | 316 | 
| 324 static RawInstance* CreateClassMirror(const Class& cls, | 317 static RawInstance* CreateClassMirror(const Class& cls, | 
| 325                                       const AbstractType& type, | 318                                       const AbstractType& type, | 
| 326                                       const Bool& is_declaration, | 319                                       const Bool& is_declaration, | 
| 327                                       const Instance& owner_mirror) { | 320                                       const Instance& owner_mirror) { | 
| 328   if (type.IsTypeRef()) { | 321   if (type.IsTypeRef()) { | 
| 329     AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type()); | 322     AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type()); | 
| 330     ASSERT(!ref_type.IsTypeRef()); | 323     ASSERT(!ref_type.IsTypeRef()); | 
| 331     ASSERT(ref_type.IsCanonical()); | 324     ASSERT(ref_type.IsCanonical()); | 
| 332     return CreateClassMirror(cls, ref_type, is_declaration, owner_mirror); | 325     return CreateClassMirror(cls, ref_type, is_declaration, owner_mirror); | 
| 333   } | 326   } | 
| 334   ASSERT(!cls.IsDynamicClass() && !cls.IsVoidClass()); | 327   ASSERT(!cls.IsDynamicClass() && !cls.IsVoidClass()); | 
| 335   ASSERT(!type.IsNull()); | 328   ASSERT(!type.IsNull()); | 
| 336   ASSERT(type.IsFinalized()); | 329   ASSERT(type.IsFinalized()); | 
| 337 | 330 | 
| 338   if (cls.IsSignatureClass()) { | 331   if (cls.IsTypedefClass()) { | 
| 339     if (cls.IsCanonicalSignatureClass()) { | 332     return CreateTypedefMirror(cls, type, is_declaration, owner_mirror); | 
| 340       // We represent function types as canonical signature classes. |  | 
| 341       return CreateFunctionTypeMirror(cls, type); |  | 
| 342     } else { |  | 
| 343       // We represent typedefs as non-canonical signature classes. |  | 
| 344       return CreateTypedefMirror(cls, type, is_declaration, owner_mirror); |  | 
| 345     } |  | 
| 346   } | 333   } | 
| 347 | 334 | 
| 348   const Error& error = Error::Handle(cls.EnsureIsFinalized(Thread::Current())); | 335   const Error& error = Error::Handle(cls.EnsureIsFinalized(Thread::Current())); | 
| 349   if (!error.IsNull()) { | 336   if (!error.IsNull()) { | 
| 350     Exceptions::PropagateError(error); | 337     Exceptions::PropagateError(error); | 
| 351     UNREACHABLE(); | 338     UNREACHABLE(); | 
| 352   } | 339   } | 
| 353 | 340 | 
| 354   const Array& args = Array::Handle(Array::New(9)); | 341   const Array& args = Array::Handle(Array::New(9)); | 
| 355   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); | 342   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); | 
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 547   if (type.IsTypeRef()) { | 534   if (type.IsTypeRef()) { | 
| 548     AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type()); | 535     AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type()); | 
| 549     ASSERT(!ref_type.IsTypeRef()); | 536     ASSERT(!ref_type.IsTypeRef()); | 
| 550     ASSERT(ref_type.IsCanonical()); | 537     ASSERT(ref_type.IsCanonical()); | 
| 551     return CreateTypeMirror(ref_type); | 538     return CreateTypeMirror(ref_type); | 
| 552   } | 539   } | 
| 553   ASSERT(type.IsFinalized()); | 540   ASSERT(type.IsFinalized()); | 
| 554   PROPAGATE_IF_MALFORMED(type); | 541   PROPAGATE_IF_MALFORMED(type); | 
| 555   ASSERT(type.IsCanonical() || type.IsTypeParameter() || type.IsBoundedType()); | 542   ASSERT(type.IsCanonical() || type.IsTypeParameter() || type.IsBoundedType()); | 
| 556 | 543 | 
|  | 544   if (type.IsFunctionType()) { | 
|  | 545     const Class& scope_class = | 
|  | 546         Class::Handle(FunctionType::Cast(type).scope_class()); | 
|  | 547     if (scope_class.IsTypedefClass()) { | 
|  | 548       return CreateTypedefMirror(scope_class, | 
|  | 549                                  type, Bool::False(), Object::null_instance()); | 
|  | 550     } else { | 
|  | 551       return CreateFunctionTypeMirror(type); | 
|  | 552     } | 
|  | 553   } | 
| 557   if (type.HasResolvedTypeClass()) { | 554   if (type.HasResolvedTypeClass()) { | 
| 558     const Class& cls = Class::Handle(type.type_class()); | 555     const Class& cls = Class::Handle(type.type_class()); | 
| 559     // Handle void and dynamic types. | 556     // Handle void and dynamic types. | 
| 560     if (cls.IsVoidClass()) { | 557     if (cls.IsVoidClass()) { | 
| 561       Array& args = Array::Handle(Array::New(1)); | 558       Array& args = Array::Handle(Array::New(1)); | 
| 562       args.SetAt(0, Symbols::Void()); | 559       args.SetAt(0, Symbols::Void()); | 
| 563       return CreateMirror(Symbols::_SpecialTypeMirror(), args); | 560       return CreateMirror(Symbols::_SpecialTypeMirror(), args); | 
| 564     } else if (cls.IsDynamicClass()) { | 561     } else if (cls.IsDynamicClass()) { | 
| 565       Array& args = Array::Handle(Array::New(1)); | 562       Array& args = Array::Handle(Array::New(1)); | 
| 566       args.SetAt(0, Symbols::Dynamic()); | 563       args.SetAt(0, Symbols::Dynamic()); | 
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 778     return type.Canonicalize(); | 775     return type.Canonicalize(); | 
| 779   } | 776   } | 
| 780 | 777 | 
| 781   ASSERT(!instantiator.IsNull()); | 778   ASSERT(!instantiator.IsNull()); | 
| 782   ASSERT(instantiator.IsFinalized()); | 779   ASSERT(instantiator.IsFinalized()); | 
| 783   PROPAGATE_IF_MALFORMED(instantiator); | 780   PROPAGATE_IF_MALFORMED(instantiator); | 
| 784 | 781 | 
| 785   const TypeArguments& type_args = | 782   const TypeArguments& type_args = | 
| 786       TypeArguments::Handle(instantiator.arguments()); | 783       TypeArguments::Handle(instantiator.arguments()); | 
| 787   Error& bound_error = Error::Handle(); | 784   Error& bound_error = Error::Handle(); | 
| 788   AbstractType& result = | 785   AbstractType& result = AbstractType::Handle( | 
| 789       AbstractType::Handle(type.InstantiateFrom(type_args, &bound_error)); | 786       type.InstantiateFrom(type_args, &bound_error, NULL, Heap::kOld)); | 
| 790   if (!bound_error.IsNull()) { | 787   if (!bound_error.IsNull()) { | 
| 791     Exceptions::PropagateError(bound_error); | 788     Exceptions::PropagateError(bound_error); | 
| 792     UNREACHABLE(); | 789     UNREACHABLE(); | 
| 793   } | 790   } | 
| 794   ASSERT(result.IsFinalized()); | 791   ASSERT(result.IsFinalized()); | 
| 795   return result.Canonicalize(); | 792   return result.Canonicalize(); | 
| 796 } | 793 } | 
| 797 | 794 | 
| 798 | 795 | 
| 799 DEFINE_NATIVE_ENTRY(MirrorSystem_libraries, 0) { | 796 DEFINE_NATIVE_ENTRY(MirrorSystem_libraries, 0) { | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 821   VerifyMethodKindShifts(); | 818   VerifyMethodKindShifts(); | 
| 822 | 819 | 
| 823   return CreateIsolateMirror(); | 820   return CreateIsolateMirror(); | 
| 824 } | 821 } | 
| 825 | 822 | 
| 826 | 823 | 
| 827 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalClassMirror, 1) { | 824 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalClassMirror, 1) { | 
| 828   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 825   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 
| 829   PROPAGATE_IF_MALFORMED(type); | 826   PROPAGATE_IF_MALFORMED(type); | 
| 830   ASSERT(type.IsFinalized()); | 827   ASSERT(type.IsFinalized()); | 
| 831   ASSERT(type.HasResolvedTypeClass()); | 828   ASSERT(type.IsFunctionType() || type.HasResolvedTypeClass()); | 
| 832   const Class& cls = Class::Handle(type.type_class()); | 829   const Class& cls = Class::Handle(type.type_class()); | 
| 833   ASSERT(!cls.IsNull()); | 830   ASSERT(!cls.IsNull()); | 
| 834   if (cls.IsDynamicClass() || | 831   if (cls.IsDynamicClass() || cls.IsVoidClass() || cls.IsTypedefClass()) { | 
| 835       cls.IsVoidClass() || |  | 
| 836       (cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass())) { |  | 
| 837     Exceptions::ThrowArgumentError(type); | 832     Exceptions::ThrowArgumentError(type); | 
| 838     UNREACHABLE(); | 833     UNREACHABLE(); | 
| 839   } | 834   } | 
| 840   return CreateClassMirror(cls, | 835   return CreateClassMirror(cls, | 
| 841                            AbstractType::Handle(cls.DeclarationType()), | 836                            AbstractType::Handle(cls.DeclarationType()), | 
| 842                            Bool::True(),  // is_declaration | 837                            Bool::True(),  // is_declaration | 
| 843                            Object::null_instance()); | 838                            Object::null_instance()); | 
| 844 } | 839 } | 
| 845 | 840 | 
| 846 | 841 | 
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 904   } | 899   } | 
| 905   return metadata.raw(); | 900   return metadata.raw(); | 
| 906 } | 901 } | 
| 907 | 902 | 
| 908 | 903 | 
| 909 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 2) { | 904 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 2) { | 
| 910   GET_NON_NULL_NATIVE_ARGUMENT(Instance, | 905   GET_NON_NULL_NATIVE_ARGUMENT(Instance, | 
| 911                                owner_mirror, | 906                                owner_mirror, | 
| 912                                arguments->NativeArgAt(0)); | 907                                arguments->NativeArgAt(0)); | 
| 913   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 908   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 
| 914   const Class& cls = Class::Handle(ref.GetClassReferent()); | 909   // TODO(rmacnak): Return get:call() method on class _Closure instead? | 
| 915   const Function& func = Function::Handle(CallMethod(cls)); | 910   // This now returns the result of invoking that call getter. | 
|  | 911   const Function& func = Function::Handle(ref.GetFunctionReferent()); | 
| 916   ASSERT(!func.IsNull()); | 912   ASSERT(!func.IsNull()); | 
| 917   return CreateMethodMirror(func, owner_mirror, AbstractType::Handle()); | 913   return CreateMethodMirror(func, owner_mirror, AbstractType::Handle()); | 
| 918 } | 914 } | 
| 919 | 915 | 
| 920 | 916 | 
| 921 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) { | 917 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) { | 
| 922   GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); | 918   GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); | 
| 923   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 919   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 
| 924   const Class& cls = Class::Handle(ref.GetClassReferent()); | 920   const Function& func = Function::Handle(ref.GetFunctionReferent()); | 
| 925   const Function& func = Function::Handle(cls.signature_function()); |  | 
| 926   return CreateParameterMirrorList(func, owner); | 921   return CreateParameterMirrorList(func, owner); | 
| 927 } | 922 } | 
| 928 | 923 | 
| 929 | 924 | 
| 930 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 2) { | 925 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 2) { | 
| 931   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 926   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 
| 932   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, | 927   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, | 
| 933                                instantiator, | 928                                instantiator, | 
| 934                                arguments->NativeArgAt(1)); | 929                                arguments->NativeArgAt(1)); | 
| 935   const Class& cls = Class::Handle(ref.GetClassReferent()); | 930   const Function& func = Function::Handle(ref.GetFunctionReferent()); | 
| 936   const Function& func = Function::Handle(CallMethod(cls)); |  | 
| 937   ASSERT(!func.IsNull()); | 931   ASSERT(!func.IsNull()); | 
| 938   AbstractType& type = AbstractType::Handle(func.result_type()); | 932   AbstractType& type = AbstractType::Handle(func.result_type()); | 
| 939   return InstantiateType(type, instantiator); | 933   return InstantiateType(type, instantiator); | 
| 940 } | 934 } | 
| 941 | 935 | 
| 942 | 936 | 
| 943 DEFINE_NATIVE_ENTRY(ClassMirror_libraryUri, 1) { | 937 DEFINE_NATIVE_ENTRY(ClassMirror_libraryUri, 1) { | 
| 944   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 938   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 
| 945   const Class& klass = Class::Handle(ref.GetClassReferent()); | 939   const Class& klass = Class::Handle(ref.GetClassReferent()); | 
| 946   const Library& library = Library::Handle(klass.library()); | 940   const Library& library = Library::Handle(klass.library()); | 
| 947   ASSERT(!library.IsNull()); | 941   ASSERT(!library.IsNull()); | 
| 948   return library.url(); | 942   return library.url(); | 
| 949 } | 943 } | 
| 950 | 944 | 
| 951 | 945 | 
| 952 DEFINE_NATIVE_ENTRY(ClassMirror_supertype, 1) { | 946 DEFINE_NATIVE_ENTRY(ClassMirror_supertype, 1) { | 
| 953   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 947   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 
| 954   PROPAGATE_IF_MALFORMED(type); | 948   PROPAGATE_IF_MALFORMED(type); | 
| 955   ASSERT(type.IsFinalized()); | 949   ASSERT(type.IsFinalized()); | 
| 956   if (!type.HasResolvedTypeClass()) { |  | 
| 957     Exceptions::ThrowArgumentError(type); |  | 
| 958     UNREACHABLE(); |  | 
| 959   } |  | 
| 960   const Class& cls = Class::Handle(type.type_class()); | 950   const Class& cls = Class::Handle(type.type_class()); | 
| 961   const AbstractType& super_type = AbstractType::Handle(cls.super_type()); | 951   const AbstractType& super_type = AbstractType::Handle(cls.super_type()); | 
| 962   ASSERT(super_type.IsNull() || super_type.IsFinalized()); | 952   ASSERT(super_type.IsNull() || super_type.IsFinalized()); | 
| 963   return super_type.raw(); | 953   return super_type.raw(); | 
| 964 } | 954 } | 
| 965 | 955 | 
| 966 | 956 | 
| 967 DEFINE_NATIVE_ENTRY(ClassMirror_supertype_instantiated, 1) { | 957 DEFINE_NATIVE_ENTRY(ClassMirror_supertype_instantiated, 1) { | 
| 968   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 958   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 
| 969   PROPAGATE_IF_MALFORMED(type); | 959   PROPAGATE_IF_MALFORMED(type); | 
| 970   ASSERT(type.IsFinalized()); | 960   ASSERT(type.IsFinalized()); | 
| 971   if (!type.HasResolvedTypeClass()) { |  | 
| 972     Exceptions::ThrowArgumentError(type); |  | 
| 973     UNREACHABLE(); |  | 
| 974   } |  | 
| 975   const Class& cls = Class::Handle(type.type_class()); | 961   const Class& cls = Class::Handle(type.type_class()); | 
| 976   const AbstractType& super_type = AbstractType::Handle(cls.super_type()); | 962   const AbstractType& super_type = AbstractType::Handle(cls.super_type()); | 
| 977   return InstantiateType(super_type, type); | 963   return InstantiateType(super_type, type); | 
| 978 } | 964 } | 
| 979 | 965 | 
| 980 | 966 | 
| 981 DEFINE_NATIVE_ENTRY(ClassMirror_interfaces, 1) { | 967 DEFINE_NATIVE_ENTRY(ClassMirror_interfaces, 1) { | 
| 982   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 968   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 
| 983   PROPAGATE_IF_MALFORMED(type); | 969   PROPAGATE_IF_MALFORMED(type); | 
| 984   ASSERT(type.IsFinalized()); | 970   ASSERT(type.IsFinalized()); | 
| 985   if (!type.HasResolvedTypeClass()) { |  | 
| 986     Exceptions::ThrowArgumentError(type); |  | 
| 987     UNREACHABLE(); |  | 
| 988   } |  | 
| 989   const Class& cls = Class::Handle(type.type_class()); | 971   const Class& cls = Class::Handle(type.type_class()); | 
| 990   const Error& error = Error::Handle(cls.EnsureIsFinalized(thread)); | 972   const Error& error = Error::Handle(cls.EnsureIsFinalized(thread)); | 
| 991   if (!error.IsNull()) { | 973   if (!error.IsNull()) { | 
| 992     Exceptions::PropagateError(error); | 974     Exceptions::PropagateError(error); | 
| 993   } | 975   } | 
| 994 | 976 | 
| 995   return cls.interfaces(); | 977   return cls.interfaces(); | 
| 996 } | 978 } | 
| 997 | 979 | 
| 998 DEFINE_NATIVE_ENTRY(ClassMirror_interfaces_instantiated, 1) { | 980 DEFINE_NATIVE_ENTRY(ClassMirror_interfaces_instantiated, 1) { | 
| 999   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 981   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 
| 1000   PROPAGATE_IF_MALFORMED(type); | 982   PROPAGATE_IF_MALFORMED(type); | 
| 1001   ASSERT(type.IsFinalized()); | 983   ASSERT(type.IsFinalized()); | 
| 1002   if (!type.HasResolvedTypeClass()) { |  | 
| 1003     Exceptions::ThrowArgumentError(type); |  | 
| 1004     UNREACHABLE(); |  | 
| 1005   } |  | 
| 1006   const Class& cls = Class::Handle(type.type_class()); | 984   const Class& cls = Class::Handle(type.type_class()); | 
| 1007   const Error& error = Error::Handle(cls.EnsureIsFinalized(thread)); | 985   const Error& error = Error::Handle(cls.EnsureIsFinalized(thread)); | 
| 1008   if (!error.IsNull()) { | 986   if (!error.IsNull()) { | 
| 1009     Exceptions::PropagateError(error); | 987     Exceptions::PropagateError(error); | 
| 1010   } | 988   } | 
| 1011 | 989 | 
| 1012   Array& interfaces = Array::Handle(cls.interfaces()); | 990   Array& interfaces = Array::Handle(cls.interfaces()); | 
| 1013   Array& interfaces_inst = Array::Handle(Array::New(interfaces.Length())); | 991   Array& interfaces_inst = Array::Handle(Array::New(interfaces.Length())); | 
| 1014   AbstractType& interface = AbstractType::Handle(); | 992   AbstractType& interface = AbstractType::Handle(); | 
| 1015 | 993 | 
| 1016   for (int i = 0; i < interfaces.Length(); i++) { | 994   for (int i = 0; i < interfaces.Length(); i++) { | 
| 1017     interface ^= interfaces.At(i); | 995     interface ^= interfaces.At(i); | 
| 1018     interface = InstantiateType(interface, type); | 996     interface = InstantiateType(interface, type); | 
| 1019     interfaces_inst.SetAt(i, interface); | 997     interfaces_inst.SetAt(i, interface); | 
| 1020   } | 998   } | 
| 1021 | 999 | 
| 1022   return interfaces_inst.raw(); | 1000   return interfaces_inst.raw(); | 
| 1023 } | 1001 } | 
| 1024 | 1002 | 
| 1025 | 1003 | 
| 1026 DEFINE_NATIVE_ENTRY(ClassMirror_mixin, 1) { | 1004 DEFINE_NATIVE_ENTRY(ClassMirror_mixin, 1) { | 
| 1027   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 1005   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 
| 1028   PROPAGATE_IF_MALFORMED(type); | 1006   PROPAGATE_IF_MALFORMED(type); | 
| 1029   ASSERT(type.IsFinalized()); | 1007   ASSERT(type.IsFinalized()); | 
| 1030   if (!type.HasResolvedTypeClass()) { |  | 
| 1031     Exceptions::ThrowArgumentError(type); |  | 
| 1032     UNREACHABLE(); |  | 
| 1033   } |  | 
| 1034   const Class& cls = Class::Handle(type.type_class()); | 1008   const Class& cls = Class::Handle(type.type_class()); | 
| 1035   const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); | 1009   const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); | 
| 1036   ASSERT(mixin_type.IsNull() || mixin_type.IsFinalized()); | 1010   ASSERT(mixin_type.IsNull() || mixin_type.IsFinalized()); | 
| 1037   return mixin_type.raw(); | 1011   return mixin_type.raw(); | 
| 1038 } | 1012 } | 
| 1039 | 1013 | 
| 1040 | 1014 | 
| 1041 DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) { | 1015 DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) { | 
| 1042   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 1016   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 
| 1043   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, | 1017   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, | 
| 1044                                instantiator, | 1018                                instantiator, | 
| 1045                                arguments->NativeArgAt(1)); | 1019                                arguments->NativeArgAt(1)); | 
| 1046   PROPAGATE_IF_MALFORMED(type); | 1020   PROPAGATE_IF_MALFORMED(type); | 
| 1047   ASSERT(type.IsFinalized()); | 1021   ASSERT(type.IsFinalized()); | 
| 1048   if (!type.HasResolvedTypeClass()) { |  | 
| 1049     Exceptions::ThrowArgumentError(type); |  | 
| 1050     UNREACHABLE(); |  | 
| 1051   } |  | 
| 1052   const Class& cls = Class::Handle(type.type_class()); | 1022   const Class& cls = Class::Handle(type.type_class()); | 
| 1053   const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); | 1023   const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); | 
| 1054   if (mixin_type.IsNull()) { | 1024   if (mixin_type.IsNull()) { | 
| 1055     return mixin_type.raw(); | 1025     return mixin_type.raw(); | 
| 1056   } | 1026   } | 
| 1057 | 1027 | 
| 1058   return InstantiateType(mixin_type, instantiator); | 1028   return InstantiateType(mixin_type, instantiator); | 
| 1059 } | 1029 } | 
| 1060 | 1030 | 
| 1061 | 1031 | 
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1159 | 1129 | 
| 1160   Object& entry = Object::Handle(); | 1130   Object& entry = Object::Handle(); | 
| 1161   DictionaryIterator entries(library); | 1131   DictionaryIterator entries(library); | 
| 1162 | 1132 | 
| 1163   AbstractType& type = AbstractType::Handle(); | 1133   AbstractType& type = AbstractType::Handle(); | 
| 1164 | 1134 | 
| 1165   while (entries.HasNext()) { | 1135   while (entries.HasNext()) { | 
| 1166     entry = entries.GetNext(); | 1136     entry = entries.GetNext(); | 
| 1167     if (entry.IsClass()) { | 1137     if (entry.IsClass()) { | 
| 1168       const Class& klass = Class::Cast(entry); | 1138       const Class& klass = Class::Cast(entry); | 
| 1169       // We filter out function signature classes and dynamic. | 1139       // We filter out mixin application classes and dynamic. | 
| 1170       // TODO(12478): Should not need to filter out dynamic. | 1140       // TODO(12478): Should not need to filter out dynamic. | 
| 1171       // Note that the VM does not consider mixin application aliases to be | 1141       // Note that the VM does not consider mixin application aliases to be | 
| 1172       // mixin applications. | 1142       // mixin applications. | 
| 1173       if (!klass.IsCanonicalSignatureClass() && | 1143       if (!klass.IsDynamicClass() && !klass.IsMixinApplication()) { | 
| 1174           !klass.IsDynamicClass() && |  | 
| 1175           !klass.IsMixinApplication()) { |  | 
| 1176         type = klass.DeclarationType(); | 1144         type = klass.DeclarationType(); | 
| 1177         member_mirror = CreateClassMirror(klass, | 1145         member_mirror = CreateClassMirror(klass, | 
| 1178                                           type, | 1146                                           type, | 
| 1179                                           Bool::True(),  // is_declaration | 1147                                           Bool::True(),  // is_declaration | 
| 1180                                           owner_mirror); | 1148                                           owner_mirror); | 
| 1181         member_mirrors.Add(member_mirror); | 1149         member_mirrors.Add(member_mirror); | 
| 1182       } | 1150       } | 
| 1183     } else if (entry.IsField()) { | 1151     } else if (entry.IsField()) { | 
| 1184       const Field& field = Field::Cast(entry); | 1152       const Field& field = Field::Cast(entry); | 
| 1185       if (field.is_reflectable()) { | 1153       if (field.is_reflectable()) { | 
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1300                                           Array::empty_array())); | 1268                                           Array::empty_array())); | 
| 1301   if (result.IsError()) { | 1269   if (result.IsError()) { | 
| 1302     Exceptions::PropagateError(Error::Cast(result)); | 1270     Exceptions::PropagateError(Error::Cast(result)); | 
| 1303     UNREACHABLE(); | 1271     UNREACHABLE(); | 
| 1304   } | 1272   } | 
| 1305 | 1273 | 
| 1306   // Because we currently only use this native for building field extractors and | 1274   // Because we currently only use this native for building field extractors and | 
| 1307   // setters, assume the result is a closure and mark its function as invisible, | 1275   // setters, assume the result is a closure and mark its function as invisible, | 
| 1308   // so it will not appear in stack traces. Whenever we support | 1276   // so it will not appear in stack traces. Whenever we support | 
| 1309   // ObjectMirror.evaluate this will need to be separated. | 1277   // ObjectMirror.evaluate this will need to be separated. | 
| 1310   ASSERT(Instance::Cast(result).IsClosure()); | 1278   ASSERT(result.IsClosure()); | 
| 1311   const Function& func = | 1279   const Function& func = Function::Handle(Closure::Cast(result).function()); | 
| 1312       Function::Handle(Closure::function(Instance::Cast(result))); |  | 
| 1313   func.set_is_visible(false); | 1280   func.set_is_visible(false); | 
| 1314   func.set_is_debuggable(false); | 1281   func.set_is_debuggable(false); | 
| 1315 | 1282 | 
| 1316   return result.raw(); | 1283   return result.raw(); | 
| 1317 } | 1284 } | 
| 1318 | 1285 | 
| 1319 DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) { | 1286 DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) { | 
| 1320   GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0)); | 1287   GET_NON_NULL_NATIVE_ARGUMENT(FunctionType, type, arguments->NativeArgAt(0)); | 
| 1321   const Class& cls = Class::Handle(type.type_class()); | 1288   const Class& cls = Class::Handle(type.scope_class()); | 
| 1322   // We represent typedefs as non-canonical signature classes. | 1289   ASSERT(cls.IsTypedefClass()); | 
| 1323   ASSERT(cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass()); |  | 
| 1324   return CreateTypedefMirror(cls, | 1290   return CreateTypedefMirror(cls, | 
| 1325                              AbstractType::Handle(cls.DeclarationType()), | 1291                              AbstractType::Handle(cls.DeclarationType()), | 
| 1326                              Bool::True(),  // is_declaration | 1292                              Bool::True(),  // is_declaration | 
| 1327                              Object::null_instance()); | 1293                              Object::null_instance()); | 
| 1328 } | 1294 } | 
| 1329 | 1295 | 
| 1330 DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) { | 1296 DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) { | 
| 1331   // Argument 0 is the mirror, which is unused by the native. It exists | 1297   // Argument 0 is the mirror, which is unused by the native. It exists | 
| 1332   // because this native is an instance method in order to be polymorphic | 1298   // because this native is an instance method in order to be polymorphic | 
| 1333   // with its cousins. | 1299   // with its cousins. | 
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1447   return InvokeDynamicFunction(reflectee, | 1413   return InvokeDynamicFunction(reflectee, | 
| 1448                                setter, | 1414                                setter, | 
| 1449                                internal_setter_name, | 1415                                internal_setter_name, | 
| 1450                                args, | 1416                                args, | 
| 1451                                args_descriptor); | 1417                                args_descriptor); | 
| 1452 } | 1418 } | 
| 1453 | 1419 | 
| 1454 | 1420 | 
| 1455 DEFINE_NATIVE_ENTRY(InstanceMirror_computeType, 1) { | 1421 DEFINE_NATIVE_ENTRY(InstanceMirror_computeType, 1) { | 
| 1456   GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); | 1422   GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); | 
| 1457   const Type& type = Type::Handle(instance.GetType()); | 1423   const AbstractType& type = AbstractType::Handle(instance.GetType()); | 
| 1458   // The static type of null is specified to be the bottom type, however, the | 1424   // The static type of null is specified to be the bottom type, however, the | 
| 1459   // runtime type of null is the Null type, which we correctly return here. | 1425   // runtime type of null is the Null type, which we correctly return here. | 
| 1460   return type.Canonicalize(); | 1426   return type.Canonicalize(); | 
| 1461 } | 1427 } | 
| 1462 | 1428 | 
| 1463 | 1429 | 
| 1464 DEFINE_NATIVE_ENTRY(ClosureMirror_function, 1) { | 1430 DEFINE_NATIVE_ENTRY(ClosureMirror_function, 1) { | 
| 1465   GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0)); | 1431   GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0)); | 
| 1466   ASSERT(!closure.IsNull()); | 1432   ASSERT(!closure.IsNull()); | 
| 1467 | 1433 | 
| 1468   Function& function = Function::Handle(); | 1434   Function& function = Function::Handle(); | 
| 1469   bool callable = closure.IsCallable(&function); | 1435   bool callable = closure.IsCallable(&function); | 
| 1470   if (callable) { | 1436   if (callable) { | 
| 1471     if (function.IsImplicitClosureFunction()) { | 1437     if (function.IsImplicitClosureFunction()) { | 
| 1472       // The VM uses separate Functions for tear-offs, but the mirrors consider | 1438       // The VM uses separate Functions for tear-offs, but the mirrors consider | 
| 1473       // the tear-offs to be the same as the torn-off methods. Avoid handing out | 1439       // the tear-offs to be the same as the torn-off methods. Avoid handing out | 
| 1474       // a reference to the tear-off here to avoid a special case in the | 1440       // a reference to the tear-off here to avoid a special case in the | 
| 1475       // the equality test. | 1441       // the equality test. | 
| 1476       function = function.parent_function(); | 1442       function = function.parent_function(); | 
| 1477     } | 1443     } | 
| 1478 | 1444 | 
| 1479     Type& instantiator = Type::Handle(); | 1445     Type& instantiator = Type::Handle(); | 
| 1480     if (closure.IsClosure()) { | 1446     if (closure.IsClosure()) { | 
| 1481       const TypeArguments& arguments = | 1447       const TypeArguments& arguments = | 
| 1482           TypeArguments::Handle(Closure::GetTypeArguments(closure)); | 1448           TypeArguments::Handle(closure.GetTypeArguments()); | 
| 1483       const Class& cls = | 1449       const Class& cls = | 
| 1484           Class::Handle(Isolate::Current()->object_store()->object_class()); | 1450           Class::Handle(Isolate::Current()->object_store()->object_class()); | 
| 1485       instantiator = Type::New(cls, arguments, Token::kNoSourcePos); | 1451       instantiator = Type::New(cls, arguments, Token::kNoSourcePos); | 
| 1486       instantiator.SetIsFinalized(); | 1452       instantiator.SetIsFinalized(); | 
| 1487     } | 1453     } | 
| 1488     return CreateMethodMirror(function, | 1454     return CreateMethodMirror(function, | 
| 1489                               Instance::null_instance(), | 1455                               Instance::null_instance(), | 
| 1490                               instantiator); | 1456                               instantiator); | 
| 1491   } | 1457   } | 
| 1492   return Instance::null(); | 1458   return Instance::null(); | 
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1701   Class& redirected_klass = Class::Handle(klass.raw()); | 1667   Class& redirected_klass = Class::Handle(klass.raw()); | 
| 1702   Function& redirected_constructor = Function::Handle(lookup_constructor.raw()); | 1668   Function& redirected_constructor = Function::Handle(lookup_constructor.raw()); | 
| 1703   if (lookup_constructor.IsRedirectingFactory()) { | 1669   if (lookup_constructor.IsRedirectingFactory()) { | 
| 1704     ClassFinalizer::ResolveRedirectingFactory(klass, lookup_constructor); | 1670     ClassFinalizer::ResolveRedirectingFactory(klass, lookup_constructor); | 
| 1705     Type& redirect_type = Type::Handle(lookup_constructor.RedirectionType()); | 1671     Type& redirect_type = Type::Handle(lookup_constructor.RedirectionType()); | 
| 1706 | 1672 | 
| 1707     if (!redirect_type.IsInstantiated()) { | 1673     if (!redirect_type.IsInstantiated()) { | 
| 1708       // The type arguments of the redirection type are instantiated from the | 1674       // The type arguments of the redirection type are instantiated from the | 
| 1709       // type arguments of the type reflected by the class mirror. | 1675       // type arguments of the type reflected by the class mirror. | 
| 1710       Error& bound_error = Error::Handle(); | 1676       Error& bound_error = Error::Handle(); | 
| 1711       redirect_type ^= redirect_type.InstantiateFrom(type_arguments, | 1677       redirect_type ^= redirect_type.InstantiateFrom( | 
| 1712                                                      &bound_error); | 1678           type_arguments, &bound_error, NULL, Heap::kOld); | 
| 1713       if (!bound_error.IsNull()) { | 1679       if (!bound_error.IsNull()) { | 
| 1714         Exceptions::PropagateError(bound_error); | 1680         Exceptions::PropagateError(bound_error); | 
| 1715         UNREACHABLE(); | 1681         UNREACHABLE(); | 
| 1716       } | 1682       } | 
| 1717       redirect_type ^= redirect_type.Canonicalize(); | 1683       redirect_type ^= redirect_type.Canonicalize(); | 
| 1718     } | 1684     } | 
| 1719 | 1685 | 
| 1720     type = redirect_type.raw(); | 1686     type = redirect_type.raw(); | 
| 1721     type_arguments = redirect_type.arguments(); | 1687     type_arguments = redirect_type.arguments(); | 
| 1722 | 1688 | 
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2008   if (decl.IsFunction()) { | 1974   if (decl.IsFunction()) { | 
| 2009     const Function& func = Function::Cast(decl); | 1975     const Function& func = Function::Cast(decl); | 
| 2010     if (func.IsImplicitConstructor() || func.IsSignatureFunction()) { | 1976     if (func.IsImplicitConstructor() || func.IsSignatureFunction()) { | 
| 2011       // These are synthetic methods; they have no source. | 1977       // These are synthetic methods; they have no source. | 
| 2012       return Instance::null(); | 1978       return Instance::null(); | 
| 2013     } | 1979     } | 
| 2014     script = func.script(); | 1980     script = func.script(); | 
| 2015     token_pos = func.token_pos(); | 1981     token_pos = func.token_pos(); | 
| 2016   } else if (decl.IsClass()) { | 1982   } else if (decl.IsClass()) { | 
| 2017     const Class& cls = Class::Cast(decl); | 1983     const Class& cls = Class::Cast(decl); | 
| 2018     const bool is_typedef = cls.IsSignatureClass() && | 1984     const bool is_typedef = cls.IsTypedefClass(); | 
| 2019                             !cls.IsCanonicalSignatureClass(); |  | 
| 2020     if (cls.is_synthesized_class() && | 1985     if (cls.is_synthesized_class() && | 
| 2021         !is_typedef && | 1986         !is_typedef && | 
| 2022         !cls.is_mixin_app_alias() && | 1987         !cls.is_mixin_app_alias() && | 
| 2023         !cls.is_enum_class()) { | 1988         !cls.is_enum_class()) { | 
| 2024       return Instance::null();  // Synthetic. | 1989       return Instance::null();  // Synthetic. | 
| 2025     } | 1990     } | 
| 2026     script = cls.script(); | 1991     script = cls.script(); | 
| 2027     token_pos = cls.token_pos(); | 1992     token_pos = cls.token_pos(); | 
| 2028   } else if (decl.IsField()) { | 1993   } else if (decl.IsField()) { | 
| 2029     const Field& field = Field::Cast(decl); | 1994     const Field& field = Field::Cast(decl); | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2070     // information is not available. | 2035     // information is not available. | 
| 2071     script.GetTokenLocation(token_pos, &from_line, NULL); | 2036     script.GetTokenLocation(token_pos, &from_line, NULL); | 
| 2072   } | 2037   } | 
| 2073   // We should always have at least the line number. | 2038   // We should always have at least the line number. | 
| 2074   ASSERT(from_line != 0); | 2039   ASSERT(from_line != 0); | 
| 2075   return CreateSourceLocation(uri, from_line, from_col); | 2040   return CreateSourceLocation(uri, from_line, from_col); | 
| 2076 } | 2041 } | 
| 2077 | 2042 | 
| 2078 | 2043 | 
| 2079 DEFINE_NATIVE_ENTRY(TypedefMirror_referent, 1) { | 2044 DEFINE_NATIVE_ENTRY(TypedefMirror_referent, 1) { | 
| 2080   GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0)); | 2045   GET_NON_NULL_NATIVE_ARGUMENT(FunctionType, type, arguments->NativeArgAt(0)); | 
| 2081   const Class& cls = Class::Handle(type.type_class()); | 2046   const Class& cls = Class::Handle(type.scope_class()); | 
|  | 2047   ASSERT(cls.IsTypedefClass()); | 
| 2082   const Function& sig_func = Function::Handle(cls.signature_function()); | 2048   const Function& sig_func = Function::Handle(cls.signature_function()); | 
| 2083   const Class& sig_cls = Class::Handle(sig_func.signature_class()); | 2049   FunctionType& referent_type = FunctionType::Handle(sig_func.SignatureType()); | 
| 2084 | 2050   // If the scope class of the function type is not generic, replace it with | 
| 2085   AbstractType& referent_type = AbstractType::Handle(sig_cls.DeclarationType()); | 2051   // Closure class (Function::SignatureType() keeps it). | 
| 2086   referent_type = InstantiateType(referent_type, type); | 2052   ASSERT(cls.raw() == referent_type.scope_class()); | 
| 2087 | 2053   if (!cls.IsGeneric()) { | 
| 2088   return CreateFunctionTypeMirror(sig_cls, referent_type); | 2054     referent_type = FunctionType::New( | 
|  | 2055         Class::Handle(Isolate::Current()->object_store()->closure_class()), | 
|  | 2056         TypeArguments::Handle(referent_type.arguments()), | 
|  | 2057         sig_func, | 
|  | 2058         referent_type.token_pos()); | 
|  | 2059     referent_type ^= ClassFinalizer::FinalizeType( | 
|  | 2060         cls, referent_type, ClassFinalizer::kCanonicalize); | 
|  | 2061   } | 
|  | 2062   referent_type ^= InstantiateType(referent_type, type); | 
|  | 2063   return CreateFunctionTypeMirror(referent_type); | 
| 2089 } | 2064 } | 
| 2090 | 2065 | 
| 2091 | 2066 | 
| 2092 DEFINE_NATIVE_ENTRY(ParameterMirror_type, 3) { | 2067 DEFINE_NATIVE_ENTRY(ParameterMirror_type, 3) { | 
| 2093   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 2068   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 
| 2094   GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1)); | 2069   GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1)); | 
| 2095   GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(2)); | 2070   GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(2)); | 
| 2096   const Function& func = Function::Handle(ref.GetFunctionReferent()); | 2071   const Function& func = Function::Handle(ref.GetFunctionReferent()); | 
| 2097   const AbstractType& type = AbstractType::Handle( | 2072   const AbstractType& type = AbstractType::Handle( | 
| 2098       func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value())); | 2073       func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value())); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 2109 } | 2084 } | 
| 2110 | 2085 | 
| 2111 DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 2) { | 2086 DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 2) { | 
| 2112   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); | 2087   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); | 
| 2113   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); | 2088   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); | 
| 2114   return Bool::Get(a.IsSubtypeOf(b, NULL)).raw(); | 2089   return Bool::Get(a.IsSubtypeOf(b, NULL)).raw(); | 
| 2115 } | 2090 } | 
| 2116 | 2091 | 
| 2117 | 2092 | 
| 2118 }  // namespace dart | 2093 }  // namespace dart | 
| OLD | NEW | 
|---|