| 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 class SsaCodeGeneratorTask extends CompilerTask { | 5 class SsaCodeGeneratorTask extends CompilerTask { |
| 6 SsaCodeGeneratorTask(Compiler compiler) : super(compiler); | 6 SsaCodeGeneratorTask(Compiler compiler) : super(compiler); |
| 7 String get name() => 'SSA code generator'; | 7 String get name() => 'SSA code generator'; |
| 8 | 8 |
| 9 String generate(WorkItem work, HGraph graph) { | 9 String generate(WorkItem work, HGraph graph) { |
| 10 return measure(() { | 10 return measure(() { |
| (...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 use(node.inputs[0], JSPrecedence.EXPRESSION_PRECEDENCE); | 708 use(node.inputs[0], JSPrecedence.EXPRESSION_PRECEDENCE); |
| 709 buffer.add(';\n'); | 709 buffer.add(';\n'); |
| 710 } | 710 } |
| 711 } | 711 } |
| 712 | 712 |
| 713 visitThis(HThis node) { | 713 visitThis(HThis node) { |
| 714 buffer.add('this'); | 714 buffer.add('this'); |
| 715 } | 715 } |
| 716 | 716 |
| 717 visitThrow(HThrow node) { | 717 visitThrow(HThrow node) { |
| 718 buffer.add('throw '); | 718 // Make sure that the toString interceptor is emitted so the JS |
| 719 use(node.inputs[0], JSPrecedence.EXPRESSION_PRECEDENCE); | 719 // toString method can call it. |
| 720 Element toStringHelper = |
| 721 compiler.findHelper(new SourceString(@'builtin$toString$0')); |
| 722 compiler.registerStaticUse(toStringHelper); |
| 723 generateThrowWithHelper('captureStackTrace', node.inputs[0]); |
| 720 buffer.add(';\n'); | 724 buffer.add(';\n'); |
| 721 } | 725 } |
| 722 | 726 |
| 723 visitBoundsCheck(HBoundsCheck node) { | 727 visitBoundsCheck(HBoundsCheck node) { |
| 724 buffer.add('if ('); | 728 buffer.add('if ('); |
| 725 use(node.index, JSPrecedence.RELATIONAL_PRECEDENCE); | 729 use(node.index, JSPrecedence.RELATIONAL_PRECEDENCE); |
| 726 buffer.add(' < 0 || '); | 730 buffer.add(' < 0 || '); |
| 727 use(node.index, JSPrecedence.RELATIONAL_PRECEDENCE); | 731 use(node.index, JSPrecedence.RELATIONAL_PRECEDENCE); |
| 728 buffer.add(' >= '); | 732 buffer.add(' >= '); |
| 729 use(node.length, JSPrecedence.SHIFT_PRECEDENCE); | 733 use(node.length, JSPrecedence.SHIFT_PRECEDENCE); |
| 730 buffer.add(") "); | 734 buffer.add(") "); |
| 731 generateFail('ioore', node.index); | 735 generateThrowWithHelper('ioore', node.index); |
| 732 } | 736 } |
| 733 | 737 |
| 734 visitIntegerCheck(HIntegerCheck node) { | 738 visitIntegerCheck(HIntegerCheck node) { |
| 735 buffer.add('if ('); | 739 buffer.add('if ('); |
| 736 use(node.value, JSPrecedence.EQUALITY_PRECEDENCE); | 740 use(node.value, JSPrecedence.EQUALITY_PRECEDENCE); |
| 737 buffer.add(' !== ('); | 741 buffer.add(' !== ('); |
| 738 use(node.value, JSPrecedence.BITWISE_OR_PRECEDENCE); | 742 use(node.value, JSPrecedence.BITWISE_OR_PRECEDENCE); |
| 739 buffer.add(" | 0)) "); | 743 buffer.add(" | 0)) "); |
| 740 generateFail('iae', node.value); | 744 generateThrowWithHelper('iae', node.value); |
| 741 } | 745 } |
| 742 | 746 |
| 743 void generateFail(String helperName, HInstruction argument) { | 747 void generateThrowWithHelper(String helperName, HInstruction argument) { |
| 744 Element helper = compiler.findHelper(new SourceString(helperName)); | 748 Element helper = compiler.findHelper(new SourceString(helperName)); |
| 745 compiler.registerStaticUse(helper); | 749 compiler.registerStaticUse(helper); |
| 746 buffer.add('throw '); | 750 buffer.add('throw '); |
| 747 beginExpression(JSPrecedence.EXPRESSION_PRECEDENCE); | 751 beginExpression(JSPrecedence.EXPRESSION_PRECEDENCE); |
| 748 beginExpression(JSPrecedence.CALL_PRECEDENCE); | 752 beginExpression(JSPrecedence.CALL_PRECEDENCE); |
| 749 buffer.add(compiler.namer.isolateAccess(helper)); | 753 buffer.add(compiler.namer.isolateAccess(helper)); |
| 750 visitArguments([null, argument]); | 754 visitArguments([null, argument]); |
| 751 endExpression(JSPrecedence.CALL_PRECEDENCE); | 755 endExpression(JSPrecedence.CALL_PRECEDENCE); |
| 752 endExpression(JSPrecedence.EXPRESSION_PRECEDENCE); | 756 endExpression(JSPrecedence.EXPRESSION_PRECEDENCE); |
| 753 } | 757 } |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 } else if (element == coreLibrary.find(const SourceString('bool'))) { | 921 } else if (element == coreLibrary.find(const SourceString('bool'))) { |
| 918 checkBool(input, '==='); | 922 checkBool(input, '==='); |
| 919 } else if (element == coreLibrary.find(const SourceString('int'))) { | 923 } else if (element == coreLibrary.find(const SourceString('int'))) { |
| 920 beginExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); | 924 beginExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); |
| 921 checkNum(input, '==='); | 925 checkNum(input, '==='); |
| 922 buffer.add(' && '); | 926 buffer.add(' && '); |
| 923 checkInt(input, '==='); | 927 checkInt(input, '==='); |
| 924 endExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); | 928 endExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); |
| 925 } else { | 929 } else { |
| 926 beginExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); | 930 beginExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); |
| 931 if (isStringSupertype(element)) { |
| 932 checkString(input, '==='); |
| 933 buffer.add(' || '); |
| 934 } |
| 927 checkObject(input, '==='); | 935 checkObject(input, '==='); |
| 928 buffer.add(' && '); | 936 buffer.add(' && '); |
| 929 int precedence = JSPrecedence.PREFIX_PRECEDENCE; | 937 int precedence = JSPrecedence.PREFIX_PRECEDENCE; |
| 930 bool endParen = false; | 938 bool endParen = false; |
| 931 if (element == coreLibrary.find(const SourceString('List'))) { | 939 if (isListOrSupertype(element)) { |
| 932 buffer.add("("); | 940 buffer.add("("); |
| 933 endParen = true; | 941 endParen = true; |
| 934 beginExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); | 942 beginExpression(JSPrecedence.LOGICAL_OR_PRECEDENCE); |
| 935 checkObject(input, '==='); | |
| 936 buffer.add(' && '); | |
| 937 checkArray(input, '==='); | 943 checkArray(input, '==='); |
| 938 buffer.add(' || '); | 944 buffer.add(' || '); |
| 939 precedence = JSPrecedence.LOGICAL_OR_PRECEDENCE; | 945 precedence = JSPrecedence.LOGICAL_OR_PRECEDENCE; |
| 940 } else { | 946 } else { |
| 941 beginExpression(precedence); | 947 beginExpression(precedence); |
| 942 } | 948 } |
| 943 buffer.add('!!'); | 949 buffer.add('!!'); |
| 944 use(input, JSPrecedence.MEMBER_PRECEDENCE); | 950 use(input, JSPrecedence.MEMBER_PRECEDENCE); |
| 945 buffer.add('.'); | 951 buffer.add('.'); |
| 946 buffer.add(compiler.namer.operatorIs(node.typeExpression)); | 952 buffer.add(compiler.namer.operatorIs(node.typeExpression)); |
| 947 endExpression(precedence); | 953 endExpression(precedence); |
| 948 if (endParen) buffer.add(')'); | 954 if (endParen) buffer.add(')'); |
| 949 endExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); | 955 endExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); |
| 950 } | 956 } |
| 951 } | 957 } |
| 958 |
| 959 bool isStringSupertype(ClassElement cls) { |
| 960 LibraryElement coreLibrary = compiler.coreLibrary; |
| 961 return (cls == coreLibrary.find(const SourceString('Comparable'))) |
| 962 || (cls == coreLibrary.find(const SourceString('Hashable'))) |
| 963 || (cls == coreLibrary.find(const SourceString('Pattern'))); |
| 964 } |
| 965 |
| 966 bool isListOrSupertype(ClassElement cls) { |
| 967 LibraryElement coreLibrary = compiler.coreLibrary; |
| 968 return (cls == coreLibrary.find(const SourceString('List'))) |
| 969 || (cls == coreLibrary.find(const SourceString('Collection'))) |
| 970 || (cls == coreLibrary.find(const SourceString('Iterable'))); |
| 971 } |
| 952 } | 972 } |
| 953 | 973 |
| 954 class SsaOptimizedCodeGenerator extends SsaCodeGenerator { | 974 class SsaOptimizedCodeGenerator extends SsaCodeGenerator { |
| 955 final List<HTypeGuard> guards; | 975 final List<HTypeGuard> guards; |
| 956 int state = 0; | 976 int state = 0; |
| 957 | 977 |
| 958 SsaOptimizedCodeGenerator(compiler, work, buffer, parameters, parameterNames) | 978 SsaOptimizedCodeGenerator(compiler, work, buffer, parameters, parameterNames) |
| 959 : super(compiler, work, buffer, parameters, parameterNames), | 979 : super(compiler, work, buffer, parameters, parameterNames), |
| 960 guards = <HTypeGuard>[]; | 980 guards = <HTypeGuard>[]; |
| 961 | 981 |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1309 startBailoutSwitch(); | 1329 startBailoutSwitch(); |
| 1310 } | 1330 } |
| 1311 } | 1331 } |
| 1312 | 1332 |
| 1313 void endElse(HIf node) { | 1333 void endElse(HIf node) { |
| 1314 if (node.elseBlock.hasBailouts()) { | 1334 if (node.elseBlock.hasBailouts()) { |
| 1315 endBailoutSwitch(); | 1335 endBailoutSwitch(); |
| 1316 } | 1336 } |
| 1317 } | 1337 } |
| 1318 } | 1338 } |
| OLD | NEW |