| 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" |
| 11 #include "vm/dart_entry.h" | 11 #include "vm/dart_entry.h" |
| 12 #include "vm/exceptions.h" | 12 #include "vm/exceptions.h" |
| 13 #include "vm/flags.h" | 13 #include "vm/flags.h" |
| 14 #include "vm/object_store.h" | 14 #include "vm/object_store.h" |
| 15 #include "vm/parser.h" | 15 #include "vm/parser.h" |
| 16 #include "vm/port.h" | 16 #include "vm/port.h" |
| 17 #include "vm/resolver.h" | 17 #include "vm/resolver.h" |
| 18 #include "vm/symbols.h" | 18 #include "vm/symbols.h" |
| 19 | 19 |
| 20 namespace dart { | 20 namespace dart { |
| 21 | 21 |
| 22 #ifndef PRODUCT | 22 #ifndef PRODUCT |
| 23 | 23 |
| 24 #define PROPAGATE_IF_MALFORMED(type) \ | 24 #define PROPAGATE_IF_MALFORMED(type) \ |
| 25 if (type.IsMalformed()) { \ | 25 if (type.IsMalformed()) { \ |
| 26 Exceptions::PropagateError(Error::Handle(type.error())); \ | 26 Exceptions::PropagateError(Error::Handle(type.error())); \ |
| 27 } \ | 27 } |
| 28 | 28 |
| 29 static RawInstance* CreateMirror(const String& mirror_class_name, | 29 static RawInstance* CreateMirror(const String& mirror_class_name, |
| 30 const Array& constructor_arguments) { | 30 const Array& constructor_arguments) { |
| 31 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary()); | 31 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary()); |
| 32 const String& constructor_name = Symbols::Dot(); | 32 const String& constructor_name = Symbols::Dot(); |
| 33 | 33 |
| 34 const Object& result = Object::Handle( | 34 const Object& result = Object::Handle(DartLibraryCalls::InstanceCreate( |
| 35 DartLibraryCalls::InstanceCreate(mirrors_lib, | 35 mirrors_lib, mirror_class_name, constructor_name, constructor_arguments)); |
| 36 mirror_class_name, | |
| 37 constructor_name, | |
| 38 constructor_arguments)); | |
| 39 ASSERT(!result.IsError()); | 36 ASSERT(!result.IsError()); |
| 40 return Instance::Cast(result).raw(); | 37 return Instance::Cast(result).raw(); |
| 41 } | 38 } |
| 42 | 39 |
| 43 | 40 |
| 44 // Conventions: | 41 // Conventions: |
| 45 // * For throwing a NSM in a class klass we use its runtime type as receiver, | 42 // * For throwing a NSM in a class klass we use its runtime type as receiver, |
| 46 // i.e., klass.RareType(). | 43 // i.e., klass.RareType(). |
| 47 // * For throwing a NSM in a library, we just pass the null instance as | 44 // * For throwing a NSM in a library, we just pass the null instance as |
| 48 // receiver. | 45 // receiver. |
| 49 static void ThrowNoSuchMethod(const Instance& receiver, | 46 static void ThrowNoSuchMethod(const Instance& receiver, |
| 50 const String& function_name, | 47 const String& function_name, |
| 51 const Function& function, | 48 const Function& function, |
| 52 const Array& arguments, | 49 const Array& arguments, |
| 53 const Array& argument_names, | 50 const Array& argument_names, |
| 54 const InvocationMirror::Call call, | 51 const InvocationMirror::Call call, |
| 55 const InvocationMirror::Type type) { | 52 const InvocationMirror::Type type) { |
| 56 const Smi& invocation_type = Smi::Handle(Smi::New( | 53 const Smi& invocation_type = |
| 57 InvocationMirror::EncodeType(call, type))); | 54 Smi::Handle(Smi::New(InvocationMirror::EncodeType(call, type))); |
| 58 | 55 |
| 59 const Array& args = Array::Handle(Array::New(6)); | 56 const Array& args = Array::Handle(Array::New(6)); |
| 60 args.SetAt(0, receiver); | 57 args.SetAt(0, receiver); |
| 61 args.SetAt(1, function_name); | 58 args.SetAt(1, function_name); |
| 62 args.SetAt(2, invocation_type); | 59 args.SetAt(2, invocation_type); |
| 63 args.SetAt(3, arguments); | 60 args.SetAt(3, arguments); |
| 64 if (!argument_names.IsNull() && (argument_names.Length() > 0)) { | 61 if (!argument_names.IsNull() && (argument_names.Length() > 0)) { |
| 65 // Empty and null are treated differently for some reason. Don't pass empty | 62 // Empty and null are treated differently for some reason. Don't pass empty |
| 66 // to match the non-reflective error. | 63 // to match the non-reflective error. |
| 67 args.SetAt(4, argument_names); | 64 args.SetAt(4, argument_names); |
| 68 } | 65 } |
| 69 if (!function.IsNull()) { | 66 if (!function.IsNull()) { |
| 70 const Array& array = Array::Handle(Array::New(1)); | 67 const Array& array = Array::Handle(Array::New(1)); |
| 71 array.SetAt(0, String::Handle(function.UserVisibleFormalParameters())); | 68 array.SetAt(0, String::Handle(function.UserVisibleFormalParameters())); |
| 72 args.SetAt(5, array); | 69 args.SetAt(5, array); |
| 73 } | 70 } |
| 74 | 71 |
| 75 const Library& libcore = Library::Handle(Library::CoreLibrary()); | 72 const Library& libcore = Library::Handle(Library::CoreLibrary()); |
| 76 const Class& NoSuchMethodError = Class::Handle( | 73 const Class& NoSuchMethodError = |
| 77 libcore.LookupClass(Symbols::NoSuchMethodError())); | 74 Class::Handle(libcore.LookupClass(Symbols::NoSuchMethodError())); |
| 78 const Function& throwNew = Function::Handle( | 75 const Function& throwNew = Function::Handle( |
| 79 NoSuchMethodError.LookupFunctionAllowPrivate(Symbols::ThrowNew())); | 76 NoSuchMethodError.LookupFunctionAllowPrivate(Symbols::ThrowNew())); |
| 80 const Object& result = Object::Handle( | 77 const Object& result = |
| 81 DartEntry::InvokeFunction(throwNew, args)); | 78 Object::Handle(DartEntry::InvokeFunction(throwNew, args)); |
| 82 ASSERT(result.IsError()); | 79 ASSERT(result.IsError()); |
| 83 Exceptions::PropagateError(Error::Cast(result)); | 80 Exceptions::PropagateError(Error::Cast(result)); |
| 84 UNREACHABLE(); | 81 UNREACHABLE(); |
| 85 } | 82 } |
| 86 | 83 |
| 87 | 84 |
| 88 static void EnsureConstructorsAreCompiled(const Function& func) { | 85 static void EnsureConstructorsAreCompiled(const Function& func) { |
| 89 // Only generative constructors can have initializing formals. | 86 // Only generative constructors can have initializing formals. |
| 90 if (!func.IsGenerativeConstructor()) return; | 87 if (!func.IsGenerativeConstructor()) return; |
| 91 | 88 |
| 92 Thread* thread = Thread::Current(); | 89 Thread* thread = Thread::Current(); |
| 93 Zone* zone = thread->zone(); | 90 Zone* zone = thread->zone(); |
| 94 const Class& cls = Class::Handle(zone, func.Owner()); | 91 const Class& cls = Class::Handle(zone, func.Owner()); |
| 95 const Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread)); | 92 const Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread)); |
| 96 if (!error.IsNull()) { | 93 if (!error.IsNull()) { |
| 97 Exceptions::PropagateError(error); | 94 Exceptions::PropagateError(error); |
| 98 UNREACHABLE(); | 95 UNREACHABLE(); |
| 99 } | 96 } |
| 100 if (!func.HasCode()) { | 97 if (!func.HasCode()) { |
| 101 const Error& error = Error::Handle( | 98 const Error& error = |
| 102 zone, Compiler::CompileFunction(thread, func)); | 99 Error::Handle(zone, Compiler::CompileFunction(thread, func)); |
| 103 if (!error.IsNull()) { | 100 if (!error.IsNull()) { |
| 104 Exceptions::PropagateError(error); | 101 Exceptions::PropagateError(error); |
| 105 UNREACHABLE(); | 102 UNREACHABLE(); |
| 106 } | 103 } |
| 107 } | 104 } |
| 108 } | 105 } |
| 109 | 106 |
| 110 static RawInstance* CreateParameterMirrorList(const Function& func, | 107 static RawInstance* CreateParameterMirrorList(const Function& func, |
| 111 const Instance& owner_mirror) { | 108 const Instance& owner_mirror) { |
| 112 HANDLESCOPE(Thread::Current()); | 109 HANDLESCOPE(Thread::Current()); |
| 113 const intptr_t implicit_param_count = func.NumImplicitParameters(); | 110 const intptr_t implicit_param_count = func.NumImplicitParameters(); |
| 114 const intptr_t non_implicit_param_count = func.NumParameters() - | 111 const intptr_t non_implicit_param_count = |
| 115 implicit_param_count; | 112 func.NumParameters() - implicit_param_count; |
| 116 const intptr_t index_of_first_optional_param = | 113 const intptr_t index_of_first_optional_param = |
| 117 non_implicit_param_count - func.NumOptionalParameters(); | 114 non_implicit_param_count - func.NumOptionalParameters(); |
| 118 const intptr_t index_of_first_named_param = | 115 const intptr_t index_of_first_named_param = |
| 119 non_implicit_param_count - func.NumOptionalNamedParameters(); | 116 non_implicit_param_count - func.NumOptionalNamedParameters(); |
| 120 const Array& results = Array::Handle(Array::New(non_implicit_param_count)); | 117 const Array& results = Array::Handle(Array::New(non_implicit_param_count)); |
| 121 const Array& args = Array::Handle(Array::New(9)); | 118 const Array& args = Array::Handle(Array::New(9)); |
| 122 | 119 |
| 123 Smi& pos = Smi::Handle(); | 120 Smi& pos = Smi::Handle(); |
| 124 String& name = String::Handle(); | 121 String& name = String::Handle(); |
| 125 Instance& param = Instance::Handle(); | 122 Instance& param = Instance::Handle(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 is_final ^= Bool::True().raw(); | 168 is_final ^= Bool::True().raw(); |
| 172 default_value = Object::null(); | 169 default_value = Object::null(); |
| 173 metadata = Object::null(); | 170 metadata = Object::null(); |
| 174 } | 171 } |
| 175 | 172 |
| 176 for (intptr_t i = 0; i < non_implicit_param_count; i++) { | 173 for (intptr_t i = 0; i < non_implicit_param_count; i++) { |
| 177 pos ^= Smi::New(i); | 174 pos ^= Smi::New(i); |
| 178 name ^= func.ParameterNameAt(implicit_param_count + i); | 175 name ^= func.ParameterNameAt(implicit_param_count + i); |
| 179 if (has_extra_parameter_info) { | 176 if (has_extra_parameter_info) { |
| 180 is_final ^= param_descriptor.At(i * Parser::kParameterEntrySize + | 177 is_final ^= param_descriptor.At(i * Parser::kParameterEntrySize + |
| 181 Parser::kParameterIsFinalOffset); | 178 Parser::kParameterIsFinalOffset); |
| 182 default_value = param_descriptor.At(i * Parser::kParameterEntrySize + | 179 default_value = param_descriptor.At(i * Parser::kParameterEntrySize + |
| 183 Parser::kParameterDefaultValueOffset); | 180 Parser::kParameterDefaultValueOffset); |
| 184 metadata = param_descriptor.At(i * Parser::kParameterEntrySize + | 181 metadata = param_descriptor.At(i * Parser::kParameterEntrySize + |
| 185 Parser::kParameterMetadataOffset); | 182 Parser::kParameterMetadataOffset); |
| 186 } | 183 } |
| 187 ASSERT(default_value.IsNull() || default_value.IsInstance()); | 184 ASSERT(default_value.IsNull() || default_value.IsInstance()); |
| 188 | 185 |
| 189 // Arguments 0 (referent) and 2 (owner) are the same for all parameters. See | 186 // Arguments 0 (referent) and 2 (owner) are the same for all parameters. See |
| 190 // above. | 187 // above. |
| 191 args.SetAt(1, name); | 188 args.SetAt(1, name); |
| 192 args.SetAt(3, pos); | 189 args.SetAt(3, pos); |
| 193 args.SetAt(4, Bool::Get(i >= index_of_first_optional_param)); | 190 args.SetAt(4, Bool::Get(i >= index_of_first_optional_param)); |
| 194 args.SetAt(5, Bool::Get(i >= index_of_first_named_param)); | 191 args.SetAt(5, Bool::Get(i >= index_of_first_named_param)); |
| 195 args.SetAt(6, is_final); | 192 args.SetAt(6, is_final); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 | 268 |
| 272 String& name = String::Handle(func.name()); | 269 String& name = String::Handle(func.name()); |
| 273 name = String::ScrubNameRetainPrivate(name); | 270 name = String::ScrubNameRetainPrivate(name); |
| 274 args.SetAt(1, name); | 271 args.SetAt(1, name); |
| 275 args.SetAt(2, owner_mirror); | 272 args.SetAt(2, owner_mirror); |
| 276 args.SetAt(3, instantiator); | 273 args.SetAt(3, instantiator); |
| 277 args.SetAt(4, Bool::Get(func.is_static())); | 274 args.SetAt(4, Bool::Get(func.is_static())); |
| 278 | 275 |
| 279 intptr_t kind_flags = 0; | 276 intptr_t kind_flags = 0; |
| 280 kind_flags |= (func.is_abstract() << Mirrors::kAbstract); | 277 kind_flags |= (func.is_abstract() << Mirrors::kAbstract); |
| 281 kind_flags |= (func.IsGetterFunction() << Mirrors::kGetter); | 278 kind_flags |= (func.IsGetterFunction() << Mirrors::kGetter); |
| 282 kind_flags |= (func.IsSetterFunction() << Mirrors::kSetter); | 279 kind_flags |= (func.IsSetterFunction() << Mirrors::kSetter); |
| 283 bool is_ctor = (func.kind() == RawFunction::kConstructor); | 280 bool is_ctor = (func.kind() == RawFunction::kConstructor); |
| 284 kind_flags |= (is_ctor << Mirrors::kConstructor); | 281 kind_flags |= (is_ctor << Mirrors::kConstructor); |
| 285 kind_flags |= ((is_ctor && func.is_const()) << Mirrors::kConstCtor); | 282 kind_flags |= ((is_ctor && func.is_const()) << Mirrors::kConstCtor); |
| 286 kind_flags |= ((is_ctor && func.IsGenerativeConstructor()) | 283 kind_flags |= |
| 287 << Mirrors::kGenerativeCtor); | 284 ((is_ctor && func.IsGenerativeConstructor()) << Mirrors::kGenerativeCtor); |
| 288 kind_flags |= ((is_ctor && func.is_redirecting()) | 285 kind_flags |= |
| 289 << Mirrors::kRedirectingCtor); | 286 ((is_ctor && func.is_redirecting()) << Mirrors::kRedirectingCtor); |
| 290 kind_flags |= ((is_ctor && func.IsFactory()) << Mirrors::kFactoryCtor); | 287 kind_flags |= ((is_ctor && func.IsFactory()) << Mirrors::kFactoryCtor); |
| 291 kind_flags |= (func.is_external() << Mirrors::kExternal); | 288 kind_flags |= (func.is_external() << Mirrors::kExternal); |
| 292 args.SetAt(5, Smi::Handle(Smi::New(kind_flags))); | 289 args.SetAt(5, Smi::Handle(Smi::New(kind_flags))); |
| 293 | 290 |
| 294 return CreateMirror(Symbols::_LocalMethodMirror(), args); | 291 return CreateMirror(Symbols::_LocalMethodMirror(), args); |
| 295 } | 292 } |
| 296 | 293 |
| 297 | 294 |
| 298 static RawInstance* CreateVariableMirror(const Field& field, | 295 static RawInstance* CreateVariableMirror(const Field& field, |
| 299 const Instance& owner_mirror) { | 296 const Instance& owner_mirror) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 static RawInstance* CreateLibraryMirror(Thread* thread, const Library& lib) { | 354 static RawInstance* CreateLibraryMirror(Thread* thread, const Library& lib) { |
| 358 Zone* zone = thread->zone(); | 355 Zone* zone = thread->zone(); |
| 359 ASSERT(!lib.IsNull()); | 356 ASSERT(!lib.IsNull()); |
| 360 const Array& args = Array::Handle(zone, Array::New(3)); | 357 const Array& args = Array::Handle(zone, Array::New(3)); |
| 361 args.SetAt(0, MirrorReference::Handle(zone, MirrorReference::New(lib))); | 358 args.SetAt(0, MirrorReference::Handle(zone, MirrorReference::New(lib))); |
| 362 String& str = String::Handle(zone); | 359 String& str = String::Handle(zone); |
| 363 str = lib.name(); | 360 str = lib.name(); |
| 364 args.SetAt(1, str); | 361 args.SetAt(1, str); |
| 365 str = lib.url(); | 362 str = lib.url(); |
| 366 const char* censored_libraries[] = { | 363 const char* censored_libraries[] = { |
| 367 "dart:_builtin", | 364 "dart:_builtin", "dart:_blink", "dart:_vmservice", NULL, |
| 368 "dart:_blink", | |
| 369 "dart:_vmservice", | |
| 370 NULL, | |
| 371 }; | 365 }; |
| 372 for (intptr_t i = 0; censored_libraries[i] != NULL; i++) { | 366 for (intptr_t i = 0; censored_libraries[i] != NULL; i++) { |
| 373 if (str.Equals(censored_libraries[i])) { | 367 if (str.Equals(censored_libraries[i])) { |
| 374 // Censored library (grumble). | 368 // Censored library (grumble). |
| 375 return Instance::null(); | 369 return Instance::null(); |
| 376 } | 370 } |
| 377 } | 371 } |
| 378 if (str.Equals("dart:io")) { | 372 if (str.Equals("dart:io")) { |
| 379 // Hack around dart:io being loaded into non-service isolates in Dartium. | 373 // Hack around dart:io being loaded into non-service isolates in Dartium. |
| 380 Isolate* isolate = thread->isolate(); | 374 Isolate* isolate = thread->isolate(); |
| 381 const GrowableObjectArray& libraries = GrowableObjectArray::Handle( | 375 const GrowableObjectArray& libraries = |
| 382 zone, isolate->object_store()->libraries()); | 376 GrowableObjectArray::Handle(zone, isolate->object_store()->libraries()); |
| 383 Library& other_lib = Library::Handle(zone); | 377 Library& other_lib = Library::Handle(zone); |
| 384 String& other_uri = String::Handle(zone); | 378 String& other_uri = String::Handle(zone); |
| 385 for (intptr_t i = 0; i < libraries.Length(); i++) { | 379 for (intptr_t i = 0; i < libraries.Length(); i++) { |
| 386 other_lib ^= libraries.At(i); | 380 other_lib ^= libraries.At(i); |
| 387 other_uri = other_lib.url(); | 381 other_uri = other_lib.url(); |
| 388 if (other_uri.Equals("dart:html")) { | 382 if (other_uri.Equals("dart:html")) { |
| 389 return Instance::null(); | 383 return Instance::null(); |
| 390 } | 384 } |
| 391 } | 385 } |
| 392 } | 386 } |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 Instance& dep = Instance::Handle(); | 470 Instance& dep = Instance::Handle(); |
| 477 LibraryPrefix& prefix = LibraryPrefix::Handle(); | 471 LibraryPrefix& prefix = LibraryPrefix::Handle(); |
| 478 GrowableObjectArray& deps = | 472 GrowableObjectArray& deps = |
| 479 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 473 GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| 480 | 474 |
| 481 // Unprefixed imports. | 475 // Unprefixed imports. |
| 482 ports = lib.imports(); | 476 ports = lib.imports(); |
| 483 for (intptr_t i = 0; i < ports.Length(); i++) { | 477 for (intptr_t i = 0; i < ports.Length(); i++) { |
| 484 ns ^= ports.At(i); | 478 ns ^= ports.At(i); |
| 485 if (!ns.IsNull()) { | 479 if (!ns.IsNull()) { |
| 486 dep = CreateLibraryDependencyMirror( | 480 dep = CreateLibraryDependencyMirror(thread, lib_mirror, ns, prefix, true, |
| 487 thread, lib_mirror, ns, prefix, true, false); | 481 false); |
| 488 if (!dep.IsNull()) { | 482 if (!dep.IsNull()) { |
| 489 deps.Add(dep); | 483 deps.Add(dep); |
| 490 } | 484 } |
| 491 } | 485 } |
| 492 } | 486 } |
| 493 | 487 |
| 494 // Exports. | 488 // Exports. |
| 495 ports = lib.exports(); | 489 ports = lib.exports(); |
| 496 for (intptr_t i = 0; i < ports.Length(); i++) { | 490 for (intptr_t i = 0; i < ports.Length(); i++) { |
| 497 ns ^= ports.At(i); | 491 ns ^= ports.At(i); |
| 498 dep = CreateLibraryDependencyMirror( | 492 dep = CreateLibraryDependencyMirror(thread, lib_mirror, ns, prefix, false, |
| 499 thread, lib_mirror, ns, prefix, false, false); | 493 false); |
| 500 if (!dep.IsNull()) { | 494 if (!dep.IsNull()) { |
| 501 deps.Add(dep); | 495 deps.Add(dep); |
| 502 } | 496 } |
| 503 } | 497 } |
| 504 | 498 |
| 505 // Prefixed imports. | 499 // Prefixed imports. |
| 506 DictionaryIterator entries(lib); | 500 DictionaryIterator entries(lib); |
| 507 Object& entry = Object::Handle(); | 501 Object& entry = Object::Handle(); |
| 508 while (entries.HasNext()) { | 502 while (entries.HasNext()) { |
| 509 entry = entries.GetNext(); | 503 entry = entries.GetNext(); |
| 510 if (entry.IsLibraryPrefix()) { | 504 if (entry.IsLibraryPrefix()) { |
| 511 prefix ^= entry.raw(); | 505 prefix ^= entry.raw(); |
| 512 ports = prefix.imports(); | 506 ports = prefix.imports(); |
| 513 for (intptr_t i = 0; i < ports.Length(); i++) { | 507 for (intptr_t i = 0; i < ports.Length(); i++) { |
| 514 ns ^= ports.At(i); | 508 ns ^= ports.At(i); |
| 515 if (!ns.IsNull()) { | 509 if (!ns.IsNull()) { |
| 516 dep = CreateLibraryDependencyMirror( | 510 dep = CreateLibraryDependencyMirror(thread, lib_mirror, ns, prefix, |
| 517 thread, lib_mirror, ns, prefix, true, prefix.is_deferred_load()); | 511 true, prefix.is_deferred_load()); |
| 518 if (!dep.IsNull()) { | 512 if (!dep.IsNull()) { |
| 519 deps.Add(dep); | 513 deps.Add(dep); |
| 520 } | 514 } |
| 521 } | 515 } |
| 522 } | 516 } |
| 523 } | 517 } |
| 524 } | 518 } |
| 525 | 519 |
| 526 return deps.raw(); | 520 return deps.raw(); |
| 527 } | 521 } |
| 528 | 522 |
| 529 | 523 |
| 530 static RawInstance* CreateTypeMirror(const AbstractType& type) { | 524 static RawInstance* CreateTypeMirror(const AbstractType& type) { |
| 531 if (type.IsTypeRef()) { | 525 if (type.IsTypeRef()) { |
| 532 AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type()); | 526 AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type()); |
| 533 ASSERT(!ref_type.IsTypeRef()); | 527 ASSERT(!ref_type.IsTypeRef()); |
| 534 ASSERT(ref_type.IsCanonical()); | 528 ASSERT(ref_type.IsCanonical()); |
| 535 return CreateTypeMirror(ref_type); | 529 return CreateTypeMirror(ref_type); |
| 536 } | 530 } |
| 537 ASSERT(type.IsFinalized()); | 531 ASSERT(type.IsFinalized()); |
| 538 PROPAGATE_IF_MALFORMED(type); | 532 PROPAGATE_IF_MALFORMED(type); |
| 539 ASSERT(type.IsCanonical() || type.IsTypeParameter() || type.IsBoundedType()); | 533 ASSERT(type.IsCanonical() || type.IsTypeParameter() || type.IsBoundedType()); |
| 540 | 534 |
| 541 if (type.IsFunctionType()) { | 535 if (type.IsFunctionType()) { |
| 542 const Class& scope_class = Class::Handle(Type::Cast(type).type_class()); | 536 const Class& scope_class = Class::Handle(Type::Cast(type).type_class()); |
| 543 if (scope_class.IsTypedefClass()) { | 537 if (scope_class.IsTypedefClass()) { |
| 544 return CreateTypedefMirror(scope_class, | 538 return CreateTypedefMirror(scope_class, type, Bool::False(), |
| 545 type, Bool::False(), Object::null_instance()); | 539 Object::null_instance()); |
| 546 } else { | 540 } else { |
| 547 return CreateFunctionTypeMirror(type); | 541 return CreateFunctionTypeMirror(type); |
| 548 } | 542 } |
| 549 } | 543 } |
| 550 if (type.HasResolvedTypeClass()) { | 544 if (type.HasResolvedTypeClass()) { |
| 551 const Class& cls = Class::Handle(type.type_class()); | 545 const Class& cls = Class::Handle(type.type_class()); |
| 552 // Handle void and dynamic types. | 546 // Handle void and dynamic types. |
| 553 if (cls.IsVoidClass()) { | 547 if (cls.IsVoidClass()) { |
| 554 Array& args = Array::Handle(Array::New(1)); | 548 Array& args = Array::Handle(Array::New(1)); |
| 555 args.SetAt(0, Symbols::Void()); | 549 args.SetAt(0, Symbols::Void()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 570 } | 564 } |
| 571 UNREACHABLE(); | 565 UNREACHABLE(); |
| 572 return Instance::null(); | 566 return Instance::null(); |
| 573 } | 567 } |
| 574 | 568 |
| 575 | 569 |
| 576 static RawInstance* CreateIsolateMirror() { | 570 static RawInstance* CreateIsolateMirror() { |
| 577 Thread* thread = Thread::Current(); | 571 Thread* thread = Thread::Current(); |
| 578 Isolate* isolate = thread->isolate(); | 572 Isolate* isolate = thread->isolate(); |
| 579 const String& debug_name = String::Handle(String::New(isolate->name())); | 573 const String& debug_name = String::Handle(String::New(isolate->name())); |
| 580 const Library& root_library = Library::Handle(thread->zone(), | 574 const Library& root_library = |
| 581 isolate->object_store()->root_library()); | 575 Library::Handle(thread->zone(), isolate->object_store()->root_library()); |
| 582 const Instance& root_library_mirror = | 576 const Instance& root_library_mirror = |
| 583 Instance::Handle(CreateLibraryMirror(thread, root_library)); | 577 Instance::Handle(CreateLibraryMirror(thread, root_library)); |
| 584 | 578 |
| 585 const Array& args = Array::Handle(Array::New(2)); | 579 const Array& args = Array::Handle(Array::New(2)); |
| 586 args.SetAt(0, debug_name); | 580 args.SetAt(0, debug_name); |
| 587 args.SetAt(1, root_library_mirror); | 581 args.SetAt(1, root_library_mirror); |
| 588 return CreateMirror(Symbols::_LocalIsolateMirror(), args); | 582 return CreateMirror(Symbols::_LocalIsolateMirror(), args); |
| 589 } | 583 } |
| 590 | 584 |
| 591 | 585 |
| 592 static void VerifyMethodKindShifts() { | 586 static void VerifyMethodKindShifts() { |
| 593 #ifdef DEBUG | 587 #ifdef DEBUG |
| 594 Thread* thread = Thread::Current(); | 588 Thread* thread = Thread::Current(); |
| 595 Zone* zone = thread->zone(); | 589 Zone* zone = thread->zone(); |
| 596 const Library& lib = Library::Handle(zone, Library::MirrorsLibrary()); | 590 const Library& lib = Library::Handle(zone, Library::MirrorsLibrary()); |
| 597 const Class& cls = Class::Handle(zone, | 591 const Class& cls = Class::Handle( |
| 598 lib.LookupClassAllowPrivate(Symbols::_LocalMethodMirror())); | 592 zone, lib.LookupClassAllowPrivate(Symbols::_LocalMethodMirror())); |
| 599 const Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread)); | 593 const Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread)); |
| 600 ASSERT(error.IsNull()); | 594 ASSERT(error.IsNull()); |
| 601 | 595 |
| 602 Field& field = Field::Handle(); | 596 Field& field = Field::Handle(); |
| 603 Smi& value = Smi::Handle(); | 597 Smi& value = Smi::Handle(); |
| 604 | 598 |
| 605 #define CHECK_KIND_SHIFT(name) \ | 599 #define CHECK_KIND_SHIFT(name) \ |
| 606 field = cls.LookupField(String::Handle(String::New(#name))); \ | 600 field = cls.LookupField(String::Handle(String::New(#name))); \ |
| 607 ASSERT(!field.IsNull()); \ | 601 ASSERT(!field.IsNull()); \ |
| 608 value ^= field.StaticValue(); \ | 602 value ^= field.StaticValue(); \ |
| 609 ASSERT(value.Value() == Mirrors::name); | 603 ASSERT(value.Value() == Mirrors::name); |
| 610 MIRRORS_KIND_SHIFT_LIST(CHECK_KIND_SHIFT) | 604 MIRRORS_KIND_SHIFT_LIST(CHECK_KIND_SHIFT) |
| 611 #undef CHECK_KIND_SHIFT | 605 #undef CHECK_KIND_SHIFT |
| 612 #endif | 606 #endif |
| 613 } | 607 } |
| 614 | 608 |
| 615 | 609 |
| 616 static RawInstance* ReturnResult(const Object& result) { | 610 static RawInstance* ReturnResult(const Object& result) { |
| 617 if (result.IsError()) { | 611 if (result.IsError()) { |
| 618 Exceptions::PropagateError(Error::Cast(result)); | 612 Exceptions::PropagateError(Error::Cast(result)); |
| 619 UNREACHABLE(); | 613 UNREACHABLE(); |
| 620 } | 614 } |
| 621 if (result.IsInstance()) { | 615 if (result.IsInstance()) { |
| 622 return Instance::Cast(result).raw(); | 616 return Instance::Cast(result).raw(); |
| 623 } | 617 } |
| 624 ASSERT(result.IsNull()); | 618 ASSERT(result.IsNull()); |
| 625 return Instance::null(); | 619 return Instance::null(); |
| 626 } | 620 } |
| 627 | 621 |
| 628 | 622 |
| 629 // Invoke the function, or noSuchMethod if it is null. Propagate any unhandled | 623 // Invoke the function, or noSuchMethod if it is null. Propagate any unhandled |
| 630 // exceptions. Wrap and propagate any compilation errors. | 624 // exceptions. Wrap and propagate any compilation errors. |
| 631 static RawInstance* InvokeDynamicFunction( | 625 static RawInstance* InvokeDynamicFunction(const Instance& receiver, |
| 632 const Instance& receiver, | 626 const Function& function, |
| 633 const Function& function, | 627 const String& target_name, |
| 634 const String& target_name, | 628 const Array& args, |
| 635 const Array& args, | 629 const Array& args_descriptor_array) { |
| 636 const Array& args_descriptor_array) { | |
| 637 // Note "args" is already the internal arguments with the receiver as the | 630 // Note "args" is already the internal arguments with the receiver as the |
| 638 // first element. | 631 // first element. |
| 639 Object& result = Object::Handle(); | 632 Object& result = Object::Handle(); |
| 640 ArgumentsDescriptor args_descriptor(args_descriptor_array); | 633 ArgumentsDescriptor args_descriptor(args_descriptor_array); |
| 641 if (function.IsNull() || | 634 if (function.IsNull() || !function.is_reflectable() || |
| 642 !function.is_reflectable() || | |
| 643 !function.AreValidArguments(args_descriptor, NULL)) { | 635 !function.AreValidArguments(args_descriptor, NULL)) { |
| 644 result = DartEntry::InvokeNoSuchMethod(receiver, | 636 result = DartEntry::InvokeNoSuchMethod(receiver, target_name, args, |
| 645 target_name, | |
| 646 args, | |
| 647 args_descriptor_array); | 637 args_descriptor_array); |
| 648 } else { | 638 } else { |
| 649 result = DartEntry::InvokeFunction(function, | 639 result = DartEntry::InvokeFunction(function, args, args_descriptor_array); |
| 650 args, | |
| 651 args_descriptor_array); | |
| 652 } | 640 } |
| 653 return ReturnResult(result); | 641 return ReturnResult(result); |
| 654 } | 642 } |
| 655 | 643 |
| 656 | 644 |
| 657 static RawInstance* InvokeLibraryGetter(const Library& library, | 645 static RawInstance* InvokeLibraryGetter(const Library& library, |
| 658 const String& getter_name, | 646 const String& getter_name, |
| 659 const bool throw_nsm_if_absent) { | 647 const bool throw_nsm_if_absent) { |
| 660 // To access a top-level we may need to use the Field or the getter Function. | 648 // To access a top-level we may need to use the Field or the getter Function. |
| 661 // The getter function may either be in the library or in the field's owner | 649 // The getter function may either be in the library or in the field's owner |
| 662 // class, depending on whether it was an actual getter, or an uninitialized | 650 // class, depending on whether it was an actual getter, or an uninitialized |
| 663 // field. | 651 // field. |
| 664 const Field& field = Field::Handle( | 652 const Field& field = Field::Handle(library.LookupLocalField(getter_name)); |
| 665 library.LookupLocalField(getter_name)); | |
| 666 Function& getter = Function::Handle(); | 653 Function& getter = Function::Handle(); |
| 667 if (field.IsNull()) { | 654 if (field.IsNull()) { |
| 668 // No field found. Check for a getter in the lib. | 655 // No field found. Check for a getter in the lib. |
| 669 const String& internal_getter_name = | 656 const String& internal_getter_name = |
| 670 String::Handle(Field::GetterName(getter_name)); | 657 String::Handle(Field::GetterName(getter_name)); |
| 671 getter = library.LookupLocalFunction(internal_getter_name); | 658 getter = library.LookupLocalFunction(internal_getter_name); |
| 672 if (getter.IsNull()) { | 659 if (getter.IsNull()) { |
| 673 getter = library.LookupLocalFunction(getter_name); | 660 getter = library.LookupLocalFunction(getter_name); |
| 674 if (!getter.IsNull()) { | 661 if (!getter.IsNull()) { |
| 675 // Looking for a getter but found a regular method: closurize it. | 662 // Looking for a getter but found a regular method: closurize it. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 691 } | 678 } |
| 692 | 679 |
| 693 if (!getter.IsNull() && getter.is_reflectable()) { | 680 if (!getter.IsNull() && getter.is_reflectable()) { |
| 694 // Invoke the getter and return the result. | 681 // Invoke the getter and return the result. |
| 695 const Object& result = Object::Handle( | 682 const Object& result = Object::Handle( |
| 696 DartEntry::InvokeFunction(getter, Object::empty_array())); | 683 DartEntry::InvokeFunction(getter, Object::empty_array())); |
| 697 return ReturnResult(result); | 684 return ReturnResult(result); |
| 698 } | 685 } |
| 699 | 686 |
| 700 if (throw_nsm_if_absent) { | 687 if (throw_nsm_if_absent) { |
| 701 ThrowNoSuchMethod(Instance::null_instance(), | 688 ThrowNoSuchMethod(Instance::null_instance(), getter_name, getter, |
| 702 getter_name, | 689 Object::null_array(), Object::null_array(), |
| 703 getter, | 690 InvocationMirror::kTopLevel, InvocationMirror::kGetter); |
| 704 Object::null_array(), | |
| 705 Object::null_array(), | |
| 706 InvocationMirror::kTopLevel, | |
| 707 InvocationMirror::kGetter); | |
| 708 UNREACHABLE(); | 691 UNREACHABLE(); |
| 709 } | 692 } |
| 710 | 693 |
| 711 // Fall through case: Indicate that we didn't find any function or field using | 694 // Fall through case: Indicate that we didn't find any function or field using |
| 712 // a special null instance. This is different from a field being null. Callers | 695 // a special null instance. This is different from a field being null. Callers |
| 713 // make sure that this null does not leak into Dartland. | 696 // make sure that this null does not leak into Dartland. |
| 714 return Object::sentinel().raw(); | 697 return Object::sentinel().raw(); |
| 715 } | 698 } |
| 716 | 699 |
| 717 | 700 |
| 718 static RawInstance* InvokeClassGetter(const Class& klass, | 701 static RawInstance* InvokeClassGetter(const Class& klass, |
| 719 const String& getter_name, | 702 const String& getter_name, |
| 720 const bool throw_nsm_if_absent) { | 703 const bool throw_nsm_if_absent) { |
| 721 // Note static fields do not have implicit getters. | 704 // Note static fields do not have implicit getters. |
| 722 const Field& field = | 705 const Field& field = Field::Handle(klass.LookupStaticField(getter_name)); |
| 723 Field::Handle(klass.LookupStaticField(getter_name)); | |
| 724 if (field.IsNull() || field.IsUninitialized()) { | 706 if (field.IsNull() || field.IsUninitialized()) { |
| 725 const String& internal_getter_name = String::Handle( | 707 const String& internal_getter_name = |
| 726 Field::GetterName(getter_name)); | 708 String::Handle(Field::GetterName(getter_name)); |
| 727 Function& getter = Function::Handle( | 709 Function& getter = |
| 728 klass.LookupStaticFunction(internal_getter_name)); | 710 Function::Handle(klass.LookupStaticFunction(internal_getter_name)); |
| 729 | 711 |
| 730 if (getter.IsNull() || !getter.is_reflectable()) { | 712 if (getter.IsNull() || !getter.is_reflectable()) { |
| 731 if (getter.IsNull()) { | 713 if (getter.IsNull()) { |
| 732 getter = klass.LookupStaticFunction(getter_name); | 714 getter = klass.LookupStaticFunction(getter_name); |
| 733 if (!getter.IsNull()) { | 715 if (!getter.IsNull()) { |
| 734 // Looking for a getter but found a regular method: closurize it. | 716 // Looking for a getter but found a regular method: closurize it. |
| 735 const Function& closure_function = | 717 const Function& closure_function = |
| 736 Function::Handle(getter.ImplicitClosureFunction()); | 718 Function::Handle(getter.ImplicitClosureFunction()); |
| 737 return closure_function.ImplicitStaticClosure(); | 719 return closure_function.ImplicitStaticClosure(); |
| 738 } | 720 } |
| 739 } | 721 } |
| 740 if (throw_nsm_if_absent) { | 722 if (throw_nsm_if_absent) { |
| 741 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), | 723 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), getter_name, |
| 742 getter_name, | 724 getter, Object::null_array(), Object::null_array(), |
| 743 getter, | 725 InvocationMirror::kStatic, InvocationMirror::kGetter); |
| 744 Object::null_array(), | |
| 745 Object::null_array(), | |
| 746 InvocationMirror::kStatic, | |
| 747 InvocationMirror::kGetter); | |
| 748 UNREACHABLE(); | 726 UNREACHABLE(); |
| 749 } | 727 } |
| 750 // Fall through case: Indicate that we didn't find any function or field | 728 // Fall through case: Indicate that we didn't find any function or field |
| 751 // using a special null instance. This is different from a field being | 729 // using a special null instance. This is different from a field being |
| 752 // null. Callers make sure that this null does not leak into Dartland. | 730 // null. Callers make sure that this null does not leak into Dartland. |
| 753 return Object::sentinel().raw(); | 731 return Object::sentinel().raw(); |
| 754 } | 732 } |
| 755 | 733 |
| 756 // Invoke the getter and return the result. | 734 // Invoke the getter and return the result. |
| 757 const Object& result = Object::Handle( | 735 const Object& result = Object::Handle( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 784 if (!bound_error.IsNull()) { | 762 if (!bound_error.IsNull()) { |
| 785 Exceptions::PropagateError(bound_error); | 763 Exceptions::PropagateError(bound_error); |
| 786 UNREACHABLE(); | 764 UNREACHABLE(); |
| 787 } | 765 } |
| 788 ASSERT(result.IsFinalized()); | 766 ASSERT(result.IsFinalized()); |
| 789 return result.Canonicalize(); | 767 return result.Canonicalize(); |
| 790 } | 768 } |
| 791 | 769 |
| 792 | 770 |
| 793 DEFINE_NATIVE_ENTRY(MirrorSystem_libraries, 0) { | 771 DEFINE_NATIVE_ENTRY(MirrorSystem_libraries, 0) { |
| 794 const GrowableObjectArray& libraries = GrowableObjectArray::Handle( | 772 const GrowableObjectArray& libraries = |
| 795 zone, isolate->object_store()->libraries()); | 773 GrowableObjectArray::Handle(zone, isolate->object_store()->libraries()); |
| 796 | 774 |
| 797 const intptr_t num_libraries = libraries.Length(); | 775 const intptr_t num_libraries = libraries.Length(); |
| 798 const GrowableObjectArray& library_mirrors = GrowableObjectArray::Handle( | 776 const GrowableObjectArray& library_mirrors = GrowableObjectArray::Handle( |
| 799 zone, GrowableObjectArray::New(num_libraries)); | 777 zone, GrowableObjectArray::New(num_libraries)); |
| 800 Library& library = Library::Handle(zone); | 778 Library& library = Library::Handle(zone); |
| 801 Instance& library_mirror = Instance::Handle(zone); | 779 Instance& library_mirror = Instance::Handle(zone); |
| 802 | 780 |
| 803 for (int i = 0; i < num_libraries; i++) { | 781 for (int i = 0; i < num_libraries; i++) { |
| 804 library ^= libraries.At(i); | 782 library ^= libraries.At(i); |
| 805 library_mirror = CreateLibraryMirror(thread, library); | 783 library_mirror = CreateLibraryMirror(thread, library); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 822 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 800 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
| 823 PROPAGATE_IF_MALFORMED(type); | 801 PROPAGATE_IF_MALFORMED(type); |
| 824 ASSERT(type.IsFinalized()); | 802 ASSERT(type.IsFinalized()); |
| 825 ASSERT(type.HasResolvedTypeClass()); | 803 ASSERT(type.HasResolvedTypeClass()); |
| 826 const Class& cls = Class::Handle(type.type_class()); | 804 const Class& cls = Class::Handle(type.type_class()); |
| 827 ASSERT(!cls.IsNull()); | 805 ASSERT(!cls.IsNull()); |
| 828 if (cls.IsDynamicClass() || cls.IsVoidClass() || cls.IsTypedefClass()) { | 806 if (cls.IsDynamicClass() || cls.IsVoidClass() || cls.IsTypedefClass()) { |
| 829 Exceptions::ThrowArgumentError(type); | 807 Exceptions::ThrowArgumentError(type); |
| 830 UNREACHABLE(); | 808 UNREACHABLE(); |
| 831 } | 809 } |
| 832 return CreateClassMirror(cls, | 810 return CreateClassMirror(cls, AbstractType::Handle(cls.DeclarationType()), |
| 833 AbstractType::Handle(cls.DeclarationType()), | |
| 834 Bool::True(), // is_declaration | 811 Bool::True(), // is_declaration |
| 835 Object::null_instance()); | 812 Object::null_instance()); |
| 836 } | 813 } |
| 837 | 814 |
| 838 | 815 |
| 839 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) { | 816 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) { |
| 840 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 817 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
| 841 return CreateTypeMirror(type); | 818 return CreateTypeMirror(type); |
| 842 } | 819 } |
| 843 | 820 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 | 869 |
| 893 const Object& metadata = Object::Handle(library.GetMetadata(decl)); | 870 const Object& metadata = Object::Handle(library.GetMetadata(decl)); |
| 894 if (metadata.IsError()) { | 871 if (metadata.IsError()) { |
| 895 Exceptions::PropagateError(Error::Cast(metadata)); | 872 Exceptions::PropagateError(Error::Cast(metadata)); |
| 896 } | 873 } |
| 897 return metadata.raw(); | 874 return metadata.raw(); |
| 898 } | 875 } |
| 899 | 876 |
| 900 | 877 |
| 901 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 2) { | 878 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 2) { |
| 902 GET_NON_NULL_NATIVE_ARGUMENT(Instance, | 879 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror, |
| 903 owner_mirror, | |
| 904 arguments->NativeArgAt(0)); | 880 arguments->NativeArgAt(0)); |
| 905 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 881 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 906 // TODO(rmacnak): Return get:call() method on class _Closure instead? | 882 // TODO(rmacnak): Return get:call() method on class _Closure instead? |
| 907 // This now returns the result of invoking that call getter. | 883 // This now returns the result of invoking that call getter. |
| 908 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 884 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 909 ASSERT(!func.IsNull()); | 885 ASSERT(!func.IsNull()); |
| 910 return CreateMethodMirror(func, owner_mirror, AbstractType::Handle()); | 886 return CreateMethodMirror(func, owner_mirror, AbstractType::Handle()); |
| 911 } | 887 } |
| 912 | 888 |
| 913 | 889 |
| 914 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) { | 890 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) { |
| 915 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); | 891 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0)); |
| 916 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 892 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 917 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 893 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 918 return CreateParameterMirrorList(func, owner); | 894 return CreateParameterMirrorList(func, owner); |
| 919 } | 895 } |
| 920 | 896 |
| 921 | 897 |
| 922 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 2) { | 898 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 2) { |
| 923 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 899 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 924 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, | 900 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, instantiator, |
| 925 instantiator, | |
| 926 arguments->NativeArgAt(1)); | 901 arguments->NativeArgAt(1)); |
| 927 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 902 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 928 ASSERT(!func.IsNull()); | 903 ASSERT(!func.IsNull()); |
| 929 AbstractType& type = AbstractType::Handle(func.result_type()); | 904 AbstractType& type = AbstractType::Handle(func.result_type()); |
| 930 return InstantiateType(type, instantiator); | 905 return InstantiateType(type, instantiator); |
| 931 } | 906 } |
| 932 | 907 |
| 933 | 908 |
| 934 DEFINE_NATIVE_ENTRY(ClassMirror_libraryUri, 1) { | 909 DEFINE_NATIVE_ENTRY(ClassMirror_libraryUri, 1) { |
| 935 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 910 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1004 ASSERT(type.IsFinalized()); | 979 ASSERT(type.IsFinalized()); |
| 1005 const Class& cls = Class::Handle(type.type_class()); | 980 const Class& cls = Class::Handle(type.type_class()); |
| 1006 const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); | 981 const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); |
| 1007 ASSERT(mixin_type.IsNull() || mixin_type.IsFinalized()); | 982 ASSERT(mixin_type.IsNull() || mixin_type.IsFinalized()); |
| 1008 return mixin_type.raw(); | 983 return mixin_type.raw(); |
| 1009 } | 984 } |
| 1010 | 985 |
| 1011 | 986 |
| 1012 DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) { | 987 DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) { |
| 1013 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); | 988 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); |
| 1014 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, | 989 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, instantiator, |
| 1015 instantiator, | |
| 1016 arguments->NativeArgAt(1)); | 990 arguments->NativeArgAt(1)); |
| 1017 PROPAGATE_IF_MALFORMED(type); | 991 PROPAGATE_IF_MALFORMED(type); |
| 1018 ASSERT(type.IsFinalized()); | 992 ASSERT(type.IsFinalized()); |
| 1019 const Class& cls = Class::Handle(type.type_class()); | 993 const Class& cls = Class::Handle(type.type_class()); |
| 1020 const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); | 994 const AbstractType& mixin_type = AbstractType::Handle(cls.mixin()); |
| 1021 if (mixin_type.IsNull()) { | 995 if (mixin_type.IsNull()) { |
| 1022 return mixin_type.raw(); | 996 return mixin_type.raw(); |
| 1023 } | 997 } |
| 1024 | 998 |
| 1025 return InstantiateType(mixin_type, instantiator); | 999 return InstantiateType(mixin_type, instantiator); |
| 1026 } | 1000 } |
| 1027 | 1001 |
| 1028 | 1002 |
| 1029 DEFINE_NATIVE_ENTRY(ClassMirror_members, 3) { | 1003 DEFINE_NATIVE_ENTRY(ClassMirror_members, 3) { |
| 1030 GET_NON_NULL_NATIVE_ARGUMENT(Instance, | 1004 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror, |
| 1031 owner_mirror, | |
| 1032 arguments->NativeArgAt(0)); | 1005 arguments->NativeArgAt(0)); |
| 1033 GET_NATIVE_ARGUMENT(AbstractType, | 1006 GET_NATIVE_ARGUMENT(AbstractType, owner_instantiator, |
| 1034 owner_instantiator, | |
| 1035 arguments->NativeArgAt(1)); | 1007 arguments->NativeArgAt(1)); |
| 1036 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(2)); | 1008 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(2)); |
| 1037 const Class& klass = Class::Handle(ref.GetClassReferent()); | 1009 const Class& klass = Class::Handle(ref.GetClassReferent()); |
| 1038 | 1010 |
| 1039 const Error& error = Error::Handle(klass.EnsureIsFinalized(thread)); | 1011 const Error& error = Error::Handle(klass.EnsureIsFinalized(thread)); |
| 1040 if (!error.IsNull()) { | 1012 if (!error.IsNull()) { |
| 1041 Exceptions::PropagateError(error); | 1013 Exceptions::PropagateError(error); |
| 1042 } | 1014 } |
| 1043 | 1015 |
| 1044 const Array& fields = Array::Handle(klass.fields()); | 1016 const Array& fields = Array::Handle(klass.fields()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1058 member_mirror = CreateVariableMirror(field, owner_mirror); | 1030 member_mirror = CreateVariableMirror(field, owner_mirror); |
| 1059 member_mirrors.Add(member_mirror); | 1031 member_mirrors.Add(member_mirror); |
| 1060 } | 1032 } |
| 1061 } | 1033 } |
| 1062 | 1034 |
| 1063 Function& func = Function::Handle(); | 1035 Function& func = Function::Handle(); |
| 1064 for (intptr_t i = 0; i < num_functions; i++) { | 1036 for (intptr_t i = 0; i < num_functions; i++) { |
| 1065 func ^= functions.At(i); | 1037 func ^= functions.At(i); |
| 1066 if (func.is_reflectable() && | 1038 if (func.is_reflectable() && |
| 1067 (func.kind() == RawFunction::kRegularFunction || | 1039 (func.kind() == RawFunction::kRegularFunction || |
| 1068 func.kind() == RawFunction::kGetterFunction || | 1040 func.kind() == RawFunction::kGetterFunction || |
| 1069 func.kind() == RawFunction::kSetterFunction)) { | 1041 func.kind() == RawFunction::kSetterFunction)) { |
| 1070 member_mirror = CreateMethodMirror(func, owner_mirror, | 1042 member_mirror = |
| 1071 owner_instantiator); | 1043 CreateMethodMirror(func, owner_mirror, owner_instantiator); |
| 1072 member_mirrors.Add(member_mirror); | 1044 member_mirrors.Add(member_mirror); |
| 1073 } | 1045 } |
| 1074 } | 1046 } |
| 1075 | 1047 |
| 1076 return member_mirrors.raw(); | 1048 return member_mirrors.raw(); |
| 1077 } | 1049 } |
| 1078 | 1050 |
| 1079 | 1051 |
| 1080 DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 3) { | 1052 DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 3) { |
| 1081 GET_NON_NULL_NATIVE_ARGUMENT(Instance, | 1053 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror, |
| 1082 owner_mirror, | |
| 1083 arguments->NativeArgAt(0)); | 1054 arguments->NativeArgAt(0)); |
| 1084 GET_NATIVE_ARGUMENT(AbstractType, | 1055 GET_NATIVE_ARGUMENT(AbstractType, owner_instantiator, |
| 1085 owner_instantiator, | |
| 1086 arguments->NativeArgAt(1)); | 1056 arguments->NativeArgAt(1)); |
| 1087 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(2)); | 1057 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(2)); |
| 1088 const Class& klass = Class::Handle(ref.GetClassReferent()); | 1058 const Class& klass = Class::Handle(ref.GetClassReferent()); |
| 1089 | 1059 |
| 1090 const Error& error = Error::Handle(klass.EnsureIsFinalized(thread)); | 1060 const Error& error = Error::Handle(klass.EnsureIsFinalized(thread)); |
| 1091 if (!error.IsNull()) { | 1061 if (!error.IsNull()) { |
| 1092 Exceptions::PropagateError(error); | 1062 Exceptions::PropagateError(error); |
| 1093 } | 1063 } |
| 1094 | 1064 |
| 1095 const Array& functions = Array::Handle(klass.functions()); | 1065 const Array& functions = Array::Handle(klass.functions()); |
| 1096 const intptr_t num_functions = functions.Length(); | 1066 const intptr_t num_functions = functions.Length(); |
| 1097 | 1067 |
| 1098 Instance& constructor_mirror = Instance::Handle(); | 1068 Instance& constructor_mirror = Instance::Handle(); |
| 1099 const GrowableObjectArray& constructor_mirrors = GrowableObjectArray::Handle( | 1069 const GrowableObjectArray& constructor_mirrors = |
| 1100 GrowableObjectArray::New(num_functions)); | 1070 GrowableObjectArray::Handle(GrowableObjectArray::New(num_functions)); |
| 1101 | 1071 |
| 1102 Function& func = Function::Handle(); | 1072 Function& func = Function::Handle(); |
| 1103 for (intptr_t i = 0; i < num_functions; i++) { | 1073 for (intptr_t i = 0; i < num_functions; i++) { |
| 1104 func ^= functions.At(i); | 1074 func ^= functions.At(i); |
| 1105 if (func.is_reflectable() && func.kind() == RawFunction::kConstructor) { | 1075 if (func.is_reflectable() && func.kind() == RawFunction::kConstructor) { |
| 1106 constructor_mirror = CreateMethodMirror(func, owner_mirror, | 1076 constructor_mirror = |
| 1107 owner_instantiator); | 1077 CreateMethodMirror(func, owner_mirror, owner_instantiator); |
| 1108 constructor_mirrors.Add(constructor_mirror); | 1078 constructor_mirrors.Add(constructor_mirror); |
| 1109 } | 1079 } |
| 1110 } | 1080 } |
| 1111 | 1081 |
| 1112 return constructor_mirrors.raw(); | 1082 return constructor_mirrors.raw(); |
| 1113 } | 1083 } |
| 1114 | 1084 |
| 1115 | 1085 |
| 1116 DEFINE_NATIVE_ENTRY(LibraryMirror_members, 2) { | 1086 DEFINE_NATIVE_ENTRY(LibraryMirror_members, 2) { |
| 1117 GET_NON_NULL_NATIVE_ARGUMENT(Instance, | 1087 GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror, |
| 1118 owner_mirror, | |
| 1119 arguments->NativeArgAt(0)); | 1088 arguments->NativeArgAt(0)); |
| 1120 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 1089 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 1121 const Library& library = Library::Handle(ref.GetLibraryReferent()); | 1090 const Library& library = Library::Handle(ref.GetLibraryReferent()); |
| 1122 | 1091 |
| 1123 Instance& member_mirror = Instance::Handle(); | 1092 Instance& member_mirror = Instance::Handle(); |
| 1124 const GrowableObjectArray& member_mirrors = | 1093 const GrowableObjectArray& member_mirrors = |
| 1125 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 1094 GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| 1126 | 1095 |
| 1127 Object& entry = Object::Handle(); | 1096 Object& entry = Object::Handle(); |
| 1128 DictionaryIterator entries(library); | 1097 DictionaryIterator entries(library); |
| 1129 | 1098 |
| 1130 AbstractType& type = AbstractType::Handle(); | 1099 AbstractType& type = AbstractType::Handle(); |
| 1131 | 1100 |
| 1132 while (entries.HasNext()) { | 1101 while (entries.HasNext()) { |
| 1133 entry = entries.GetNext(); | 1102 entry = entries.GetNext(); |
| 1134 if (entry.IsClass()) { | 1103 if (entry.IsClass()) { |
| 1135 const Class& klass = Class::Cast(entry); | 1104 const Class& klass = Class::Cast(entry); |
| 1136 // We filter out mixin application classes and dynamic. | 1105 // We filter out mixin application classes and dynamic. |
| 1137 // TODO(12478): Should not need to filter out dynamic. | 1106 // TODO(12478): Should not need to filter out dynamic. |
| 1138 // Note that the VM does not consider mixin application aliases to be | 1107 // Note that the VM does not consider mixin application aliases to be |
| 1139 // mixin applications. | 1108 // mixin applications. |
| 1140 if (!klass.IsDynamicClass() && !klass.IsMixinApplication()) { | 1109 if (!klass.IsDynamicClass() && !klass.IsMixinApplication()) { |
| 1141 type = klass.DeclarationType(); | 1110 type = klass.DeclarationType(); |
| 1142 member_mirror = CreateClassMirror(klass, | 1111 member_mirror = CreateClassMirror(klass, type, |
| 1143 type, | |
| 1144 Bool::True(), // is_declaration | 1112 Bool::True(), // is_declaration |
| 1145 owner_mirror); | 1113 owner_mirror); |
| 1146 member_mirrors.Add(member_mirror); | 1114 member_mirrors.Add(member_mirror); |
| 1147 } | 1115 } |
| 1148 } else if (entry.IsField()) { | 1116 } else if (entry.IsField()) { |
| 1149 const Field& field = Field::Cast(entry); | 1117 const Field& field = Field::Cast(entry); |
| 1150 if (field.is_reflectable()) { | 1118 if (field.is_reflectable()) { |
| 1151 member_mirror = CreateVariableMirror(field, owner_mirror); | 1119 member_mirror = CreateVariableMirror(field, owner_mirror); |
| 1152 member_mirrors.Add(member_mirror); | 1120 member_mirrors.Add(member_mirror); |
| 1153 } | 1121 } |
| 1154 } else if (entry.IsFunction()) { | 1122 } else if (entry.IsFunction()) { |
| 1155 const Function& func = Function::Cast(entry); | 1123 const Function& func = Function::Cast(entry); |
| 1156 if (func.is_reflectable() && | 1124 if (func.is_reflectable() && |
| 1157 (func.kind() == RawFunction::kRegularFunction || | 1125 (func.kind() == RawFunction::kRegularFunction || |
| 1158 func.kind() == RawFunction::kGetterFunction || | 1126 func.kind() == RawFunction::kGetterFunction || |
| 1159 func.kind() == RawFunction::kSetterFunction)) { | 1127 func.kind() == RawFunction::kSetterFunction)) { |
| 1160 member_mirror = CreateMethodMirror(func, owner_mirror, | 1128 member_mirror = |
| 1161 AbstractType::Handle()); | 1129 CreateMethodMirror(func, owner_mirror, AbstractType::Handle()); |
| 1162 member_mirrors.Add(member_mirror); | 1130 member_mirrors.Add(member_mirror); |
| 1163 } | 1131 } |
| 1164 } | 1132 } |
| 1165 } | 1133 } |
| 1166 | 1134 |
| 1167 return member_mirrors.raw(); | 1135 return member_mirrors.raw(); |
| 1168 } | 1136 } |
| 1169 | 1137 |
| 1170 | 1138 |
| 1171 DEFINE_NATIVE_ENTRY(ClassMirror_type_variables, 1) { | 1139 DEFINE_NATIVE_ENTRY(ClassMirror_type_variables, 1) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1215 result.SetAt(i, type_mirror); | 1183 result.SetAt(i, type_mirror); |
| 1216 } | 1184 } |
| 1217 return result.raw(); | 1185 return result.raw(); |
| 1218 } | 1186 } |
| 1219 | 1187 |
| 1220 | 1188 |
| 1221 DEFINE_NATIVE_ENTRY(TypeVariableMirror_owner, 1) { | 1189 DEFINE_NATIVE_ENTRY(TypeVariableMirror_owner, 1) { |
| 1222 GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0)); | 1190 GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0)); |
| 1223 const Class& owner = Class::Handle(param.parameterized_class()); | 1191 const Class& owner = Class::Handle(param.parameterized_class()); |
| 1224 const AbstractType& type = AbstractType::Handle(owner.DeclarationType()); | 1192 const AbstractType& type = AbstractType::Handle(owner.DeclarationType()); |
| 1225 return CreateClassMirror(owner, | 1193 return CreateClassMirror(owner, type, |
| 1226 type, | |
| 1227 Bool::True(), // is_declaration | 1194 Bool::True(), // is_declaration |
| 1228 Instance::null_instance()); | 1195 Instance::null_instance()); |
| 1229 } | 1196 } |
| 1230 | 1197 |
| 1231 | 1198 |
| 1232 DEFINE_NATIVE_ENTRY(TypeVariableMirror_upper_bound, 1) { | 1199 DEFINE_NATIVE_ENTRY(TypeVariableMirror_upper_bound, 1) { |
| 1233 GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0)); | 1200 GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0)); |
| 1234 return param.bound(); | 1201 return param.bound(); |
| 1235 } | 1202 } |
| 1236 | 1203 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1252 for (int i = 0; i < num_libraries; i++) { | 1219 for (int i = 0; i < num_libraries; i++) { |
| 1253 each_library ^= libraries.At(i); | 1220 each_library ^= libraries.At(i); |
| 1254 library_key = each_library.private_key(); | 1221 library_key = each_library.private_key(); |
| 1255 if (library_key.Equals(private_key)) { | 1222 if (library_key.Equals(private_key)) { |
| 1256 ctxt_library = each_library.raw(); | 1223 ctxt_library = each_library.raw(); |
| 1257 break; | 1224 break; |
| 1258 } | 1225 } |
| 1259 } | 1226 } |
| 1260 } | 1227 } |
| 1261 ASSERT(!ctxt_library.IsNull()); | 1228 ASSERT(!ctxt_library.IsNull()); |
| 1262 const Object& result = | 1229 const Object& result = Object::Handle(ctxt_library.Evaluate( |
| 1263 Object::Handle(ctxt_library.Evaluate(expression, | 1230 expression, Array::empty_array(), Array::empty_array())); |
| 1264 Array::empty_array(), | |
| 1265 Array::empty_array())); | |
| 1266 if (result.IsError()) { | 1231 if (result.IsError()) { |
| 1267 Exceptions::PropagateError(Error::Cast(result)); | 1232 Exceptions::PropagateError(Error::Cast(result)); |
| 1268 UNREACHABLE(); | 1233 UNREACHABLE(); |
| 1269 } | 1234 } |
| 1270 | 1235 |
| 1271 // Because we currently only use this native for building field extractors and | 1236 // Because we currently only use this native for building field extractors and |
| 1272 // setters, assume the result is a closure and mark its function as invisible, | 1237 // setters, assume the result is a closure and mark its function as invisible, |
| 1273 // so it will not appear in stack traces. Whenever we support | 1238 // so it will not appear in stack traces. Whenever we support |
| 1274 // ObjectMirror.evaluate this will need to be separated. | 1239 // ObjectMirror.evaluate this will need to be separated. |
| 1275 ASSERT(result.IsClosure()); | 1240 ASSERT(result.IsClosure()); |
| 1276 const Function& func = Function::Handle(Closure::Cast(result).function()); | 1241 const Function& func = Function::Handle(Closure::Cast(result).function()); |
| 1277 func.set_is_visible(false); | 1242 func.set_is_visible(false); |
| 1278 func.set_is_debuggable(false); | 1243 func.set_is_debuggable(false); |
| 1279 | 1244 |
| 1280 return result.raw(); | 1245 return result.raw(); |
| 1281 } | 1246 } |
| 1282 | 1247 |
| 1283 DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) { | 1248 DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) { |
| 1284 GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0)); | 1249 GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0)); |
| 1285 ASSERT(type.IsFunctionType()); | 1250 ASSERT(type.IsFunctionType()); |
| 1286 const Class& cls = Class::Handle(type.type_class()); | 1251 const Class& cls = Class::Handle(type.type_class()); |
| 1287 ASSERT(cls.IsTypedefClass()); | 1252 ASSERT(cls.IsTypedefClass()); |
| 1288 return CreateTypedefMirror(cls, | 1253 return CreateTypedefMirror(cls, AbstractType::Handle(cls.DeclarationType()), |
| 1289 AbstractType::Handle(cls.DeclarationType()), | |
| 1290 Bool::True(), // is_declaration | 1254 Bool::True(), // is_declaration |
| 1291 Object::null_instance()); | 1255 Object::null_instance()); |
| 1292 } | 1256 } |
| 1293 | 1257 |
| 1294 DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) { | 1258 DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) { |
| 1295 // Argument 0 is the mirror, which is unused by the native. It exists | 1259 // Argument 0 is the mirror, which is unused by the native. It exists |
| 1296 // because this native is an instance method in order to be polymorphic | 1260 // because this native is an instance method in order to be polymorphic |
| 1297 // with its cousins. | 1261 // with its cousins. |
| 1298 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); | 1262 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); |
| 1299 GET_NON_NULL_NATIVE_ARGUMENT( | 1263 GET_NON_NULL_NATIVE_ARGUMENT(String, function_name, |
| 1300 String, function_name, arguments->NativeArgAt(2)); | 1264 arguments->NativeArgAt(2)); |
| 1301 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); | 1265 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); |
| 1302 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); | 1266 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); |
| 1303 | 1267 |
| 1304 Class& klass = Class::Handle(reflectee.clazz()); | 1268 Class& klass = Class::Handle(reflectee.clazz()); |
| 1305 Function& function = Function::Handle(zone, | 1269 Function& function = Function::Handle( |
| 1306 Resolver::ResolveDynamicAnyArgs(zone, klass, function_name)); | 1270 zone, Resolver::ResolveDynamicAnyArgs(zone, klass, function_name)); |
| 1307 | 1271 |
| 1308 const Array& args_descriptor = | 1272 const Array& args_descriptor = |
| 1309 Array::Handle(zone, ArgumentsDescriptor::New(args.Length(), arg_names)); | 1273 Array::Handle(zone, ArgumentsDescriptor::New(args.Length(), arg_names)); |
| 1310 | 1274 |
| 1311 if (function.IsNull()) { | 1275 if (function.IsNull()) { |
| 1312 // Didn't find a method: try to find a getter and invoke call on its result. | 1276 // Didn't find a method: try to find a getter and invoke call on its result. |
| 1313 const String& getter_name = | 1277 const String& getter_name = |
| 1314 String::Handle(zone, Field::GetterName(function_name)); | 1278 String::Handle(zone, Field::GetterName(function_name)); |
| 1315 function = Resolver::ResolveDynamicAnyArgs(zone, klass, getter_name); | 1279 function = Resolver::ResolveDynamicAnyArgs(zone, klass, getter_name); |
| 1316 if (!function.IsNull()) { | 1280 if (!function.IsNull()) { |
| 1317 ASSERT(function.kind() != RawFunction::kMethodExtractor); | 1281 ASSERT(function.kind() != RawFunction::kMethodExtractor); |
| 1318 // Invoke the getter. | 1282 // Invoke the getter. |
| 1319 const int kNumArgs = 1; | 1283 const int kNumArgs = 1; |
| 1320 const Array& getter_args = Array::Handle(zone, Array::New(kNumArgs)); | 1284 const Array& getter_args = Array::Handle(zone, Array::New(kNumArgs)); |
| 1321 getter_args.SetAt(0, reflectee); | 1285 getter_args.SetAt(0, reflectee); |
| 1322 const Array& getter_args_descriptor = | 1286 const Array& getter_args_descriptor = |
| 1323 Array::Handle(zone, ArgumentsDescriptor::New(getter_args.Length())); | 1287 Array::Handle(zone, ArgumentsDescriptor::New(getter_args.Length())); |
| 1324 const Instance& getter_result = Instance::Handle(zone, | 1288 const Instance& getter_result = Instance::Handle( |
| 1325 InvokeDynamicFunction(reflectee, | 1289 zone, InvokeDynamicFunction(reflectee, function, getter_name, |
| 1326 function, | 1290 getter_args, getter_args_descriptor)); |
| 1327 getter_name, | |
| 1328 getter_args, | |
| 1329 getter_args_descriptor)); | |
| 1330 // Replace the closure as the receiver in the arguments list. | 1291 // Replace the closure as the receiver in the arguments list. |
| 1331 args.SetAt(0, getter_result); | 1292 args.SetAt(0, getter_result); |
| 1332 // Call the closure. | 1293 // Call the closure. |
| 1333 const Object& call_result = | 1294 const Object& call_result = |
| 1334 Object::Handle(zone, DartEntry::InvokeClosure(args, args_descriptor)); | 1295 Object::Handle(zone, DartEntry::InvokeClosure(args, args_descriptor)); |
| 1335 if (call_result.IsError()) { | 1296 if (call_result.IsError()) { |
| 1336 Exceptions::PropagateError(Error::Cast(call_result)); | 1297 Exceptions::PropagateError(Error::Cast(call_result)); |
| 1337 UNREACHABLE(); | 1298 UNREACHABLE(); |
| 1338 } | 1299 } |
| 1339 return call_result.raw(); | 1300 return call_result.raw(); |
| 1340 } | 1301 } |
| 1341 } | 1302 } |
| 1342 | 1303 |
| 1343 // Found an ordinary method. | 1304 // Found an ordinary method. |
| 1344 return InvokeDynamicFunction(reflectee, | 1305 return InvokeDynamicFunction(reflectee, function, function_name, args, |
| 1345 function, | |
| 1346 function_name, | |
| 1347 args, | |
| 1348 args_descriptor); | 1306 args_descriptor); |
| 1349 } | 1307 } |
| 1350 | 1308 |
| 1351 | 1309 |
| 1352 DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) { | 1310 DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) { |
| 1353 // Argument 0 is the mirror, which is unused by the native. It exists | 1311 // Argument 0 is the mirror, which is unused by the native. It exists |
| 1354 // because this native is an instance method in order to be polymorphic | 1312 // because this native is an instance method in order to be polymorphic |
| 1355 // with its cousins. | 1313 // with its cousins. |
| 1356 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); | 1314 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); |
| 1357 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2)); | 1315 GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2)); |
| 1358 Class& klass = Class::Handle(reflectee.clazz()); | 1316 Class& klass = Class::Handle(reflectee.clazz()); |
| 1359 | 1317 |
| 1360 const String& internal_getter_name = String::Handle( | 1318 const String& internal_getter_name = |
| 1361 Field::GetterName(getter_name)); | 1319 String::Handle(Field::GetterName(getter_name)); |
| 1362 Function& function = Function::Handle(zone, | 1320 Function& function = Function::Handle( |
| 1363 Resolver::ResolveDynamicAnyArgs(zone, klass, internal_getter_name)); | 1321 zone, Resolver::ResolveDynamicAnyArgs(zone, klass, internal_getter_name)); |
| 1364 | 1322 |
| 1365 // Check for method extraction when method extractors are not created. | 1323 // Check for method extraction when method extractors are not created. |
| 1366 if (function.IsNull() && !FLAG_lazy_dispatchers) { | 1324 if (function.IsNull() && !FLAG_lazy_dispatchers) { |
| 1367 function = Resolver::ResolveDynamicAnyArgs(zone, klass, getter_name); | 1325 function = Resolver::ResolveDynamicAnyArgs(zone, klass, getter_name); |
| 1368 if (!function.IsNull()) { | 1326 if (!function.IsNull()) { |
| 1369 const Function& closure_function = | 1327 const Function& closure_function = |
| 1370 Function::Handle(zone, function.ImplicitClosureFunction()); | 1328 Function::Handle(zone, function.ImplicitClosureFunction()); |
| 1371 return closure_function.ImplicitInstanceClosure(reflectee); | 1329 return closure_function.ImplicitInstanceClosure(reflectee); |
| 1372 } | 1330 } |
| 1373 } | 1331 } |
| 1374 | 1332 |
| 1375 const int kNumArgs = 1; | 1333 const int kNumArgs = 1; |
| 1376 const Array& args = Array::Handle(zone, Array::New(kNumArgs)); | 1334 const Array& args = Array::Handle(zone, Array::New(kNumArgs)); |
| 1377 args.SetAt(0, reflectee); | 1335 args.SetAt(0, reflectee); |
| 1378 const Array& args_descriptor = | 1336 const Array& args_descriptor = |
| 1379 Array::Handle(zone, ArgumentsDescriptor::New(args.Length())); | 1337 Array::Handle(zone, ArgumentsDescriptor::New(args.Length())); |
| 1380 | 1338 |
| 1381 // InvokeDynamic invokes NoSuchMethod if the provided function is null. | 1339 // InvokeDynamic invokes NoSuchMethod if the provided function is null. |
| 1382 return InvokeDynamicFunction(reflectee, | 1340 return InvokeDynamicFunction(reflectee, function, internal_getter_name, args, |
| 1383 function, | |
| 1384 internal_getter_name, | |
| 1385 args, | |
| 1386 args_descriptor); | 1341 args_descriptor); |
| 1387 } | 1342 } |
| 1388 | 1343 |
| 1389 | 1344 |
| 1390 DEFINE_NATIVE_ENTRY(InstanceMirror_invokeSetter, 4) { | 1345 DEFINE_NATIVE_ENTRY(InstanceMirror_invokeSetter, 4) { |
| 1391 // Argument 0 is the mirror, which is unused by the native. It exists | 1346 // Argument 0 is the mirror, which is unused by the native. It exists |
| 1392 // because this native is an instance method in order to be polymorphic | 1347 // because this native is an instance method in order to be polymorphic |
| 1393 // with its cousins. | 1348 // with its cousins. |
| 1394 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); | 1349 GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); |
| 1395 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); | 1350 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); |
| 1396 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); | 1351 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); |
| 1397 | 1352 |
| 1398 const Class& klass = Class::Handle(zone, reflectee.clazz()); | 1353 const Class& klass = Class::Handle(zone, reflectee.clazz()); |
| 1399 const String& internal_setter_name = | 1354 const String& internal_setter_name = |
| 1400 String::Handle(zone, Field::SetterName(setter_name)); | 1355 String::Handle(zone, Field::SetterName(setter_name)); |
| 1401 const Function& setter = Function::Handle(zone, | 1356 const Function& setter = Function::Handle( |
| 1402 Resolver::ResolveDynamicAnyArgs(zone, klass, internal_setter_name)); | 1357 zone, Resolver::ResolveDynamicAnyArgs(zone, klass, internal_setter_name)); |
| 1403 | 1358 |
| 1404 const int kNumArgs = 2; | 1359 const int kNumArgs = 2; |
| 1405 const Array& args = Array::Handle(zone, Array::New(kNumArgs)); | 1360 const Array& args = Array::Handle(zone, Array::New(kNumArgs)); |
| 1406 args.SetAt(0, reflectee); | 1361 args.SetAt(0, reflectee); |
| 1407 args.SetAt(1, value); | 1362 args.SetAt(1, value); |
| 1408 const Array& args_descriptor = | 1363 const Array& args_descriptor = |
| 1409 Array::Handle(zone, ArgumentsDescriptor::New(args.Length())); | 1364 Array::Handle(zone, ArgumentsDescriptor::New(args.Length())); |
| 1410 | 1365 |
| 1411 return InvokeDynamicFunction(reflectee, | 1366 return InvokeDynamicFunction(reflectee, setter, internal_setter_name, args, |
| 1412 setter, | |
| 1413 internal_setter_name, | |
| 1414 args, | |
| 1415 args_descriptor); | 1367 args_descriptor); |
| 1416 } | 1368 } |
| 1417 | 1369 |
| 1418 | 1370 |
| 1419 DEFINE_NATIVE_ENTRY(InstanceMirror_computeType, 1) { | 1371 DEFINE_NATIVE_ENTRY(InstanceMirror_computeType, 1) { |
| 1420 GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); | 1372 GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); |
| 1421 const AbstractType& type = AbstractType::Handle(instance.GetType()); | 1373 const AbstractType& type = AbstractType::Handle(instance.GetType()); |
| 1422 // The static type of null is specified to be the bottom type, however, the | 1374 // The static type of null is specified to be the bottom type, however, the |
| 1423 // runtime type of null is the Null type, which we correctly return here. | 1375 // runtime type of null is the Null type, which we correctly return here. |
| 1424 return type.Canonicalize(); | 1376 return type.Canonicalize(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1442 | 1394 |
| 1443 Type& instantiator = Type::Handle(); | 1395 Type& instantiator = Type::Handle(); |
| 1444 if (closure.IsClosure()) { | 1396 if (closure.IsClosure()) { |
| 1445 const TypeArguments& arguments = | 1397 const TypeArguments& arguments = |
| 1446 TypeArguments::Handle(closure.GetTypeArguments()); | 1398 TypeArguments::Handle(closure.GetTypeArguments()); |
| 1447 const Class& cls = | 1399 const Class& cls = |
| 1448 Class::Handle(Isolate::Current()->object_store()->object_class()); | 1400 Class::Handle(Isolate::Current()->object_store()->object_class()); |
| 1449 instantiator = Type::New(cls, arguments, TokenPosition::kNoSource); | 1401 instantiator = Type::New(cls, arguments, TokenPosition::kNoSource); |
| 1450 instantiator.SetIsFinalized(); | 1402 instantiator.SetIsFinalized(); |
| 1451 } | 1403 } |
| 1452 return CreateMethodMirror(function, | 1404 return CreateMethodMirror(function, Instance::null_instance(), |
| 1453 Instance::null_instance(), | |
| 1454 instantiator); | 1405 instantiator); |
| 1455 } | 1406 } |
| 1456 return Instance::null(); | 1407 return Instance::null(); |
| 1457 } | 1408 } |
| 1458 | 1409 |
| 1459 | 1410 |
| 1460 DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 5) { | 1411 DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 5) { |
| 1461 // Argument 0 is the mirror, which is unused by the native. It exists | 1412 // Argument 0 is the mirror, which is unused by the native. It exists |
| 1462 // because this native is an instance method in order to be polymorphic | 1413 // because this native is an instance method in order to be polymorphic |
| 1463 // with its cousins. | 1414 // with its cousins. |
| 1464 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 1415 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 1465 const Class& klass = Class::Handle(ref.GetClassReferent()); | 1416 const Class& klass = Class::Handle(ref.GetClassReferent()); |
| 1466 GET_NON_NULL_NATIVE_ARGUMENT( | 1417 GET_NON_NULL_NATIVE_ARGUMENT(String, function_name, |
| 1467 String, function_name, arguments->NativeArgAt(2)); | 1418 arguments->NativeArgAt(2)); |
| 1468 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); | 1419 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); |
| 1469 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); | 1420 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); |
| 1470 | 1421 |
| 1471 const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread)); | 1422 const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread)); |
| 1472 if (!error.IsNull()) { | 1423 if (!error.IsNull()) { |
| 1473 Exceptions::PropagateError(error); | 1424 Exceptions::PropagateError(error); |
| 1474 UNREACHABLE(); | 1425 UNREACHABLE(); |
| 1475 } | 1426 } |
| 1476 | 1427 |
| 1477 Function& function = Function::Handle( | 1428 Function& function = |
| 1478 klass.LookupStaticFunction(function_name)); | 1429 Function::Handle(klass.LookupStaticFunction(function_name)); |
| 1479 | 1430 |
| 1480 if (function.IsNull()) { | 1431 if (function.IsNull()) { |
| 1481 // Didn't find a method: try to find a getter and invoke call on its result. | 1432 // Didn't find a method: try to find a getter and invoke call on its result. |
| 1482 const String& getter_name = | 1433 const String& getter_name = |
| 1483 String::Handle(Field::GetterName(function_name)); | 1434 String::Handle(Field::GetterName(function_name)); |
| 1484 function = klass.LookupStaticFunction(getter_name); | 1435 function = klass.LookupStaticFunction(getter_name); |
| 1485 if (!function.IsNull()) { | 1436 if (!function.IsNull()) { |
| 1486 // Invoke the getter. | 1437 // Invoke the getter. |
| 1487 const Object& getter_result = Object::Handle( | 1438 const Object& getter_result = Object::Handle( |
| 1488 DartEntry::InvokeFunction(function, Object::empty_array())); | 1439 DartEntry::InvokeFunction(function, Object::empty_array())); |
| 1489 if (getter_result.IsError()) { | 1440 if (getter_result.IsError()) { |
| 1490 Exceptions::PropagateError(Error::Cast(getter_result)); | 1441 Exceptions::PropagateError(Error::Cast(getter_result)); |
| 1491 UNREACHABLE(); | 1442 UNREACHABLE(); |
| 1492 } | 1443 } |
| 1493 // Make room for the closure (receiver) in the argument list. | 1444 // Make room for the closure (receiver) in the argument list. |
| 1494 intptr_t numArgs = args.Length(); | 1445 intptr_t numArgs = args.Length(); |
| 1495 const Array& call_args = Array::Handle(Array::New(numArgs + 1)); | 1446 const Array& call_args = Array::Handle(Array::New(numArgs + 1)); |
| 1496 Object& temp = Object::Handle(); | 1447 Object& temp = Object::Handle(); |
| 1497 for (int i = 0; i < numArgs; i++) { | 1448 for (int i = 0; i < numArgs; i++) { |
| 1498 temp = args.At(i); | 1449 temp = args.At(i); |
| 1499 call_args.SetAt(i + 1, temp); | 1450 call_args.SetAt(i + 1, temp); |
| 1500 } | 1451 } |
| 1501 call_args.SetAt(0, getter_result); | 1452 call_args.SetAt(0, getter_result); |
| 1502 const Array& call_args_descriptor_array = | 1453 const Array& call_args_descriptor_array = Array::Handle( |
| 1503 Array::Handle(ArgumentsDescriptor::New(call_args.Length(), arg_names)); | 1454 ArgumentsDescriptor::New(call_args.Length(), arg_names)); |
| 1504 // Call the closure. | 1455 // Call the closure. |
| 1505 const Object& call_result = Object::Handle( | 1456 const Object& call_result = Object::Handle( |
| 1506 DartEntry::InvokeClosure(call_args, call_args_descriptor_array)); | 1457 DartEntry::InvokeClosure(call_args, call_args_descriptor_array)); |
| 1507 if (call_result.IsError()) { | 1458 if (call_result.IsError()) { |
| 1508 Exceptions::PropagateError(Error::Cast(call_result)); | 1459 Exceptions::PropagateError(Error::Cast(call_result)); |
| 1509 UNREACHABLE(); | 1460 UNREACHABLE(); |
| 1510 } | 1461 } |
| 1511 return call_result.raw(); | 1462 return call_result.raw(); |
| 1512 } | 1463 } |
| 1513 } | 1464 } |
| 1514 | 1465 |
| 1515 const Array& args_descriptor_array = | 1466 const Array& args_descriptor_array = |
| 1516 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); | 1467 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); |
| 1517 | 1468 |
| 1518 ArgumentsDescriptor args_descriptor(args_descriptor_array); | 1469 ArgumentsDescriptor args_descriptor(args_descriptor_array); |
| 1519 | 1470 |
| 1520 if (function.IsNull() || | 1471 if (function.IsNull() || !function.AreValidArguments(args_descriptor, NULL) || |
| 1521 !function.AreValidArguments(args_descriptor, NULL) || | |
| 1522 !function.is_reflectable()) { | 1472 !function.is_reflectable()) { |
| 1523 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), | 1473 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), function_name, |
| 1524 function_name, | 1474 function, args, arg_names, InvocationMirror::kStatic, |
| 1525 function, | |
| 1526 args, | |
| 1527 arg_names, | |
| 1528 InvocationMirror::kStatic, | |
| 1529 InvocationMirror::kMethod); | 1475 InvocationMirror::kMethod); |
| 1530 UNREACHABLE(); | 1476 UNREACHABLE(); |
| 1531 } | 1477 } |
| 1532 | 1478 |
| 1533 Object& result = Object::Handle( | 1479 Object& result = Object::Handle( |
| 1534 DartEntry::InvokeFunction(function, args, args_descriptor_array)); | 1480 DartEntry::InvokeFunction(function, args, args_descriptor_array)); |
| 1535 if (result.IsError()) { | 1481 if (result.IsError()) { |
| 1536 Exceptions::PropagateError(Error::Cast(result)); | 1482 Exceptions::PropagateError(Error::Cast(result)); |
| 1537 UNREACHABLE(); | 1483 UNREACHABLE(); |
| 1538 } | 1484 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1565 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); | 1511 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); |
| 1566 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); | 1512 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); |
| 1567 | 1513 |
| 1568 const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread)); | 1514 const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread)); |
| 1569 if (!error.IsNull()) { | 1515 if (!error.IsNull()) { |
| 1570 Exceptions::PropagateError(error); | 1516 Exceptions::PropagateError(error); |
| 1571 UNREACHABLE(); | 1517 UNREACHABLE(); |
| 1572 } | 1518 } |
| 1573 | 1519 |
| 1574 // Check for real fields and user-defined setters. | 1520 // Check for real fields and user-defined setters. |
| 1575 const Field& field = | 1521 const Field& field = Field::Handle(klass.LookupStaticField(setter_name)); |
| 1576 Field::Handle(klass.LookupStaticField(setter_name)); | |
| 1577 Function& setter = Function::Handle(); | 1522 Function& setter = Function::Handle(); |
| 1578 const String& internal_setter_name = String::Handle( | 1523 const String& internal_setter_name = |
| 1579 Field::SetterName(setter_name)); | 1524 String::Handle(Field::SetterName(setter_name)); |
| 1580 | 1525 |
| 1581 if (field.IsNull()) { | 1526 if (field.IsNull()) { |
| 1582 setter = klass.LookupStaticFunction(internal_setter_name); | 1527 setter = klass.LookupStaticFunction(internal_setter_name); |
| 1583 | 1528 |
| 1584 const int kNumArgs = 1; | 1529 const int kNumArgs = 1; |
| 1585 const Array& args = Array::Handle(Array::New(kNumArgs)); | 1530 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 1586 args.SetAt(0, value); | 1531 args.SetAt(0, value); |
| 1587 | 1532 |
| 1588 if (setter.IsNull() || !setter.is_reflectable()) { | 1533 if (setter.IsNull() || !setter.is_reflectable()) { |
| 1589 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), | 1534 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), |
| 1590 internal_setter_name, | 1535 internal_setter_name, setter, args, |
| 1591 setter, | 1536 Object::null_array(), InvocationMirror::kStatic, |
| 1592 args, | |
| 1593 Object::null_array(), | |
| 1594 InvocationMirror::kStatic, | |
| 1595 InvocationMirror::kSetter); | 1537 InvocationMirror::kSetter); |
| 1596 UNREACHABLE(); | 1538 UNREACHABLE(); |
| 1597 } | 1539 } |
| 1598 | 1540 |
| 1599 // Invoke the setter and return the result. | 1541 // Invoke the setter and return the result. |
| 1600 Object& result = Object::Handle( | 1542 Object& result = Object::Handle(DartEntry::InvokeFunction(setter, args)); |
| 1601 DartEntry::InvokeFunction(setter, args)); | |
| 1602 if (result.IsError()) { | 1543 if (result.IsError()) { |
| 1603 Exceptions::PropagateError(Error::Cast(result)); | 1544 Exceptions::PropagateError(Error::Cast(result)); |
| 1604 UNREACHABLE(); | 1545 UNREACHABLE(); |
| 1605 } | 1546 } |
| 1606 return result.raw(); | 1547 return result.raw(); |
| 1607 } | 1548 } |
| 1608 | 1549 |
| 1609 if (field.is_final() || !field.is_reflectable()) { | 1550 if (field.is_final() || !field.is_reflectable()) { |
| 1610 const int kNumArgs = 1; | 1551 const int kNumArgs = 1; |
| 1611 const Array& args = Array::Handle(Array::New(kNumArgs)); | 1552 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 1612 args.SetAt(0, value); | 1553 args.SetAt(0, value); |
| 1613 | 1554 |
| 1614 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), | 1555 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), |
| 1615 internal_setter_name, | 1556 internal_setter_name, setter, args, Object::null_array(), |
| 1616 setter, | 1557 InvocationMirror::kStatic, InvocationMirror::kSetter); |
| 1617 args, | |
| 1618 Object::null_array(), | |
| 1619 InvocationMirror::kStatic, | |
| 1620 InvocationMirror::kSetter); | |
| 1621 UNREACHABLE(); | 1558 UNREACHABLE(); |
| 1622 } | 1559 } |
| 1623 | 1560 |
| 1624 field.SetStaticValue(value); | 1561 field.SetStaticValue(value); |
| 1625 return value.raw(); | 1562 return value.raw(); |
| 1626 } | 1563 } |
| 1627 | 1564 |
| 1628 | 1565 |
| 1629 DEFINE_NATIVE_ENTRY(ClassMirror_invokeConstructor, 5) { | 1566 DEFINE_NATIVE_ENTRY(ClassMirror_invokeConstructor, 5) { |
| 1630 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1567 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1631 const Class& klass = Class::Handle(ref.GetClassReferent()); | 1568 const Class& klass = Class::Handle(ref.GetClassReferent()); |
| 1632 GET_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(1)); | 1569 GET_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(1)); |
| 1633 GET_NON_NULL_NATIVE_ARGUMENT( | 1570 GET_NON_NULL_NATIVE_ARGUMENT(String, constructor_name, |
| 1634 String, constructor_name, arguments->NativeArgAt(2)); | 1571 arguments->NativeArgAt(2)); |
| 1635 GET_NON_NULL_NATIVE_ARGUMENT(Array, explicit_args, arguments->NativeArgAt(3)); | 1572 GET_NON_NULL_NATIVE_ARGUMENT(Array, explicit_args, arguments->NativeArgAt(3)); |
| 1636 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); | 1573 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); |
| 1637 | 1574 |
| 1638 const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread)); | 1575 const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread)); |
| 1639 if (!error.IsNull()) { | 1576 if (!error.IsNull()) { |
| 1640 Exceptions::PropagateError(error); | 1577 Exceptions::PropagateError(error); |
| 1641 UNREACHABLE(); | 1578 UNREACHABLE(); |
| 1642 } | 1579 } |
| 1643 | 1580 |
| 1644 // By convention, the static function implementing a named constructor 'C' | 1581 // By convention, the static function implementing a named constructor 'C' |
| 1645 // for class 'A' is labeled 'A.C', and the static function implementing the | 1582 // for class 'A' is labeled 'A.C', and the static function implementing the |
| 1646 // unnamed constructor for class 'A' is labeled 'A.'. | 1583 // unnamed constructor for class 'A' is labeled 'A.'. |
| 1647 // This convention prevents users from explicitly calling constructors. | 1584 // This convention prevents users from explicitly calling constructors. |
| 1648 const String& klass_name = String::Handle(klass.Name()); | 1585 const String& klass_name = String::Handle(klass.Name()); |
| 1649 String& external_constructor_name = String::Handle(klass_name.raw()); | 1586 String& external_constructor_name = String::Handle(klass_name.raw()); |
| 1650 String& internal_constructor_name = | 1587 String& internal_constructor_name = |
| 1651 String::Handle(String::Concat(klass_name, Symbols::Dot())); | 1588 String::Handle(String::Concat(klass_name, Symbols::Dot())); |
| 1652 if (!constructor_name.IsNull() && constructor_name.Length() > 0) { | 1589 if (!constructor_name.IsNull() && constructor_name.Length() > 0) { |
| 1653 internal_constructor_name = | 1590 internal_constructor_name = |
| 1654 String::Concat(internal_constructor_name, constructor_name); | 1591 String::Concat(internal_constructor_name, constructor_name); |
| 1655 external_constructor_name = internal_constructor_name.raw(); | 1592 external_constructor_name = internal_constructor_name.raw(); |
| 1656 } | 1593 } |
| 1657 | 1594 |
| 1658 Function& lookup_constructor = Function::Handle( | 1595 Function& lookup_constructor = |
| 1659 klass.LookupFunction(internal_constructor_name)); | 1596 Function::Handle(klass.LookupFunction(internal_constructor_name)); |
| 1660 | 1597 |
| 1661 if (lookup_constructor.IsNull() || | 1598 if (lookup_constructor.IsNull() || |
| 1662 (lookup_constructor.kind() != RawFunction::kConstructor) || | 1599 (lookup_constructor.kind() != RawFunction::kConstructor) || |
| 1663 !lookup_constructor.is_reflectable()) { | 1600 !lookup_constructor.is_reflectable()) { |
| 1664 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), | 1601 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), |
| 1665 external_constructor_name, | 1602 external_constructor_name, lookup_constructor, |
| 1666 lookup_constructor, | 1603 explicit_args, arg_names, InvocationMirror::kConstructor, |
| 1667 explicit_args, | |
| 1668 arg_names, | |
| 1669 InvocationMirror::kConstructor, | |
| 1670 InvocationMirror::kMethod); | 1604 InvocationMirror::kMethod); |
| 1671 UNREACHABLE(); | 1605 UNREACHABLE(); |
| 1672 } | 1606 } |
| 1673 | 1607 |
| 1674 if (klass.is_abstract() && !lookup_constructor.IsFactory()) { | 1608 if (klass.is_abstract() && !lookup_constructor.IsFactory()) { |
| 1675 const Array& error_args = Array::Handle(Array::New(3)); | 1609 const Array& error_args = Array::Handle(Array::New(3)); |
| 1676 error_args.SetAt(0, klass_name); | 1610 error_args.SetAt(0, klass_name); |
| 1677 // 1 = script url | 1611 // 1 = script url |
| 1678 // 2 = token position | 1612 // 2 = token position |
| 1679 Exceptions::ThrowByType(Exceptions::kAbstractClassInstantiation, | 1613 Exceptions::ThrowByType(Exceptions::kAbstractClassInstantiation, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1723 Array::Handle(Array::New(num_implicit_args + num_explicit_args)); | 1657 Array::Handle(Array::New(num_implicit_args + num_explicit_args)); |
| 1724 | 1658 |
| 1725 // Copy over the explicit arguments. | 1659 // Copy over the explicit arguments. |
| 1726 Object& explicit_argument = Object::Handle(); | 1660 Object& explicit_argument = Object::Handle(); |
| 1727 for (int i = 0; i < num_explicit_args; i++) { | 1661 for (int i = 0; i < num_explicit_args; i++) { |
| 1728 explicit_argument = explicit_args.At(i); | 1662 explicit_argument = explicit_args.At(i); |
| 1729 args.SetAt(i + num_implicit_args, explicit_argument); | 1663 args.SetAt(i + num_implicit_args, explicit_argument); |
| 1730 } | 1664 } |
| 1731 | 1665 |
| 1732 const Array& args_descriptor_array = | 1666 const Array& args_descriptor_array = |
| 1733 Array::Handle(ArgumentsDescriptor::New(args.Length(), | 1667 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); |
| 1734 arg_names)); | |
| 1735 | 1668 |
| 1736 ArgumentsDescriptor args_descriptor(args_descriptor_array); | 1669 ArgumentsDescriptor args_descriptor(args_descriptor_array); |
| 1737 if (!redirected_constructor.AreValidArguments(args_descriptor, NULL) || | 1670 if (!redirected_constructor.AreValidArguments(args_descriptor, NULL) || |
| 1738 !redirected_constructor.is_reflectable()) { | 1671 !redirected_constructor.is_reflectable()) { |
| 1739 external_constructor_name = redirected_constructor.name(); | 1672 external_constructor_name = redirected_constructor.name(); |
| 1740 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), | 1673 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), |
| 1741 external_constructor_name, | 1674 external_constructor_name, redirected_constructor, |
| 1742 redirected_constructor, | 1675 explicit_args, arg_names, InvocationMirror::kConstructor, |
| 1743 explicit_args, | |
| 1744 arg_names, | |
| 1745 InvocationMirror::kConstructor, | |
| 1746 InvocationMirror::kMethod); | 1676 InvocationMirror::kMethod); |
| 1747 UNREACHABLE(); | 1677 UNREACHABLE(); |
| 1748 } | 1678 } |
| 1749 | 1679 |
| 1750 Instance& new_object = Instance::Handle(); | 1680 Instance& new_object = Instance::Handle(); |
| 1751 if (redirected_constructor.IsGenerativeConstructor()) { | 1681 if (redirected_constructor.IsGenerativeConstructor()) { |
| 1752 // Constructors get the uninitialized object. | 1682 // Constructors get the uninitialized object. |
| 1753 // Note we have delayed allocation until after the function | 1683 // Note we have delayed allocation until after the function |
| 1754 // type and argument matching checks. | 1684 // type and argument matching checks. |
| 1755 new_object = Instance::New(redirected_klass); | 1685 new_object = Instance::New(redirected_klass); |
| 1756 if (!type_arguments.IsNull()) { | 1686 if (!type_arguments.IsNull()) { |
| 1757 // The type arguments will be null if the class has no type parameters, in | 1687 // The type arguments will be null if the class has no type parameters, in |
| 1758 // which case the following call would fail because there is no slot | 1688 // which case the following call would fail because there is no slot |
| 1759 // reserved in the object for the type vector. | 1689 // reserved in the object for the type vector. |
| 1760 new_object.SetTypeArguments(type_arguments); | 1690 new_object.SetTypeArguments(type_arguments); |
| 1761 } | 1691 } |
| 1762 args.SetAt(0, new_object); | 1692 args.SetAt(0, new_object); |
| 1763 } else { | 1693 } else { |
| 1764 // Factories get type arguments. | 1694 // Factories get type arguments. |
| 1765 args.SetAt(0, type_arguments); | 1695 args.SetAt(0, type_arguments); |
| 1766 } | 1696 } |
| 1767 | 1697 |
| 1768 // Invoke the constructor and return the new object. | 1698 // Invoke the constructor and return the new object. |
| 1769 const Object& result = | 1699 const Object& result = Object::Handle(DartEntry::InvokeFunction( |
| 1770 Object::Handle(DartEntry::InvokeFunction(redirected_constructor, | 1700 redirected_constructor, args, args_descriptor_array)); |
| 1771 args, | |
| 1772 args_descriptor_array)); | |
| 1773 if (result.IsError()) { | 1701 if (result.IsError()) { |
| 1774 Exceptions::PropagateError(Error::Cast(result)); | 1702 Exceptions::PropagateError(Error::Cast(result)); |
| 1775 UNREACHABLE(); | 1703 UNREACHABLE(); |
| 1776 } | 1704 } |
| 1777 | 1705 |
| 1778 // Factories may return null. | 1706 // Factories may return null. |
| 1779 ASSERT(result.IsInstance() || result.IsNull()); | 1707 ASSERT(result.IsInstance() || result.IsNull()); |
| 1780 | 1708 |
| 1781 if (redirected_constructor.IsGenerativeConstructor()) { | 1709 if (redirected_constructor.IsGenerativeConstructor()) { |
| 1782 return new_object.raw(); | 1710 return new_object.raw(); |
| 1783 } else { | 1711 } else { |
| 1784 return result.raw(); | 1712 return result.raw(); |
| 1785 } | 1713 } |
| 1786 } | 1714 } |
| 1787 | 1715 |
| 1788 | 1716 |
| 1789 DEFINE_NATIVE_ENTRY(LibraryMirror_invoke, 5) { | 1717 DEFINE_NATIVE_ENTRY(LibraryMirror_invoke, 5) { |
| 1790 // Argument 0 is the mirror, which is unused by the native. It exists | 1718 // Argument 0 is the mirror, which is unused by the native. It exists |
| 1791 // because this native is an instance method in order to be polymorphic | 1719 // because this native is an instance method in order to be polymorphic |
| 1792 // with its cousins. | 1720 // with its cousins. |
| 1793 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 1721 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 1794 const Library& library = Library::Handle(ref.GetLibraryReferent()); | 1722 const Library& library = Library::Handle(ref.GetLibraryReferent()); |
| 1795 GET_NON_NULL_NATIVE_ARGUMENT( | 1723 GET_NON_NULL_NATIVE_ARGUMENT(String, function_name, |
| 1796 String, function_name, arguments->NativeArgAt(2)); | 1724 arguments->NativeArgAt(2)); |
| 1797 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); | 1725 GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); |
| 1798 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); | 1726 GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); |
| 1799 | 1727 |
| 1800 Function& function = Function::Handle( | 1728 Function& function = |
| 1801 library.LookupLocalFunction(function_name)); | 1729 Function::Handle(library.LookupLocalFunction(function_name)); |
| 1802 | 1730 |
| 1803 if (function.IsNull()) { | 1731 if (function.IsNull()) { |
| 1804 // Didn't find a method: try to find a getter and invoke call on its result. | 1732 // Didn't find a method: try to find a getter and invoke call on its result. |
| 1805 const Instance& getter_result = | 1733 const Instance& getter_result = |
| 1806 Instance::Handle(InvokeLibraryGetter(library, function_name, false)); | 1734 Instance::Handle(InvokeLibraryGetter(library, function_name, false)); |
| 1807 if (getter_result.raw() != Object::sentinel().raw()) { | 1735 if (getter_result.raw() != Object::sentinel().raw()) { |
| 1808 // Make room for the closure (receiver) in arguments. | 1736 // Make room for the closure (receiver) in arguments. |
| 1809 intptr_t numArgs = args.Length(); | 1737 intptr_t numArgs = args.Length(); |
| 1810 const Array& call_args = Array::Handle(Array::New(numArgs + 1)); | 1738 const Array& call_args = Array::Handle(Array::New(numArgs + 1)); |
| 1811 Object& temp = Object::Handle(); | 1739 Object& temp = Object::Handle(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1824 UNREACHABLE(); | 1752 UNREACHABLE(); |
| 1825 } | 1753 } |
| 1826 return call_result.raw(); | 1754 return call_result.raw(); |
| 1827 } | 1755 } |
| 1828 } | 1756 } |
| 1829 | 1757 |
| 1830 const Array& args_descriptor_array = | 1758 const Array& args_descriptor_array = |
| 1831 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); | 1759 Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); |
| 1832 ArgumentsDescriptor args_descriptor(args_descriptor_array); | 1760 ArgumentsDescriptor args_descriptor(args_descriptor_array); |
| 1833 | 1761 |
| 1834 if (function.IsNull() || | 1762 if (function.IsNull() || !function.AreValidArguments(args_descriptor, NULL) || |
| 1835 !function.AreValidArguments(args_descriptor, NULL) || | |
| 1836 !function.is_reflectable()) { | 1763 !function.is_reflectable()) { |
| 1837 ThrowNoSuchMethod(Instance::null_instance(), | 1764 ThrowNoSuchMethod(Instance::null_instance(), function_name, function, args, |
| 1838 function_name, | 1765 arg_names, InvocationMirror::kTopLevel, |
| 1839 function, | |
| 1840 args, | |
| 1841 arg_names, | |
| 1842 InvocationMirror::kTopLevel, | |
| 1843 InvocationMirror::kMethod); | 1766 InvocationMirror::kMethod); |
| 1844 UNREACHABLE(); | 1767 UNREACHABLE(); |
| 1845 } | 1768 } |
| 1846 | 1769 |
| 1847 const Object& result = Object::Handle( | 1770 const Object& result = Object::Handle( |
| 1848 DartEntry::InvokeFunction(function, args, args_descriptor_array)); | 1771 DartEntry::InvokeFunction(function, args, args_descriptor_array)); |
| 1849 if (result.IsError()) { | 1772 if (result.IsError()) { |
| 1850 Exceptions::PropagateError(Error::Cast(result)); | 1773 Exceptions::PropagateError(Error::Cast(result)); |
| 1851 UNREACHABLE(); | 1774 UNREACHABLE(); |
| 1852 } | 1775 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1870 // because this native is an instance method in order to be polymorphic | 1793 // because this native is an instance method in order to be polymorphic |
| 1871 // with its cousins. | 1794 // with its cousins. |
| 1872 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 1795 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 1873 const Library& library = Library::Handle(ref.GetLibraryReferent()); | 1796 const Library& library = Library::Handle(ref.GetLibraryReferent()); |
| 1874 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); | 1797 GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2)); |
| 1875 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); | 1798 GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3)); |
| 1876 | 1799 |
| 1877 // To access a top-level we may need to use the Field or the | 1800 // To access a top-level we may need to use the Field or the |
| 1878 // setter Function. The setter function may either be in the | 1801 // setter Function. The setter function may either be in the |
| 1879 // library or in the field's owner class, depending. | 1802 // library or in the field's owner class, depending. |
| 1880 const Field& field = Field::Handle( | 1803 const Field& field = Field::Handle(library.LookupLocalField(setter_name)); |
| 1881 library.LookupLocalField(setter_name)); | |
| 1882 Function& setter = Function::Handle(); | 1804 Function& setter = Function::Handle(); |
| 1883 const String& internal_setter_name = | 1805 const String& internal_setter_name = |
| 1884 String::Handle(Field::SetterName(setter_name)); | 1806 String::Handle(Field::SetterName(setter_name)); |
| 1885 | 1807 |
| 1886 if (field.IsNull()) { | 1808 if (field.IsNull()) { |
| 1887 setter = library.LookupLocalFunction(internal_setter_name); | 1809 setter = library.LookupLocalFunction(internal_setter_name); |
| 1888 | 1810 |
| 1889 const int kNumArgs = 1; | 1811 const int kNumArgs = 1; |
| 1890 const Array& args = Array::Handle(Array::New(kNumArgs)); | 1812 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 1891 args.SetAt(0, value); | 1813 args.SetAt(0, value); |
| 1892 | 1814 |
| 1893 if (setter.IsNull() || !setter.is_reflectable()) { | 1815 if (setter.IsNull() || !setter.is_reflectable()) { |
| 1894 ThrowNoSuchMethod(Instance::null_instance(), | 1816 ThrowNoSuchMethod(Instance::null_instance(), internal_setter_name, setter, |
| 1895 internal_setter_name, | 1817 args, Object::null_array(), InvocationMirror::kTopLevel, |
| 1896 setter, | |
| 1897 args, | |
| 1898 Object::null_array(), | |
| 1899 InvocationMirror::kTopLevel, | |
| 1900 InvocationMirror::kSetter); | 1818 InvocationMirror::kSetter); |
| 1901 UNREACHABLE(); | 1819 UNREACHABLE(); |
| 1902 } | 1820 } |
| 1903 | 1821 |
| 1904 // Invoke the setter and return the result. | 1822 // Invoke the setter and return the result. |
| 1905 const Object& result = Object::Handle( | 1823 const Object& result = |
| 1906 DartEntry::InvokeFunction(setter, args)); | 1824 Object::Handle(DartEntry::InvokeFunction(setter, args)); |
| 1907 if (result.IsError()) { | 1825 if (result.IsError()) { |
| 1908 Exceptions::PropagateError(Error::Cast(result)); | 1826 Exceptions::PropagateError(Error::Cast(result)); |
| 1909 UNREACHABLE(); | 1827 UNREACHABLE(); |
| 1910 } | 1828 } |
| 1911 return result.raw(); | 1829 return result.raw(); |
| 1912 } | 1830 } |
| 1913 | 1831 |
| 1914 if (field.is_final() || !field.is_reflectable()) { | 1832 if (field.is_final() || !field.is_reflectable()) { |
| 1915 const int kNumArgs = 1; | 1833 const int kNumArgs = 1; |
| 1916 const Array& args = Array::Handle(Array::New(kNumArgs)); | 1834 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 1917 args.SetAt(0, value); | 1835 args.SetAt(0, value); |
| 1918 | 1836 |
| 1919 ThrowNoSuchMethod(Instance::null_instance(), | 1837 ThrowNoSuchMethod(Instance::null_instance(), internal_setter_name, setter, |
| 1920 internal_setter_name, | 1838 args, Object::null_array(), InvocationMirror::kTopLevel, |
| 1921 setter, | |
| 1922 args, | |
| 1923 Object::null_array(), | |
| 1924 InvocationMirror::kTopLevel, | |
| 1925 InvocationMirror::kSetter); | 1839 InvocationMirror::kSetter); |
| 1926 UNREACHABLE(); | 1840 UNREACHABLE(); |
| 1927 } | 1841 } |
| 1928 | 1842 |
| 1929 field.SetStaticValue(value); | 1843 field.SetStaticValue(value); |
| 1930 return value.raw(); | 1844 return value.raw(); |
| 1931 } | 1845 } |
| 1932 | 1846 |
| 1933 | 1847 |
| 1934 DEFINE_NATIVE_ENTRY(MethodMirror_owner, 2) { | 1848 DEFINE_NATIVE_ENTRY(MethodMirror_owner, 2) { |
| 1935 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1849 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1936 GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); | 1850 GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); |
| 1937 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1851 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| 1938 if (func.IsNonImplicitClosureFunction()) { | 1852 if (func.IsNonImplicitClosureFunction()) { |
| 1939 return CreateMethodMirror(Function::Handle( | 1853 return CreateMethodMirror(Function::Handle(func.parent_function()), |
| 1940 func.parent_function()), Object::null_instance(), instantiator); | 1854 Object::null_instance(), instantiator); |
| 1941 } | 1855 } |
| 1942 const Class& owner = Class::Handle(func.Owner()); | 1856 const Class& owner = Class::Handle(func.Owner()); |
| 1943 if (owner.IsTopLevel()) { | 1857 if (owner.IsTopLevel()) { |
| 1944 return CreateLibraryMirror(thread, Library::Handle(owner.library())); | 1858 return CreateLibraryMirror(thread, Library::Handle(owner.library())); |
| 1945 } | 1859 } |
| 1946 | 1860 |
| 1947 AbstractType& type = AbstractType::Handle(owner.DeclarationType()); | 1861 AbstractType& type = AbstractType::Handle(owner.DeclarationType()); |
| 1948 return CreateClassMirror(owner, type, Bool::True(), Object::null_instance()); | 1862 return CreateClassMirror(owner, type, Bool::True(), Object::null_instance()); |
| 1949 } | 1863 } |
| 1950 | 1864 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2005 const Function& func = Function::Cast(decl); | 1919 const Function& func = Function::Cast(decl); |
| 2006 if (func.IsImplicitConstructor() || func.IsSignatureFunction()) { | 1920 if (func.IsImplicitConstructor() || func.IsSignatureFunction()) { |
| 2007 // These are synthetic methods; they have no source. | 1921 // These are synthetic methods; they have no source. |
| 2008 return Instance::null(); | 1922 return Instance::null(); |
| 2009 } | 1923 } |
| 2010 script = func.script(); | 1924 script = func.script(); |
| 2011 token_pos = func.token_pos(); | 1925 token_pos = func.token_pos(); |
| 2012 } else if (decl.IsClass()) { | 1926 } else if (decl.IsClass()) { |
| 2013 const Class& cls = Class::Cast(decl); | 1927 const Class& cls = Class::Cast(decl); |
| 2014 const bool is_typedef = cls.IsTypedefClass(); | 1928 const bool is_typedef = cls.IsTypedefClass(); |
| 2015 if (cls.is_synthesized_class() && | 1929 if (cls.is_synthesized_class() && !is_typedef && |
| 2016 !is_typedef && | 1930 !cls.is_mixin_app_alias() && !cls.is_enum_class()) { |
| 2017 !cls.is_mixin_app_alias() && | |
| 2018 !cls.is_enum_class()) { | |
| 2019 return Instance::null(); // Synthetic. | 1931 return Instance::null(); // Synthetic. |
| 2020 } | 1932 } |
| 2021 script = cls.script(); | 1933 script = cls.script(); |
| 2022 token_pos = cls.token_pos(); | 1934 token_pos = cls.token_pos(); |
| 2023 } else if (decl.IsField()) { | 1935 } else if (decl.IsField()) { |
| 2024 const Field& field = Field::Cast(decl); | 1936 const Field& field = Field::Cast(decl); |
| 2025 script = field.Script(); | 1937 script = field.Script(); |
| 2026 token_pos = field.token_pos(); | 1938 token_pos = field.token_pos(); |
| 2027 } else if (decl.IsTypeParameter()) { | 1939 } else if (decl.IsTypeParameter()) { |
| 2028 const TypeParameter& type_var = TypeParameter::Cast(decl); | 1940 const TypeParameter& type_var = TypeParameter::Cast(decl); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2105 | 2017 |
| 2106 DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 2) { | 2018 DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 2) { |
| 2107 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); | 2019 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); |
| 2108 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); | 2020 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); |
| 2109 return Bool::Get(a.IsSubtypeOf(b, NULL, NULL, Heap::kNew)).raw(); | 2021 return Bool::Get(a.IsSubtypeOf(b, NULL, NULL, Heap::kNew)).raw(); |
| 2110 } | 2022 } |
| 2111 | 2023 |
| 2112 #endif // !PRODUCT | 2024 #endif // !PRODUCT |
| 2113 | 2025 |
| 2114 } // namespace dart | 2026 } // namespace dart |
| OLD | NEW |