Index: runtime/lib/mirrors_impl.dart |
=================================================================== |
--- runtime/lib/mirrors_impl.dart (revision 24826) |
+++ runtime/lib/mirrors_impl.dart (working copy) |
@@ -73,6 +73,22 @@ |
List<InstanceMirror> _metadata(mirror) |
native 'Mirrors_metadata'; |
+// This will verify the argument types, unwrap them, and ensure we have a fixed |
+// array. |
+List _unwarpAsyncArguments(wrappedArgs){ |
+ List unwrappedArgs = new List(wrappedArgs.length); |
+ for(int i = 0; i < wrappedArgs.length; i++){ |
+ var wrappedArg = wrappedArgs[i]; |
+ if(_isSimpleValue(wrappedArg)) { |
+ unwrappedArgs[i] = wrappedArg; |
+ } else if(wrappedArg is InstanceMirror) { |
+ unwrappedArgs[i] = wrappedArg._reflectee; |
+ } else { |
+ throw "positional argument $i ($arg) was not a simple value or InstanceMirror"; |
+ } |
+ } |
+ return unwrappedArgs; |
+} |
class _LocalMirrorSystemImpl extends MirrorSystem { |
// Change parameter back to "this.libraries" when native code is changed. |
@@ -404,7 +420,7 @@ |
// dynamic, void and the function types have their names set eagerly in the |
// constructor. |
if(_simpleName == null) { |
- _simpleName = _s(_ClassMirror_name(_reflectee)); |
+ _simpleName = _s(_name(_reflectee)); |
} |
return _simpleName; |
} |
@@ -531,6 +547,77 @@ |
return "$prettyName on '${_n(simpleName)}'"; |
} |
+ InstanceMirror invoke(Symbol memberName, |
+ List positionalArguments, |
+ [Map<Symbol, dynamic> namedArguments]) { |
+ if (namedArguments != null) { |
+ throw new UnimplementedError( |
+ 'named argument support is not implemented'); |
+ } |
+ return reflect(_invoke(_reflectee, |
+ _n(memberName), |
+ positionalArguments.toList(growable:false))); |
+ } |
+ |
+ Future<InstanceMirror> invokeAsync(Symbol memberName, |
+ List positionalArguments, |
+ [Map<Symbol, dynamic> namedArguments]) { |
+ if (namedArguments != null) { |
+ throw new UnimplementedError( |
+ 'named argument support is not implemented'); |
+ } |
+ |
+ try { |
+ var result = _invoke(_reflectee, |
+ _n(memberName), |
+ _unwarpAsyncArguments(positionalArguments)); |
+ return new Future.value(reflect(result)); |
+ } on MirroredError catch(e) { |
+ return new Future.error(e); |
+ } |
+ } |
+ |
+ InstanceMirror getField(Symbol memberName) { |
+ return reflect(_invokeGetter(_reflectee, |
+ _n(memberName))); |
+ } |
+ |
+ Future<InstanceMirror> getFieldAsync(Symbol memberName) { |
+ try { |
+ var result = _invokeGetter(_reflectee, |
+ _n(memberName)); |
+ return new Future.value(reflect(result)); |
+ } on MirroredError catch(e) { |
+ return new Future.error(e); |
+ } |
+ } |
+ |
+ InstanceMirror setField(Symbol memberName, Object value) { |
+ return reflect(_invokeSetter(_reflectee, |
+ _n(memberName), |
+ value)); |
+ } |
+ |
+ Future<InstanceMirror> setFieldAsync(Symbol memberName, Object value) { |
+ try { |
+ var unwrappedValue; |
+ if(_isSimpleValue(value)) { |
+ unwrappedValue = value; |
+ } else if(wrappedArg is InstanceMirror) { |
+ unwrappedValue = value._reflectee; |
+ } else { |
+ throw "setter argument ($value) must be a simple value or InstanceMirror"; |
+ } |
+ |
+ var result = _invokeSetter(_reflectee, |
+ _n(memberName), |
+ unwrappedValue); |
+ return new Future.value(reflect(result)); |
+ } on MirroredError catch(e) { |
+ return new Future.error(e); |
+ } |
+ } |
+ |
InstanceMirror newInstance(Symbol constructorName, |
List positionalArguments, |
[Map<Symbol, dynamic> namedArguments]) { |
@@ -538,10 +625,9 @@ |
throw new UnimplementedError( |
'named argument support is not implemented'); |
} |
- return _invokeConstructor(this, |
- _n(constructorName), |
- positionalArguments, |
- false); |
+ return reflect(_invokeConstructor(_reflectee, |
+ _n(constructorName), |
+ positionalArguments.toList(growable:false))); |
} |
Future<InstanceMirror> newInstanceAsync(Symbol constructorName, |
@@ -551,19 +637,14 @@ |
throw new UnimplementedError( |
'named argument support is not implemented'); |
} |
- // Walk the arguments and make sure they are legal. |
- for (int i = 0; i < positionalArguments.length; i++) { |
- var arg = positionalArguments[i]; |
- _LocalObjectMirrorImpl._validateArgument(i, arg); |
- } |
+ |
try { |
- return new Future<InstanceMirror>.value( |
- _invokeConstructor(this, |
- _n(constructorName), |
- positionalArguments, |
- true)); |
- } catch (exception) { |
- return new Future<InstanceMirror>.error(exception); |
+ var result = _invokeConstructor(_reflectee, |
+ _n(constructorName), |
+ _unwarpAsyncArguments(positionalArguments)); |
+ return new Future.value(reflect(result)); |
+ } on MirroredError catch(e) { |
+ return new Future.error(e); |
} |
} |
@@ -571,11 +652,21 @@ |
// reflect() and then make them into a Dart list |
List<InstanceMirror> get metadata => _metadata(this).map(reflect).toList(); |
- static _invokeConstructor(ref, constructorName, positionalArguments, async) |
- native 'LocalClassMirrorImpl_invokeConstructor'; |
- static String _ClassMirror_name(reflectee) |
+ static _name(reflectee) |
native "ClassMirror_name"; |
+ |
+ static _invoke(reflectee, constructorName, positionalArguments) |
+ native 'ClassMirror_invoke'; |
+ |
+ static _invokeGetter(reflectee, getterName) |
+ native 'ClassMirror_invokeGetter'; |
+ |
+ static _invokeSetter(reflectee, setterName, value) |
+ native 'ClassMirror_invokeSetter'; |
+ |
+ static _invokeConstructor(reflectee, constructorName, positionalArguments) |
+ native 'ClassMirror_invokeConstructor'; |
} |
class _LazyFunctionTypeMirror { |