OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 import 'dart:collection' show Queue; | 5 import 'dart:collection' show Queue; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/backend_api.dart' show ForeignResolver; | 8 import '../common/backend_api.dart' show ForeignResolver; |
9 import '../common/registry.dart' show Registry; | 9 import '../common/registry.dart' show Registry; |
10 import '../common/resolution.dart' show Resolution; | 10 import '../common/resolution.dart' show Resolution; |
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 backend.nativeData.setNativeMemberName(element, name); | 459 backend.nativeData.setNativeMemberName(element, name); |
460 } | 460 } |
461 } | 461 } |
462 | 462 |
463 bool isIdentifier(String s) => _identifier.hasMatch(s); | 463 bool isIdentifier(String s) => _identifier.hasMatch(s); |
464 | 464 |
465 bool isNativeMethod(FunctionElementX element) { | 465 bool isNativeMethod(FunctionElementX element) { |
466 if (!backend.canLibraryUseNative(element.library)) return false; | 466 if (!backend.canLibraryUseNative(element.library)) return false; |
467 // Native method? | 467 // Native method? |
468 return reporter.withCurrentElement(element, () { | 468 return reporter.withCurrentElement(element, () { |
469 Node node = element.parseNode(resolution.parsing); | 469 Node node = element.parseNode(resolution.parsingContext); |
470 if (node is! FunctionExpression) return false; | 470 if (node is! FunctionExpression) return false; |
471 FunctionExpression functionExpression = node; | 471 FunctionExpression functionExpression = node; |
472 node = functionExpression.body; | 472 node = functionExpression.body; |
473 Token token = node.getBeginToken(); | 473 Token token = node.getBeginToken(); |
474 if (identical(token.stringValue, 'native')) return true; | 474 if (identical(token.stringValue, 'native')) return true; |
475 return false; | 475 return false; |
476 }); | 476 }); |
477 } | 477 } |
478 | 478 |
479 void registerNativeBehavior(NativeBehavior nativeBehavior, cause) { | 479 void registerNativeBehavior(NativeBehavior nativeBehavior, cause) { |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 * Handles JS-calls, which can be an instantiation point for types. | 608 * Handles JS-calls, which can be an instantiation point for types. |
609 * | 609 * |
610 * For example, the following code instantiates and returns native classes | 610 * For example, the following code instantiates and returns native classes |
611 * that are `_DOMWindowImpl` or a subtype. | 611 * that are `_DOMWindowImpl` or a subtype. |
612 * | 612 * |
613 * JS('_DOMWindowImpl', 'window') | 613 * JS('_DOMWindowImpl', 'window') |
614 * | 614 * |
615 */ | 615 */ |
616 void registerJsCall(Send node, ForeignResolver resolver) { | 616 void registerJsCall(Send node, ForeignResolver resolver) { |
617 NativeBehavior behavior = NativeBehavior.ofJsCall( | 617 NativeBehavior behavior = NativeBehavior.ofJsCall( |
618 node, reporter, compiler.parsing, compiler.coreTypes, resolver); | 618 node, reporter, compiler.parsingContext, compiler.coreTypes, resolver); |
619 registerNativeBehavior(behavior, node); | 619 registerNativeBehavior(behavior, node); |
620 nativeBehaviors[node] = behavior; | 620 nativeBehaviors[node] = behavior; |
621 } | 621 } |
622 | 622 |
623 /** | 623 /** |
624 * Handles JS-embedded global calls, which can be an instantiation point for | 624 * Handles JS-embedded global calls, which can be an instantiation point for |
625 * types. | 625 * types. |
626 * | 626 * |
627 * For example, the following code instantiates and returns a String class | 627 * For example, the following code instantiates and returns a String class |
628 * | 628 * |
629 * JS_EMBEDDED_GLOBAL('String', 'foo') | 629 * JS_EMBEDDED_GLOBAL('String', 'foo') |
630 * | 630 * |
631 */ | 631 */ |
632 void registerJsEmbeddedGlobalCall(Send node, ForeignResolver resolver) { | 632 void registerJsEmbeddedGlobalCall(Send node, ForeignResolver resolver) { |
633 NativeBehavior behavior = NativeBehavior.ofJsEmbeddedGlobalCall( | 633 NativeBehavior behavior = NativeBehavior.ofJsEmbeddedGlobalCall( |
634 node, reporter, compiler.parsing, compiler.coreTypes, resolver); | 634 node, reporter, compiler.parsingContext, compiler.coreTypes, resolver); |
635 registerNativeBehavior(behavior, node); | 635 registerNativeBehavior(behavior, node); |
636 nativeBehaviors[node] = behavior; | 636 nativeBehaviors[node] = behavior; |
637 } | 637 } |
638 | 638 |
639 /** | 639 /** |
640 * Handles JS-compiler builtin calls, which can be an instantiation point for | 640 * Handles JS-compiler builtin calls, which can be an instantiation point for |
641 * types. | 641 * types. |
642 * | 642 * |
643 * For example, the following code instantiates and returns a String class | 643 * For example, the following code instantiates and returns a String class |
644 * | 644 * |
645 * JS_BUILTIN('String', 'int2string', 0) | 645 * JS_BUILTIN('String', 'int2string', 0) |
646 * | 646 * |
647 */ | 647 */ |
648 void registerJsBuiltinCall(Send node, ForeignResolver resolver) { | 648 void registerJsBuiltinCall(Send node, ForeignResolver resolver) { |
649 NativeBehavior behavior = NativeBehavior.ofJsBuiltinCall( | 649 NativeBehavior behavior = NativeBehavior.ofJsBuiltinCall( |
650 node, reporter, compiler.parsing, compiler.coreTypes, resolver); | 650 node, reporter, compiler.parsingContext, compiler.coreTypes, resolver); |
651 registerNativeBehavior(behavior, node); | 651 registerNativeBehavior(behavior, node); |
652 nativeBehaviors[node] = behavior; | 652 nativeBehaviors[node] = behavior; |
653 } | 653 } |
654 } | 654 } |
655 | 655 |
656 class NativeCodegenEnqueuer extends NativeEnqueuerBase { | 656 class NativeCodegenEnqueuer extends NativeEnqueuerBase { |
657 final CodeEmitterTask emitter; | 657 final CodeEmitterTask emitter; |
658 | 658 |
659 final Set<ClassElement> doneAddSubtypes = new Set<ClassElement>(); | 659 final Set<ClassElement> doneAddSubtypes = new Set<ClassElement>(); |
660 | 660 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 List<Element> directSubtypes = | 708 List<Element> directSubtypes = |
709 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassElement>[]); | 709 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassElement>[]); |
710 directSubtypes.add(cls); | 710 directSubtypes.add(cls); |
711 } | 711 } |
712 | 712 |
713 void logSummary(log(message)) { | 713 void logSummary(log(message)) { |
714 log('Compiled ${registeredClasses.length} native classes, ' | 714 log('Compiled ${registeredClasses.length} native classes, ' |
715 '${unusedClasses.length} native classes omitted.'); | 715 '${unusedClasses.length} native classes omitted.'); |
716 } | 716 } |
717 } | 717 } |
OLD | NEW |