| 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 dart2js.compile_time_constant_evaluator; | 5 library dart2js.compile_time_constant_evaluator; |
| 6 | 6 |
| 7 import 'constant_system_dart.dart'; | 7 import 'constant_system_dart.dart'; |
| 8 import 'constants/constant_system.dart'; | 8 import 'constants/constant_system.dart'; |
| 9 import 'constants/expressions.dart'; | 9 import 'constants/expressions.dart'; |
| 10 import 'constants/values.dart'; | 10 import 'constants/values.dart'; |
| (...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 748 evaluateArgumentsToConstructor( | 748 evaluateArgumentsToConstructor( |
| 749 node, callStructure, send.arguments, constructor.implementation, | 749 node, callStructure, send.arguments, constructor.implementation, |
| 750 compileArgument: (node) => concreteArgumentMap[node]); | 750 compileArgument: (node) => concreteArgumentMap[node]); |
| 751 List<AstConstant> concreteArguments = | 751 List<AstConstant> concreteArguments = |
| 752 concreteArgumentMap.values.toList(); | 752 concreteArgumentMap.values.toList(); |
| 753 | 753 |
| 754 if (constructor == compiler.intEnvironment || | 754 if (constructor == compiler.intEnvironment || |
| 755 constructor == compiler.boolEnvironment || | 755 constructor == compiler.boolEnvironment || |
| 756 constructor == compiler.stringEnvironment) { | 756 constructor == compiler.stringEnvironment) { |
| 757 | 757 |
| 758 AstConstant createEvaluatedConstant(ConstantValue value) { | |
| 759 return new AstConstant( | |
| 760 context, node, new ConstructedConstantExpression( | |
| 761 value, | |
| 762 type, | |
| 763 constructor, | |
| 764 elements.getSelector(send).callStructure, | |
| 765 concreteArguments.map((e) => e.expression).toList())); | |
| 766 } | |
| 767 | |
| 768 var firstArgument = normalizedArguments[0].value; | 758 var firstArgument = normalizedArguments[0].value; |
| 769 ConstantValue defaultValue = normalizedArguments[1].value; | 759 ConstantValue defaultValue = normalizedArguments[1].value; |
| 770 | 760 |
| 771 if (firstArgument.isNull) { | 761 if (firstArgument.isNull) { |
| 772 compiler.reportError( | 762 compiler.reportError( |
| 773 send.arguments.head, MessageKind.NULL_NOT_ALLOWED); | 763 send.arguments.head, MessageKind.NULL_NOT_ALLOWED); |
| 774 return null; | 764 return null; |
| 775 } | 765 } |
| 776 | 766 |
| 777 if (!firstArgument.isString) { | 767 if (!firstArgument.isString) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 802 | 792 |
| 803 if (constructor == compiler.stringEnvironment && | 793 if (constructor == compiler.stringEnvironment && |
| 804 !(defaultValue.isNull || defaultValue.isString)) { | 794 !(defaultValue.isNull || defaultValue.isString)) { |
| 805 DartType type = defaultValue.getType(compiler.coreTypes); | 795 DartType type = defaultValue.getType(compiler.coreTypes); |
| 806 compiler.reportError( | 796 compiler.reportError( |
| 807 send.arguments.tail.head, MessageKind.NOT_ASSIGNABLE, | 797 send.arguments.tail.head, MessageKind.NOT_ASSIGNABLE, |
| 808 {'fromType': type, 'toType': compiler.stringClass.rawType}); | 798 {'fromType': type, 'toType': compiler.stringClass.rawType}); |
| 809 return null; | 799 return null; |
| 810 } | 800 } |
| 811 | 801 |
| 802 String name = |
| 803 firstArgument.primitiveValue.slowToString(); |
| 812 String value = | 804 String value = |
| 813 compiler.fromEnvironment(firstArgument.primitiveValue.slowToString()); | 805 compiler.fromEnvironment(name); |
| 806 |
| 807 AstConstant createEvaluatedConstant(ConstantValue value) { |
| 808 |
| 809 ConstantExpression expression; |
| 810 if (constructor == compiler.intEnvironment) { |
| 811 expression = new IntFromEnvironmentConstantExpression( |
| 812 value, name, normalizedArguments[1].expression); |
| 813 } else if (constructor == compiler.boolEnvironment) { |
| 814 expression = new BoolFromEnvironmentConstantExpression( |
| 815 value, name, normalizedArguments[1].expression); |
| 816 } else if (constructor == compiler.stringEnvironment) { |
| 817 expression = new StringFromEnvironmentConstantExpression( |
| 818 value, name, normalizedArguments[1].expression); |
| 819 } |
| 820 return new AstConstant(context, node, expression); |
| 821 } |
| 814 | 822 |
| 815 if (value == null) { | 823 if (value == null) { |
| 816 return createEvaluatedConstant(defaultValue); | 824 return createEvaluatedConstant(defaultValue); |
| 817 } else if (constructor == compiler.intEnvironment) { | 825 } else if (constructor == compiler.intEnvironment) { |
| 818 int number = int.parse(value, onError: (_) => null); | 826 int number = int.parse(value, onError: (_) => null); |
| 819 return createEvaluatedConstant( | 827 return createEvaluatedConstant( |
| 820 (number == null) | 828 (number == null) |
| 821 ? defaultValue | 829 ? defaultValue |
| 822 : constantSystem.createInt(number)); | 830 : constantSystem.createInt(number)); |
| 823 } else if (constructor == compiler.boolEnvironment) { | 831 } else if (constructor == compiler.boolEnvironment) { |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1147 ConstantValue get value => expression.value; | 1155 ConstantValue get value => expression.value; |
| 1148 | 1156 |
| 1149 String toString() => expression.toString(); | 1157 String toString() => expression.toString(); |
| 1150 } | 1158 } |
| 1151 | 1159 |
| 1152 /// A synthetic constant used to recover from errors. | 1160 /// A synthetic constant used to recover from errors. |
| 1153 class ErroneousAstConstant extends AstConstant { | 1161 class ErroneousAstConstant extends AstConstant { |
| 1154 ErroneousAstConstant(Element element, Node node) | 1162 ErroneousAstConstant(Element element, Node node) |
| 1155 : super(element, node, new ErroneousConstantExpression()); | 1163 : super(element, node, new ErroneousConstantExpression()); |
| 1156 } | 1164 } |
| OLD | NEW |