| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /** | 5 /** |
| 6 * A function element that represents a closure call. The signature is copied | 6 * A function element that represents a closure call. The signature is copied |
| 7 * from the given element. | 7 * from the given element. |
| 8 */ | 8 */ |
| 9 class ClosureInvocationElement extends FunctionElement { | 9 class ClosureInvocationElement extends FunctionElement { |
| 10 ClosureInvocationElement(SourceString name, | 10 ClosureInvocationElement(SourceString name, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 CodeBuffer mainBuffer; | 39 CodeBuffer mainBuffer; |
| 40 /** Shorter access to [isolatePropertiesName]. Both here in the code, as | 40 /** Shorter access to [isolatePropertiesName]. Both here in the code, as |
| 41 well as in the generated code. */ | 41 well as in the generated code. */ |
| 42 String isolateProperties; | 42 String isolateProperties; |
| 43 String classesCollector; | 43 String classesCollector; |
| 44 final Map<int, String> boundClosureCache; | 44 final Map<int, String> boundClosureCache; |
| 45 | 45 |
| 46 final bool generateSourceMap; | 46 final bool generateSourceMap; |
| 47 final SourceMapBuilder sourceMapBuilder; | 47 final SourceMapBuilder sourceMapBuilder; |
| 48 | 48 |
| 49 CodeEmitterTask(Compiler compiler, [bool generateSourceMap = false]) | 49 CodeEmitterTask(Compiler compiler, this.namer, |
| 50 : namer = compiler.namer, | 50 [bool generateSourceMap = false]) |
| 51 boundClosureBuffer = new CodeBuffer(), | 51 : boundClosureBuffer = new CodeBuffer(), |
| 52 mainBuffer = new CodeBuffer(), | 52 mainBuffer = new CodeBuffer(), |
| 53 boundClosureCache = new Map<int, String>(), | 53 boundClosureCache = new Map<int, String>(), |
| 54 generateSourceMap = generateSourceMap, | 54 generateSourceMap = generateSourceMap, |
| 55 sourceMapBuilder = new SourceMapBuilder(), | 55 sourceMapBuilder = new SourceMapBuilder(), |
| 56 super(compiler) { | 56 super(compiler) { |
| 57 nativeEmitter = new NativeEmitter(this); | 57 nativeEmitter = new NativeEmitter(this); |
| 58 } | 58 } |
| 59 | 59 |
| 60 String get name => 'CodeEmitter'; | 60 String get name => 'CodeEmitter'; |
| 61 | 61 |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 if (member.isFunction() | 471 if (member.isFunction() |
| 472 || member.isGenerativeConstructorBody() | 472 || member.isGenerativeConstructorBody() |
| 473 || member.isGetter() | 473 || member.isGetter() |
| 474 || member.isSetter()) { | 474 || member.isSetter()) { |
| 475 if (member.modifiers !== null && member.modifiers.isAbstract()) return; | 475 if (member.modifiers !== null && member.modifiers.isAbstract()) return; |
| 476 CodeBuffer codeBuffer = compiler.codegenWorld.generatedCode[member]; | 476 CodeBuffer codeBuffer = compiler.codegenWorld.generatedCode[member]; |
| 477 if (codeBuffer == null) return; | 477 if (codeBuffer == null) return; |
| 478 defineInstanceMember(namer.getName(member), codeBuffer); | 478 defineInstanceMember(namer.getName(member), codeBuffer); |
| 479 codeBuffer = compiler.codegenWorld.generatedBailoutCode[member]; | 479 codeBuffer = compiler.codegenWorld.generatedBailoutCode[member]; |
| 480 if (codeBuffer !== null) { | 480 if (codeBuffer !== null) { |
| 481 defineInstanceMember(compiler.namer.getBailoutName(member), codeBuffer); | 481 defineInstanceMember(namer.getBailoutName(member), codeBuffer); |
| 482 } | 482 } |
| 483 FunctionElement function = member; | 483 FunctionElement function = member; |
| 484 FunctionSignature parameters = function.computeSignature(compiler); | 484 FunctionSignature parameters = function.computeSignature(compiler); |
| 485 if (!parameters.optionalParameters.isEmpty()) { | 485 if (!parameters.optionalParameters.isEmpty()) { |
| 486 addParameterStubs(member, defineInstanceMember); | 486 addParameterStubs(member, defineInstanceMember); |
| 487 } | 487 } |
| 488 } else if (!member.isField()) { | 488 } else if (!member.isField()) { |
| 489 compiler.internalError('unexpected kind: "${member.kind}"', | 489 compiler.internalError('unexpected kind: "${member.kind}"', |
| 490 element: member); | 490 element: member); |
| 491 } | 491 } |
| 492 emitExtraAccessors(member, defineInstanceMember); | 492 emitExtraAccessors(member, defineInstanceMember); |
| 493 } | 493 } |
| 494 | 494 |
| 495 String generateCheckedSetter(Element member, String fieldName) { | 495 String generateCheckedSetter(Element member, String fieldName) { |
| 496 DartType type = member.computeType(compiler); | 496 DartType type = member.computeType(compiler); |
| 497 if (type.element.isTypeVariable() | 497 if (type.element.isTypeVariable() |
| 498 || type.element == compiler.dynamicClass | 498 || type.element == compiler.dynamicClass |
| 499 || type.element == compiler.objectClass) { | 499 || type.element == compiler.objectClass) { |
| 500 // TODO(ngeoffray): Support type checks on type parameters. | 500 // TODO(ngeoffray): Support type checks on type parameters. |
| 501 return null; | 501 return null; |
| 502 } else { | 502 } else { |
| 503 SourceString helper = compiler.backend.getCheckedModeHelper(type); | 503 SourceString helper = compiler.backend.getCheckedModeHelper(type); |
| 504 Element helperElement = compiler.findHelper(helper); | 504 Element helperElement = compiler.findHelper(helper); |
| 505 String helperName = compiler.namer.isolateAccess(helperElement); | 505 String helperName = namer.isolateAccess(helperElement); |
| 506 String additionalArgument = compiler.namer.operatorIs(type.element); | 506 String additionalArgument = namer.operatorIs(type.element); |
| 507 return " set\$$fieldName: function(v) { " | 507 return " set\$$fieldName: function(v) { " |
| 508 "this.$fieldName = $helperName(v, '$additionalArgument'); }"; | 508 "this.$fieldName = $helperName(v, '$additionalArgument'); }"; |
| 509 } | 509 } |
| 510 } | 510 } |
| 511 | 511 |
| 512 List<String> emitClassFields(ClassElement classElement, CodeBuffer buffer) { | 512 List<String> emitClassFields(ClassElement classElement, CodeBuffer buffer) { |
| 513 // If the class is never instantiated we still need to set it up for | 513 // If the class is never instantiated we still need to set it up for |
| 514 // inheritance purposes, but we can simplify its JavaScript constructor. | 514 // inheritance purposes, but we can simplify its JavaScript constructor. |
| 515 bool isInstantiated = | 515 bool isInstantiated = |
| 516 compiler.codegenWorld.instantiatedClasses.contains(classElement); | 516 compiler.codegenWorld.instantiatedClasses.contains(classElement); |
| (...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1297 sourceName = token.slowToString(); | 1297 sourceName = token.slowToString(); |
| 1298 } | 1298 } |
| 1299 int totalOffset = bufferOffset + offset; | 1299 int totalOffset = bufferOffset + offset; |
| 1300 sourceMapBuilder.addMapping( | 1300 sourceMapBuilder.addMapping( |
| 1301 sourceFile, token.charOffset, sourceName, totalOffset); | 1301 sourceFile, token.charOffset, sourceName, totalOffset); |
| 1302 }); | 1302 }); |
| 1303 } | 1303 } |
| 1304 } | 1304 } |
| 1305 | 1305 |
| 1306 typedef void DefineMemberFunction(String invocationName, CodeBuffer definition); | 1306 typedef void DefineMemberFunction(String invocationName, CodeBuffer definition); |
| OLD | NEW |