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

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

Issue 50313007: Implement dynamic function checks. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Merged with r30897. Created 7 years 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 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 RuntimeTypes rti = backend.rti; 315 RuntimeTypes rti = backend.rti;
316 // [:() => null:] is dummy encoding of [this] which is never needed for 316 // [:() => null:] is dummy encoding of [this] which is never needed for
317 // the encoding of the type of the static [method]. 317 // the encoding of the type of the static [method].
318 jsAst.Expression encoding = 318 jsAst.Expression encoding =
319 rti.getSignatureEncoding(methodType, js('null')); 319 rti.getSignatureEncoding(methodType, js('null'));
320 String operatorSignature = namer.operatorSignature(); 320 String operatorSignature = namer.operatorSignature();
321 // TODO(johnniwinther): Make MiniJsParser support function expressions. 321 // TODO(johnniwinther): Make MiniJsParser support function expressions.
322 closureBuilder.addProperty(operatorSignature, encoding); 322 closureBuilder.addProperty(operatorSignature, encoding);
323 } 323 }
324 324
325 void emitIsFunctionTypeTest(FunctionType functionType) {
326 String operator = namer.operatorIsType(functionType);
327 closureBuilder.addProperty(operator, js('true'));
328 }
329
330 FunctionType methodType = element.computeType(compiler); 325 FunctionType methodType = element.computeType(compiler);
331 Map<FunctionType, bool> functionTypeChecks = 326 Map<FunctionType, bool> functionTypeChecks =
332 task.typeTestEmitter.getFunctionTypeChecksOn(methodType); 327 task.typeTestEmitter.getFunctionTypeChecksOn(methodType);
333 task.typeTestEmitter.generateFunctionTypeTests( 328 task.typeTestEmitter.generateFunctionTypeTests(
334 element, methodType, functionTypeChecks, 329 element, methodType, functionTypeChecks,
335 emitFunctionTypeSignature, emitIsFunctionTypeTest); 330 emitFunctionTypeSignature);
336 331
337 closureClassElement = 332 closureClassElement =
338 addClosureIfNew(closureBuilder, closureClassElement, fieldNames); 333 addClosureIfNew(closureBuilder, closureClassElement, fieldNames);
339 staticGetters[element] = closureClassElement; 334 staticGetters[element] = closureClassElement;
340 335
341 } 336 }
342 } 337 }
343 338
344 ClassElement addClosureIfNew(ClassBuilder builder, 339 ClassElement addClosureIfNew(ClassBuilder builder,
345 ClassElement closure, 340 ClassElement closure,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 444
450 addParameterStubs(callElement, boundClosureBuilder.addProperty); 445 addParameterStubs(callElement, boundClosureBuilder.addProperty);
451 446
452 void emitFunctionTypeSignature(Element method, FunctionType methodType) { 447 void emitFunctionTypeSignature(Element method, FunctionType methodType) {
453 jsAst.Expression encoding = backend.rti.getSignatureEncoding( 448 jsAst.Expression encoding = backend.rti.getSignatureEncoding(
454 methodType, js('this')[fieldNames[0]]); 449 methodType, js('this')[fieldNames[0]]);
455 String operatorSignature = namer.operatorSignature(); 450 String operatorSignature = namer.operatorSignature();
456 boundClosureBuilder.addProperty(operatorSignature, encoding); 451 boundClosureBuilder.addProperty(operatorSignature, encoding);
457 } 452 }
458 453
459 void emitIsFunctionTypeTest(FunctionType functionType) {
460 String operator = namer.operatorIsType(functionType);
461 boundClosureBuilder.addProperty(operator,
462 new jsAst.LiteralBool(true));
463 }
464
465 DartType memberType = member.computeType(compiler); 454 DartType memberType = member.computeType(compiler);
466 Map<FunctionType, bool> functionTypeChecks = 455 Map<FunctionType, bool> functionTypeChecks =
467 task.typeTestEmitter.getFunctionTypeChecksOn(memberType); 456 task.typeTestEmitter.getFunctionTypeChecksOn(memberType);
468 457
469 task.typeTestEmitter.generateFunctionTypeTests( 458 task.typeTestEmitter.generateFunctionTypeTests(
470 member, memberType, functionTypeChecks, 459 member, memberType, functionTypeChecks,
471 emitFunctionTypeSignature, emitIsFunctionTypeTest); 460 emitFunctionTypeSignature);
472 461
473 closureClassElement = 462 closureClassElement =
474 addClosureIfNew(boundClosureBuilder, closureClassElement, fieldNames); 463 addClosureIfNew(boundClosureBuilder, closureClassElement, fieldNames);
475 464
476 String closureClass = namer.isolateAccess(closureClassElement); 465 String closureClass = namer.isolateAccess(closureClassElement);
477 466
478 // And finally the getter. 467 // And finally the getter.
479 String getterName = namer.getterName(member); 468 String getterName = namer.getterName(member);
480 String targetName = namer.instanceMethodName(member); 469 String targetName = namer.instanceMethodName(member);
481 470
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 if (!parameters.optionalParameters.isEmpty) { 618 if (!parameters.optionalParameters.isEmpty) {
630 addParameterStubs(member, builder.addProperty); 619 addParameterStubs(member, builder.addProperty);
631 } 620 }
632 } 621 }
633 } 622 }
634 623
635 void addMemberField(VariableElement member, ClassBuilder builder) { 624 void addMemberField(VariableElement member, ClassBuilder builder) {
636 // For now, do nothing. 625 // For now, do nothing.
637 } 626 }
638 } 627 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698