| OLD | NEW |
| 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 14 matching lines...) Expand all Loading... |
| 25 | 25 |
| 26 final bool needStructuredInfo = | 26 final bool needStructuredInfo = |
| 27 canTearOff || canBeReflected || canBeApplied || hasSuperAlias; | 27 canTearOff || canBeReflected || canBeApplied || hasSuperAlias; |
| 28 | 28 |
| 29 emitter.interceptorEmitter.recordMangledNameOfMemberMethod(member, name); | 29 emitter.interceptorEmitter.recordMangledNameOfMemberMethod(member, name); |
| 30 | 30 |
| 31 if (!needStructuredInfo) { | 31 if (!needStructuredInfo) { |
| 32 compiler.dumpInfoTask.registerElementAst(member, | 32 compiler.dumpInfoTask.registerElementAst(member, |
| 33 builder.addProperty(name, code)); | 33 builder.addProperty(name, code)); |
| 34 | 34 |
| 35 for (ParameterStubMethod method in method.parameterStubs) { | 35 for (ParameterStubMethod stub in method.parameterStubs) { |
| 36 jsAst.Property property = builder.addProperty(method.name, method.code); | 36 assert(stub.callName == null); |
| 37 jsAst.Property property = builder.addProperty(stub.name, stub.code); |
| 37 compiler.dumpInfoTask.registerElementAst(member, property); | 38 compiler.dumpInfoTask.registerElementAst(member, property); |
| 38 emitter.interceptorEmitter | 39 emitter.interceptorEmitter |
| 39 .recordMangledNameOfMemberMethod(member, method.name); | 40 .recordMangledNameOfMemberMethod(member, stub.name); |
| 40 } | 41 } |
| 41 return; | 42 return; |
| 42 } | 43 } |
| 43 emitter.needsStructuredMemberInfo = true; | 44 emitter.needsStructuredMemberInfo = true; |
| 44 | 45 |
| 45 // This element is needed for reflection or needs additional stubs or has a | 46 // This element is needed for reflection or needs additional stubs or has a |
| 46 // super alias. So we need to retain additional information. | 47 // super alias. So we need to retain additional information. |
| 47 | 48 |
| 48 // The information is stored in an array with this format: | 49 // The information is stored in an array with this format: |
| 49 // | 50 // |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 | 86 |
| 86 if (onlyNeedsSuperAlias) { | 87 if (onlyNeedsSuperAlias) { |
| 87 jsAst.ArrayInitializer arrayInit = | 88 jsAst.ArrayInitializer arrayInit = |
| 88 new jsAst.ArrayInitializer(expressions); | 89 new jsAst.ArrayInitializer(expressions); |
| 89 compiler.dumpInfoTask.registerElementAst(member, | 90 compiler.dumpInfoTask.registerElementAst(member, |
| 90 builder.addProperty(name, arrayInit)); | 91 builder.addProperty(name, arrayInit)); |
| 91 return; | 92 return; |
| 92 } | 93 } |
| 93 | 94 |
| 94 String callSelectorString = 'null'; | 95 String callSelectorString = 'null'; |
| 95 if (member.isFunction) { | 96 if (method.callName != null) { |
| 96 Selector callSelector = new Selector.fromElement(member).toCallSelector(); | 97 callSelectorString = '"${method.callName}"'; |
| 97 callSelectorString = '"${namer.invocationName(callSelector)}"'; | |
| 98 } | 98 } |
| 99 | 99 |
| 100 // On [requiredParameterCount], the lower bit is set if this method can be | 100 // On [requiredParameterCount], the lower bit is set if this method can be |
| 101 // called reflectively. | 101 // called reflectively. |
| 102 int requiredParameterCount = parameters.requiredParameterCount << 1; | 102 int requiredParameterCount = parameters.requiredParameterCount << 1; |
| 103 if (member.isAccessor) requiredParameterCount++; | 103 if (member.isAccessor) requiredParameterCount++; |
| 104 | 104 |
| 105 int optionalParameterCount = parameters.optionalParameterCount << 1; | 105 int optionalParameterCount = parameters.optionalParameterCount << 1; |
| 106 if (parameters.optionalParametersAreNamed) optionalParameterCount++; | 106 if (parameters.optionalParametersAreNamed) optionalParameterCount++; |
| 107 | 107 |
| 108 // TODO(sra): Don't use LiteralString for non-strings. | 108 // TODO(sra): Don't use LiteralString for non-strings. |
| 109 List tearOffInfo = [new jsAst.LiteralString(callSelectorString)]; | 109 List tearOffInfo = [new jsAst.LiteralString(callSelectorString)]; |
| 110 | 110 |
| 111 if (needsStubs || canTearOff) { | 111 for (ParameterStubMethod stub in method.parameterStubs) { |
| 112 String invocationName = stub.name; |
| 113 emitter.interceptorEmitter |
| 114 .recordMangledNameOfMemberMethod(member, invocationName); |
| 112 | 115 |
| 113 for (ParameterStubMethod method in method.parameterStubs) { | 116 expressions.add(stub.code); |
| 114 String invocationName = method.name; | 117 if (member.isInstanceMember) { |
| 115 emitter.interceptorEmitter | 118 expressions.add(js.string(invocationName)); |
| 116 .recordMangledNameOfMemberMethod(member, invocationName); | 119 } else { |
| 117 expressions.add(method.code); | 120 // TOOD(floitsch): Since we know when reading static data versus |
| 118 if (member.isInstanceMember) { | 121 // instance data, we can eliminate this element. |
| 119 expressions.add(js.string(invocationName)); | 122 expressions.add(js('null')); |
| 120 } else { | |
| 121 expressions.add(js('null')); | |
| 122 // TOOD(ahe): Since we know when reading static data versus instance | |
| 123 // data, we can eliminate this element. | |
| 124 } | |
| 125 | |
| 126 Set<Selector> callSelectors = compiler.codegenWorld.invokedNames[ | |
| 127 namer.closureInvocationSelectorName]; | |
| 128 Selector callSelector = method.selector.toCallSelector(); | |
| 129 String callSelectorString = 'null'; | |
| 130 if (canTearOff && callSelectors != null && | |
| 131 callSelectors.contains(callSelector)) { | |
| 132 callSelectorString = '"${namer.invocationName(callSelector)}"'; | |
| 133 } | |
| 134 tearOffInfo.add(new jsAst.LiteralString(callSelectorString)); | |
| 135 } | 123 } |
| 124 String callName = stub.callName; |
| 125 String callSelectorString = (callName == null) ? 'null' : '"$callName"'; |
| 126 tearOffInfo.add(new jsAst.LiteralString(callSelectorString)); |
| 136 } | 127 } |
| 137 | 128 |
| 138 jsAst.Expression memberTypeExpression; | 129 jsAst.Expression memberTypeExpression; |
| 139 if (canTearOff || canBeReflected) { | 130 if (canTearOff || canBeReflected) { |
| 140 DartType memberType; | 131 DartType memberType; |
| 141 if (member.isGenerativeConstructorBody) { | 132 if (member.isGenerativeConstructorBody) { |
| 142 var body = member; | 133 var body = member; |
| 143 memberType = body.constructor.type; | 134 memberType = body.constructor.type; |
| 144 } else { | 135 } else { |
| 145 memberType = member.type; | 136 memberType = member.type; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 jsAst.ArrayInitializer arrayInit = | 197 jsAst.ArrayInitializer arrayInit = |
| 207 new jsAst.ArrayInitializer(expressions.toList()); | 198 new jsAst.ArrayInitializer(expressions.toList()); |
| 208 compiler.dumpInfoTask.registerElementAst(member, | 199 compiler.dumpInfoTask.registerElementAst(member, |
| 209 builder.addProperty(name, arrayInit)); | 200 builder.addProperty(name, arrayInit)); |
| 210 } | 201 } |
| 211 | 202 |
| 212 void addMemberField(Field field, ClassBuilder builder) { | 203 void addMemberField(Field field, ClassBuilder builder) { |
| 213 // For now, do nothing. | 204 // For now, do nothing. |
| 214 } | 205 } |
| 215 } | 206 } |
| OLD | NEW |