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

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

Issue 273723003: Assume a method can be torn off, if it's accessible through reflection. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add test. Created 6 years, 7 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 | tests/lib/mirrors/get_field_test.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) 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 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 = !member.isFunction || 358 bool isNotApplyTarget = !member.isFunction ||
359 member.isConstructor || 359 member.isConstructor ||
360 member.isAccessor; 360 member.isAccessor;
361 String tearOffName; 361 String tearOffName;
362
363 final bool canBeReflected = backend.isAccessibleByReflection(member);
364
362 if (isNotApplyTarget) { 365 if (isNotApplyTarget) {
363 canTearOff = false; 366 canTearOff = false;
364 } else if (member.isInstanceMember) { 367 } else if (member.isInstanceMember) {
365 if (member.enclosingClass.isClosure) { 368 if (member.enclosingClass.isClosure) {
366 canTearOff = false; 369 canTearOff = false;
367 isClosure = true; 370 isClosure = true;
368 } else { 371 } else {
369 // Careful with operators. 372 // Careful with operators.
370 canTearOff = compiler.codegenWorld.hasInvokedGetter(member, compiler); 373 canTearOff =
374 compiler.codegenWorld.hasInvokedGetter(member, compiler) ||
375 canBeReflected;
371 assert(!needsSuperGetter(member) || canTearOff); 376 assert(!needsSuperGetter(member) || canTearOff);
372 tearOffName = namer.getterName(member); 377 tearOffName = namer.getterName(member);
373 } 378 }
374 } else { 379 } else {
375 canTearOff = 380 canTearOff =
376 compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member); 381 compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member) ||
herhut 2014/05/08 14:21:55 long line
floitsch 2014/05/08 15:40:14 Not for me.
382 canBeReflected;
377 tearOffName = namer.getStaticClosureName(member); 383 tearOffName = namer.getStaticClosureName(member);
378 } 384 }
379 final bool canBeApplied = compiler.enabledFunctionApply && 385 final bool canBeApplied = compiler.enabledFunctionApply &&
380 compiler.world.getMightBePassedToApply(member); 386 compiler.world.getMightBePassedToApply(member);
381 387
382 final bool canBeReflected = backend.isAccessibleByReflection(member);
383 final bool needStructuredInfo = 388 final bool needStructuredInfo =
384 canTearOff || canBeReflected || canBeApplied; 389 canTearOff || canBeReflected || canBeApplied;
385 if (!needStructuredInfo) { 390 if (!needStructuredInfo) {
386 builder.addProperty(name, code); 391 builder.addProperty(name, code);
387 if (needsStubs) { 392 if (needsStubs) {
388 addParameterStubs( 393 addParameterStubs(
389 member, 394 member,
390 (Selector selector, jsAst.Fun function) { 395 (Selector selector, jsAst.Fun function) {
391 builder.addProperty(namer.invocationName(selector), function); 396 builder.addProperty(namer.invocationName(selector), function);
392 }); 397 });
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 } else if (isClosure && canBeApplied) { 543 } else if (isClosure && canBeApplied) {
539 expressions.add(js.string(member.name)); 544 expressions.add(js.string(member.name));
540 } 545 }
541 builder.addProperty(name, new jsAst.ArrayInitializer.from(expressions)); 546 builder.addProperty(name, new jsAst.ArrayInitializer.from(expressions));
542 } 547 }
543 548
544 void addMemberField(VariableElement member, ClassBuilder builder) { 549 void addMemberField(VariableElement member, ClassBuilder builder) {
545 // For now, do nothing. 550 // For now, do nothing.
546 } 551 }
547 } 552 }
OLDNEW
« no previous file with comments | « no previous file | tests/lib/mirrors/get_field_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698