Chromium Code Reviews| Index: runtime/lib/mirrors.cc |
| =================================================================== |
| --- runtime/lib/mirrors.cc (revision 9071) |
| +++ runtime/lib/mirrors.cc (working copy) |
| @@ -198,30 +198,36 @@ |
| } |
| -static Dart_Handle CreateLazyLibraryMirror(Dart_Handle lib) { |
| - if (Dart_IsNull(lib)) { |
| - return lib; |
| +static Dart_Handle CreateLazyMirror(Dart_Handle target) { |
| + if (Dart_IsNull(target)) { |
| + return target; |
| } |
| - Dart_Handle cls_name = Dart_NewString("_LazyLibraryMirror"); |
| - Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name); |
| - const int kNumArgs = 1; |
| - Dart_Handle args[kNumArgs]; |
| - args[0] = Dart_LibraryName(lib); |
| - return Dart_New(cls, Dart_Null(), kNumArgs, args); |
| -} |
| + if (Dart_IsLibrary(target)) { |
| + Dart_Handle cls_name = Dart_NewString("_LazyLibraryMirror"); |
| + Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name); |
| + const int kNumArgs = 1; |
| + Dart_Handle args[kNumArgs]; |
| + args[0] = Dart_LibraryName(target); |
| + return Dart_New(cls, Dart_Null(), kNumArgs, args); |
| + } else { |
| + ASSERT(Dart_IsClass(target) || Dart_IsInterface(target)); |
| + Dart_Handle cls_name = Dart_NewString("_LazyInterfaceMirror"); |
| + Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name); |
| + Dart_Handle lib = Dart_ClassGetLibrary(target); |
| + Dart_Handle lib_name; |
| + if (Dart_IsNull(lib)) { |
| + lib_name = Dart_Null(); |
| + } else { |
| + lib_name = Dart_LibraryName(lib); |
| + } |
| -static Dart_Handle CreateLazyInterfaceMirror(Dart_Handle intf) { |
| - if (Dart_IsNull(intf)) { |
| - return intf; |
| + const int kNumArgs = 2; |
| + Dart_Handle args[kNumArgs]; |
| + args[0] = lib_name; |
| + args[1] = Dart_ClassName(target); |
| + return Dart_New(cls, Dart_Null(), kNumArgs, args); |
| } |
| - Dart_Handle cls_name = Dart_NewString("_LazyInterfaceMirror"); |
| - Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name); |
| - const int kNumArgs = 2; |
| - Dart_Handle args[kNumArgs]; |
| - args[0] = Dart_LibraryName(Dart_ClassGetLibrary(intf)); |
| - args[1] = Dart_ClassName(intf); |
| - return Dart_New(cls, Dart_Null(), kNumArgs, args); |
| } |
| @@ -242,7 +248,7 @@ |
| if (Dart_IsError(interface)) { |
| return interface; |
| } |
| - Dart_Handle mirror = CreateLazyInterfaceMirror(interface); |
| + Dart_Handle mirror = CreateLazyMirror(interface); |
| if (Dart_IsError(mirror)) { |
| return mirror; |
| } |
| @@ -255,9 +261,13 @@ |
| } |
| +static Dart_Handle CreateMemberMap(Dart_Handle owner); |
| + |
| + |
| static Dart_Handle CreateInterfaceMirror(Dart_Handle intf, |
| Dart_Handle intf_name, |
| - Dart_Handle lib) { |
| + Dart_Handle lib, |
| + Dart_Handle lib_mirror) { |
| ASSERT(Dart_IsClass(intf) || Dart_IsInterface(intf)); |
| Dart_Handle cls_name = Dart_NewString("_LocalInterfaceMirrorImpl"); |
| Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name); |
| @@ -271,46 +281,207 @@ |
| super_class = Dart_GetClass(CoreLib(), Dart_NewString("Object")); |
| } |
| Dart_Handle default_class = Dart_ClassGetDefault(intf); |
| + Dart_Handle member_map = CreateMemberMap(intf); |
| + if (Dart_IsError(member_map)) { |
| + return member_map; |
| + } |
| - const int kNumArgs = 7; |
| + const int kNumArgs = 8; |
|
cshapiro
2012/06/28 23:57:47
Can this be eliminated, maybe by something like th
turnidge
2012/07/09 23:45:17
Done.
|
| Dart_Handle args[kNumArgs]; |
| args[0] = CreateVMReference(intf); |
| args[1] = intf_name; |
| args[2] = Dart_NewBoolean(Dart_IsClass(intf)); |
| - args[3] = CreateLazyLibraryMirror(lib); |
| - args[4] = CreateLazyInterfaceMirror(super_class); |
| + args[3] = lib_mirror; |
| + args[4] = CreateLazyMirror(super_class); |
| args[5] = CreateImplementsList(intf); |
| - args[6] = CreateLazyInterfaceMirror(default_class); |
| + args[6] = CreateLazyMirror(default_class); |
| + args[7] = member_map; |
| Dart_Handle mirror = Dart_New(cls, Dart_Null(), kNumArgs, args); |
| return mirror; |
| } |
| -static Dart_Handle CreateLibraryMemberMap(Dart_Handle lib) { |
| +static Dart_Handle CreateMethodMirror(Dart_Handle func, |
| + Dart_Handle func_name, |
| + Dart_Handle lib_mirror) { |
| + ASSERT(Dart_IsFunction(func)); |
| + Dart_Handle cls_name = Dart_NewString("_LocalMethodMirrorImpl"); |
| + Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name); |
| + if (Dart_IsError(cls)) { |
| + return cls; |
| + } |
| + |
| + bool is_static = false; |
| + bool is_abstract = false; |
| + bool is_getter = false; |
| + bool is_setter = false; |
| + bool is_constructor = false; |
| + |
| + Dart_Handle result = Dart_FunctionIsStatic(func, &is_static); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + result = Dart_FunctionIsAbstract(func, &is_abstract); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + result = Dart_FunctionIsGetter(func, &is_getter); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + result = Dart_FunctionIsSetter(func, &is_setter); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + result = Dart_FunctionIsConstructor(func, &is_constructor); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + |
| + // TODO(turnidge): Implement constructor kinds (arguments 7 - 10). |
| + const int kNumArgs = 11; |
|
cshapiro
2012/06/28 23:57:47
Same here, see above regarding the kNumArgs stuff.
turnidge
2012/07/09 23:45:17
Done.
|
| + Dart_Handle args[kNumArgs]; |
| + args[0] = func_name; |
| + args[1] = lib_mirror; |
| + args[2] = Dart_NewBoolean(is_static); |
| + args[3] = Dart_NewBoolean(is_abstract); |
| + args[4] = Dart_NewBoolean(is_getter); |
| + args[5] = Dart_NewBoolean(is_setter); |
| + args[6] = Dart_NewBoolean(is_constructor); |
| + args[7] = Dart_False(); |
| + args[8] = Dart_False(); |
| + args[9] = Dart_False(); |
| + args[10] = Dart_False(); |
| + Dart_Handle mirror = Dart_New(cls, Dart_Null(), kNumArgs, args); |
| + return mirror; |
| +} |
| + |
| + |
| +static Dart_Handle CreateVariableMirror(Dart_Handle var, |
| + Dart_Handle var_name, |
| + Dart_Handle lib_mirror) { |
| + ASSERT(Dart_IsVariable(var)); |
| + Dart_Handle cls_name = Dart_NewString("_LocalVariableMirrorImpl"); |
| + Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name); |
| + if (Dart_IsError(cls)) { |
| + return cls; |
| + } |
| + |
| + bool is_static = false; |
| + bool is_final = false; |
| + |
| + Dart_Handle result = Dart_VariableIsStatic(var, &is_static); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + result = Dart_VariableIsFinal(var, &is_final); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + |
| + const int kNumArgs = 4; |
|
cshapiro
2012/06/28 23:57:47
Same here too.
turnidge
2012/07/09 23:45:17
Done.
|
| + Dart_Handle args[kNumArgs]; |
| + args[0] = var_name; |
| + args[1] = lib_mirror; |
| + args[2] = Dart_NewBoolean(is_static); |
| + args[3] = Dart_NewBoolean(is_final); |
| + Dart_Handle mirror = Dart_New(cls, Dart_Null(), kNumArgs, args); |
| + return mirror; |
| +} |
| + |
| + |
| +static Dart_Handle CreateMemberMap(Dart_Handle owner) { |
| // TODO(turnidge): This should be an immutable map. |
| + Dart_Handle owner_mirror = CreateLazyMirror(owner); |
| + if (Dart_IsError(owner_mirror)) { |
| + return owner_mirror; |
| + } |
| Dart_Handle map = MapNew(); |
| - Dart_Handle intf_names = Dart_LibraryGetClassNames(lib); |
| - if (Dart_IsError(intf_names)) { |
| - return intf_names; |
| + Dart_Handle names; |
| + Dart_Handle result; |
| + intptr_t len; |
|
cshapiro
2012/06/28 23:57:47
How do we know that len is always initialized? Ca
turnidge
2012/07/09 23:45:17
Taken care of by splitting out the 3 helper functi
|
| + |
| + if (Dart_IsLibrary(owner)) { |
| + // Add classes/interfaces. |
| + names = Dart_LibraryGetClassNames(owner); |
|
cshapiro
2012/06/28 23:57:47
Since names here is not the same as names below, i
turnidge
2012/07/09 23:45:17
Done.
|
| + if (Dart_IsError(names)) { |
| + return names; |
| + } |
| + result = Dart_ListLength(names, &len); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + for (int i = 0; i < len; i++) { |
| + Dart_Handle intf_name = Dart_ListGetAt(names, i); |
| + Dart_Handle intf = Dart_GetClass(owner, intf_name); |
| + if (Dart_IsError(intf)) { |
| + return intf; |
| + } |
| + Dart_Handle intf_mirror = |
| + CreateInterfaceMirror(intf, intf_name, owner, owner_mirror); |
| + if (Dart_IsError(intf_mirror)) { |
| + return intf_mirror; |
| + } |
| + result = MapAdd(map, intf_name, intf_mirror); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + } |
| } |
| - intptr_t len; |
| - Dart_Handle result = Dart_ListLength(intf_names, &len); |
| + |
| + // Add functions. |
| + names = Dart_GetFunctionNames(owner); |
| + if (Dart_IsError(names)) { |
| + return names; |
| + } |
| + result = Dart_ListLength(names, &len); |
| if (Dart_IsError(result)) { |
| return result; |
| } |
| for (int i = 0; i < len; i++) { |
| - Dart_Handle intf_name = Dart_ListGetAt(intf_names, i); |
| - Dart_Handle intf = Dart_GetClass(lib, intf_name); |
| - if (Dart_IsError(intf)) { |
| - return intf; |
| + Dart_Handle func_name = Dart_ListGetAt(names, i); |
| + Dart_Handle func = Dart_LookupFunction(owner, func_name); |
| + if (Dart_IsError(func)) { |
| + return func; |
| } |
| - Dart_Handle intf_mirror = CreateInterfaceMirror(intf, intf_name, lib); |
| - if (Dart_IsError(intf_mirror)) { |
| - return intf_mirror; |
| + ASSERT(!Dart_IsNull(func)); |
| + Dart_Handle func_mirror = CreateMethodMirror(func, func_name, owner_mirror); |
| + if (Dart_IsError(func_mirror)) { |
| + return func_mirror; |
| } |
| - result = MapAdd(map, intf_name, intf_mirror); |
| + result = MapAdd(map, func_name, func_mirror); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| } |
| + |
| + // Add variables. |
| + names = Dart_GetVariableNames(owner); |
|
cshapiro
2012/06/28 23:57:47
It looks like there are 3 different functions insi
turnidge
2012/07/09 23:45:17
Done.
|
| + if (Dart_IsError(names)) { |
| + return names; |
| + } |
| + result = Dart_ListLength(names, &len); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + for (int i = 0; i < len; i++) { |
| + Dart_Handle var_name = Dart_ListGetAt(names, i); |
| + Dart_Handle var = Dart_LookupVariable(owner, var_name); |
| + if (Dart_IsError(var)) { |
| + return var; |
| + } |
| + ASSERT(!Dart_IsNull(var)); |
| + Dart_Handle var_mirror = CreateVariableMirror(var, var_name, owner_mirror); |
| + if (Dart_IsError(var_mirror)) { |
| + return var_mirror; |
| + } |
| + result = MapAdd(map, var_name, var_mirror); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + } |
| + |
| return map; |
| } |
| @@ -321,7 +492,7 @@ |
| if (Dart_IsError(cls)) { |
| return cls; |
| } |
| - Dart_Handle member_map = CreateLibraryMemberMap(lib); |
| + Dart_Handle member_map = CreateMemberMap(lib); |
| if (Dart_IsError(member_map)) { |
| return member_map; |
| } |
| @@ -417,7 +588,7 @@ |
| const int kNumArgs = 4; |
| Dart_Handle args[kNumArgs]; |
| args[0] = CreateVMReference(Dart_Null()); |
| - args[1] = CreateLazyInterfaceMirror(object_class); |
| + args[1] = CreateLazyMirror(object_class); |
| args[2] = Dart_True(); |
| args[3] = Dart_Null(); |
| Dart_Handle mirror = Dart_New(cls, Dart_Null(), kNumArgs, args); |
| @@ -443,7 +614,7 @@ |
| const int kNumArgs = 4; |
| Dart_Handle args[kNumArgs]; |
| args[0] = CreateVMReference(instance); |
| - args[1] = CreateLazyInterfaceMirror(instance_cls); |
| + args[1] = CreateLazyMirror(instance_cls); |
| args[2] = Dart_NewBoolean(is_simple); |
| args[3] = (is_simple ? instance : Dart_Null()); |
| Dart_Handle mirror = Dart_New(cls, Dart_Null(), kNumArgs, args); |