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