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 |