Chromium Code Reviews| Index: runtime/lib/mirrors.cc |
| diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc |
| index 790705a11158304af0057734caf38f472c3b9573..b95cac45c4c09be9f32b3ffbce66d04a36796e8e 100644 |
| --- a/runtime/lib/mirrors.cc |
| +++ b/runtime/lib/mirrors.cc |
| @@ -118,8 +118,7 @@ static Dart_Handle CreateMirrorReference(Dart_Handle handle) { |
| DARTSCOPE(isolate); |
| const Object& referent = Object::Handle(isolate, Api::UnwrapHandle(handle)); |
| const MirrorReference& reference = |
| - MirrorReference::Handle(MirrorReference::New()); |
| - reference.set_referent(referent); |
| + MirrorReference::Handle(MirrorReference::New(referent)); |
| return Api::NewHandle(isolate, reference.raw()); |
| } |
| @@ -235,47 +234,35 @@ static Dart_Handle UnwrapMirror(Dart_Handle mirror) { |
| static Dart_Handle CreateLazyMirror(Dart_Handle target); |
| -static Dart_Handle CreateParameterMirrorList(Dart_Handle func) { |
| - ASSERT(Dart_IsFunction(func)); |
| - int64_t fixed_param_count; |
| - int64_t opt_param_count; |
| - Dart_Handle result = Dart_FunctionParameterCounts(func, |
| - &fixed_param_count, |
| - &opt_param_count); |
| - if (Dart_IsError(result)) { |
| - return result; |
| - } |
| - |
| - int64_t param_count = fixed_param_count + opt_param_count; |
| - Dart_Handle parameter_list = Dart_NewList(param_count); |
| - if (Dart_IsError(parameter_list)) { |
| - return result; |
| +static RawInstance* CreateParameterMirrorList(const Function& func) { |
| + 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)); |
| + args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); |
| + Smi& pos = Smi::Handle(); |
| + Instance& param = Instance::Handle(); |
| + for (intptr_t i = 0; i < param_cnt; ++i) { |
|
siva
2013/07/24 23:12:38
normally i++ is used in our code base I think.
Michael Lippautz (Google)
2013/07/24 23:34:03
Done.
|
| + pos ^= Smi::New(i); |
| + args.SetAt(1, pos); |
| + args.SetAt(2, (i >= func.num_fixed_parameters()) ? |
| + Bool::True() : Bool::False()); |
| + param ^= CreateMirror(Symbols::_LocalParameterMirrorImpl(), args); |
| + results.SetAt(i, param); |
| } |
| + results.MakeImmutable(); |
| + return results.raw(); |
| +} |
| - Dart_Handle param_cls_name = NewString("_LocalParameterMirrorImpl"); |
| - Dart_Handle param_type = Dart_GetType(MirrorLib(), param_cls_name, 0, NULL); |
| - if (Dart_IsError(param_type)) { |
| - return param_type; |
| - } |
| - Dart_Handle reflectee = CreateMirrorReference(func); |
| - for (int64_t i = 0; i < param_count; i++) { |
| - Dart_Handle args[] = { |
| - reflectee, |
| - Dart_NewInteger(i), |
| - (i >= fixed_param_count) ? Api::True() : Api::False(), |
| - }; |
| - Dart_Handle param = |
| - Dart_New(param_type, Dart_Null(), ARRAY_SIZE(args), args); |
| - if (Dart_IsError(param)) { |
| - return param; |
| - } |
| - result = Dart_ListSetAt(parameter_list, i, param); |
| - if (Dart_IsError(result)) { |
| - return result; |
| - } |
| - } |
| - return parameter_list; |
| +static Dart_Handle CreateParameterMirrorListUsingApi(Dart_Handle func) { |
| + ASSERT(Dart_IsFunction(func)); |
| + Isolate* isolate = Isolate::Current(); |
| + return Api::NewHandle( |
| + isolate, CreateParameterMirrorList(Api::UnwrapFunctionHandle( |
| + isolate, func))); |
| } |
| @@ -304,7 +291,7 @@ static Dart_Handle CreateLazyMirror(Dart_Handle target) { |
| Dart_Handle args[] = { |
| CreateLazyMirror(return_type), |
| - CreateParameterMirrorList(sig), |
| + CreateParameterMirrorListUsingApi(sig), |
| }; |
| return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args); |
| } else { |
| @@ -583,7 +570,7 @@ static Dart_Handle CreateMethodMirrorUsingApi(Dart_Handle func, |
| Dart_Handle args[] = { |
| CreateMirrorReference(func), |
| owner_mirror, |
| - CreateParameterMirrorList(func), |
| + CreateParameterMirrorListUsingApi(func), |
| func_obj.is_static() ? Api::True() : Api::False(), |
| func_obj.is_abstract() ? Api::True() : Api::False(), |
| func_obj.IsGetterFunction() ? Api::True() : Api::False(), |
| @@ -602,8 +589,7 @@ static Dart_Handle CreateMethodMirrorUsingApi(Dart_Handle func, |
| static RawInstance* CreateVariableMirror(const Field& field, |
| const Instance& owner_mirror) { |
| const MirrorReference& field_ref = |
| - MirrorReference::Handle(MirrorReference::New()); |
| - field_ref.set_referent(field); |
| + MirrorReference::Handle(MirrorReference::New(field)); |
| const String& name = String::Handle(field.UserVisibleName()); |