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

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: More test and fixes. 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
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 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 member.isGenerativeConstructor || 338 member.isGenerativeConstructor ||
339 member.isAccessor) { 339 member.isAccessor) {
340 addMemberMethod(member, builder); 340 addMemberMethod(member, builder);
341 } else { 341 } else {
342 compiler.internalError(member, 342 compiler.internalError(member,
343 'Unexpected kind: "${member.kind}".'); 343 'Unexpected kind: "${member.kind}".');
344 } 344 }
345 if (member.isInstanceMember) emitExtraAccessors(member, builder); 345 if (member.isInstanceMember) emitExtraAccessors(member, builder);
346 } 346 }
347 347
348 bool _isOperator(FunctionElement member) {
349 // TODO(18740): there must be a better way to know if an element is an
350 // operator.
351 return Elements.operatorNameToIdentifier(member.name) != member.name;
herhut 2014/05/09 07:23:18 Why do we use two different ways to determine whet
floitsch 2014/05/09 07:53:19 I didn't want to change unrelated code.
352 }
353
348 void addMemberMethod(FunctionElement member, ClassBuilder builder) { 354 void addMemberMethod(FunctionElement member, ClassBuilder builder) {
349 if (member.isAbstract) return; 355 if (member.isAbstract) return;
350 jsAst.Expression code = backend.generatedCode[member]; 356 jsAst.Expression code = backend.generatedCode[member];
351 if (code == null) return; 357 if (code == null) return;
352 String name = namer.getNameOfMember(member); 358 String name = namer.getNameOfMember(member);
353 task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name); 359 task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
354 FunctionSignature parameters = member.functionSignature; 360 FunctionSignature parameters = member.functionSignature;
355 bool needsStubs = !parameters.optionalParameters.isEmpty; 361 bool needsStubs = !parameters.optionalParameters.isEmpty;
356 bool canTearOff = false; 362 bool canTearOff = false;
357 bool isClosure = false; 363 bool isClosure = false;
358 bool isNotApplyTarget = !member.isFunction || 364 bool isNotApplyTarget = !member.isFunction ||
359 member.isConstructor || 365 member.isConstructor ||
360 member.isAccessor; 366 member.isAccessor;
361 String tearOffName; 367 String tearOffName;
368
369 final bool canBeReflected = backend.isAccessibleByReflection(member);
370
362 if (isNotApplyTarget) { 371 if (isNotApplyTarget) {
363 canTearOff = false; 372 canTearOff = false;
364 } else if (member.isInstanceMember) { 373 } else if (member.isInstanceMember) {
365 if (member.enclosingClass.isClosure) { 374 if (member.enclosingClass.isClosure) {
366 canTearOff = false; 375 canTearOff = false;
367 isClosure = true; 376 isClosure = true;
368 } else { 377 } else {
369 // Careful with operators. 378 // Careful with operators.
370 canTearOff = compiler.codegenWorld.hasInvokedGetter(member, compiler); 379 canTearOff =
380 compiler.codegenWorld.hasInvokedGetter(member, compiler) ||
381 (canBeReflected && !_isOperator(member));
371 assert(!needsSuperGetter(member) || canTearOff); 382 assert(!needsSuperGetter(member) || canTearOff);
372 tearOffName = namer.getterName(member); 383 tearOffName = namer.getterName(member);
373 } 384 }
374 } else { 385 } else {
375 canTearOff = 386 canTearOff =
376 compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member); 387 compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member) ||
388 canBeReflected;
377 tearOffName = namer.getStaticClosureName(member); 389 tearOffName = namer.getStaticClosureName(member);
378 } 390 }
379 final bool canBeApplied = compiler.enabledFunctionApply && 391 final bool canBeApplied = compiler.enabledFunctionApply &&
380 compiler.world.getMightBePassedToApply(member); 392 compiler.world.getMightBePassedToApply(member);
381 393
382 final bool canBeReflected = backend.isAccessibleByReflection(member);
383 final bool needStructuredInfo = 394 final bool needStructuredInfo =
384 canTearOff || canBeReflected || canBeApplied; 395 canTearOff || canBeReflected || canBeApplied;
385 if (!needStructuredInfo) { 396 if (!needStructuredInfo) {
386 builder.addProperty(name, code); 397 builder.addProperty(name, code);
387 if (needsStubs) { 398 if (needsStubs) {
388 addParameterStubs( 399 addParameterStubs(
389 member, 400 member,
390 (Selector selector, jsAst.Fun function) { 401 (Selector selector, jsAst.Fun function) {
391 builder.addProperty(namer.invocationName(selector), function); 402 builder.addProperty(namer.invocationName(selector), function);
392 }); 403 });
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 } else if (isClosure && canBeApplied) { 549 } else if (isClosure && canBeApplied) {
539 expressions.add(js.string(member.name)); 550 expressions.add(js.string(member.name));
540 } 551 }
541 builder.addProperty(name, new jsAst.ArrayInitializer.from(expressions)); 552 builder.addProperty(name, new jsAst.ArrayInitializer.from(expressions));
542 } 553 }
543 554
544 void addMemberField(VariableElement member, ClassBuilder builder) { 555 void addMemberField(VariableElement member, ClassBuilder builder) {
545 // For now, do nothing. 556 // For now, do nothing.
546 } 557 }
547 } 558 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698