| Index: runtime/lib/mirrors.cc
|
| diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
|
| index 570aee2daa305d53425eec0a54bf0afabbea547c..ab2fd9681943062be3e3b4dda396733bdda18acb 100644
|
| --- a/runtime/lib/mirrors.cc
|
| +++ b/runtime/lib/mirrors.cc
|
| @@ -74,9 +74,6 @@ static Dart_Handle CreateMirrorReference(Dart_Handle handle) {
|
| }
|
|
|
|
|
| -static Dart_Handle CreateLazyMirror(Dart_Handle target);
|
| -
|
| -
|
| static RawInstance* CreateParameterMirrorList(const Function& func) {
|
| HANDLESCOPE(Isolate::Current());
|
| const intptr_t param_cnt = func.num_fixed_parameters() -
|
| @@ -100,76 +97,6 @@ static RawInstance* CreateParameterMirrorList(const Function& func) {
|
| }
|
|
|
|
|
| -static Dart_Handle CreateParameterMirrorListUsingApi(Dart_Handle func) {
|
| - ASSERT(Dart_IsFunction(func));
|
| - Isolate* isolate = Isolate::Current();
|
| - return Api::NewHandle(
|
| - isolate, CreateParameterMirrorList(Api::UnwrapFunctionHandle(
|
| - isolate, func)));
|
| -}
|
| -
|
| -
|
| -static Dart_Handle CreateLazyMirror(Dart_Handle target) {
|
| - if (Dart_IsNull(target) || Dart_IsError(target)) {
|
| - return target;
|
| - }
|
| -
|
| - if (Dart_IsLibrary(target)) {
|
| - Dart_Handle cls_name = NewString("_LazyLibraryMirror");
|
| - Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
|
| - Dart_Handle args[] = { Dart_LibraryUrl(target) };
|
| - return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args);
|
| - }
|
| -
|
| - if (Dart_IsClass(target)) {
|
| - if (Dart_ClassIsFunctionType(target)) {
|
| - Dart_Handle cls_name = NewString("_LazyFunctionTypeMirror");
|
| - Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
|
| -
|
| - Dart_Handle sig = Dart_ClassGetFunctionTypeSignature(target);
|
| - Dart_Handle return_type = Dart_FunctionReturnType(sig);
|
| - if (Dart_IsError(return_type)) {
|
| - return return_type;
|
| - }
|
| -
|
| - Dart_Handle args[] = {
|
| - CreateMirrorReference(target),
|
| - CreateLazyMirror(return_type),
|
| - CreateParameterMirrorListUsingApi(sig),
|
| - };
|
| - return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args);
|
| - } else {
|
| - Dart_Handle cls_name = NewString("_LazyTypeMirror");
|
| - Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
|
| - Dart_Handle lib = Dart_ClassGetLibrary(target);
|
| - Dart_Handle lib_url;
|
| - if (Dart_IsNull(lib)) {
|
| - lib_url = Dart_Null();
|
| - } else {
|
| - lib_url = Dart_LibraryUrl(lib);
|
| - }
|
| - Dart_Handle args[] = { lib_url, Dart_ClassName(target) };
|
| - return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args);
|
| - }
|
| - }
|
| -
|
| - if (Dart_IsTypeVariable(target)) {
|
| - Dart_Handle var_name = Dart_TypeVariableName(target);
|
| - Dart_Handle owner = Dart_TypeVariableOwner(target);
|
| - Dart_Handle owner_mirror = CreateLazyMirror(owner);
|
| -
|
| - Dart_Handle cls_name = NewString("_LazyTypeVariableMirror");
|
| - Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
|
| -
|
| - Dart_Handle args[] = { var_name, owner_mirror };
|
| - return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args);
|
| - }
|
| -
|
| - UNREACHABLE();
|
| - return Dart_Null();
|
| -}
|
| -
|
| -
|
| static RawInstance* CreateTypeVariableMirror(const TypeParameter& param,
|
| const Instance& owner_mirror) {
|
| const Array& args = Array::Handle(Array::New(3));
|
| @@ -201,29 +128,24 @@ static RawInstance* CreateTypeVariableList(const Class& cls) {
|
| }
|
|
|
|
|
| -static Dart_Handle CreateTypedefMirror(Dart_Handle cls,
|
| - Dart_Handle cls_name,
|
| - Dart_Handle owner_mirror) {
|
| - Dart_Handle mirror_cls_name = NewString("_LocalTypedefMirrorImpl");
|
| - Dart_Handle mirror_type = Dart_GetType(MirrorLib(), mirror_cls_name, 0, NULL);
|
| - if (Dart_IsError(mirror_type)) {
|
| - return mirror_type;
|
| - }
|
| +static RawInstance* CreateTypedefMirror(const Class& cls,
|
| + const Instance& owner_mirror) {
|
| + const Array& args = Array::Handle(Array::New(3));
|
| + args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
|
| + args.SetAt(1, String::Handle(cls.UserVisibleName()));
|
| + args.SetAt(2, owner_mirror);
|
| + return CreateMirror(Symbols::_LocalTypedefMirrorImpl(), args);
|
| +}
|
|
|
| - Dart_Handle referent = Dart_ClassGetTypedefReferent(cls);
|
| - if (Dart_IsError(referent)) {
|
| - return referent;
|
| - }
|
|
|
| - Dart_Handle args[] = {
|
| - CreateMirrorReference(cls),
|
| - cls_name,
|
| - owner_mirror,
|
| - CreateLazyMirror(referent),
|
| - };
|
| - Dart_Handle mirror =
|
| - Dart_New(mirror_type, Dart_Null(), ARRAY_SIZE(args), args);
|
| - return mirror;
|
| +static Dart_Handle CreateTypedefMirrorUsingApi(Dart_Handle cls,
|
| + Dart_Handle cls_name,
|
| + Dart_Handle owner_mirror) {
|
| + Isolate* isolate = Isolate::Current();
|
| + return Api::NewHandle(
|
| + isolate, CreateTypedefMirror(
|
| + Api::UnwrapClassHandle(isolate, cls),
|
| + Api::UnwrapInstanceHandle(isolate, owner_mirror)));
|
| }
|
|
|
|
|
| @@ -234,7 +156,7 @@ static Dart_Handle CreateClassMirrorUsingApi(Dart_Handle intf,
|
| if (Dart_ClassIsTypedef(intf)) {
|
| // This class is actually a typedef. Represent it specially in
|
| // reflection.
|
| - return CreateTypedefMirror(intf, intf_name, lib_mirror);
|
| + return CreateTypedefMirrorUsingApi(intf, intf_name, lib_mirror);
|
| }
|
|
|
| Dart_Handle cls_name = NewString("_LocalClassMirrorImpl");
|
| @@ -479,6 +401,23 @@ DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) {
|
| }
|
|
|
|
|
| +DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 1) {
|
| + GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
|
| + const Class& cls = Class::Handle(ref.GetClassReferent());
|
| + const Function& func = Function::Handle(cls.signature_function());
|
| + return CreateParameterMirrorList(func);
|
| +}
|
| +
|
| +
|
| +DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 1) {
|
| + GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
|
| + const Class& cls = Class::Handle(ref.GetClassReferent());
|
| + const Function& func = Function::Handle(cls.signature_function());
|
| + const AbstractType& return_type = AbstractType::Handle(func.result_type());
|
| + return CreateTypeMirror(return_type);
|
| +}
|
| +
|
| +
|
| void HandleMirrorsMessage(Isolate* isolate,
|
| Dart_Port reply_port,
|
| const Instance& message) {
|
| @@ -1302,6 +1241,15 @@ DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 1) {
|
| }
|
|
|
|
|
| +DEFINE_NATIVE_ENTRY(TypedefMirror_referent, 1) {
|
| + GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
|
| + const Class& cls = Class::Handle(ref.GetClassReferent());
|
| + const Function& sig_func = Function::Handle(cls.signature_function());
|
| + const Class& sig_cls = Class::Handle(sig_func.signature_class());
|
| + return MirrorReference::New(sig_cls);
|
| +}
|
| +
|
| +
|
| DEFINE_NATIVE_ENTRY(ParameterMirror_type, 2) {
|
| GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
|
| GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1));
|
|
|