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

Unified Diff: runtime/lib/mirrors.cc

Issue 21624006: ParameterMirror: Implement some missing getters. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 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/lib/mirrors_impl.dart » ('j') | tests/lib/mirrors/stringify.dart » ('J')
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 d75901a69bcb3c865323e9a94e3fb6aee3d6688f..94812720ef564e408e28142a58f7651e16ca81c2 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -45,20 +45,31 @@ DEFINE_NATIVE_ENTRY(Mirrors_isLocalPort, 1) {
}
-static RawInstance* CreateParameterMirrorList(const Function& func) {
+static RawInstance* CreateParameterMirrorList(const Function& func,
+ const Instance& owner_mirror) {
HANDLESCOPE(Isolate::Current());
- const intptr_t param_cnt = func.num_fixed_parameters() -
- func.NumImplicitParameters() +
- func.NumOptionalParameters();
- const Array& results = Array::Handle(Array::New(param_cnt));
- const Array& args = Array::Handle(Array::New(3));
+ const intptr_t implicit_param_count = func.NumImplicitParameters();
+ const intptr_t non_implicit_param_count = func.NumParameters() -
+ implicit_param_count;
+ const intptr_t index_of_first_optional_param =
+ non_implicit_param_count - func.NumOptionalParameters();
+ const intptr_t index_of_first_named_param =
+ non_implicit_param_count - func.NumOptionalNamedParameters();
+ const Array& results = Array::Handle(Array::New(non_implicit_param_count));
+ const Array& args = Array::Handle(Array::New(6));
args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func)));
+ args.SetAt(2, owner_mirror);
Smi& pos = Smi::Handle();
+ String& name = String::Handle();
Instance& param = Instance::Handle();
- for (intptr_t i = 0; i < param_cnt; i++) {
+ for (intptr_t i = 0; i < non_implicit_param_count; i++) {
pos ^= Smi::New(i);
- args.SetAt(1, pos);
- args.SetAt(2, (i >= func.num_fixed_parameters()) ?
+ name ^= func.ParameterNameAt(implicit_param_count + i);
+ args.SetAt(1, name);
+ args.SetAt(3, pos);
+ args.SetAt(4, (i >= index_of_first_optional_param) ?
+ Bool::True() : Bool::False());
+ args.SetAt(5, (i >= index_of_first_named_param) ?
Bool::True() : Bool::False());
param ^= CreateMirror(Symbols::_LocalParameterMirrorImpl(), args);
results.SetAt(i, param);
@@ -378,12 +389,12 @@ DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 2) {
}
-DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0));
+ GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
const Class& cls = Class::Handle(ref.GetClassReferent());
- const Function& func = Function::Handle(CallMethod(cls));
- ASSERT(!func.IsNull());
- return CreateParameterMirrorList(func);
+ const Function& func = Function::Handle(cls.signature_function());
+ return CreateParameterMirrorList(func, owner);
}
@@ -1231,10 +1242,11 @@ DEFINE_NATIVE_ENTRY(MethodMirror_owner, 1) {
}
-DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0));
+ GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
const Function& func = Function::Handle(ref.GetFunctionReferent());
- return CreateParameterMirrorList(func);
+ return CreateParameterMirrorList(func, owner);
}
« no previous file with comments | « no previous file | runtime/lib/mirrors_impl.dart » ('j') | tests/lib/mirrors/stringify.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698