| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library kernel.ast_from_binary; | 4 library kernel.ast_from_binary; |
| 5 | 5 |
| 6 import 'dart:convert'; | 6 import 'dart:convert'; |
| 7 import 'dart:typed_data'; | 7 import 'dart:typed_data'; |
| 8 | 8 |
| 9 import '../ast.dart'; | 9 import '../ast.dart'; |
| 10 import '../transformations/flags.dart'; | 10 import '../transformations/flags.dart'; |
| (...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 : (tagByte & Tag.SpecializedTagMask); | 658 : (tagByte & Tag.SpecializedTagMask); |
| 659 switch (tag) { | 659 switch (tag) { |
| 660 case Tag.LoadLibrary: | 660 case Tag.LoadLibrary: |
| 661 return new LoadLibrary(readDeferredImportReference()); | 661 return new LoadLibrary(readDeferredImportReference()); |
| 662 case Tag.CheckLibraryIsLoaded: | 662 case Tag.CheckLibraryIsLoaded: |
| 663 return new CheckLibraryIsLoaded(readDeferredImportReference()); | 663 return new CheckLibraryIsLoaded(readDeferredImportReference()); |
| 664 case Tag.InvalidExpression: | 664 case Tag.InvalidExpression: |
| 665 return new InvalidExpression(); | 665 return new InvalidExpression(); |
| 666 case Tag.VariableGet: | 666 case Tag.VariableGet: |
| 667 int offset = readOffset(); | 667 int offset = readOffset(); |
| 668 readUInt(); // offset of the variable declaration in the binary. |
| 668 return new VariableGet(readVariableReference(), readDartTypeOption()) | 669 return new VariableGet(readVariableReference(), readDartTypeOption()) |
| 669 ..fileOffset = offset; | 670 ..fileOffset = offset; |
| 670 case Tag.SpecializedVariableGet: | 671 case Tag.SpecializedVariableGet: |
| 671 int index = tagByte & Tag.SpecializedPayloadMask; | 672 int index = tagByte & Tag.SpecializedPayloadMask; |
| 672 int offset = readOffset(); | 673 int offset = readOffset(); |
| 674 readUInt(); // offset of the variable declaration in the binary. |
| 673 return new VariableGet(variableStack[index])..fileOffset = offset; | 675 return new VariableGet(variableStack[index])..fileOffset = offset; |
| 674 case Tag.VariableSet: | 676 case Tag.VariableSet: |
| 675 int offset = readOffset(); | 677 int offset = readOffset(); |
| 678 readUInt(); // offset of the variable declaration in the binary. |
| 676 return new VariableSet(readVariableReference(), readExpression()) | 679 return new VariableSet(readVariableReference(), readExpression()) |
| 677 ..fileOffset = offset; | 680 ..fileOffset = offset; |
| 678 case Tag.SpecializedVariableSet: | 681 case Tag.SpecializedVariableSet: |
| 679 int index = tagByte & Tag.SpecializedPayloadMask; | 682 int index = tagByte & Tag.SpecializedPayloadMask; |
| 680 int offset = readOffset(); | 683 int offset = readOffset(); |
| 684 readUInt(); // offset of the variable declaration in the binary. |
| 681 return new VariableSet(variableStack[index], readExpression()) | 685 return new VariableSet(variableStack[index], readExpression()) |
| 682 ..fileOffset = offset; | 686 ..fileOffset = offset; |
| 683 case Tag.PropertyGet: | 687 case Tag.PropertyGet: |
| 684 int offset = readOffset(); | 688 int offset = readOffset(); |
| 685 return new PropertyGet.byReference( | 689 return new PropertyGet.byReference( |
| 686 readExpression(), readName(), readMemberReference(allowNull: true)) | 690 readExpression(), readName(), readMemberReference(allowNull: true)) |
| 687 ..fileOffset = offset; | 691 ..fileOffset = offset; |
| 688 case Tag.PropertySet: | 692 case Tag.PropertySet: |
| 689 int offset = readOffset(); | 693 int offset = readOffset(); |
| 690 return new PropertySet.byReference(readExpression(), readName(), | 694 return new PropertySet.byReference(readExpression(), readName(), |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 return new ForInStatement(variable, iterable, body, isAsync: isAsync) | 946 return new ForInStatement(variable, iterable, body, isAsync: isAsync) |
| 943 ..fileOffset = offset; | 947 ..fileOffset = offset; |
| 944 case Tag.SwitchStatement: | 948 case Tag.SwitchStatement: |
| 945 var expression = readExpression(); | 949 var expression = readExpression(); |
| 946 int count = readUInt(); | 950 int count = readUInt(); |
| 947 List<SwitchCase> cases = | 951 List<SwitchCase> cases = |
| 948 new List<SwitchCase>.generate(count, (i) => new SwitchCase.empty()); | 952 new List<SwitchCase>.generate(count, (i) => new SwitchCase.empty()); |
| 949 switchCaseStack.addAll(cases); | 953 switchCaseStack.addAll(cases); |
| 950 for (int i = 0; i < cases.length; ++i) { | 954 for (int i = 0; i < cases.length; ++i) { |
| 951 var caseNode = cases[i]; | 955 var caseNode = cases[i]; |
| 952 _fillTreeNodeList(caseNode.expressions, readExpression, caseNode); | 956 int length = readUInt(); |
| 953 caseNode.expressionOffsets.length = caseNode.expressions.length; | 957 caseNode.expressions.length = length; |
| 954 for (int i = 0; i < caseNode.expressionOffsets.length; ++i) { | 958 caseNode.expressionOffsets.length = length; |
| 959 for (int i = 0; i < length; ++i) { |
| 955 caseNode.expressionOffsets[i] = readOffset(); | 960 caseNode.expressionOffsets[i] = readOffset(); |
| 961 caseNode.expressions[i] = readExpression()..parent = caseNode; |
| 956 } | 962 } |
| 957 caseNode.isDefault = readByte() == 1; | 963 caseNode.isDefault = readByte() == 1; |
| 958 caseNode.body = readStatement()..parent = caseNode; | 964 caseNode.body = readStatement()..parent = caseNode; |
| 959 } | 965 } |
| 960 switchCaseStack.length -= count; | 966 switchCaseStack.length -= count; |
| 961 return new SwitchStatement(expression, cases); | 967 return new SwitchStatement(expression, cases); |
| 962 case Tag.ContinueSwitchStatement: | 968 case Tag.ContinueSwitchStatement: |
| 963 int index = readUInt(); | 969 int index = readUInt(); |
| 964 return new ContinueSwitchStatement(switchCaseStack[index]); | 970 return new ContinueSwitchStatement(switchCaseStack[index]); |
| 965 case Tag.IfStatement: | 971 case Tag.IfStatement: |
| 966 return new IfStatement( | 972 return new IfStatement( |
| 967 readExpression(), readStatement(), readStatementOrNullIfEmpty()); | 973 readExpression(), readStatement(), readStatementOrNullIfEmpty()); |
| 968 case Tag.ReturnStatement: | 974 case Tag.ReturnStatement: |
| 969 int offset = readOffset(); | 975 int offset = readOffset(); |
| 970 return new ReturnStatement(readExpressionOption())..fileOffset = offset; | 976 return new ReturnStatement(readExpressionOption())..fileOffset = offset; |
| 971 case Tag.TryCatch: | 977 case Tag.TryCatch: |
| 972 return new TryCatch(readStatement(), readCatchList()); | 978 Statement body = readStatement(); |
| 979 readByte(); // whether any catch needs a stacktrace. |
| 980 return new TryCatch(body, readCatchList()); |
| 973 case Tag.TryFinally: | 981 case Tag.TryFinally: |
| 974 return new TryFinally(readStatement(), readStatement()); | 982 return new TryFinally(readStatement(), readStatement()); |
| 975 case Tag.YieldStatement: | 983 case Tag.YieldStatement: |
| 976 int offset = readOffset(); | 984 int offset = readOffset(); |
| 977 int flags = readByte(); | 985 int flags = readByte(); |
| 978 return new YieldStatement(readExpression(), | 986 return new YieldStatement(readExpression(), |
| 979 isYieldStar: flags & YieldStatement.FlagYieldStar != 0, | 987 isYieldStar: flags & YieldStatement.FlagYieldStar != 0, |
| 980 isNative: flags & YieldStatement.FlagNative != 0) | 988 isNative: flags & YieldStatement.FlagNative != 0) |
| 981 ..fileOffset = offset; | 989 ..fileOffset = offset; |
| 982 case Tag.VariableDeclaration: | 990 case Tag.VariableDeclaration: |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 case Tag.InterfaceType: | 1071 case Tag.InterfaceType: |
| 1064 return new InterfaceType.byReference( | 1072 return new InterfaceType.byReference( |
| 1065 readClassReference(), readDartTypeList()); | 1073 readClassReference(), readDartTypeList()); |
| 1066 case Tag.SimpleInterfaceType: | 1074 case Tag.SimpleInterfaceType: |
| 1067 return new InterfaceType.byReference( | 1075 return new InterfaceType.byReference( |
| 1068 readClassReference(), const <DartType>[]); | 1076 readClassReference(), const <DartType>[]); |
| 1069 case Tag.FunctionType: | 1077 case Tag.FunctionType: |
| 1070 int typeParameterStackHeight = typeParameterStack.length; | 1078 int typeParameterStackHeight = typeParameterStack.length; |
| 1071 var typeParameters = readAndPushTypeParameterList(); | 1079 var typeParameters = readAndPushTypeParameterList(); |
| 1072 var requiredParameterCount = readUInt(); | 1080 var requiredParameterCount = readUInt(); |
| 1081 var totalParameterCount = readUInt(); |
| 1073 var positional = readDartTypeList(); | 1082 var positional = readDartTypeList(); |
| 1074 var named = readNamedTypeList(); | 1083 var named = readNamedTypeList(); |
| 1084 assert(positional.length + named.length == totalParameterCount); |
| 1075 var returnType = readDartType(); | 1085 var returnType = readDartType(); |
| 1076 typeParameterStack.length = typeParameterStackHeight; | 1086 typeParameterStack.length = typeParameterStackHeight; |
| 1077 return new FunctionType(positional, returnType, | 1087 return new FunctionType(positional, returnType, |
| 1078 typeParameters: typeParameters, | 1088 typeParameters: typeParameters, |
| 1079 requiredParameterCount: requiredParameterCount, | 1089 requiredParameterCount: requiredParameterCount, |
| 1080 namedParameters: named); | 1090 namedParameters: named); |
| 1081 case Tag.SimpleFunctionType: | 1091 case Tag.SimpleFunctionType: |
| 1082 var positional = readDartTypeList(); | 1092 var positional = readDartTypeList(); |
| 1083 var returnType = readDartType(); | 1093 var returnType = readDartType(); |
| 1084 return new FunctionType(positional, returnType); | 1094 return new FunctionType(positional, returnType); |
| 1085 case Tag.TypeParameterType: | 1095 case Tag.TypeParameterType: |
| 1086 int index = readUInt(); | 1096 int index = readUInt(); |
| 1097 readUInt(); // offset of the TypeParameter declaration in the binary. |
| 1087 var bound = readDartTypeOption(); | 1098 var bound = readDartTypeOption(); |
| 1088 return new TypeParameterType(typeParameterStack[index], bound); | 1099 return new TypeParameterType(typeParameterStack[index], bound); |
| 1089 default: | 1100 default: |
| 1090 throw fail('Invalid dart type tag: $tag'); | 1101 throw fail('Invalid dart type tag: $tag'); |
| 1091 } | 1102 } |
| 1092 } | 1103 } |
| 1093 | 1104 |
| 1094 List<TypeParameter> readAndPushTypeParameterList( | 1105 List<TypeParameter> readAndPushTypeParameterList( |
| 1095 [List<TypeParameter> list, TreeNode parent]) { | 1106 [List<TypeParameter> list, TreeNode parent]) { |
| 1096 int length = readUInt(); | 1107 int length = readUInt(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1110 } | 1121 } |
| 1111 return list; | 1122 return list; |
| 1112 } | 1123 } |
| 1113 | 1124 |
| 1114 void readTypeParameter(TypeParameter node) { | 1125 void readTypeParameter(TypeParameter node) { |
| 1115 node.name = readStringOrNullIfEmpty(); | 1126 node.name = readStringOrNullIfEmpty(); |
| 1116 node.bound = readDartType(); | 1127 node.bound = readDartType(); |
| 1117 } | 1128 } |
| 1118 | 1129 |
| 1119 Arguments readArguments() { | 1130 Arguments readArguments() { |
| 1131 var numArguments = readUInt(); |
| 1120 var typeArguments = readDartTypeList(); | 1132 var typeArguments = readDartTypeList(); |
| 1121 var positional = readExpressionList(); | 1133 var positional = readExpressionList(); |
| 1122 var named = readNamedExpressionList(); | 1134 var named = readNamedExpressionList(); |
| 1135 assert(numArguments == positional.length + named.length); |
| 1123 return new Arguments(positional, types: typeArguments, named: named); | 1136 return new Arguments(positional, types: typeArguments, named: named); |
| 1124 } | 1137 } |
| 1125 | 1138 |
| 1126 List<NamedExpression> readNamedExpressionList() { | 1139 List<NamedExpression> readNamedExpressionList() { |
| 1127 return new List<NamedExpression>.generate( | 1140 return new List<NamedExpression>.generate( |
| 1128 readUInt(), (i) => readNamedExpression()); | 1141 readUInt(), (i) => readNamedExpression()); |
| 1129 } | 1142 } |
| 1130 | 1143 |
| 1131 NamedExpression readNamedExpression() { | 1144 NamedExpression readNamedExpression() { |
| 1132 return new NamedExpression(readStringReference(), readExpression()); | 1145 return new NamedExpression(readStringReference(), readExpression()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1159 ..fileOffset = offset | 1172 ..fileOffset = offset |
| 1160 ..fileEqualsOffset = fileEqualsOffset; | 1173 ..fileEqualsOffset = fileEqualsOffset; |
| 1161 } | 1174 } |
| 1162 | 1175 |
| 1163 int readOffset() { | 1176 int readOffset() { |
| 1164 // Offset is saved as unsigned, | 1177 // Offset is saved as unsigned, |
| 1165 // but actually ranges from -1 and up (thus the -1) | 1178 // but actually ranges from -1 and up (thus the -1) |
| 1166 return readUInt() - 1; | 1179 return readUInt() - 1; |
| 1167 } | 1180 } |
| 1168 } | 1181 } |
| OLD | NEW |