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

Unified Diff: runtime/lib/mirrors_impl.dart

Issue 18463003: Implement the invoke methods (invoke, getField, setField, newInstance, apply) as internal natives. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 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 side-by-side diff with in-line comments
Download patch
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 {

Powered by Google App Engine
This is Rietveld 408576698