OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #library('js_helper'); | 5 #library('js_helper'); |
6 | 6 |
7 #import('coreimpl.dart'); | 7 #import('coreimpl.dart'); |
8 | 8 |
9 #source('constant_map.dart'); | 9 #source('constant_map.dart'); |
10 #source('date_helper.dart'); | 10 #source('date_helper.dart'); |
(...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1339 Iterator iterator = keyValuePairs.iterator(); | 1339 Iterator iterator = keyValuePairs.iterator(); |
1340 Map result = new LinkedHashMap(); | 1340 Map result = new LinkedHashMap(); |
1341 while (iterator.hasNext()) { | 1341 while (iterator.hasNext()) { |
1342 String key = iterator.next(); | 1342 String key = iterator.next(); |
1343 var value = iterator.next(); | 1343 var value = iterator.next(); |
1344 result[key] = value; | 1344 result[key] = value; |
1345 } | 1345 } |
1346 return result; | 1346 return result; |
1347 } | 1347 } |
1348 | 1348 |
| 1349 invokeClosure(Function closure, |
| 1350 var isolate, |
| 1351 int numberOfArguments, |
| 1352 var arg1, |
| 1353 var arg2) { |
| 1354 if (numberOfArguments == 0) { |
| 1355 return JS_CALL_IN_ISOLATE(isolate, () => closure()); |
| 1356 } else if (numberOfArguments == 1) { |
| 1357 return JS_CALL_IN_ISOLATE(isolate, () => closure(arg1)); |
| 1358 } else if (numberOfArguments == 2) { |
| 1359 return JS_CALL_IN_ISOLATE(isolate, () => closure(arg1, arg2)); |
| 1360 } else { |
| 1361 throw new Exception( |
| 1362 'Unsupported number of arguments for wrapped closure'); |
| 1363 } |
| 1364 } |
| 1365 |
1349 /** | 1366 /** |
1350 * Called by generated code to convert a Dart closure to a JS | 1367 * Called by generated code to convert a Dart closure to a JS |
1351 * closure when the Dart closure is passed to the DOM. | 1368 * closure when the Dart closure is passed to the DOM. |
1352 */ | 1369 */ |
1353 convertDartClosureToJS(closure) { | 1370 convertDartClosureToJS(closure) { |
1354 if (closure === null) return null; | 1371 if (closure === null) return null; |
1355 var function = JS('var', @'#.$identity', closure); | 1372 var function = JS('var', @'#.$identity', closure); |
1356 if (JS('bool', @'!!#', function)) return function; | 1373 if (JS('bool', @'!!#', function)) return function; |
| 1374 |
1357 function = JS("var", @"""function() { | 1375 function = JS("var", @"""function() { |
1358 var dartClosure = #; | 1376 return #(#, #, arguments.length, arguments[0], arguments[1]); |
1359 switch (arguments.length) { | |
1360 case 0: return #(dartClosure); | |
1361 case 1: return #(dartClosure, arguments[0]); | |
1362 case 2: return #(dartClosure, arguments[0], arguments[1]); | |
1363 default: | |
1364 throw new Error('Unsupported number of arguments for wrapped closure'); | |
1365 } | |
1366 }""", | 1377 }""", |
| 1378 invokeClosure, |
1367 closure, | 1379 closure, |
1368 callClosure0, | 1380 JS_CURRENT_ISOLATE()); |
1369 callClosure1, | 1381 |
1370 callClosure2); | |
1371 JS('void', @'#.$identity = #', closure, function); | 1382 JS('void', @'#.$identity = #', closure, function); |
1372 return function; | 1383 return function; |
1373 } | 1384 } |
1374 | 1385 |
1375 /** | 1386 /** |
1376 * Helper methods when converting a Dart closure to a JS closure. | |
1377 */ | |
1378 callClosure0(closure) => closure(); | |
1379 callClosure1(closure, arg1) => closure(arg1); | |
1380 callClosure2(closure, arg1, arg2) => closure(arg1, arg2); | |
1381 | |
1382 /** | |
1383 * Super class for Dart closures. | 1387 * Super class for Dart closures. |
1384 */ | 1388 */ |
1385 class Closure implements Function { | 1389 class Closure implements Function { |
1386 String toString() => "Closure"; | 1390 String toString() => "Closure"; |
1387 } | 1391 } |
1388 | 1392 |
1389 bool jsHasOwnProperty(var jsObject, String property) { | 1393 bool jsHasOwnProperty(var jsObject, String property) { |
1390 return JS('bool', @'#.hasOwnProperty(#)', jsObject, property); | 1394 return JS('bool', @'#.hasOwnProperty(#)', jsObject, property); |
1391 } | 1395 } |
1392 | 1396 |
1393 jsPropertyAccess(var jsObject, String property) { | 1397 jsPropertyAccess(var jsObject, String property) { |
1394 return JS('var', @'#[#]', jsObject, property); | 1398 return JS('var', @'#[#]', jsObject, property); |
1395 } | 1399 } |
1396 | 1400 |
1397 /** | 1401 /** |
1398 * Called at the end of unaborted switch cases to get the singleton | 1402 * Called at the end of unaborted switch cases to get the singleton |
1399 * FallThroughError exception that will be thrown. | 1403 * FallThroughError exception that will be thrown. |
1400 */ | 1404 */ |
1401 getFallThroughError() => const FallThroughError(); | 1405 getFallThroughError() => const FallThroughError(); |
OLD | NEW |