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

Side by Side Diff: runtime/lib/mirrors.cc

Issue 21124011: Inline CreateTypedefMirror and get rid of LazyXXXMirror (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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "include/dart_api.h" 5 #include "include/dart_api.h"
6 #include "include/dart_debugger_api.h" 6 #include "include/dart_debugger_api.h"
7 #include "include/dart_mirrors_api.h" 7 #include "include/dart_mirrors_api.h"
8 #include "vm/dart_api_impl.h" 8 #include "vm/dart_api_impl.h"
9 #include "vm/dart_api_state.h" // TODO(11742): Remove with CreateMirrorRef. 9 #include "vm/dart_api_state.h" // TODO(11742): Remove with CreateMirrorRef.
10 #include "vm/bootstrap_natives.h" 10 #include "vm/bootstrap_natives.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 static Dart_Handle CreateMirrorReference(Dart_Handle handle) { 67 static Dart_Handle CreateMirrorReference(Dart_Handle handle) {
68 Isolate* isolate = Isolate::Current(); 68 Isolate* isolate = Isolate::Current();
69 DARTSCOPE(isolate); 69 DARTSCOPE(isolate);
70 const Object& referent = Object::Handle(isolate, Api::UnwrapHandle(handle)); 70 const Object& referent = Object::Handle(isolate, Api::UnwrapHandle(handle));
71 const MirrorReference& reference = 71 const MirrorReference& reference =
72 MirrorReference::Handle(MirrorReference::New(referent)); 72 MirrorReference::Handle(MirrorReference::New(referent));
73 return Api::NewHandle(isolate, reference.raw()); 73 return Api::NewHandle(isolate, reference.raw());
74 } 74 }
75 75
76 76
77 static Dart_Handle CreateLazyMirror(Dart_Handle target);
78
79
80 static RawInstance* CreateParameterMirrorList(const Function& func) { 77 static RawInstance* CreateParameterMirrorList(const Function& func) {
81 HANDLESCOPE(Isolate::Current()); 78 HANDLESCOPE(Isolate::Current());
82 const intptr_t param_cnt = func.num_fixed_parameters() - 79 const intptr_t param_cnt = func.num_fixed_parameters() -
83 func.NumImplicitParameters() + 80 func.NumImplicitParameters() +
84 func.NumOptionalParameters(); 81 func.NumOptionalParameters();
85 const Array& results = Array::Handle(Array::New(param_cnt)); 82 const Array& results = Array::Handle(Array::New(param_cnt));
86 const Array& args = Array::Handle(Array::New(3)); 83 const Array& args = Array::Handle(Array::New(3));
87 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); 84 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func)));
88 Smi& pos = Smi::Handle(); 85 Smi& pos = Smi::Handle();
89 Instance& param = Instance::Handle(); 86 Instance& param = Instance::Handle();
90 for (intptr_t i = 0; i < param_cnt; i++) { 87 for (intptr_t i = 0; i < param_cnt; i++) {
91 pos ^= Smi::New(i); 88 pos ^= Smi::New(i);
92 args.SetAt(1, pos); 89 args.SetAt(1, pos);
93 args.SetAt(2, (i >= func.num_fixed_parameters()) ? 90 args.SetAt(2, (i >= func.num_fixed_parameters()) ?
94 Bool::True() : Bool::False()); 91 Bool::True() : Bool::False());
95 param ^= CreateMirror(Symbols::_LocalParameterMirrorImpl(), args); 92 param ^= CreateMirror(Symbols::_LocalParameterMirrorImpl(), args);
96 results.SetAt(i, param); 93 results.SetAt(i, param);
97 } 94 }
98 results.MakeImmutable(); 95 results.MakeImmutable();
99 return results.raw(); 96 return results.raw();
100 } 97 }
101 98
102 99
103 static Dart_Handle CreateParameterMirrorListUsingApi(Dart_Handle func) {
104 ASSERT(Dart_IsFunction(func));
105 Isolate* isolate = Isolate::Current();
106 return Api::NewHandle(
107 isolate, CreateParameterMirrorList(Api::UnwrapFunctionHandle(
108 isolate, func)));
109 }
110
111
112 static Dart_Handle CreateLazyMirror(Dart_Handle target) {
113 if (Dart_IsNull(target) || Dart_IsError(target)) {
114 return target;
115 }
116
117 if (Dart_IsLibrary(target)) {
118 Dart_Handle cls_name = NewString("_LazyLibraryMirror");
119 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
120 Dart_Handle args[] = { Dart_LibraryUrl(target) };
121 return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args);
122 }
123
124 if (Dart_IsClass(target)) {
125 if (Dart_ClassIsFunctionType(target)) {
126 Dart_Handle cls_name = NewString("_LazyFunctionTypeMirror");
127 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
128
129 Dart_Handle sig = Dart_ClassGetFunctionTypeSignature(target);
130 Dart_Handle return_type = Dart_FunctionReturnType(sig);
131 if (Dart_IsError(return_type)) {
132 return return_type;
133 }
134
135 Dart_Handle args[] = {
136 CreateMirrorReference(target),
137 CreateLazyMirror(return_type),
138 CreateParameterMirrorListUsingApi(sig),
139 };
140 return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args);
141 } else {
142 Dart_Handle cls_name = NewString("_LazyTypeMirror");
143 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
144 Dart_Handle lib = Dart_ClassGetLibrary(target);
145 Dart_Handle lib_url;
146 if (Dart_IsNull(lib)) {
147 lib_url = Dart_Null();
148 } else {
149 lib_url = Dart_LibraryUrl(lib);
150 }
151 Dart_Handle args[] = { lib_url, Dart_ClassName(target) };
152 return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args);
153 }
154 }
155
156 if (Dart_IsTypeVariable(target)) {
157 Dart_Handle var_name = Dart_TypeVariableName(target);
158 Dart_Handle owner = Dart_TypeVariableOwner(target);
159 Dart_Handle owner_mirror = CreateLazyMirror(owner);
160
161 Dart_Handle cls_name = NewString("_LazyTypeVariableMirror");
162 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
163
164 Dart_Handle args[] = { var_name, owner_mirror };
165 return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args);
166 }
167
168 UNREACHABLE();
169 return Dart_Null();
170 }
171
172
173 static RawInstance* CreateTypeVariableMirror(const TypeParameter& param, 100 static RawInstance* CreateTypeVariableMirror(const TypeParameter& param,
174 const Instance& owner_mirror) { 101 const Instance& owner_mirror) {
175 const Array& args = Array::Handle(Array::New(3)); 102 const Array& args = Array::Handle(Array::New(3));
176 args.SetAt(0, param); 103 args.SetAt(0, param);
177 args.SetAt(1, String::Handle(param.name())); 104 args.SetAt(1, String::Handle(param.name()));
178 args.SetAt(2, owner_mirror); 105 args.SetAt(2, owner_mirror);
179 return CreateMirror(Symbols::_LocalTypeVariableMirrorImpl(), args); 106 return CreateMirror(Symbols::_LocalTypeVariableMirrorImpl(), args);
180 } 107 }
181 108
182 109
(...skipping 11 matching lines...) Expand all
194 type ^= args.TypeAt(i); 121 type ^= args.TypeAt(i);
195 ASSERT(type.IsTypeParameter()); 122 ASSERT(type.IsTypeParameter());
196 name ^= type.name(); 123 name ^= type.name();
197 result.SetAt(2 * i, name); 124 result.SetAt(2 * i, name);
198 result.SetAt(2 * i + 1, type); 125 result.SetAt(2 * i + 1, type);
199 } 126 }
200 return result.raw(); 127 return result.raw();
201 } 128 }
202 129
203 130
204 static Dart_Handle CreateTypedefMirror(Dart_Handle cls, 131 static RawInstance* CreateTypedefMirror(const Class& cls,
205 Dart_Handle cls_name, 132 const Instance& owner_mirror) {
206 Dart_Handle owner_mirror) { 133 const Array& args = Array::Handle(Array::New(3));
207 Dart_Handle mirror_cls_name = NewString("_LocalTypedefMirrorImpl"); 134 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
208 Dart_Handle mirror_type = Dart_GetType(MirrorLib(), mirror_cls_name, 0, NULL); 135 args.SetAt(1, String::Handle(cls.UserVisibleName()));
209 if (Dart_IsError(mirror_type)) { 136 args.SetAt(2, owner_mirror);
210 return mirror_type; 137 return CreateMirror(Symbols::_LocalTypedefMirrorImpl(), args);
211 }
212
213 Dart_Handle referent = Dart_ClassGetTypedefReferent(cls);
214 if (Dart_IsError(referent)) {
215 return referent;
216 }
217
218 Dart_Handle args[] = {
219 CreateMirrorReference(cls),
220 cls_name,
221 owner_mirror,
222 CreateLazyMirror(referent),
223 };
224 Dart_Handle mirror =
225 Dart_New(mirror_type, Dart_Null(), ARRAY_SIZE(args), args);
226 return mirror;
227 } 138 }
228 139
229 140
141 static Dart_Handle CreateTypedefMirrorUsingApi(Dart_Handle cls,
142 Dart_Handle cls_name,
143 Dart_Handle owner_mirror) {
144 Isolate* isolate = Isolate::Current();
145 return Api::NewHandle(
146 isolate, CreateTypedefMirror(
147 Api::UnwrapClassHandle(isolate, cls),
148 Api::UnwrapInstanceHandle(isolate, owner_mirror)));
149 }
150
151
230 static Dart_Handle CreateClassMirrorUsingApi(Dart_Handle intf, 152 static Dart_Handle CreateClassMirrorUsingApi(Dart_Handle intf,
231 Dart_Handle intf_name, 153 Dart_Handle intf_name,
232 Dart_Handle lib_mirror) { 154 Dart_Handle lib_mirror) {
233 ASSERT(Dart_IsClass(intf)); 155 ASSERT(Dart_IsClass(intf));
234 if (Dart_ClassIsTypedef(intf)) { 156 if (Dart_ClassIsTypedef(intf)) {
235 // This class is actually a typedef. Represent it specially in 157 // This class is actually a typedef. Represent it specially in
236 // reflection. 158 // reflection.
237 return CreateTypedefMirror(intf, intf_name, lib_mirror); 159 return CreateTypedefMirrorUsingApi(intf, intf_name, lib_mirror);
238 } 160 }
239 161
240 Dart_Handle cls_name = NewString("_LocalClassMirrorImpl"); 162 Dart_Handle cls_name = NewString("_LocalClassMirrorImpl");
241 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL); 163 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
242 if (Dart_IsError(type)) { 164 if (Dart_IsError(type)) {
243 return type; 165 return type;
244 } 166 }
245 167
246 Dart_Handle args[] = { 168 Dart_Handle args[] = {
247 CreateMirrorReference(intf), 169 CreateMirrorReference(intf),
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 394
473 const Library& library = Library::Handle(klass.library()); 395 const Library& library = Library::Handle(klass.library());
474 const Object& metadata = Object::Handle(library.GetMetadata(decl)); 396 const Object& metadata = Object::Handle(library.GetMetadata(decl));
475 if (metadata.IsError()) { 397 if (metadata.IsError()) {
476 ThrowInvokeError(Error::Cast(metadata)); 398 ThrowInvokeError(Error::Cast(metadata));
477 } 399 }
478 return metadata.raw(); 400 return metadata.raw();
479 } 401 }
480 402
481 403
404 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 1) {
405 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
406 const Class& cls = Class::Handle(ref.GetClassReferent());
407 const Function& func = Function::Handle(cls.signature_function());
408 return CreateParameterMirrorList(func);
409 }
410
411
412 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 1) {
413 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
414 const Class& cls = Class::Handle(ref.GetClassReferent());
415 const Function& func = Function::Handle(cls.signature_function());
416 const AbstractType& return_type = AbstractType::Handle(func.result_type());
417 return CreateTypeMirror(return_type);
418 }
419
420
482 void HandleMirrorsMessage(Isolate* isolate, 421 void HandleMirrorsMessage(Isolate* isolate,
483 Dart_Port reply_port, 422 Dart_Port reply_port,
484 const Instance& message) { 423 const Instance& message) {
485 UNIMPLEMENTED(); 424 UNIMPLEMENTED();
486 } 425 }
487 426
488 427
489 static bool FieldIsUninitialized(const Field& field) { 428 static bool FieldIsUninitialized(const Field& field) {
490 ASSERT(!field.IsNull()); 429 ASSERT(!field.IsNull());
491 430
(...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after
1295 DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 1) { 1234 DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 1) {
1296 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); 1235 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
1297 const Function& func = Function::Handle(ref.GetFunctionReferent()); 1236 const Function& func = Function::Handle(ref.GetFunctionReferent());
1298 // We handle constructors in Dart code. 1237 // We handle constructors in Dart code.
1299 ASSERT(!func.IsConstructor()); 1238 ASSERT(!func.IsConstructor());
1300 const AbstractType& return_type = AbstractType::Handle(func.result_type()); 1239 const AbstractType& return_type = AbstractType::Handle(func.result_type());
1301 return CreateTypeMirror(return_type); 1240 return CreateTypeMirror(return_type);
1302 } 1241 }
1303 1242
1304 1243
1244 DEFINE_NATIVE_ENTRY(TypedefMirror_referent, 1) {
1245 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
1246 const Class& cls = Class::Handle(ref.GetClassReferent());
1247 const Function& sig_func = Function::Handle(cls.signature_function());
1248 const Class& sig_cls = Class::Handle(sig_func.signature_class());
1249 return MirrorReference::New(sig_cls);
1250 }
1251
1252
1305 DEFINE_NATIVE_ENTRY(ParameterMirror_type, 2) { 1253 DEFINE_NATIVE_ENTRY(ParameterMirror_type, 2) {
1306 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); 1254 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
1307 GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1)); 1255 GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1));
1308 const Function& func = Function::Handle(ref.GetFunctionReferent()); 1256 const Function& func = Function::Handle(ref.GetFunctionReferent());
1309 const AbstractType& param_type = AbstractType::Handle(func.ParameterTypeAt( 1257 const AbstractType& param_type = AbstractType::Handle(func.ParameterTypeAt(
1310 func.NumImplicitParameters() + pos.Value())); 1258 func.NumImplicitParameters() + pos.Value()));
1311 return CreateTypeMirror(param_type); 1259 return CreateTypeMirror(param_type);
1312 } 1260 }
1313 1261
1314 1262
1315 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { 1263 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) {
1316 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); 1264 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
1317 const Field& field = Field::Handle(ref.GetFieldReferent()); 1265 const Field& field = Field::Handle(ref.GetFieldReferent());
1318 1266
1319 const AbstractType& type = AbstractType::Handle(field.type()); 1267 const AbstractType& type = AbstractType::Handle(field.type());
1320 return CreateTypeMirror(type); 1268 return CreateTypeMirror(type);
1321 } 1269 }
1322 1270
1323 } // namespace dart 1271 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/lib/mirrors_impl.dart » ('j') | tests/lib/mirrors/function_type_mirror_test.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698