| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "lib/invocation_mirror.h" | 5 #include "lib/invocation_mirror.h" |
| 6 #include "vm/bootstrap_natives.h" | 6 #include "vm/bootstrap_natives.h" |
| 7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
| 8 #include "vm/compiler.h" | 8 #include "vm/compiler.h" |
| 9 #include "vm/dart_entry.h" | 9 #include "vm/dart_entry.h" |
| 10 #include "vm/exceptions.h" | 10 #include "vm/exceptions.h" |
| 11 #include "vm/object_store.h" | 11 #include "vm/object_store.h" |
| 12 #include "vm/parser.h" | 12 #include "vm/parser.h" |
| 13 #include "vm/port.h" | 13 #include "vm/port.h" |
| 14 #include "vm/resolver.h" | 14 #include "vm/resolver.h" |
| 15 #include "vm/symbols.h" | 15 #include "vm/symbols.h" |
| 16 | 16 |
| 17 namespace dart { | 17 namespace dart { |
| 18 | 18 |
| 19 DEFINE_FLAG(bool, use_mirrored_compilation_error, false, | 19 DEFINE_FLAG(bool, use_mirrored_compilation_error, false, |
| 20 "Wrap compilation errors that occur during reflective access in a " | 20 "Wrap compilation errors that occur during reflective access in a " |
| 21 "MirroredCompilationError, rather than suspending the isolate."); | 21 "MirroredCompilationError, rather than suspending the isolate."); |
| 22 | 22 |
| 23 DEFINE_FLAG(bool, support_find_in_context, false, |
| 24 "Experimental support for ClosureMirror.findInContext."); |
| 25 |
| 23 static RawInstance* CreateMirror(const String& mirror_class_name, | 26 static RawInstance* CreateMirror(const String& mirror_class_name, |
| 24 const Array& constructor_arguments) { | 27 const Array& constructor_arguments) { |
| 25 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary()); | 28 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary()); |
| 26 const String& constructor_name = Symbols::Dot(); | 29 const String& constructor_name = Symbols::Dot(); |
| 27 | 30 |
| 28 const Object& result = Object::Handle( | 31 const Object& result = Object::Handle( |
| 29 DartLibraryCalls::InstanceCreate(mirrors_lib, | 32 DartLibraryCalls::InstanceCreate(mirrors_lib, |
| 30 mirror_class_name, | 33 mirror_class_name, |
| 31 constructor_name, | 34 constructor_name, |
| 32 constructor_arguments)); | 35 constructor_arguments)); |
| (...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 | 717 |
| 715 static RawInstance* LookupStaticFunctionOrFieldInClass( | 718 static RawInstance* LookupStaticFunctionOrFieldInClass( |
| 716 const Class& klass, | 719 const Class& klass, |
| 717 const String& lookup_name) { | 720 const String& lookup_name) { |
| 718 Instance& result = Instance::Handle( | 721 Instance& result = Instance::Handle( |
| 719 InvokeClassGetter(klass, lookup_name, false)); | 722 InvokeClassGetter(klass, lookup_name, false)); |
| 720 if (result.raw() != Object::sentinel().raw()) { | 723 if (result.raw() != Object::sentinel().raw()) { |
| 721 return result.raw(); | 724 return result.raw(); |
| 722 } | 725 } |
| 723 | 726 |
| 724 Function& func = Function::Handle(); | 727 const Function& func = |
| 725 Class& lookup_class = Class::Handle(klass.raw()); | 728 Function::Handle(klass.LookupStaticFunction(lookup_name)); |
| 726 while (func.IsNull() && !lookup_class.IsNull()) { | |
| 727 func ^= lookup_class.LookupStaticFunction(lookup_name); | |
| 728 lookup_class = lookup_class.SuperClass(); | |
| 729 } | |
| 730 if (!func.IsNull()) { | 729 if (!func.IsNull()) { |
| 731 const Function& closure_function = Function::Handle( | 730 const Function& closure_function = Function::Handle( |
| 732 func.ImplicitClosureFunction()); | 731 func.ImplicitClosureFunction()); |
| 733 ASSERT(!closure_function.IsNull()); | 732 ASSERT(!closure_function.IsNull()); |
| 734 return closure_function.ImplicitStaticClosure(); | 733 return closure_function.ImplicitStaticClosure(); |
| 735 } | 734 } |
| 736 | 735 |
| 737 // Fall through case: Indicate that we didn't find any function or field using | 736 // Fall through case: Indicate that we didn't find any function or field using |
| 738 // a special null instance. This is different from a field being null. Callers | 737 // a special null instance. This is different from a field being null. Callers |
| 739 // make sure that this null does not leak into Dartland. | 738 // make sure that this null does not leak into Dartland. |
| (...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1417 Object::Handle(DartEntry::InvokeClosure(args, args_descriptor)); | 1416 Object::Handle(DartEntry::InvokeClosure(args, args_descriptor)); |
| 1418 if (result.IsError()) { | 1417 if (result.IsError()) { |
| 1419 ThrowInvokeError(Error::Cast(result)); | 1418 ThrowInvokeError(Error::Cast(result)); |
| 1420 UNREACHABLE(); | 1419 UNREACHABLE(); |
| 1421 } | 1420 } |
| 1422 return result.raw(); | 1421 return result.raw(); |
| 1423 } | 1422 } |
| 1424 | 1423 |
| 1425 | 1424 |
| 1426 DEFINE_NATIVE_ENTRY(ClosureMirror_find_in_context, 2) { | 1425 DEFINE_NATIVE_ENTRY(ClosureMirror_find_in_context, 2) { |
| 1426 if (!FLAG_support_find_in_context) { |
| 1427 return Object::empty_array().raw(); |
| 1428 } |
| 1429 |
| 1427 GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0)); | 1430 GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0)); |
| 1428 GET_NON_NULL_NATIVE_ARGUMENT(Array, lookup_parts, arguments->NativeArgAt(1)); | 1431 GET_NON_NULL_NATIVE_ARGUMENT(Array, lookup_parts, arguments->NativeArgAt(1)); |
| 1429 ASSERT(lookup_parts.Length() >= 1 && lookup_parts.Length() <= 3); | 1432 ASSERT(lookup_parts.Length() >= 1 && lookup_parts.Length() <= 3); |
| 1430 | 1433 |
| 1431 if (!closure.IsClosure()) { | 1434 if (!closure.IsClosure()) { |
| 1432 const Array& result_tuple = Array::Handle(Array::New(2)); | 1435 const Array& result_tuple = Array::Handle(Array::New(2)); |
| 1433 result_tuple.SetAt(0, Bool::False()); | 1436 result_tuple.SetAt(0, Bool::False()); |
| 1434 return result_tuple.raw(); | 1437 return result_tuple.raw(); |
| 1435 } | 1438 } |
| 1436 | 1439 |
| (...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1957 } | 1960 } |
| 1958 | 1961 |
| 1959 | 1962 |
| 1960 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { | 1963 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { |
| 1961 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1964 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1962 const Field& field = Field::Handle(ref.GetFieldReferent()); | 1965 const Field& field = Field::Handle(ref.GetFieldReferent()); |
| 1963 return field.type(); | 1966 return field.type(); |
| 1964 } | 1967 } |
| 1965 | 1968 |
| 1966 } // namespace dart | 1969 } // namespace dart |
| OLD | NEW |