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 'dart:collection'; | 7 import 'dart:collection'; |
8 import 'dart:_foreign_helper' show DART_CLOSURE_TO_JS, | 8 import 'dart:_foreign_helper' show DART_CLOSURE_TO_JS, |
9 JS, | 9 JS, |
10 JS_CALL_IN_ISOLATE, | 10 JS_CALL_IN_ISOLATE, |
11 JS_CURRENT_ISOLATE, | 11 JS_CURRENT_ISOLATE, |
| 12 JS_CURRENT_ISOLATE_CONTEXT, |
12 JS_DART_OBJECT_CONSTRUCTOR, | 13 JS_DART_OBJECT_CONSTRUCTOR, |
| 14 JS_OPERATOR_AS_PREFIX, |
13 JS_OPERATOR_IS_PREFIX, | 15 JS_OPERATOR_IS_PREFIX, |
14 JS_OPERATOR_AS_PREFIX, | |
15 RAW_DART_FUNCTION_REF; | 16 RAW_DART_FUNCTION_REF; |
16 import 'dart:_interceptors'; | 17 import 'dart:_interceptors'; |
17 import "dart:_collection-dev" as _symbol_dev; | 18 import "dart:_collection-dev" as _symbol_dev; |
18 | 19 |
19 part 'constant_map.dart'; | 20 part 'constant_map.dart'; |
20 part 'native_helper.dart'; | 21 part 'native_helper.dart'; |
21 part 'regexp_helper.dart'; | 22 part 'regexp_helper.dart'; |
22 part 'string_helper.dart'; | 23 part 'string_helper.dart'; |
23 part 'js_rti.dart'; | 24 part 'js_rti.dart'; |
24 | 25 |
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 | 582 |
582 static getConstructor(String className) { | 583 static getConstructor(String className) { |
583 // TODO(ahe): Generalize this and improve test coverage of | 584 // TODO(ahe): Generalize this and improve test coverage of |
584 // reflecting on intercepted classes. | 585 // reflecting on intercepted classes. |
585 if (JS('bool', '# == "String"', className)) return const JSString(); | 586 if (JS('bool', '# == "String"', className)) return const JSString(); |
586 if (JS('bool', '# == "int"', int)) return const JSInt(); | 587 if (JS('bool', '# == "int"', int)) return const JSInt(); |
587 if (JS('bool', '# == "double"', int)) return const JSDouble(); | 588 if (JS('bool', '# == "double"', int)) return const JSDouble(); |
588 if (JS('bool', '# == "num"', int)) return const JSNumber(); | 589 if (JS('bool', '# == "num"', int)) return const JSNumber(); |
589 if (JS('bool', '# == "bool"', int)) return const JSBool(); | 590 if (JS('bool', '# == "bool"', int)) return const JSBool(); |
590 if (JS('bool', '# == "List"', int)) return const JSArray(); | 591 if (JS('bool', '# == "List"', int)) return const JSArray(); |
591 // TODO(ahe): How to safely access $? | 592 return JS('var', '#[#]', JS_CURRENT_ISOLATE(), className); |
592 return JS('var', r'$[#]', className); | |
593 } | 593 } |
594 | 594 |
595 static bool identicalImplementation(a, b) { | 595 static bool identicalImplementation(a, b) { |
596 return JS('bool', '# == null', a) | 596 return JS('bool', '# == null', a) |
597 ? JS('bool', '# == null', b) | 597 ? JS('bool', '# == null', b) |
598 : JS('bool', '# === #', a, b); | 598 : JS('bool', '# === #', a, b); |
599 } | 599 } |
600 } | 600 } |
601 | 601 |
602 /** | 602 /** |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 // compiler and/or minifier. | 937 // compiler and/or minifier. |
938 function = JS('var', | 938 function = JS('var', |
939 r'(function ($2, $3) {' | 939 r'(function ($2, $3) {' |
940 r' return function($0, $1) { ' | 940 r' return function($0, $1) { ' |
941 r'return $3(#, $2, #, $0, $1) }})(#, #)', | 941 r'return $3(#, $2, #, $0, $1) }})(#, #)', |
942 closure, | 942 closure, |
943 arity, | 943 arity, |
944 // Capture the current isolate now. Remember that "#" | 944 // Capture the current isolate now. Remember that "#" |
945 // in JS is simply textual substitution of compiled | 945 // in JS is simply textual substitution of compiled |
946 // expressions. | 946 // expressions. |
947 JS_CURRENT_ISOLATE(), | 947 JS_CURRENT_ISOLATE_CONTEXT(), |
948 DART_CLOSURE_TO_JS(invokeClosure)); | 948 DART_CLOSURE_TO_JS(invokeClosure)); |
949 | 949 |
950 JS('void', r'#.$identity = #', closure, function); | 950 JS('void', r'#.$identity = #', closure, function); |
951 return function; | 951 return function; |
952 } | 952 } |
953 | 953 |
954 /** | 954 /** |
955 * Super class for Dart closures. | 955 * Super class for Dart closures. |
956 */ | 956 */ |
957 class Closure implements Function { | 957 class Closure implements Function { |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1416 expectedArgumentNames); | 1416 expectedArgumentNames); |
1417 } | 1417 } |
1418 | 1418 |
1419 /** | 1419 /** |
1420 * Called by generated code when a static field's initializer references the | 1420 * Called by generated code when a static field's initializer references the |
1421 * field that is currently being initialized. | 1421 * field that is currently being initialized. |
1422 */ | 1422 */ |
1423 void throwCyclicInit(String staticName) { | 1423 void throwCyclicInit(String staticName) { |
1424 throw new RuntimeError("Cyclic initialization for static $staticName"); | 1424 throw new RuntimeError("Cyclic initialization for static $staticName"); |
1425 } | 1425 } |
OLD | NEW |