Chromium Code Reviews| Index: runtime/lib/mirrors.cc |
| diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc |
| index 98806b148e17e52bd2eee8d646bfa96554b4dd5e..0fa041412ca5cb80768fcdeb3901d7164efb2520 100644 |
| --- a/runtime/lib/mirrors.cc |
| +++ b/runtime/lib/mirrors.cc |
| @@ -44,21 +44,29 @@ 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 intptr_t param_cnt = func.NumParameters() - |
| + func.NumImplicitParameters(); |
| + const intptr_t implicit_cnt = func.NumImplicitParameters(); |
| + const intptr_t first_optional = func.num_fixed_parameters() - |
| + func.NumImplicitParameters(); |
| + const intptr_t first_named = func.NumParameters() - |
| + func.NumImplicitParameters() - |
| + func.NumOptionalNamedParameters(); |
| const Array& results = Array::Handle(Array::New(param_cnt)); |
| - const Array& args = Array::Handle(Array::New(3)); |
| + 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(); |
| Instance& param = Instance::Handle(); |
| for (intptr_t i = 0; i < param_cnt; i++) { |
| pos ^= Smi::New(i); |
| - args.SetAt(1, pos); |
| - args.SetAt(2, (i >= func.num_fixed_parameters()) ? |
| - Bool::True() : Bool::False()); |
| + args.SetAt(1, String::Handle(func.ParameterNameAt(implicit_cnt + i))); |
| + args.SetAt(3, pos); |
| + args.SetAt(4, (i >= first_optional) ? Bool::True() : Bool::False()); |
| + args.SetAt(5, (i >= first_named) ? Bool::True() : Bool::False()); |
| param ^= CreateMirror(Symbols::_LocalParameterMirrorImpl(), args); |
| results.SetAt(i, param); |
| } |
| @@ -319,9 +327,10 @@ DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) { |
| DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 1) { |
| GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| + GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(1)); |
|
rmacnak
2013/08/02 00:50:19
Flip the order of the arguments and make this an i
Michael Lippautz (Google)
2013/08/02 17:05:44
Done.
|
| const Class& cls = Class::Handle(ref.GetClassReferent()); |
| const Function& func = Function::Handle(cls.signature_function()); |
| - return CreateParameterMirrorList(func); |
| + return CreateParameterMirrorList(func, owner); |
| } |
| @@ -1145,8 +1154,9 @@ DEFINE_NATIVE_ENTRY(MethodMirror_owner, 1) { |
| DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 1) { |
| GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| + GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(1)); |
|
rmacnak
2013/08/02 00:50:19
As above.
Michael Lippautz (Google)
2013/08/02 17:05:44
Done.
|
| const Function& func = Function::Handle(ref.GetFunctionReferent()); |
| - return CreateParameterMirrorList(func); |
| + return CreateParameterMirrorList(func, owner); |
| } |