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

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

Issue 1957343002: Register NativeBehavior from WorldImpact. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comment. Created 4 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 4
5 library dart2js.serialization.impact; 5 library dart2js.serialization.impact;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../common/resolution.dart'; 8 import '../common/resolution.dart';
9 import '../constants/expressions.dart'; 9 import '../constants/expressions.dart';
10 import '../dart_types.dart'; 10 import '../dart_types.dart';
11 import '../elements/elements.dart'; 11 import '../elements/elements.dart';
12 import '../universe/selector.dart'; 12 import '../universe/selector.dart';
13 import '../universe/use.dart'; 13 import '../universe/use.dart';
14 import '../universe/world_impact.dart'; 14 import '../universe/world_impact.dart';
15 import '../util/enumset.dart'; 15 import '../util/enumset.dart';
16 import 'keys.dart'; 16 import 'keys.dart';
17 import 'serialization.dart'; 17 import 'serialization.dart';
18 import 'serialization_util.dart'; 18 import 'serialization_util.dart';
19 19
20 /// Visitor that serializes a [ResolutionImpact] object using an 20 /// Visitor that serializes a [ResolutionImpact] object using an
21 /// [ObjectEncoder]. 21 /// [ObjectEncoder].
22 class ImpactSerializer implements WorldImpactVisitor { 22 class ImpactSerializer implements WorldImpactVisitor {
23 final Element element; 23 final Element element;
24 final ObjectEncoder objectEncoder; 24 final ObjectEncoder objectEncoder;
25 final ListEncoder staticUses; 25 final ListEncoder staticUses;
26 final ListEncoder dynamicUses; 26 final ListEncoder dynamicUses;
27 final ListEncoder typeUses; 27 final ListEncoder typeUses;
28 final SerializerPlugin nativeDataSerializer;
28 29
29 ImpactSerializer(this.element, ObjectEncoder objectEncoder) 30 ImpactSerializer(
31 this.element, ObjectEncoder objectEncoder, this.nativeDataSerializer)
30 : this.objectEncoder = objectEncoder, 32 : this.objectEncoder = objectEncoder,
31 staticUses = objectEncoder.createList(Key.STATIC_USES), 33 staticUses = objectEncoder.createList(Key.STATIC_USES),
32 dynamicUses = objectEncoder.createList(Key.DYNAMIC_USES), 34 dynamicUses = objectEncoder.createList(Key.DYNAMIC_USES),
33 typeUses = objectEncoder.createList(Key.TYPE_USES); 35 typeUses = objectEncoder.createList(Key.TYPE_USES);
34 36
35 void serialize(ResolutionImpact resolutionImpact) { 37 void serialize(ResolutionImpact resolutionImpact) {
36 resolutionImpact.apply(this); 38 resolutionImpact.apply(this);
37 objectEncoder.setStrings(Key.SYMBOLS, resolutionImpact.constSymbolNames); 39 objectEncoder.setStrings(Key.SYMBOLS, resolutionImpact.constSymbolNames);
38 objectEncoder.setConstants( 40 objectEncoder.setConstants(
39 Key.CONSTANTS, resolutionImpact.constantLiterals); 41 Key.CONSTANTS, resolutionImpact.constantLiterals);
40 objectEncoder.setEnums(Key.FEATURES, resolutionImpact.features); 42 objectEncoder.setEnums(Key.FEATURES, resolutionImpact.features);
41 if (resolutionImpact.listLiterals.isNotEmpty) { 43 if (resolutionImpact.listLiterals.isNotEmpty) {
42 ListEncoder encoder = objectEncoder.createList(Key.LISTS); 44 ListEncoder encoder = objectEncoder.createList(Key.LISTS);
43 for (ListLiteralUse use in resolutionImpact.listLiterals) { 45 for (ListLiteralUse use in resolutionImpact.listLiterals) {
44 ObjectEncoder useEncoder = encoder.createObject(); 46 ObjectEncoder useEncoder = encoder.createObject();
45 useEncoder.setType(Key.TYPE, use.type); 47 useEncoder.setType(Key.TYPE, use.type);
46 useEncoder.setBool(Key.IS_CONST, use.isConstant); 48 useEncoder.setBool(Key.IS_CONST, use.isConstant);
47 useEncoder.setBool(Key.IS_EMPTY, use.isEmpty); 49 useEncoder.setBool(Key.IS_EMPTY, use.isEmpty);
48 } 50 }
49 } 51 }
50 if (resolutionImpact.mapLiterals.isNotEmpty) { 52 if (resolutionImpact.mapLiterals.isNotEmpty) {
51 ListEncoder encoder = objectEncoder.createList(Key.MAPS); 53 ListEncoder encoder = objectEncoder.createList(Key.MAPS);
52 for (MapLiteralUse use in resolutionImpact.mapLiterals) { 54 for (MapLiteralUse use in resolutionImpact.mapLiterals) {
53 ObjectEncoder useEncoder = encoder.createObject(); 55 ObjectEncoder useEncoder = encoder.createObject();
54 useEncoder.setType(Key.TYPE, use.type); 56 useEncoder.setType(Key.TYPE, use.type);
55 useEncoder.setBool(Key.IS_CONST, use.isConstant); 57 useEncoder.setBool(Key.IS_CONST, use.isConstant);
56 useEncoder.setBool(Key.IS_EMPTY, use.isEmpty); 58 useEncoder.setBool(Key.IS_EMPTY, use.isEmpty);
57 } 59 }
58 } 60 }
61 if (resolutionImpact.nativeData.isNotEmpty) {
62 ListEncoder encoder = objectEncoder.createList(Key.NATIVE);
63 for (dynamic data in resolutionImpact.nativeData) {
64 nativeDataSerializer.onData(data, encoder.createObject());
65 }
66 }
59 } 67 }
60 68
61 @override 69 @override
62 void visitDynamicUse(DynamicUse dynamicUse) { 70 void visitDynamicUse(DynamicUse dynamicUse) {
63 ObjectEncoder object = dynamicUses.createObject(); 71 ObjectEncoder object = dynamicUses.createObject();
64 serializeSelector(dynamicUse.selector, object); 72 serializeSelector(dynamicUse.selector, object);
65 } 73 }
66 74
67 @override 75 @override
68 void visitStaticUse(StaticUse staticUse) { 76 void visitStaticUse(StaticUse staticUse) {
(...skipping 15 matching lines...) Expand all
84 class DeserializedResolutionImpact extends WorldImpact 92 class DeserializedResolutionImpact extends WorldImpact
85 implements ResolutionImpact { 93 implements ResolutionImpact {
86 final Iterable<String> constSymbolNames; 94 final Iterable<String> constSymbolNames;
87 final Iterable<ConstantExpression> constantLiterals; 95 final Iterable<ConstantExpression> constantLiterals;
88 final Iterable<DynamicUse> dynamicUses; 96 final Iterable<DynamicUse> dynamicUses;
89 final EnumSet<Feature> _features; 97 final EnumSet<Feature> _features;
90 final Iterable<ListLiteralUse> listLiterals; 98 final Iterable<ListLiteralUse> listLiterals;
91 final Iterable<MapLiteralUse> mapLiterals; 99 final Iterable<MapLiteralUse> mapLiterals;
92 final Iterable<StaticUse> staticUses; 100 final Iterable<StaticUse> staticUses;
93 final Iterable<TypeUse> typeUses; 101 final Iterable<TypeUse> typeUses;
102 final Iterable<dynamic> nativeData;
94 103
95 DeserializedResolutionImpact( 104 DeserializedResolutionImpact(
96 {this.constSymbolNames: const <String>[], 105 {this.constSymbolNames: const <String>[],
97 this.constantLiterals: const <ConstantExpression>[], 106 this.constantLiterals: const <ConstantExpression>[],
98 this.dynamicUses: const <DynamicUse>[], 107 this.dynamicUses: const <DynamicUse>[],
99 EnumSet<Feature> features, 108 EnumSet<Feature> features,
100 this.listLiterals: const <ListLiteralUse>[], 109 this.listLiterals: const <ListLiteralUse>[],
101 this.mapLiterals: const <MapLiteralUse>[], 110 this.mapLiterals: const <MapLiteralUse>[],
102 this.staticUses: const <StaticUse>[], 111 this.staticUses: const <StaticUse>[],
103 this.typeUses: const <TypeUse>[]}) 112 this.typeUses: const <TypeUse>[],
113 this.nativeData: const <dynamic>[]})
104 : this._features = features; 114 : this._features = features;
105 115
106 Iterable<Feature> get features { 116 Iterable<Feature> get features {
107 return _features != null 117 return _features != null
108 ? _features.iterable(Feature.values) 118 ? _features.iterable(Feature.values)
109 : const <Feature>[]; 119 : const <Feature>[];
110 } 120 }
111 } 121 }
112 122
113 class ImpactDeserializer { 123 class ImpactDeserializer {
114 /// Deserializes a [WorldImpact] from [objectDecoder]. 124 /// Deserializes a [WorldImpact] from [objectDecoder].
115 static ResolutionImpact deserializeImpact( 125 static ResolutionImpact deserializeImpact(Element element,
116 Element element, ObjectDecoder objectDecoder) { 126 ObjectDecoder objectDecoder, DeserializerPlugin nativeDataDeserializer) {
117 ListDecoder staticUseDecoder = objectDecoder.getList(Key.STATIC_USES); 127 ListDecoder staticUseDecoder = objectDecoder.getList(Key.STATIC_USES);
118 List<StaticUse> staticUses = <StaticUse>[]; 128 List<StaticUse> staticUses = <StaticUse>[];
119 for (int index = 0; index < staticUseDecoder.length; index++) { 129 for (int index = 0; index < staticUseDecoder.length; index++) {
120 ObjectDecoder object = staticUseDecoder.getObject(index); 130 ObjectDecoder object = staticUseDecoder.getObject(index);
121 StaticUseKind kind = object.getEnum(Key.KIND, StaticUseKind.values); 131 StaticUseKind kind = object.getEnum(Key.KIND, StaticUseKind.values);
122 Element usedElement = 132 Element usedElement =
123 deserializeElementReference(element, Key.ELEMENT, Key.NAME, object); 133 deserializeElementReference(element, Key.ELEMENT, Key.NAME, object);
124 staticUses.add(new StaticUse.internal(usedElement, kind)); 134 staticUses.add(new StaticUse.internal(usedElement, kind));
125 } 135 }
126 136
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 for (int i = 0; i < mapLiteralDecoder.length; i++) { 183 for (int i = 0; i < mapLiteralDecoder.length; i++) {
174 ObjectDecoder useDecoder = mapLiteralDecoder.getObject(i); 184 ObjectDecoder useDecoder = mapLiteralDecoder.getObject(i);
175 DartType type = useDecoder.getType(Key.TYPE); 185 DartType type = useDecoder.getType(Key.TYPE);
176 bool isConstant = useDecoder.getBool(Key.IS_CONST); 186 bool isConstant = useDecoder.getBool(Key.IS_CONST);
177 bool isEmpty = useDecoder.getBool(Key.IS_EMPTY); 187 bool isEmpty = useDecoder.getBool(Key.IS_EMPTY);
178 mapLiterals.add( 188 mapLiterals.add(
179 new MapLiteralUse(type, isConstant: isConstant, isEmpty: isEmpty)); 189 new MapLiteralUse(type, isConstant: isConstant, isEmpty: isEmpty));
180 } 190 }
181 } 191 }
182 192
193 ListDecoder nativeDataDecoder =
194 objectDecoder.getList(Key.NATIVE, isOptional: true);
195 List<dynamic> nativeData = const <dynamic>[];
196 if (nativeDataDecoder != null) {
197 nativeData = <dynamic>[];
198 for (int i = 0; i < nativeDataDecoder.length; i++) {
199 dynamic data =
200 nativeDataDeserializer.onData(nativeDataDecoder.getObject(i));
201 if (data != null) {
202 nativeData.add(data);
203 }
204 }
205 }
206
183 return new DeserializedResolutionImpact( 207 return new DeserializedResolutionImpact(
184 constSymbolNames: constSymbolNames, 208 constSymbolNames: constSymbolNames,
185 constantLiterals: constantLiterals, 209 constantLiterals: constantLiterals,
186 dynamicUses: dynamicUses, 210 dynamicUses: dynamicUses,
187 features: features, 211 features: features,
188 listLiterals: listLiterals, 212 listLiterals: listLiterals,
189 mapLiterals: mapLiterals, 213 mapLiterals: mapLiterals,
190 staticUses: staticUses, 214 staticUses: staticUses,
191 typeUses: typeUses); 215 typeUses: typeUses,
216 nativeData: nativeData);
192 } 217 }
193 } 218 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/registry.dart ('k') | tests/compiler/dart2js/serialization/helper.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698