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 | 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 Loading... |
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 Loading... |
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 } |
OLD | NEW |