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 js_backend.serialization; | 5 library js_backend.serialization; |
6 | 6 |
7 import '../common/backend_api.dart' show BackendSerialization; | 7 import '../common/backend_api.dart' show BackendSerialization; |
8 import '../dart_types.dart'; | 8 import '../dart_types.dart'; |
9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
10 import '../js/js.dart' as js; | 10 import '../js/js.dart' as js; |
(...skipping 17 matching lines...) Expand all Loading... |
28 | 28 |
29 class JavaScriptBackendSerialization implements BackendSerialization { | 29 class JavaScriptBackendSerialization implements BackendSerialization { |
30 final JavaScriptBackendSerializer serializer; | 30 final JavaScriptBackendSerializer serializer; |
31 final JavaScriptBackendDeserializer deserializer; | 31 final JavaScriptBackendDeserializer deserializer; |
32 | 32 |
33 JavaScriptBackendSerialization(JavaScriptBackend backend) | 33 JavaScriptBackendSerialization(JavaScriptBackend backend) |
34 : serializer = new JavaScriptBackendSerializer(backend), | 34 : serializer = new JavaScriptBackendSerializer(backend), |
35 deserializer = new JavaScriptBackendDeserializer(backend); | 35 deserializer = new JavaScriptBackendDeserializer(backend); |
36 } | 36 } |
37 | 37 |
| 38 const Key JS_INTEROP_NAME = const Key('jsInteropName'); |
| 39 const Key NATIVE_MEMBER_NAME = const Key('nativeMemberName'); |
| 40 const Key NATIVE_CLASS_TAG_INFO = const Key('nativeClassTagInfo'); |
| 41 |
38 class JavaScriptBackendSerializer implements SerializerPlugin { | 42 class JavaScriptBackendSerializer implements SerializerPlugin { |
39 final JavaScriptBackend backend; | 43 final JavaScriptBackend backend; |
40 | 44 |
41 JavaScriptBackendSerializer(this.backend); | 45 JavaScriptBackendSerializer(this.backend); |
42 | 46 |
43 @override | 47 @override |
44 void onElement(Element element, ObjectEncoder createEncoder(String tag)) { | 48 void onElement(Element element, ObjectEncoder createEncoder(String tag)) { |
45 // TODO(johnniwinther): Add more data, e.g. js-interop names, native tags, | 49 ObjectEncoder encoder; |
46 // etc. | 50 ObjectEncoder getEncoder() { |
47 String nativeName = backend.nativeData.nativeMemberName[element]; | 51 return encoder ??= createEncoder(_BACKEND_DATA_TAG); |
48 if (nativeName != null) { | 52 } |
49 ObjectEncoder encoder = createEncoder(_BACKEND_DATA_TAG); | 53 |
50 encoder.setString(Key.NAME, nativeName); | 54 String jsInteropName = backend.nativeData.jsInteropNames[element]; |
| 55 if (jsInteropName != null) { |
| 56 getEncoder().setString(JS_INTEROP_NAME, jsInteropName); |
| 57 } |
| 58 String nativeMemberName = backend.nativeData.nativeMemberName[element]; |
| 59 if (nativeMemberName != null) { |
| 60 getEncoder().setString(NATIVE_MEMBER_NAME, nativeMemberName); |
| 61 } |
| 62 String nativeClassTagInfo = backend.nativeData.nativeClassTagInfo[element]; |
| 63 if (nativeClassTagInfo != null) { |
| 64 getEncoder().setString(NATIVE_CLASS_TAG_INFO, nativeClassTagInfo); |
51 } | 65 } |
52 } | 66 } |
53 | 67 |
54 /// Returns a list of the [DartType]s in [types]. | 68 /// Returns a list of the [DartType]s in [types]. |
55 static List<DartType> filterDartTypes(List types) { | 69 static List<DartType> filterDartTypes(List types) { |
56 return types.where((type) => type is DartType).toList(); | 70 return types.where((type) => type is DartType).toList(); |
57 } | 71 } |
58 | 72 |
59 /// Returns a list of the names of the [SpecialType]s in [types]. | 73 /// Returns a list of the names of the [SpecialType]s in [types]. |
60 static List<String> filterSpecialTypes(List types) { | 74 static List<String> filterSpecialTypes(List types) { |
(...skipping 28 matching lines...) Expand all Loading... |
89 | 103 |
90 class JavaScriptBackendDeserializer implements DeserializerPlugin { | 104 class JavaScriptBackendDeserializer implements DeserializerPlugin { |
91 final JavaScriptBackend backend; | 105 final JavaScriptBackend backend; |
92 | 106 |
93 JavaScriptBackendDeserializer(this.backend); | 107 JavaScriptBackendDeserializer(this.backend); |
94 | 108 |
95 @override | 109 @override |
96 void onElement(Element element, ObjectDecoder getDecoder(String tag)) { | 110 void onElement(Element element, ObjectDecoder getDecoder(String tag)) { |
97 ObjectDecoder decoder = getDecoder(_BACKEND_DATA_TAG); | 111 ObjectDecoder decoder = getDecoder(_BACKEND_DATA_TAG); |
98 if (decoder != null) { | 112 if (decoder != null) { |
99 String nativeName = decoder.getString(Key.NAME); | 113 String jsInteropName = |
100 backend.nativeData.nativeMemberName[element] = nativeName; | 114 decoder.getString(JS_INTEROP_NAME, isOptional: true); |
| 115 if (jsInteropName != null) { |
| 116 backend.nativeData.jsInteropNames[element] = jsInteropName; |
| 117 } |
| 118 String nativeMemberName = |
| 119 decoder.getString(NATIVE_MEMBER_NAME, isOptional: true); |
| 120 if (nativeMemberName != null) { |
| 121 backend.nativeData.nativeMemberName[element] = nativeMemberName; |
| 122 } |
| 123 String nativeClassTagInfo = |
| 124 decoder.getString(NATIVE_CLASS_TAG_INFO, isOptional: true); |
| 125 if (nativeClassTagInfo != null) { |
| 126 backend.nativeData.nativeClassTagInfo[element] = nativeClassTagInfo; |
| 127 } |
101 } | 128 } |
102 } | 129 } |
103 | 130 |
104 @override | 131 @override |
105 NativeBehavior onData(ObjectDecoder decoder) { | 132 NativeBehavior onData(ObjectDecoder decoder) { |
106 SideEffects sideEffects = | 133 SideEffects sideEffects = |
107 new SideEffects.fromFlags(decoder.getInt(SIDE_EFFECTS)); | 134 new SideEffects.fromFlags(decoder.getInt(SIDE_EFFECTS)); |
108 NativeBehavior behavior = new NativeBehavior.internal(sideEffects); | 135 NativeBehavior behavior = new NativeBehavior.internal(sideEffects); |
109 | 136 |
110 behavior.typesReturned | 137 behavior.typesReturned |
(...skipping 14 matching lines...) Expand all Loading... |
125 behavior.codeTemplate = js.js.parseForeignJS(behavior.codeTemplateText); | 152 behavior.codeTemplate = js.js.parseForeignJS(behavior.codeTemplateText); |
126 } | 153 } |
127 | 154 |
128 behavior.throwBehavior = | 155 behavior.throwBehavior = |
129 decoder.getEnum(THROW_BEHAVIOR, NativeThrowBehavior.values); | 156 decoder.getEnum(THROW_BEHAVIOR, NativeThrowBehavior.values); |
130 behavior.isAllocation = decoder.getBool(IS_ALLOCATION); | 157 behavior.isAllocation = decoder.getBool(IS_ALLOCATION); |
131 behavior.useGvn = decoder.getBool(USE_GVN); | 158 behavior.useGvn = decoder.getBool(USE_GVN); |
132 return behavior; | 159 return behavior; |
133 } | 160 } |
134 } | 161 } |
OLD | NEW |