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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart

Issue 223403003: Use closure tracer to identify closures that are not passed to Function.apply (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: fixed issue with failing test Created 6 years, 8 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
OLDNEW
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 /// This class should morph into something that makes it easy to build 7 /// This class should morph into something that makes it easy to build
8 /// JavaScript representations of libraries, class-sides, and instance-sides. 8 /// JavaScript representations of libraries, class-sides, and instance-sides.
9 /// Initially, it is just a placeholder for code that is moved from 9 /// Initially, it is just a placeholder for code that is moved from
10 /// [CodeEmitterTask]. 10 /// [CodeEmitterTask].
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 void addMemberMethod(FunctionElement member, ClassBuilder builder) { 348 void addMemberMethod(FunctionElement member, ClassBuilder builder) {
349 if (member.isAbstract) return; 349 if (member.isAbstract) return;
350 jsAst.Expression code = backend.generatedCode[member]; 350 jsAst.Expression code = backend.generatedCode[member];
351 if (code == null) return; 351 if (code == null) return;
352 String name = namer.getNameOfMember(member); 352 String name = namer.getNameOfMember(member);
353 task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name); 353 task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
354 FunctionSignature parameters = member.functionSignature; 354 FunctionSignature parameters = member.functionSignature;
355 bool needsStubs = !parameters.optionalParameters.isEmpty; 355 bool needsStubs = !parameters.optionalParameters.isEmpty;
356 bool canTearOff = false; 356 bool canTearOff = false;
357 bool isClosure = false; 357 bool isClosure = false;
358 bool isNotApplyTarget = 358 bool isNotApplyTarget = !member.isFunction() ||
359 !member.isFunction() || member.isConstructor() || member.isAccessor(); 359 member.isConstructor() ||
360 member.isAccessor();
360 String tearOffName; 361 String tearOffName;
361 if (isNotApplyTarget) { 362 if (isNotApplyTarget) {
362 canTearOff = false; 363 canTearOff = false;
363 } else if (member.isInstanceMember()) { 364 } else if (member.isInstanceMember()) {
364 if (member.getEnclosingClass().isClosure()) { 365 if (member.getEnclosingClass().isClosure()) {
365 canTearOff = false; 366 canTearOff = false;
366 isClosure = true; 367 isClosure = true;
367 } else { 368 } else {
368 // Careful with operators. 369 // Careful with operators.
369 canTearOff = compiler.codegenWorld.hasInvokedGetter(member, compiler); 370 canTearOff = compiler.codegenWorld.hasInvokedGetter(member, compiler);
370 assert(!needsSuperGetter(member) || canTearOff); 371 assert(!needsSuperGetter(member) || canTearOff);
371 tearOffName = namer.getterName(member); 372 tearOffName = namer.getterName(member);
372 } 373 }
373 } else { 374 } else {
374 canTearOff = 375 canTearOff =
375 compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member); 376 compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member);
376 tearOffName = namer.getStaticClosureName(member); 377 tearOffName = namer.getStaticClosureName(member);
377 } 378 }
378 final bool canBeApplied = !isNotApplyTarget && 379 final bool canBeApplied = compiler.enabledFunctionApply &&
379 compiler.enabledFunctionApply && 380 compiler.world.getMightBePassedToApply(member);
380 (canTearOff || member.name == 'call' || !member.isInstanceMember()); 381
381 final bool canBeReflected = backend.isAccessibleByReflection(member); 382 final bool canBeReflected = backend.isAccessibleByReflection(member);
382 final bool needStructuredInfo = 383 final bool needStructuredInfo =
383 canTearOff || canBeReflected || canBeApplied; 384 canTearOff || canBeReflected || canBeApplied;
384 if (!needStructuredInfo) { 385 if (!needStructuredInfo) {
385 builder.addProperty(name, code); 386 builder.addProperty(name, code);
386 if (needsStubs) { 387 if (needsStubs) {
387 addParameterStubs( 388 addParameterStubs(
388 member, 389 member,
389 (Selector selector, jsAst.Fun function) { 390 (Selector selector, jsAst.Fun function) {
390 builder.addProperty(namer.invocationName(selector), function); 391 builder.addProperty(namer.invocationName(selector), function);
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 } else if (isClosure && canBeApplied) { 538 } else if (isClosure && canBeApplied) {
538 expressions.add(js.string(member.name)); 539 expressions.add(js.string(member.name));
539 } 540 }
540 builder.addProperty(name, new jsAst.ArrayInitializer.from(expressions)); 541 builder.addProperty(name, new jsAst.ArrayInitializer.from(expressions));
541 } 542 }
542 543
543 void addMemberField(VariableElement member, ClassBuilder builder) { 544 void addMemberField(VariableElement member, ClassBuilder builder) {
544 // For now, do nothing. 545 // For now, do nothing.
545 } 546 }
546 } 547 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698