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

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: Address comments; small fixes; rebased. 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
« no previous file with comments | « pkg/kernel/lib/ast.dart ('k') | pkg/kernel/lib/binary/ast_to_binary.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 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
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
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 }
OLDNEW
« no previous file with comments | « pkg/kernel/lib/ast.dart ('k') | pkg/kernel/lib/binary/ast_to_binary.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698