| 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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   122   const intptr_t implicit_param_count = func.NumImplicitParameters(); |   122   const intptr_t implicit_param_count = func.NumImplicitParameters(); | 
|   123   const intptr_t non_implicit_param_count = func.NumParameters() - |   123   const intptr_t non_implicit_param_count = func.NumParameters() - | 
|   124                                             implicit_param_count; |   124                                             implicit_param_count; | 
|   125   const intptr_t index_of_first_optional_param = |   125   const intptr_t index_of_first_optional_param = | 
|   126       non_implicit_param_count - func.NumOptionalParameters(); |   126       non_implicit_param_count - func.NumOptionalParameters(); | 
|   127   const intptr_t index_of_first_named_param = |   127   const intptr_t index_of_first_named_param = | 
|   128       non_implicit_param_count - func.NumOptionalNamedParameters(); |   128       non_implicit_param_count - func.NumOptionalNamedParameters(); | 
|   129   const Array& results = Array::Handle(Array::New(non_implicit_param_count)); |   129   const Array& results = Array::Handle(Array::New(non_implicit_param_count)); | 
|   130   const Array& args = Array::Handle(Array::New(9)); |   130   const Array& args = Array::Handle(Array::New(9)); | 
|   131  |   131  | 
|   132   // Return for synthetic functions and getters. |  | 
|   133   if (func.IsGetterFunction() || |  | 
|   134       func.IsImplicitConstructor() || |  | 
|   135       func.IsImplicitGetterFunction() || |  | 
|   136       func.IsImplicitSetterFunction()) { |  | 
|   137     return results.raw(); |  | 
|   138   } |  | 
|   139  |  | 
|   140   Smi& pos = Smi::Handle(); |   132   Smi& pos = Smi::Handle(); | 
|   141   String& name = String::Handle(); |   133   String& name = String::Handle(); | 
|   142   Instance& param = Instance::Handle(); |   134   Instance& param = Instance::Handle(); | 
|   143   Bool& is_final = Bool::Handle(); |   135   Bool& is_final = Bool::Handle(); | 
|   144   Object& default_value = Object::Handle(); |   136   Object& default_value = Object::Handle(); | 
|   145   Object& metadata = Object::Handle(); |   137   Object& metadata = Object::Handle(); | 
|   146  |   138  | 
|   147   // We force compilation of constructors to ensure the types of initializing |   139   // We force compilation of constructors to ensure the types of initializing | 
|   148   // formals have been corrected. We do not force the compilation of all types |   140   // formals have been corrected. We do not force the compilation of all types | 
|   149   // of functions because some have no body, e.g. signature functions. |   141   // of functions because some have no body, e.g. signature functions. | 
|   150   EnsureConstructorsAreCompiled(func); |   142   EnsureConstructorsAreCompiled(func); | 
|   151  |   143  | 
|   152   // Reparse the function for the following information: |   144   bool has_extra_parameter_info = true; | 
|   153   // * The default value of a parameter. |   145   if (non_implicit_param_count == 0) { | 
|   154   // * Whether a parameters has been deflared as final. |   146     has_extra_parameter_info = false; | 
|   155   // * Any metadata associated with the parameter. |   147   } | 
|   156   const Object& result = Object::Handle(Parser::ParseFunctionParameters(func)); |   148   if (func.IsImplicitConstructor()) { | 
|   157   if (result.IsError()) { |   149     // This covers the default constructor and forwarding constructors. | 
|   158     ThrowInvokeError(Error::Cast(result)); |   150     has_extra_parameter_info = false; | 
|   159     UNREACHABLE(); |   151   } | 
 |   152  | 
 |   153   Array& param_descriptor = Array::Handle(); | 
 |   154   if (has_extra_parameter_info) { | 
 |   155     // Reparse the function for the following information: | 
 |   156     // * The default value of a parameter. | 
 |   157     // * Whether a parameters has been deflared as final. | 
 |   158     // * Any metadata associated with the parameter. | 
 |   159     const Object& result = | 
 |   160         Object::Handle(Parser::ParseFunctionParameters(func)); | 
 |   161     if (result.IsError()) { | 
 |   162       ThrowInvokeError(Error::Cast(result)); | 
 |   163       UNREACHABLE(); | 
 |   164     } | 
 |   165     param_descriptor ^= result.raw(); | 
 |   166     ASSERT(param_descriptor.Length() == | 
 |   167            (Parser::kParameterEntrySize * non_implicit_param_count)); | 
|   160   } |   168   } | 
|   161  |   169  | 
|   162   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); |   170   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); | 
|   163   args.SetAt(2, owner_mirror); |   171   args.SetAt(2, owner_mirror); | 
|   164  |   172  | 
|   165   const Array& param_descriptor = Array::Cast(result); |   173   if (!has_extra_parameter_info) { | 
|   166   ASSERT(param_descriptor.Length() == |   174     is_final ^= Bool::True().raw(); | 
|   167          (Parser::kParameterEntrySize * non_implicit_param_count)); |   175     default_value = Object::null(); | 
 |   176     metadata = Object::null(); | 
 |   177   } | 
 |   178  | 
|   168   for (intptr_t i = 0; i < non_implicit_param_count; i++) { |   179   for (intptr_t i = 0; i < non_implicit_param_count; i++) { | 
|   169     pos ^= Smi::New(i); |   180     pos ^= Smi::New(i); | 
|   170     name ^= func.ParameterNameAt(implicit_param_count + i); |   181     name ^= func.ParameterNameAt(implicit_param_count + i); | 
|   171     is_final ^= param_descriptor.At( |   182     if (has_extra_parameter_info) { | 
|   172         i * Parser::kParameterEntrySize + Parser::kParameterIsFinalOffset); |   183       is_final ^= param_descriptor.At(i * Parser::kParameterEntrySize + | 
|   173     default_value = param_descriptor.At( |   184           Parser::kParameterIsFinalOffset); | 
|   174         i * Parser::kParameterEntrySize + Parser::kParameterDefaultValueOffset); |   185       default_value = param_descriptor.At(i * Parser::kParameterEntrySize + | 
|   175     metadata = param_descriptor.At( |   186           Parser::kParameterDefaultValueOffset); | 
|   176         i * Parser::kParameterEntrySize + Parser::kParameterMetadataOffset); |   187       metadata = param_descriptor.At(i * Parser::kParameterEntrySize + | 
|   177  |   188           Parser::kParameterMetadataOffset); | 
 |   189     } | 
|   178     ASSERT(default_value.IsNull() || default_value.IsInstance()); |   190     ASSERT(default_value.IsNull() || default_value.IsInstance()); | 
|   179  |   191  | 
|   180     // Arguments 0 (referent) and 2 (owner) are the same for all parameters. See |   192     // Arguments 0 (referent) and 2 (owner) are the same for all parameters. See | 
|   181     // above. |   193     // above. | 
|   182     args.SetAt(1, name); |   194     args.SetAt(1, name); | 
|   183     args.SetAt(3, pos); |   195     args.SetAt(3, pos); | 
|   184     args.SetAt(4, Bool::Get(i >= index_of_first_optional_param)); |   196     args.SetAt(4, Bool::Get(i >= index_of_first_optional_param)); | 
|   185     args.SetAt(5, Bool::Get(i >= index_of_first_named_param)); |   197     args.SetAt(5, Bool::Get(i >= index_of_first_named_param)); | 
|   186     args.SetAt(6, is_final); |   198     args.SetAt(6, is_final); | 
|   187     args.SetAt(7, default_value); |   199     args.SetAt(7, default_value); | 
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   342     ThrowInvokeError(error); |   354     ThrowInvokeError(error); | 
|   343     UNREACHABLE(); |   355     UNREACHABLE(); | 
|   344   } |   356   } | 
|   345  |   357  | 
|   346   const Bool& is_generic = Bool::Get(cls.NumTypeParameters() != 0); |   358   const Bool& is_generic = Bool::Get(cls.NumTypeParameters() != 0); | 
|   347   const Bool& is_mixin_app_alias = Bool::Get(cls.is_mixin_app_alias()); |   359   const Bool& is_mixin_app_alias = Bool::Get(cls.is_mixin_app_alias()); | 
|   348  |   360  | 
|   349   const Array& args = Array::Handle(Array::New(8)); |   361   const Array& args = Array::Handle(Array::New(8)); | 
|   350   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); |   362   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); | 
|   351   args.SetAt(1, type); |   363   args.SetAt(1, type); | 
|   352   // We do not set the names of anonymous mixin applications because the mirrors |   364   // Note that the VM does not consider mixin application aliases to be mixin | 
 |   365   // applications, so this only covers anonymous mixin applications. We do not | 
 |   366   // set the names of anonymous mixin applications here because the mirrors | 
|   353   // use a different naming convention than the VM (lib.S with lib.M and S&M |   367   // use a different naming convention than the VM (lib.S with lib.M and S&M | 
|   354   // respectively). |   368   // respectively). | 
|   355   if (!cls.IsAnonymousMixinApplication()) { |   369   if (!cls.IsMixinApplication()) { | 
|   356     args.SetAt(2, String::Handle(cls.Name())); |   370     args.SetAt(2, String::Handle(cls.Name())); | 
|   357   } |   371   } | 
|   358   args.SetAt(3, owner_mirror); |   372   args.SetAt(3, owner_mirror); | 
|   359   args.SetAt(4, Bool::Get(cls.is_abstract())); |   373   args.SetAt(4, Bool::Get(cls.is_abstract())); | 
|   360   args.SetAt(5, is_generic); |   374   args.SetAt(5, is_generic); | 
|   361   args.SetAt(6, is_mixin_app_alias); |   375   args.SetAt(6, is_mixin_app_alias); | 
|   362   args.SetAt(7, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration); |   376   args.SetAt(7, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration); | 
|   363   return CreateMirror(Symbols::_LocalClassMirror(), args); |   377   return CreateMirror(Symbols::_LocalClassMirror(), args); | 
|   364 } |   378 } | 
|   365  |   379  | 
| (...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1307   DictionaryIterator entries(library); |  1321   DictionaryIterator entries(library); | 
|  1308  |  1322  | 
|  1309   AbstractType& type = AbstractType::Handle(); |  1323   AbstractType& type = AbstractType::Handle(); | 
|  1310  |  1324  | 
|  1311   while (entries.HasNext()) { |  1325   while (entries.HasNext()) { | 
|  1312     entry = entries.GetNext(); |  1326     entry = entries.GetNext(); | 
|  1313     if (entry.IsClass()) { |  1327     if (entry.IsClass()) { | 
|  1314       const Class& klass = Class::Cast(entry); |  1328       const Class& klass = Class::Cast(entry); | 
|  1315       // We filter out function signature classes and dynamic. |  1329       // We filter out function signature classes and dynamic. | 
|  1316       // TODO(12478): Should not need to filter out dynamic. |  1330       // TODO(12478): Should not need to filter out dynamic. | 
 |  1331       // Note that the VM does not consider mixin application aliases to be | 
 |  1332       // mixin applications. | 
|  1317       if (!klass.IsCanonicalSignatureClass() && |  1333       if (!klass.IsCanonicalSignatureClass() && | 
|  1318           !klass.IsDynamicClass() && |  1334           !klass.IsDynamicClass() && | 
|  1319           !klass.IsAnonymousMixinApplication()) { |  1335           !klass.IsMixinApplication()) { | 
|  1320         type = klass.DeclarationType(); |  1336         type = klass.DeclarationType(); | 
|  1321         member_mirror = CreateClassMirror(klass, |  1337         member_mirror = CreateClassMirror(klass, | 
|  1322                                           type, |  1338                                           type, | 
|  1323                                           Bool::True(),  // is_declaration |  1339                                           Bool::True(),  // is_declaration | 
|  1324                                           owner_mirror); |  1340                                           owner_mirror); | 
|  1325         member_mirrors.Add(member_mirror); |  1341         member_mirrors.Add(member_mirror); | 
|  1326       } |  1342       } | 
|  1327     } else if (entry.IsField()) { |  1343     } else if (entry.IsField()) { | 
|  1328       const Field& field = Field::Cast(entry); |  1344       const Field& field = Field::Cast(entry); | 
|  1329       member_mirror = CreateVariableMirror(field, owner_mirror); |  1345       member_mirror = CreateVariableMirror(field, owner_mirror); | 
| (...skipping 900 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2230 } |  2246 } | 
|  2231  |  2247  | 
|  2232 DEFINE_NATIVE_ENTRY(TypeMirror_moreSpecificTest, 2) { |  2248 DEFINE_NATIVE_ENTRY(TypeMirror_moreSpecificTest, 2) { | 
|  2233   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); |  2249   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); | 
|  2234   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); |  2250   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); | 
|  2235   return Bool::Get(a.IsMoreSpecificThan(b, NULL)).raw(); |  2251   return Bool::Get(a.IsMoreSpecificThan(b, NULL)).raw(); | 
|  2236 } |  2252 } | 
|  2237  |  2253  | 
|  2238  |  2254  | 
|  2239 }  // namespace dart |  2255 }  // namespace dart | 
| OLD | NEW |