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

Side by Side Diff: pkg/compiler/lib/src/js_emitter/native_emitter.dart

Issue 841993003: dart2js: Only emit constructors of the native class interceptors that are used. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed comments. Created 5 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 NativeEmitter { 7 class NativeEmitter {
8 8
9 final Map<Element, ClassBuilder> cachedBuilders; 9 final Map<Element, ClassBuilder> cachedBuilders;
10 10
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 generateClassInfo(backend.jsInterceptorClass); 225 generateClassInfo(backend.jsInterceptorClass);
226 for (ClassElement classElement in classes) { 226 for (ClassElement classElement in classes) {
227 generateClassInfo(classElement); 227 generateClassInfo(classElement);
228 } 228 }
229 } 229 }
230 230
231 // Emit the native class interceptors that were actually used. 231 // Emit the native class interceptors that were actually used.
232 for (ClassElement classElement in classes) { 232 for (ClassElement classElement in classes) {
233 if (!classElement.isNative) continue; 233 if (!classElement.isNative) continue;
234 if (neededClasses.contains(classElement)) { 234 if (neededClasses.contains(classElement)) {
235 ClassBuilder builder = builders[classElement];
236
237 // In CSP mode [emitClassConstructor] and [emitClassGettersSetters] have
238 // a side-effect on "precompiled" functions in [OldEmitter]. For this
239 // reason, it is important that we don't call these methods before we
240 // are certain that a class is needed.
241
242 emitterTask.oldEmitter.classEmitter
243 .emitConstructorsForCSP(classElement);
244
245 // [emitClassGettersSettersForCSP] does not affect whether or not a
246 // class is needed. If getters/setters are emitted, the class has fields
247 // and is therefore non-trivial.
248 emitterTask.oldEmitter.classEmitter.emitClassGettersSettersForCSP(
249 classElement, builder);
250
235 // Define interceptor class for [classElement]. 251 // Define interceptor class for [classElement].
236 emitterTask.oldEmitter.classEmitter.emitClassBuilderWithReflectionData( 252 emitterTask.oldEmitter.classEmitter.emitClassBuilderWithReflectionData(
237 backend.namer.getNameOfClass(classElement), 253 backend.namer.getNameOfClass(classElement),
238 classElement, builders[classElement], 254 classElement, builders[classElement],
239 emitterTask.oldEmitter.getElementDescriptor(classElement)); 255 emitterTask.oldEmitter.getElementDescriptor(classElement));
240 emitterTask.oldEmitter.needsClassSupport = true; 256 emitterTask.oldEmitter.needsClassSupport = true;
241 } 257 }
242 } 258 }
243 } 259 }
244 260
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 if (compiler.hasIncrementalSupport) { 310 if (compiler.hasIncrementalSupport) {
295 builder = cachedBuilders[classElement]; 311 builder = cachedBuilders[classElement];
296 if (builder != null) return builder; 312 if (builder != null) return builder;
297 builder = new ClassBuilder(classElement, backend.namer); 313 builder = new ClassBuilder(classElement, backend.namer);
298 cachedBuilders[classElement] = builder; 314 cachedBuilders[classElement] = builder;
299 } else { 315 } else {
300 builder = new ClassBuilder(classElement, backend.namer); 316 builder = new ClassBuilder(classElement, backend.namer);
301 } 317 }
302 builder.superName = superName; 318 builder.superName = superName;
303 319
304 emitterTask.oldEmitter.classEmitter.emitClassConstructor(
305 classElement, builder);
306 bool hasFields = emitterTask.oldEmitter.classEmitter.emitFields( 320 bool hasFields = emitterTask.oldEmitter.classEmitter.emitFields(
307 classElement, builder, classIsNative: true); 321 classElement, builder, classIsNative: true);
308 int propertyCount = builder.properties.length; 322 int propertyCount = builder.properties.length;
309 emitterTask.oldEmitter.classEmitter.emitClassGettersSetters( 323 emitterTask.oldEmitter.classEmitter.emitCheckedClassSetters(
310 classElement, builder); 324 classElement, builder);
311 emitterTask.oldEmitter.classEmitter.emitInstanceMembers( 325 emitterTask.oldEmitter.classEmitter.emitInstanceMembers(
312 classElement, builder); 326 classElement, builder);
313 emitterTask.oldEmitter.typeTestEmitter.emitIsTests(classElement, builder); 327 emitterTask.oldEmitter.typeTestEmitter.emitIsTests(classElement, builder);
314 328
315 if (!hasFields && 329 if (!hasFields &&
316 builder.properties.length == propertyCount && 330 builder.properties.length == propertyCount &&
317 superclass is! MixinApplicationElement) { 331 superclass is! MixinApplicationElement) {
318 builder.isTrivial = true; 332 builder.isTrivial = true;
319 } 333 }
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 targetOutput.add(';'); 484 targetOutput.add(';');
471 } 485 }
472 targetOutput.addBuffer(jsAst.prettyPrint( 486 targetOutput.addBuffer(jsAst.prettyPrint(
473 new jsAst.ExpressionStatement(init), compiler)); 487 new jsAst.ExpressionStatement(init), compiler));
474 targetOutput.add('\n'); 488 targetOutput.add('\n');
475 } 489 }
476 490
477 targetOutput.add('\n'); 491 targetOutput.add('\n');
478 } 492 }
479 } 493 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698