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

Side by Side Diff: runtime/lib/mirrors_impl.dart

Issue 13942008: - Add synchronous mirror API. Resurrects invoke, apply, newInstance, (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 8 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
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/bootstrap_natives.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // VM-specific implementation of the dart:mirrors library. 5 // VM-specific implementation of the dart:mirrors library.
6 6
7 // These values are allowed to be passed directly over the wire. 7 // These values are allowed to be passed directly over the wire.
8 bool _isSimpleValue(var value) { 8 bool _isSimpleValue(var value) {
9 return (value == null || value is num || value is String || value is bool); 9 return (value == null || value is num || value is String || value is bool);
10 } 10 }
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 // storing the Object reference itself here if the object is a Dart 155 // storing the Object reference itself here if the object is a Dart
156 // language objects (except for objects of type VMReference, of 156 // language objects (except for objects of type VMReference, of
157 // course). 157 // course).
158 VMReference _reference; 158 VMReference _reference;
159 } 159 }
160 160
161 abstract class _LocalObjectMirrorImpl extends _LocalVMObjectMirrorImpl 161 abstract class _LocalObjectMirrorImpl extends _LocalVMObjectMirrorImpl
162 implements ObjectMirror { 162 implements ObjectMirror {
163 _LocalObjectMirrorImpl(ref) : super(ref) {} 163 _LocalObjectMirrorImpl(ref) : super(ref) {}
164 164
165 InstanceMirror invoke(Symbol memberName,
166 List positionalArguments,
167 [Map<Symbol, dynamic> namedArguments]) {
168 if (namedArguments != null) {
169 throw new UnimplementedError(
170 'named argument support is not implemented');
171 }
172 return _invoke(this, _n(memberName), positionalArguments, false);
173 }
174
175 InstanceMirror getField(Symbol fieldName) {
176 return _getField(this, _n(fieldName));
177 }
178
179 InstanceMirror setField(Symbol fieldName, Object arg) {
180 return _setField(this, _n(fieldName), arg, false);
181 }
182
165 Future<InstanceMirror> invokeAsync(Symbol memberName, 183 Future<InstanceMirror> invokeAsync(Symbol memberName,
166 List positionalArguments, 184 List positionalArguments,
167 [Map<Symbol, dynamic> namedArguments]) { 185 [Map<Symbol, dynamic> namedArguments]) {
168 if (namedArguments != null) { 186 if (namedArguments != null) {
169 throw new UnimplementedError( 187 throw new UnimplementedError(
170 'named argument support is not implemented'); 188 'named argument support is not implemented');
171 } 189 }
172 // Walk the arguments and make sure they are legal. 190 // Walk the arguments and make sure they are legal.
173 for (int i = 0; i < positionalArguments.length; i++) { 191 for (int i = 0; i < positionalArguments.length; i++) {
174 var arg = positionalArguments[i]; 192 var arg = positionalArguments[i];
175 _validateArgument(i, arg); 193 _validateArgument(i, arg);
176 } 194 }
177 Completer<InstanceMirror> completer = new Completer<InstanceMirror>(); 195 Completer<InstanceMirror> completer = new Completer<InstanceMirror>();
178 try { 196 try {
179 completer.complete( 197 completer.complete(
180 _invoke(this, _n(memberName), positionalArguments)); 198 _invoke(this, _n(memberName), positionalArguments), true);
181 } catch (exception, s) { 199 } catch (exception, s) {
182 completer.completeError(exception, s); 200 completer.completeError(exception, s);
183 } 201 }
184 return completer.future; 202 return completer.future;
185 } 203 }
186 204
187 Future<InstanceMirror> getFieldAsync(Symbol fieldName) { 205 Future<InstanceMirror> getFieldAsync(Symbol fieldName) {
188 Completer<InstanceMirror> completer = new Completer<InstanceMirror>(); 206 Completer<InstanceMirror> completer = new Completer<InstanceMirror>();
189 try { 207 try {
190 completer.complete(_getField(this, _n(fieldName))); 208 completer.complete(_getField(this, _n(fieldName)));
191 } catch (exception, s) { 209 } catch (exception, s) {
192 completer.completeError(exception, s); 210 completer.completeError(exception, s);
193 } 211 }
194 return completer.future; 212 return completer.future;
195 } 213 }
196 214
197 Future<InstanceMirror> setFieldAsync(Symbol fieldName, Object arg) { 215 Future<InstanceMirror> setFieldAsync(Symbol fieldName, Object arg) {
198 _validateArgument(0, arg); 216 _validateArgument(0, arg);
199 217
200 Completer<InstanceMirror> completer = new Completer<InstanceMirror>(); 218 Completer<InstanceMirror> completer = new Completer<InstanceMirror>();
201 try { 219 try {
202 completer.complete(_setField(this, _n(fieldName), arg)); 220 completer.complete(_setField(this, _n(fieldName), arg, true));
203 } catch (exception, s) { 221 } catch (exception, s) {
204 completer.completeError(exception, s); 222 completer.completeError(exception, s);
205 } 223 }
206 return completer.future; 224 return completer.future;
207 } 225 }
208 226
209 static _validateArgument(int i, Object arg) 227 static _validateArgument(int i, Object arg)
210 { 228 {
211 if (arg is Mirror) { 229 if (arg is Mirror) {
212 if (arg is! InstanceMirror) { 230 if (arg is! InstanceMirror) {
213 throw new MirrorException( 231 throw new MirrorException(
214 'positional argument $i ($arg) was not an InstanceMirror'); 232 'positional argument $i ($arg) was not an InstanceMirror');
215 } 233 }
216 } else if (!_isSimpleValue(arg)) { 234 } else if (!_isSimpleValue(arg)) {
217 throw new MirrorException( 235 throw new MirrorException(
218 'positional argument $i ($arg) was not a simple value'); 236 'positional argument $i ($arg) was not a simple value');
219 } 237 }
220 } 238 }
221 239
222 static _invoke(ref, memberName, positionalArguments) 240 static _invoke(ref, memberName, positionalArguments, async)
223 native 'LocalObjectMirrorImpl_invoke'; 241 native 'LocalObjectMirrorImpl_invoke';
224 242
225 static _getField(ref, fieldName) 243 static _getField(ref, fieldName) // same for sync and async versions
226 native 'LocalObjectMirrorImpl_getField'; 244 native 'LocalObjectMirrorImpl_getField';
227 245
228 static _setField(ref, fieldName, value) 246 static _setField(ref, fieldName, value, async)
229 native 'LocalObjectMirrorImpl_setField'; 247 native 'LocalObjectMirrorImpl_setField';
230 } 248 }
231 249
232 // Prints a string as it might appear in dart program text. 250 // Prints a string as it might appear in dart program text.
233 // TODO(turnidge): Consider truncating. 251 // TODO(turnidge): Consider truncating.
234 String _dartEscape(String str) { 252 String _dartEscape(String str) {
235 bool isNice(int code) => (code >= 32 && code <= 126); 253 bool isNice(int code) => (code >= 32 && code <= 126);
236 254
237 StringBuffer buf = new StringBuffer(); 255 StringBuffer buf = new StringBuffer();
238 for (int i = 0; i < str.length; i++) { 256 for (int i = 0; i < str.length; i++) {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 reflectee, 336 reflectee,
319 this.function) : super(ref, type, reflectee) {} 337 this.function) : super(ref, type, reflectee) {}
320 338
321 final MethodMirror function; 339 final MethodMirror function;
322 340
323 String get source { 341 String get source {
324 throw new UnimplementedError( 342 throw new UnimplementedError(
325 'ClosureMirror.source is not implemented'); 343 'ClosureMirror.source is not implemented');
326 } 344 }
327 345
346 InstanceMirror apply(List<Object> positionalArguments,
347 [Map<Symbol, Object> namedArguments]) {
348 if (namedArguments != null) {
349 throw new UnimplementedError(
350 'named argument support is not implemented');
351 }
352 return _apply(this, positionalArguments, false);
353 }
354
328 Future<InstanceMirror> applyAsync(List<Object> positionalArguments, 355 Future<InstanceMirror> applyAsync(List<Object> positionalArguments,
329 [Map<Symbol, Object> namedArguments]) { 356 [Map<Symbol, Object> namedArguments]) {
330 if (namedArguments != null) { 357 if (namedArguments != null) {
331 throw new UnimplementedError( 358 throw new UnimplementedError(
332 'named argument support is not implemented'); 359 'named argument support is not implemented');
333 } 360 }
334 // Walk the arguments and make sure they are legal. 361 // Walk the arguments and make sure they are legal.
335 for (int i = 0; i < positionalArguments.length; i++) { 362 for (int i = 0; i < positionalArguments.length; i++) {
336 var arg = positionalArguments[i]; 363 var arg = positionalArguments[i];
337 _LocalObjectMirrorImpl._validateArgument(i, arg); 364 _LocalObjectMirrorImpl._validateArgument(i, arg);
338 } 365 }
339 Completer<InstanceMirror> completer = new Completer<InstanceMirror>(); 366 Completer<InstanceMirror> completer = new Completer<InstanceMirror>();
340 try { 367 try {
341 completer.complete( 368 completer.complete(
342 _apply(this, positionalArguments)); 369 _apply(this, positionalArguments, true));
343 } catch (exception) { 370 } catch (exception) {
344 completer.completeError(exception); 371 completer.completeError(exception);
345 } 372 }
346 return completer.future; 373 return completer.future;
347 } 374 }
348 375
349 Future<InstanceMirror> findInContext(Symbol name) { 376 Future<InstanceMirror> findInContext(Symbol name) {
350 throw new UnimplementedError( 377 throw new UnimplementedError(
351 'ClosureMirror.findInContext() is not implemented'); 378 'ClosureMirror.findInContext() is not implemented');
352 } 379 }
353 380
354 static _apply(ref, positionalArguments) 381 static _apply(ref, positionalArguments, async)
355 native 'LocalClosureMirrorImpl_apply'; 382 native 'LocalClosureMirrorImpl_apply';
356 } 383 }
357 384
358 class _LazyTypeMirror { 385 class _LazyTypeMirror {
359 _LazyTypeMirror(String libraryName, String typeName) 386 _LazyTypeMirror(String libraryName, String typeName)
360 : this.libraryName = _s(libraryName), 387 : this.libraryName = _s(libraryName),
361 this.typeName = _s(typeName); 388 this.typeName = _s(typeName);
362 389
363 TypeMirror resolve(MirrorSystem mirrors) { 390 TypeMirror resolve(MirrorSystem mirrors) {
364 if (libraryName == null) { 391 if (libraryName == null) {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 'ClassMirror.isOriginalDeclaration is not implemented'); 542 'ClassMirror.isOriginalDeclaration is not implemented');
516 } 543 }
517 544
518 ClassMirror get genericDeclaration { 545 ClassMirror get genericDeclaration {
519 throw new UnimplementedError( 546 throw new UnimplementedError(
520 'ClassMirror.originalDeclaration is not implemented'); 547 'ClassMirror.originalDeclaration is not implemented');
521 } 548 }
522 549
523 String toString() => "ClassMirror on '$simpleName'"; 550 String toString() => "ClassMirror on '$simpleName'";
524 551
552 InstanceMirror newInstance(Symbol constructorName,
553 List positionalArguments,
554 [Map<Symbol, dynamic> namedArguments]) {
555 if (namedArguments != null) {
556 throw new UnimplementedError(
557 'named argument support is not implemented');
558 }
559 return _invokeConstructor(this,
560 _n(constructorName),
561 positionalArguments,
562 false);
563 }
564
525 Future<InstanceMirror> newInstanceAsync(Symbol constructorName, 565 Future<InstanceMirror> newInstanceAsync(Symbol constructorName,
526 List positionalArguments, 566 List positionalArguments,
527 [Map<Symbol, dynamic> namedArguments]) { 567 [Map<Symbol, dynamic> namedArguments]) {
528 if (namedArguments != null) { 568 if (namedArguments != null) {
529 throw new UnimplementedError( 569 throw new UnimplementedError(
530 'named argument support is not implemented'); 570 'named argument support is not implemented');
531 } 571 }
532 // Walk the arguments and make sure they are legal. 572 // Walk the arguments and make sure they are legal.
533 for (int i = 0; i < positionalArguments.length; i++) { 573 for (int i = 0; i < positionalArguments.length; i++) {
534 var arg = positionalArguments[i]; 574 var arg = positionalArguments[i];
535 _LocalObjectMirrorImpl._validateArgument(i, arg); 575 _LocalObjectMirrorImpl._validateArgument(i, arg);
536 } 576 }
537 Completer<InstanceMirror> completer = new Completer<InstanceMirror>(); 577 Completer<InstanceMirror> completer = new Completer<InstanceMirror>();
538 try { 578 try {
539 completer.complete( 579 completer.complete(
540 _invokeConstructor(this, _n(constructorName), positionalArguments)); 580 _invokeConstructor(this,
581 _n(constructorName),
582 positionalArguments,
583 true));
541 } catch (exception) { 584 } catch (exception) {
542 completer.completeError(exception); 585 completer.completeError(exception);
543 } 586 }
544 return completer.future; 587 return completer.future;
545 } 588 }
546 589
547 static _invokeConstructor(ref, constructorName, positionalArguments) 590 static _invokeConstructor(ref, constructorName, positionalArguments, async)
548 native 'LocalClassMirrorImpl_invokeConstructor'; 591 native 'LocalClassMirrorImpl_invokeConstructor';
549 } 592 }
550 593
551 class _LazyFunctionTypeMirror { 594 class _LazyFunctionTypeMirror {
552 _LazyFunctionTypeMirror(this.returnType, this.parameters) {} 595 _LazyFunctionTypeMirror(this.returnType, this.parameters) {}
553 596
554 ClassMirror resolve(MirrorSystem mirrors) { 597 ClassMirror resolve(MirrorSystem mirrors) {
555 return mirrors._lookupFunctionTypeMirror(returnType.resolve(mirrors), 598 return mirrors._lookupFunctionTypeMirror(returnType.resolve(mirrors),
556 parameters); 599 parameters);
557 } 600 }
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 1044
1002 // Creates a new local mirror for some Object. 1045 // Creates a new local mirror for some Object.
1003 static InstanceMirror reflect(Object reflectee) { 1046 static InstanceMirror reflect(Object reflectee) {
1004 return makeLocalInstanceMirror(reflectee); 1047 return makeLocalInstanceMirror(reflectee);
1005 } 1048 }
1006 1049
1007 static ClassMirror reflectClass(Type reflectee) { 1050 static ClassMirror reflectClass(Type reflectee) {
1008 throw new UnimplementedError('reflectClass is not implemented'); 1051 throw new UnimplementedError('reflectClass is not implemented');
1009 } 1052 }
1010 } 1053 }
OLDNEW
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/bootstrap_natives.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698