Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(584)

Unified Diff: runtime/lib/mirrors.cc

Issue 1195573006: Handle field-invocation and method-extraction in the runtime when --lazy_dispatchers=false. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | runtime/vm/code_generator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/lib/mirrors.cc
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 3ffbff8ec4ff9389f2e9d54e345ac76e7834afe6..33af2717f8a97e10db31046f1d1bde7e427611ba 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -18,6 +18,8 @@
namespace dart {
+DECLARE_FLAG(bool, lazy_dispatchers);
+
#define PROPAGATE_IF_MALFORMED(type) \
if (type.IsMalformed()) { \
Exceptions::PropagateError(Error::Handle(type.error())); \
@@ -739,37 +741,6 @@ static RawInstance* InvokeClassGetter(const Class& klass,
}
-static RawInstance* InvokeInstanceGetter(const Class& klass,
- const Instance& reflectee,
- const String& getter_name,
- const bool throw_nsm_if_absent) {
- const String& internal_getter_name = String::Handle(
- Field::GetterName(getter_name));
- Function& function = Function::Handle(
- Resolver::ResolveDynamicAnyArgs(klass, internal_getter_name));
-
- if (!function.IsNull() || throw_nsm_if_absent) {
- const int kNumArgs = 1;
- const Array& args = Array::Handle(Array::New(kNumArgs));
- args.SetAt(0, reflectee);
- const Array& args_descriptor =
- Array::Handle(ArgumentsDescriptor::New(args.Length()));
-
- // InvokeDynamic invokes NoSuchMethod if the provided function is null.
- return InvokeDynamicFunction(reflectee,
- function,
- internal_getter_name,
- args,
- args_descriptor);
- }
-
- // Fall through case: Indicate that we didn't find any function or field using
- // a special null instance. This is different from a field being null. Callers
- // make sure that this null does not leak into Dartland.
- return Object::sentinel().raw();
-}
-
-
static RawAbstractType* InstantiateType(const AbstractType& type,
const AbstractType& instantiator) {
ASSERT(type.IsFinalized());
@@ -1389,7 +1360,34 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) {
GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1));
GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2));
Class& klass = Class::Handle(reflectee.clazz());
- return InvokeInstanceGetter(klass, reflectee, getter_name, true);
+
+ const String& internal_getter_name = String::Handle(
+ Field::GetterName(getter_name));
+ Function& function = Function::Handle(
+ Resolver::ResolveDynamicAnyArgs(klass, internal_getter_name));
+
+ // Check for method extraction when method extractors are not created.
+ if (function.IsNull() && !FLAG_lazy_dispatchers) {
+ function = Resolver::ResolveDynamicAnyArgs(klass, getter_name);
+ if (!function.IsNull()) {
+ const Function& closure_function =
+ Function::Handle(function.ImplicitClosureFunction());
+ return closure_function.ImplicitInstanceClosure(reflectee);
+ }
+ }
+
+ const int kNumArgs = 1;
+ const Array& args = Array::Handle(Array::New(kNumArgs));
+ args.SetAt(0, reflectee);
+ const Array& args_descriptor =
+ Array::Handle(ArgumentsDescriptor::New(args.Length()));
+
+ // InvokeDynamic invokes NoSuchMethod if the provided function is null.
+ return InvokeDynamicFunction(reflectee,
+ function,
+ internal_getter_name,
+ args,
+ args_descriptor);
}
« no previous file with comments | « no previous file | runtime/vm/code_generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698