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

Unified Diff: lib/compiler/implementation/lib/js_helper.dart

Issue 11231074: Change signature of noSuchMethod to take an InvocationMirror. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: One more test expectation Created 8 years, 2 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
« no previous file with comments | « lib/compiler/implementation/lib/core_patch.dart ('k') | lib/compiler/implementation/ssa/codegen.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/compiler/implementation/lib/js_helper.dart
diff --git a/lib/compiler/implementation/lib/js_helper.dart b/lib/compiler/implementation/lib/js_helper.dart
index 5aa6b43cb12a249e1b7d7cc13386c077afe46d3c..8b575ed07e4b0ff7195d91c770a73c605a743681 100644
--- a/lib/compiler/implementation/lib/js_helper.dart
+++ b/lib/compiler/implementation/lib/js_helper.dart
@@ -353,6 +353,63 @@ class ListIterator<T> implements Iterator<T> {
}
}
+createInvocationMirror(name, internalName, type, arguments, argumentNames) =>
+ new JSInvocationMirror(name, internalName, type, arguments, argumentNames);
+
+class JSInvocationMirror implements InvocationMirror {
+ static const METHOD = 0;
+ static const GETTER = 1;
+ static const SETTER = 2;
+
+ final String memberName;
+ final String _internalName;
+ final int _kind;
+ final List _arguments;
+ final List _namedArgumentNames;
+ /** Map from argument name to index in _arguments. */
+ Map<String,dynamic> _namedIndices = null;
+
+ JSInvocationMirror(this.memberName,
+ this._internalName,
+ this._kind,
+ this._arguments,
+ this._namedArgumentNames);
+
+ bool get isMethod => _kind == METHOD;
+ bool get isGetter => _kind == GETTER;
+ bool get isSetter => _kind == SETTER;
+ bool get isAccessor => _kind != METHOD;
+
+ List get positionalArguments {
+ if (isGetter) return null;
+ var list = [];
+ var argumentCount =
+ _arguments.length - _namedArgumentNames.length;
+ for (var index = 0 ; index < argumentCount ; index++) {
+ list.add(_arguments[index]);
+ }
+ return list;
+ }
+
+ Map<String,dynamic> get namedArguments {
+ if (isAccessor) return null;
+ var map = <String,dynamic>{};
+ int namedArgumentCount = _namedArgumentNames.length;
+ int namedArgumentsStartIndex = _arguments.length - namedArgumentCount;
+ for (int i = 0; i < namedArgumentCount; i++) {
+ map[_namedArgumentNames[i]] = _arguments[namedArgumentsStartIndex + i];
+ }
+ return map;
+ }
+
+ invokeOn(Object object) {
+ List arguments = _arguments;
+ if (!isJsArray(arguments)) arguments = new List.from(arguments);
+ return JS("var", "#[#].apply(#, #)",
+ object, _internalName, object, arguments);
+ }
+}
+
class Primitives {
static int hashCodeSeed = 0;
@@ -648,7 +705,7 @@ class Primitives {
String selectorName = 'call\$$argumentCount$buffer';
var jsFunction = JS('var', '#[#]', function, selectorName);
if (jsFunction == null) {
- throw new NoSuchMethodError(function, selectorName, arguments);
+ throw new NoSuchMethodError(function, selectorName, arguments, {});
}
// We bound 'this' to [function] because of how we compile
// closures: escaped local variables are stored and accessed through
@@ -889,7 +946,7 @@ unwrapException(ex) {
type == 'non_object_property_load') {
return new NullPointerException();
} else if (type == 'undefined_method') {
- return new NoSuchMethodError('', name, []);
+ return new NoSuchMethodError('', name, [], {});
}
var ieErrorCode = JS('int', '#.number & 0xffff', ex);
@@ -910,7 +967,7 @@ unwrapException(ex) {
// Object doesn't support property or method 'foo' which sets the error
// code 438 in IE.
// TODO(kasperl): Compute the right name if possible.
- return new NoSuchMethodError('', '<unknown>', []);
+ return new NoSuchMethodError('', '<unknown>', [], {});
}
}
@@ -1377,7 +1434,8 @@ void assertHelper(condition) {
* resolved cannot be found.
*/
void throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {
- throw new NoSuchMethodError(obj, name, arguments, expectedArgumentNames);
+ throw new NoSuchMethodError(obj, name, arguments, const {},
+ expectedArgumentNames);
}
/**
« no previous file with comments | « lib/compiler/implementation/lib/core_patch.dart ('k') | lib/compiler/implementation/ssa/codegen.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698