Index: dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart b/dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart |
index d1f93eda316292825eb33fe4bc80b97ffa78164c..36fc06c1329f965ce7c458e287c524ef667d00e5 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart |
@@ -10,6 +10,7 @@ import 'dart:mirrors'; |
import 'dart:_foreign_helper' show JS, JS_CURRENT_ISOLATE; |
import 'dart:_collection-dev' as _symbol_dev; |
import 'dart:_js_helper' show |
+ BoundClosure, |
Closure, |
JSInvocationMirror, |
Null, |
@@ -106,7 +107,8 @@ class JsLibraryMirror extends JsObjectMirror implements LibraryMirror { |
// TODO(ahe): Create accessor for accessing $. It is also |
// used in js_helper. |
new JsMethodMirror( |
- symbol, JS('', '#[#]', JS_CURRENT_ISOLATE(), name), parameterCount); |
+ symbol, JS('', '#[#]', JS_CURRENT_ISOLATE(), name), |
+ parameterCount); |
// TODO(ahe): Cache mirrors. |
result[symbol] = mirror; |
mirror._owner = this; |
@@ -442,9 +444,15 @@ function(reflectee) { |
if (callName == null) { |
throw new RuntimeError('Cannot find callName on "$reflectee"'); |
} |
- var jsFunction = JS('', '#[#]', reflectee, callName); |
int parameterCount = int.parse(callName.split(r'$')[1]); |
- return new JsMethodMirror(s(callName), jsFunction, parameterCount); |
+ if (reflectee is BoundClosure) { |
+ var target = reflectee.target; |
+ return new JsMethodMirror( |
+ s(target), JS('', '#[#]', reflectee.self, target), parameterCount); |
+ } else { |
+ var jsFunction = JS('', '#[#]', reflectee, callName); |
+ return new JsMethodMirror(s(callName), jsFunction, parameterCount); |
+ } |
} |
InstanceMirror apply(List positionalArguments, |
@@ -465,6 +473,7 @@ class JsMethodMirror implements MethodMirror { |
final _jsFunction; |
final int _parameterCount; |
DeclarationMirror _owner; |
+ List _metadata; |
JsMethodMirror(this.simpleName, this._jsFunction, this._parameterCount); |
@@ -476,6 +485,15 @@ class JsMethodMirror implements MethodMirror { |
DeclarationMirror get owner => _owner; |
Symbol get qualifiedName => computeQualifiedName(owner, simpleName); |
+ |
+ List<InstanceMirror> get metadata { |
+ if (_metadata == null) { |
+ var metadataFunction = JS('', r'#.$metadata', _jsFunction); |
kasperl
2013/06/03 06:12:40
Could this code be shared? Maybe it's not worth th
ahe
2013/06/03 09:13:54
Done.
|
+ _metadata = (metadataFunction == null) |
+ ? const [] : JS('', '#()', metadataFunction); |
+ } |
+ return _metadata.map(reflect).toList(); |
+ } |
} |
Symbol computeQualifiedName(DeclarationMirror owner, Symbol simpleName) { |