OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
6 | 6 |
7 class NsmEmitter extends CodeEmitterHelper { | 7 class NsmEmitter extends CodeEmitterHelper { |
8 final List<Selector> trivialNsmHandlers = <Selector>[]; | 8 final List<Selector> trivialNsmHandlers = <Selector>[]; |
9 | 9 |
10 /// If this is true then we can generate the noSuchMethod handlers at startup | 10 /// If this is true then we can generate the noSuchMethod handlers at startup |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 for (int i = 0; i < trivialNsmHandlers.length; i++) { | 144 for (int i = 0; i < trivialNsmHandlers.length; i++) { |
145 if (!backend.isInterceptedName(trivialNsmHandlers[i].name)) { | 145 if (!backend.isInterceptedName(trivialNsmHandlers[i].name)) { |
146 firstNormalSelector = i; | 146 firstNormalSelector = i; |
147 break; | 147 break; |
148 } | 148 } |
149 } | 149 } |
150 | 150 |
151 // Get the short names (JS names, perhaps minified). | 151 // Get the short names (JS names, perhaps minified). |
152 Iterable<String> shorts = trivialNsmHandlers.map((selector) => | 152 Iterable<String> shorts = trivialNsmHandlers.map((selector) => |
153 namer.invocationMirrorInternalName(selector)); | 153 namer.invocationMirrorInternalName(selector)); |
154 final diffShorts = <String>[]; | |
155 var diffEncoding = new StringBuffer(); | 154 var diffEncoding = new StringBuffer(); |
156 | 155 |
157 // Treat string as a number in base 88 with digits in ASCII order from # to | 156 // Treat string as a number in base 88 with digits in ASCII order from # to |
158 // z. The short name sorting is based on length, and uses ASCII order for | 157 // z. The short name sorting is based on length, and uses ASCII order for |
159 // equal length strings so this means that names are ascending. The hash | 158 // equal length strings so this means that names are ascending. The hash |
160 // character, #, is never given as input, but we need it because it's the | 159 // character, #, is never given as input, but we need it because it's the |
161 // implicit leading zero (otherwise we could not code names with leading | 160 // implicit leading zero (otherwise we could not code names with leading |
162 // dollar signs). | 161 // dollar signs). |
163 int fromBase88(String x) { | 162 int fromBase88(String x) { |
164 int answer = 0; | 163 int answer = 0; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 diffEncoding.write(short); | 211 diffEncoding.write(short); |
213 } | 212 } |
214 nameCounter++; | 213 nameCounter++; |
215 } | 214 } |
216 | 215 |
217 // Startup code that loops over the method names and puts handlers on the | 216 // Startup code that loops over the method names and puts handlers on the |
218 // Object class to catch noSuchMethod invocations. | 217 // Object class to catch noSuchMethod invocations. |
219 ClassElement objectClass = compiler.objectClass; | 218 ClassElement objectClass = compiler.objectClass; |
220 jsAst.Expression createInvocationMirror = backend.emitter | 219 jsAst.Expression createInvocationMirror = backend.emitter |
221 .staticFunctionAccess(backend.getCreateInvocationMirror()); | 220 .staticFunctionAccess(backend.getCreateInvocationMirror()); |
222 var type = 0; | |
223 if (useDiffEncoding) { | 221 if (useDiffEncoding) { |
224 statements.add(js.statement('''{ | 222 statements.add(js.statement('''{ |
225 var objectClassObject = processedClasses.collected[#objectClass], | 223 var objectClassObject = processedClasses.collected[#objectClass], |
226 shortNames = #diffEncoding.split(","), | 224 shortNames = #diffEncoding.split(","), |
227 nameNumber = 0, | 225 nameNumber = 0, |
228 diffEncodedString = shortNames[0], | 226 diffEncodedString = shortNames[0], |
229 calculatedShortNames = [0, 1]; // 0, 1 are args for splice. | 227 calculatedShortNames = [0, 1]; // 0, 1 are args for splice. |
230 // If we are loading a deferred library the object class will not be i
n | 228 // If we are loading a deferred library the object class will not be i
n |
231 // the collectedClasses so objectClassObject is undefined, and we skip | 229 // the collectedClasses so objectClassObject is undefined, and we skip |
232 // setting up the names. | 230 // setting up the names. |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 }''', { | 316 }''', { |
319 'sliceOffsetParams': sliceOffsetParams, | 317 'sliceOffsetParams': sliceOffsetParams, |
320 'noSuchMethodName': namer.noSuchMethodName, | 318 'noSuchMethodName': namer.noSuchMethodName, |
321 'createInvocationMirror': createInvocationMirror, | 319 'createInvocationMirror': createInvocationMirror, |
322 'names': minify ? 'shortNames' : 'longNames', | 320 'names': minify ? 'shortNames' : 'longNames', |
323 'sliceOffsetArguments': sliceOffsetArguments})); | 321 'sliceOffsetArguments': sliceOffsetArguments})); |
324 | 322 |
325 return statements; | 323 return statements; |
326 } | 324 } |
327 } | 325 } |
OLD | NEW |