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

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: Fix regression in emitted meta data 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 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 void addMemberMethod(FunctionElement member, ClassBuilder builder) { 346 void addMemberMethod(FunctionElement member, ClassBuilder builder) {
347 if (member.isAbstract) return; 347 if (member.isAbstract) return;
348 jsAst.Expression code = backend.generatedCode[member]; 348 jsAst.Expression code = backend.generatedCode[member];
349 if (code == null) return; 349 if (code == null) return;
350 String name = namer.getNameOfMember(member); 350 String name = namer.getNameOfMember(member);
351 task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name); 351 task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
352 FunctionSignature parameters = member.functionSignature; 352 FunctionSignature parameters = member.functionSignature;
353 bool needsStubs = !parameters.optionalParameters.isEmpty; 353 bool needsStubs = !parameters.optionalParameters.isEmpty;
354 bool canTearOff = false; 354 bool canTearOff = false;
355 bool isClosure = false; 355 bool isClosure = false;
356 bool isNotApplyTarget = 356 bool isNotApplyTarget = !member.isFunction() ||
357 !member.isFunction() || member.isConstructor() || member.isAccessor(); 357 member.isConstructor() ||
358 member.isAccessor();
358 String tearOffName; 359 String tearOffName;
359 if (isNotApplyTarget) { 360 if (isNotApplyTarget) {
360 canTearOff = false; 361 canTearOff = false;
361 } else if (member.isInstanceMember()) { 362 } else if (member.isInstanceMember()) {
362 if (member.getEnclosingClass().isClosure()) { 363 if (member.getEnclosingClass().isClosure()) {
363 canTearOff = false; 364 canTearOff = false;
364 isClosure = true; 365 isClosure = true;
365 } else { 366 } else {
366 // Careful with operators. 367 // Careful with operators.
367 canTearOff = compiler.codegenWorld.hasInvokedGetter(member, compiler); 368 canTearOff = compiler.codegenWorld.hasInvokedGetter(member, compiler);
368 assert(!needsSuperGetter(member) || canTearOff); 369 assert(!needsSuperGetter(member) || canTearOff);
369 tearOffName = namer.getterName(member); 370 tearOffName = namer.getterName(member);
370 } 371 }
371 } else { 372 } else {
372 canTearOff = 373 canTearOff =
373 compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member); 374 compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member);
374 tearOffName = namer.getStaticClosureName(member); 375 tearOffName = namer.getStaticClosureName(member);
375 } 376 }
376 final bool canBeApplied = !isNotApplyTarget && 377 final bool canBeApplied = compiler.enabledFunctionApply &&
377 compiler.enabledFunctionApply && 378 compiler.world.getMightBePassedToApply(member);
378 (canTearOff || member.name == 'call' || !member.isInstanceMember()); 379
379 final bool canBeReflected = backend.isAccessibleByReflection(member); 380 final bool canBeReflected = backend.isAccessibleByReflection(member);
380 final bool needStructuredInfo = 381 final bool needStructuredInfo =
381 canTearOff || canBeReflected || canBeApplied; 382 canTearOff || canBeReflected || canBeApplied;
382 if (!needStructuredInfo) { 383 if (!needStructuredInfo) {
383 builder.addProperty(name, code); 384 builder.addProperty(name, code);
384 if (needsStubs) { 385 if (needsStubs) {
385 addParameterStubs( 386 addParameterStubs(
386 member, 387 member,
387 (Selector selector, jsAst.Fun function) { 388 (Selector selector, jsAst.Fun function) {
388 builder.addProperty(namer.invocationName(selector), function); 389 builder.addProperty(namer.invocationName(selector), function);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 expressions.add(js.string(member.name)); 532 expressions.add(js.string(member.name));
532 } 533 }
533 534
534 builder.addProperty(name, js.toExpression(expressions)); 535 builder.addProperty(name, js.toExpression(expressions));
535 } 536 }
536 537
537 void addMemberField(VariableElement member, ClassBuilder builder) { 538 void addMemberField(VariableElement member, ClassBuilder builder) {
538 // For now, do nothing. 539 // For now, do nothing.
539 } 540 }
540 } 541 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698