Index: runtime/lib/mirrors_impl.dart |
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart |
index 310c9f7b48b997589ce658ab2ed42fdff2009365..cf5c54a781f1d0b5d8c68267463b5b3255da46f8 100644 |
--- a/runtime/lib/mirrors_impl.dart |
+++ b/runtime/lib/mirrors_impl.dart |
@@ -355,6 +355,33 @@ class _LocalInstanceMirror extends _LocalObjectMirror |
return reflect(this._invoke(_reflectee, _n(memberName), arguments, names)); |
} |
+ static Map _getFieldClosures = new Map.identity(); |
+ static Map _setFieldClosures = new Map.identity(); |
+ |
+ InstanceMirror getField(Symbol memberName) { |
+ var f = _getFieldClosures[memberName]; |
+ if (f == null) { |
+ f = _makeGetter(_n(memberName), _ScratchClass); |
+ _getFieldClosures[memberName] = f; |
+ } |
+ return reflect(f(_reflectee)); |
+ } |
+ |
+ InstanceMirror setField(Symbol memberName, value) { |
+ var f = _setFieldClosures[memberName]; |
+ if (f == null) { |
+ f = _makeSetter(_n(memberName), _ScratchClass); |
+ _setFieldClosures[memberName] = f; |
+ } |
+ return reflect(f(_reflectee, value)); |
+ } |
+ |
+ static _makeGetter(selector, scratchClass) |
+ native "Mirrors_makeGetter"; |
+ |
+ static _makeSetter(selector, scratchClass) |
+ native "Mirrors_makeSetter"; |
+ |
_invoke(reflectee, functionName, arguments, argumentNames) |
native 'InstanceMirror_invoke'; |
@@ -368,6 +395,8 @@ class _LocalInstanceMirror extends _LocalObjectMirror |
native 'InstanceMirror_computeType'; |
} |
+class _ScratchClass {} |
+ |
class _LocalClosureMirror extends _LocalInstanceMirror |
implements ClosureMirror { |
_LocalClosureMirror(reflectee) : super(reflectee); |