Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(439)

Side by Side Diff: pkg/kernel/lib/binary/ast_from_binary.dart

Issue 2854393002: [kernel] [partial] Streaming of kernel binary without AST nodes (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 return new TypeParameterType(typeParameterStack[index]); 1098 return new TypeParameterType(typeParameterStack[index]);
1088 default: 1099 default:
1089 throw fail('Invalid dart type tag: $tag'); 1100 throw fail('Invalid dart type tag: $tag');
1090 } 1101 }
1091 } 1102 }
1092 1103
1093 List<TypeParameter> readAndPushTypeParameterList( 1104 List<TypeParameter> readAndPushTypeParameterList(
1094 [List<TypeParameter> list, TreeNode parent]) { 1105 [List<TypeParameter> list, TreeNode parent]) {
1095 int length = readUInt(); 1106 int length = readUInt();
1096 if (length == 0) return list ?? <TypeParameter>[]; 1107 if (length == 0) return list ?? <TypeParameter>[];
(...skipping 12 matching lines...) Expand all
1109 } 1120 }
1110 return list; 1121 return list;
1111 } 1122 }
1112 1123
1113 void readTypeParameter(TypeParameter node) { 1124 void readTypeParameter(TypeParameter node) {
1114 node.name = readStringOrNullIfEmpty(); 1125 node.name = readStringOrNullIfEmpty();
1115 node.bound = readDartType(); 1126 node.bound = readDartType();
1116 } 1127 }
1117 1128
1118 Arguments readArguments() { 1129 Arguments readArguments() {
1130 var numArguments = readUInt();
1119 var typeArguments = readDartTypeList(); 1131 var typeArguments = readDartTypeList();
1120 var positional = readExpressionList(); 1132 var positional = readExpressionList();
1121 var named = readNamedExpressionList(); 1133 var named = readNamedExpressionList();
1134 assert(numArguments == positional.length + named.length);
1122 return new Arguments(positional, types: typeArguments, named: named); 1135 return new Arguments(positional, types: typeArguments, named: named);
1123 } 1136 }
1124 1137
1125 List<NamedExpression> readNamedExpressionList() { 1138 List<NamedExpression> readNamedExpressionList() {
1126 return new List<NamedExpression>.generate( 1139 return new List<NamedExpression>.generate(
1127 readUInt(), (i) => readNamedExpression()); 1140 readUInt(), (i) => readNamedExpression());
1128 } 1141 }
1129 1142
1130 NamedExpression readNamedExpression() { 1143 NamedExpression readNamedExpression() {
1131 return new NamedExpression(readStringReference(), readExpression()); 1144 return new NamedExpression(readStringReference(), readExpression());
(...skipping 26 matching lines...) Expand all
1158 ..fileOffset = offset 1171 ..fileOffset = offset
1159 ..fileEqualsOffset = fileEqualsOffset; 1172 ..fileEqualsOffset = fileEqualsOffset;
1160 } 1173 }
1161 1174
1162 int readOffset() { 1175 int readOffset() {
1163 // Offset is saved as unsigned, 1176 // Offset is saved as unsigned,
1164 // but actually ranges from -1 and up (thus the -1) 1177 // but actually ranges from -1 and up (thus the -1)
1165 return readUInt() - 1; 1178 return readUInt() - 1;
1166 } 1179 }
1167 } 1180 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698