Chromium Code Reviews| Index: lib/compiler/implementation/lib/js_helper.dart |
| =================================================================== |
| --- lib/compiler/implementation/lib/js_helper.dart (revision 13369) |
| +++ lib/compiler/implementation/lib/js_helper.dart (working copy) |
| @@ -610,6 +610,46 @@ |
| } |
| JS('void', '#[#] = #', object, key, value); |
| } |
| + |
| + static applyFunction(Function function, |
| + List positionalArguments, |
| + Map<String, Dynamic> namedArguments) { |
| + int argumentCount = 0; |
| + StringBuffer buffer = new StringBuffer(); |
| + List arguments = []; |
| + |
| + if (positionalArguments != null) { |
| + argumentCount += positionalArguments.length; |
| + arguments.addAll(positionalArguments); |
| + } |
| + |
| + // Sort the named arguments to get the right selector name and |
| + // arguments order. |
| + if (namedArguments != null && !namedArguments.isEmpty()) { |
| + // Call new List.from to make sure we get a JavaScript array. |
| + List<String> listOfNamedArguments = |
| + new List<String>.from(namedArguments.getKeys()); |
| + argumentCount += namedArguments.length; |
| + // We're sorting on strings, and the behavior is the same between |
| + // Dart string sort and JS String sort. To avoid needing the Dart |
|
kasperl
2012/10/09 11:35:18
JS String -> JS string
ngeoffray
2012/10/09 11:56:58
Done.
|
| + // sort implementation, we use the JavaScript one instead. |
| + JS('void', '#.sort()', listOfNamedArguments); |
| + listOfNamedArguments.forEach((String name) { |
| + buffer.add('\$$name'); |
| + arguments.add(namedArguments[name]); |
| + }); |
| + } |
| + |
| + String selectorName = 'call\$$argumentCount$buffer'; |
| + var jsFunction = JS('var', '#[#]', function, selectorName); |
| + if (jsFunction == null) { |
| + 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 |
| + // [function]. |
| + return JS('var', '#.apply(#, #)', jsFunction, function, arguments); |
| + } |
| } |
| /** |