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

Side by Side Diff: pkg/compiler/lib/src/serialization/constant_serialization.dart

Issue 1192103002: Support serialization of the compiler backbone. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 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
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
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.
4
5 library dart2js.serialization.constants;
6
7 import '../constants/expressions.dart';
8 import '../dart_types.dart';
9 import '../elements/elements.dart' show FieldElement;
10 import '../resolution/operators.dart';
11 import '../universe/universe.dart';
12 import 'serialization.dart';
13 import 'keys.dart';
14
15 class ConstantSerializer
floitsch 2015/06/26 20:54:04 Comment what this class does. Destructures, decom
Johnni Winther 2015/07/03 12:13:44 Done.
16 extends ConstantExpressionVisitor<dynamic, ObjectSerializer> {
17 const ConstantSerializer();
18
19 void apply(ConstantExpression exp, ObjectSerializer serializer) {
floitsch 2015/06/26 20:54:04 I prefer to call this "visit", but I have seen "ap
Johnni Winther 2015/07/03 12:13:44 Done.
20 exp.accept(this, serializer);
21 }
22
23 @override
24 void visitBinary(BinaryConstantExpression exp,
25 ObjectSerializer serializer) {
26 serializer.setEnum(Key.OPERATOR, exp.operator.kind);
27 serializer.setConstant(Key.LEFT, exp.left);
28 serializer.setConstant(Key.RIGHT, exp.right);
29 }
30
31 @override
32 void visitConcatenate(ConcatenateConstantExpression exp,
33 ObjectSerializer serializer) {
34 serializer.setConstants(Key.ARGUMENTS, exp.expressions);
35 }
36
37 @override
38 void visitConditional(ConditionalConstantExpression exp,
39 ObjectSerializer serializer) {
40 serializer.setConstant(Key.CONDITION, exp.condition);
41 serializer.setConstant(Key.TRUE, exp.trueExp);
42 serializer.setConstant(Key.FALSE, exp.falseExp);
43 }
44
45 @override
46 void visitConstructed(ConstructedConstantExpression exp,
47 ObjectSerializer serializer) {
48 serializer.setElement(Key.ELEMENT, exp.target);
49 serializer.setType(Key.TYPE, exp.type);
50 serializer.setStrings(Key.NAMES, exp.callStructure.namedArguments);
51 serializer.setConstants(Key.ARGUMENTS, exp.arguments);
52 }
53
54 @override
55 void visitFunction(FunctionConstantExpression exp,
56 ObjectSerializer serializer) {
57 serializer.setElement(Key.ELEMENT, exp.element);
58 }
59
60 @override
61 void visitIdentical(IdenticalConstantExpression exp,
62 ObjectSerializer serializer) {
63 serializer.setConstant(Key.LEFT, exp.left);
64 serializer.setConstant(Key.RIGHT, exp.right);
65 }
66
67 @override
68 void visitList(ListConstantExpression exp, ObjectSerializer serializer) {
69 serializer.setType(Key.TYPE, exp.type);
70 serializer.setConstants(Key.VALUES, exp.values);
71 }
72
73 @override
74 void visitMap(MapConstantExpression exp, ObjectSerializer serializer) {
75 serializer.setType(Key.TYPE, exp.type);
76 serializer.setConstants(Key.KEYS, exp.keys);
77 serializer.setConstants(Key.VALUES, exp.values);
78 }
79
80 @override
81 void visitBool(BoolConstantExpression exp, ObjectSerializer serializer) {
82 serializer.setBool(Key.VALUE, exp.primitiveValue);
83 }
84
85 @override
86 void visitInt(IntConstantExpression exp, ObjectSerializer serializer) {
87 serializer.setInt(Key.VALUE, exp.primitiveValue);
88 }
89
90 @override
91 void visitDouble(DoubleConstantExpression exp, ObjectSerializer serializer) {
92 serializer.setDouble(Key.VALUE, exp.primitiveValue);
93 }
94
95 @override
96 void visitString(StringConstantExpression exp, ObjectSerializer serializer) {
97 serializer.setString(Key.VALUE, exp.primitiveValue);
98 }
99
100 @override
101 void visitNull(NullConstantExpression exp, ObjectSerializer serializer) {
102 // No additional data needed.
103 }
104
105 @override
106 void visitSymbol(SymbolConstantExpression exp,
107 ObjectSerializer serializer) {
floitsch 2015/06/26 20:54:04 indentation.
Johnni Winther 2015/07/03 12:13:44 Done.
108 throw new UnsupportedError(
109 "ConstantSerializer.visitSymbol: ${exp.getText()}");
110 }
111
112 @override
113 void visitType(TypeConstantExpression exp,
114 ObjectSerializer serializer) {
floitsch 2015/06/26 20:54:04 ditto and below.
Johnni Winther 2015/07/03 12:13:44 Done.
115 serializer.setType(Key.TYPE, exp.type);
116 }
117
118 @override
119 void visitUnary(UnaryConstantExpression exp,
120 ObjectSerializer serializer) {
121 serializer.setEnum(Key.OPERATOR, exp.operator.kind);
122 serializer.setConstant(Key.EXPRESSION, exp.expression);
123 }
124
125 @override
126 void visitVariable(VariableConstantExpression exp,
127 ObjectSerializer serializer) {
128 serializer.setElement(Key.ELEMENT, exp.element);
129 }
130
131 @override
132 void visitPositional(PositionalArgumentReference exp,
133 ObjectSerializer serializer) {
134 serializer.setInt(Key.INDEX, exp.index);
135 }
136
137 @override
138 void visitNamed(NamedArgumentReference exp, ObjectSerializer serializer) {
139 serializer.setString(Key.NAME, exp.name);
140 }
141
142 @override
143 void visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp,
144 ObjectSerializer serializer) {
145 serializer.setConstant(Key.NAME, exp.name);
146 if (exp.defaultValue != null) {
147 serializer.setConstant(Key.DEFAULT, exp.defaultValue);
148 }
149 }
150
151 @override
152 void visitIntFromEnvironment(IntFromEnvironmentConstantExpression exp,
153 ObjectSerializer serializer) {
154 serializer.setConstant(Key.NAME, exp.name);
155 if (exp.defaultValue != null) {
156 serializer.setConstant(Key.DEFAULT, exp.defaultValue);
157 }
158 }
159
160 @override
161 void visitStringFromEnvironment(StringFromEnvironmentConstantExpression exp,
162 ObjectSerializer serializer) {
163 serializer.setConstant(Key.NAME, exp.name);
164 if (exp.defaultValue != null) {
165 serializer.setConstant(Key.DEFAULT, exp.defaultValue);
166 }
167 }
168
169 @override
170 void visitStringLength(StringLengthConstantExpression exp,
171 ObjectSerializer serializer) {
172 serializer.setConstant(Key.EXPRESSION, exp.expression);
173 }
174
175
176 @override
177 void visitDeferred(DeferredConstantExpression exp,
178 ObjectSerializer serializer) {
179 throw new UnsupportedError(
180 "ConstantSerializer.visitDeferred: ${exp.getText()}");
181 }
182 }
183
184 class ConstantDeserializer {
floitsch 2015/06/26 20:54:04 Ditto.
Johnni Winther 2015/07/03 12:13:44 Done.
185 static ConstantExpression deserialize(ObjectDeserializer deserializer) {
186 ConstantExpressionKind kind =
187 deserializer.getEnum(Key.KIND, ConstantExpressionKind.values);
188 switch (kind) {
189 case ConstantExpressionKind.BINARY:
190 BinaryOperator operator = BinaryOperator.fromKind(deserializer.getEnum(
191 Key.OPERATOR, BinaryOperatorKind.values));
192 return new BinaryConstantExpression(
193 deserializer.getConstant(Key.LEFT),
194 operator,
195 deserializer.getConstant(Key.RIGHT));
196 case ConstantExpressionKind.BOOL:
197 return new BoolConstantExpression(
198 deserializer.getBool(Key.VALUE));
199 case ConstantExpressionKind.BOOL_FROM_ENVIRONMENT:
200 return new BoolFromEnvironmentConstantExpression(
201 deserializer.getConstant(Key.NAME),
202 deserializer.getConstant(Key.DEFAULT, isOptional: true));
203 case ConstantExpressionKind.CONCATENATE:
204 return new ConcatenateConstantExpression(
205 deserializer.getConstants(Key.ARGUMENTS));
206 case ConstantExpressionKind.CONDITIONAL:
207 return new ConditionalConstantExpression(
208 deserializer.getConstant(Key.CONDITION),
209 deserializer.getConstant(Key.TRUE),
210 deserializer.getConstant(Key.FALSE));
211 case ConstantExpressionKind.CONSTRUCTED:
212 List<String> names =
213 deserializer.getStrings(Key.NAMES, isOptional: true);
214 List<ConstantExpression> arguments =
215 deserializer.getConstants(Key.ARGUMENTS, isOptional: true);
216 return new ConstructedConstantExpression(
217 deserializer.getType(Key.TYPE),
218 deserializer.getElement(Key.ELEMENT),
219 new CallStructure(arguments.length, names),
220 arguments);
221 case ConstantExpressionKind.DOUBLE:
222 return new DoubleConstantExpression(deserializer.getDouble(Key.VALUE));
223 case ConstantExpressionKind.ERRONEOUS:
224 break;
225 case ConstantExpressionKind.FUNCTION:
226 return new FunctionConstantExpression(
227 deserializer.getElement(Key.ELEMENT));
228 case ConstantExpressionKind.IDENTICAL:
229 return new IdenticalConstantExpression(
230 deserializer.getConstant(Key.LEFT),
231 deserializer.getConstant(Key.RIGHT));
232 case ConstantExpressionKind.INT:
233 return new IntConstantExpression(deserializer.getInt(Key.VALUE));
234 case ConstantExpressionKind.INT_FROM_ENVIRONMENT:
235 return new IntFromEnvironmentConstantExpression(
236 deserializer.getConstant(Key.NAME),
237 deserializer.getConstant(Key.DEFAULT, isOptional: true));
238 case ConstantExpressionKind.LIST:
239 return new ListConstantExpression(
240 deserializer.getType(Key.TYPE),
241 deserializer.getConstants(Key.VALUES));
242 case ConstantExpressionKind.MAP:
243 return new MapConstantExpression(
244 deserializer.getType(Key.TYPE),
245 deserializer.getConstants(Key.KEYS),
246 deserializer.getConstants(Key.VALUES));
247 case ConstantExpressionKind.NULL:
248 return new NullConstantExpression();
249 case ConstantExpressionKind.STRING:
250 return new StringConstantExpression(
251 deserializer.getString(Key.VALUE));
252 case ConstantExpressionKind.STRING_FROM_ENVIRONMENT:
253 return new StringFromEnvironmentConstantExpression(
254 deserializer.getConstant(Key.NAME),
255 deserializer.getConstant(Key.DEFAULT, isOptional: true));
256 case ConstantExpressionKind.STRING_LENGTH:
257 return new StringLengthConstantExpression(
258 deserializer.getConstant(Key.EXPRESSION));
259 case ConstantExpressionKind.SYMBOL:
260 break;
261 case ConstantExpressionKind.TYPE:
262 return new TypeConstantExpression(deserializer.getType(Key.TYPE));
263 case ConstantExpressionKind.UNARY:
264 UnaryOperator operator = UnaryOperator.fromKind(
265 deserializer.getEnum(Key.OPERATOR, UnaryOperatorKind.values));
266 return new UnaryConstantExpression(
267 operator,
268 deserializer.getConstant(Key.EXPRESSION));
269 case ConstantExpressionKind.VARIABLE:
270 return new VariableConstantExpression(
271 deserializer.getElement(Key.ELEMENT));
272
273 case ConstantExpressionKind.POSITIONAL_REFERENCE:
274 return new PositionalArgumentReference(
275 deserializer.getInt(Key.INDEX));
276 case ConstantExpressionKind.NAMED_REFERENCE:
277 return new NamedArgumentReference(
278 deserializer.getString(Key.NAME));
279 case ConstantExpressionKind.DEFERRED:
280 case ConstantExpressionKind.SYNTHETIC:
281 }
282 throw new UnsupportedError(
283 "Unexpected constant kind: ${kind} in $deserializer");
284 }
285 }
286
287 /// Serializer for [ConstantConstructor]s.
288 class ConstantConstructorSerializer
289 extends ConstantConstructorVisitor<dynamic, ObjectSerializer> {
290 const ConstantConstructorSerializer();
291
292 @override
293 void visit(ConstantConstructor constantConstructor,
294 ObjectSerializer serializer) {
floitsch 2015/06/26 20:54:04 indentation.
Johnni Winther 2015/07/03 12:13:44 Done.
295 serializer.setEnum(Key.KIND, constantConstructor.kind);
296 constantConstructor.accept(this, serializer);
297 }
298
299 @override
300 void visitGenerative(
301 GenerativeConstantConstructor constructor,
302 ObjectSerializer serializer) {
303 serializer.setType(Key.TYPE, constructor.type);
304 MapSerializer defaults = serializer.createMap(Key.DEFAULTS);
305 constructor.defaultValues.forEach((key, e) {
306 defaults.setConstant('$key', e);
307 });
308 ListSerializer fields = serializer.createList(Key.FIELDS);
309 constructor.fieldMap.forEach((FieldElement f, ConstantExpression e) {
310 ObjectSerializer fieldSerializer = fields.createObject();
311 fieldSerializer.setElement(Key.FIELD, f);
312 fieldSerializer.setConstant(Key.CONSTANT, e);
313 });
314 if (constructor.superConstructorInvocation != null) {
315 serializer.setConstant(Key.CONSTRUCTOR,
316 constructor.superConstructorInvocation);
317 }
318 }
319
320 @override
321 void visitRedirectingFactory(
322 RedirectingFactoryConstantConstructor constructor,
323 ObjectSerializer serializer) {
324 serializer.setConstant(Key.CONSTRUCTOR,
325 constructor.targetConstructorInvocation);
326 }
327
328 @override
329 void visitRedirectingGenerative(
330 RedirectingGenerativeConstantConstructor constructor,
331 ObjectSerializer serializer) {
332 MapSerializer defaults = serializer.createMap(Key.DEFAULTS);
333 constructor.defaultValues.forEach((key, ConstantExpression e) {
334 defaults.setConstant('$key', e);
335 });
336 serializer.setConstant(Key.CONSTRUCTOR,
337 constructor.thisConstructorInvocation);
338 }
339 }
340
341 class ConstantConstructorDeserializer {
342 static ConstantConstructor deserialize(ObjectDeserializer deserializer) {
343
344 ConstantConstructorKind kind =
345 deserializer.getEnum(Key.KIND, ConstantConstructorKind.values);
346
347 DartType readType() {
348 return deserializer.getType(Key.TYPE);
349 }
350
351 Map<dynamic/*int|String*/, ConstantExpression> readDefaults() {
352 Map<dynamic, ConstantExpression> defaultValues =
353 <dynamic, ConstantExpression>{};
354 if (deserializer.containsKey(Key.DEFAULTS)) {
355 MapDeserializer defaultsMap = deserializer.getMap(Key.DEFAULTS);
356 defaultsMap.forEachKey((String key) {
357 try {
358 int index = int.parse(key);
359 defaultValues[index] = defaultsMap.getConstant(key);
360 } catch (e) {
floitsch 2015/06/26 20:54:04 don't use try/catch. if it's for the 'int.parse',
Johnni Winther 2015/07/03 12:13:44 Done.
361 defaultValues[key] = defaultsMap.getConstant(key);
362 }
363 });
364 }
365 return defaultValues;
366 }
367
368 Map<FieldElement, ConstantExpression> readFields() {
369 Map<FieldElement, ConstantExpression> fieldMap =
370 <FieldElement, ConstantExpression>{};
371 if (deserializer.containsKey(Key.FIELDS)) {
372 ListDeserializer fieldsList = deserializer.getList(Key.FIELDS);
373 for (int i = 0; i < fieldsList.length; i++) {
374 ObjectDeserializer object = fieldsList.getObject(i);
375 FieldElement field = object.getElement(Key.FIELD);
376 ConstantExpression constant = object.getConstant(Key.CONSTANT);
377 fieldMap[field] = constant;
378 }
379 }
380 return fieldMap;
381 }
382
383 ConstructedConstantExpression readConstructorInvocation() {
384 return deserializer.getConstant(Key.CONSTRUCTOR, isOptional: true);
385 }
386
387 switch (kind) {
388 case ConstantConstructorKind.GENERATIVE:
389 return new GenerativeConstantConstructor(
390 readType(),
391 readDefaults(),
392 readFields(),
393 readConstructorInvocation());
394 case ConstantConstructorKind.REDIRECTING_GENERATIVE:
395 return new RedirectingGenerativeConstantConstructor(
396 readDefaults(),
397 readConstructorInvocation());
398 case ConstantConstructorKind.REDIRECTING_FACTORY:
399 return new RedirectingFactoryConstantConstructor(
400 readConstructorInvocation());
401 }
402 }
403 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698