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

Side by Side Diff: pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart

Issue 940053002: dart2js: add function type to the model. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed comments. Created 5 years, 10 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].
11 class ContainerBuilder extends CodeEmitterHelper { 11 class ContainerBuilder extends CodeEmitterHelper {
12 12
13 void addMemberMethod(DartMethod method, ClassBuilder builder) { 13 void addMemberMethod(DartMethod method, ClassBuilder builder) {
14 FunctionElement member = method.element; 14 FunctionElement member = method.element;
15 String name = method.name; 15 String name = method.name;
16 FunctionSignature parameters = member.functionSignature; 16 FunctionSignature parameters = member.functionSignature;
17 jsAst.Expression code = method.code; 17 jsAst.Expression code = method.code;
18 bool needsStubs = method.parameterStubs.isNotEmpty; 18 bool needsStubs = method.parameterStubs.isNotEmpty;
19 bool canBeApplied = method.canBeApplied; 19 bool canBeApplied = method.canBeApplied;
20 bool canBeReflected = method.canBeReflected; 20 bool canBeReflected = method.canBeReflected;
21 bool canTearOff = method.needsTearOff; 21 bool canTearOff = method.needsTearOff;
22 String tearOffName = method.tearOffName; 22 String tearOffName = method.tearOffName;
23 bool isClosure = method is InstanceMethod && method.isClosure; 23 bool isClosure = method is InstanceMethod && method.isClosure;
24 String superAlias = method is InstanceMethod ? method.aliasName : null; 24 String superAlias = method is InstanceMethod ? method.aliasName : null;
25 bool hasSuperAlias = superAlias != null; 25 bool hasSuperAlias = superAlias != null;
26 jsAst.Expression memberTypeExpression = method.functionType;
26 27
27 bool needStructuredInfo = 28 bool needStructuredInfo =
28 canTearOff || canBeReflected || canBeApplied || hasSuperAlias; 29 canTearOff || canBeReflected || canBeApplied || hasSuperAlias;
29 30
30 emitter.interceptorEmitter.recordMangledNameOfMemberMethod(member, name); 31 emitter.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
31 32
32 if (!needStructuredInfo) { 33 if (!needStructuredInfo) {
33 compiler.dumpInfoTask.registerElementAst(member, 34 compiler.dumpInfoTask.registerElementAst(member,
34 builder.addProperty(name, code)); 35 builder.addProperty(name, code));
35 36
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 } else { 120 } else {
120 // TOOD(floitsch): Since we know when reading static data versus 121 // TOOD(floitsch): Since we know when reading static data versus
121 // instance data, we can eliminate this element. 122 // instance data, we can eliminate this element.
122 expressions.add(js('null')); 123 expressions.add(js('null'));
123 } 124 }
124 String callName = stub.callName; 125 String callName = stub.callName;
125 String callSelectorString = (callName == null) ? 'null' : '"$callName"'; 126 String callSelectorString = (callName == null) ? 'null' : '"$callName"';
126 tearOffInfo.add(new jsAst.LiteralString(callSelectorString)); 127 tearOffInfo.add(new jsAst.LiteralString(callSelectorString));
127 } 128 }
128 129
129 jsAst.Expression memberTypeExpression;
130 if (canTearOff || canBeReflected) {
131 DartType memberType = method.type;
132 if (memberType.containsTypeVariables) {
133 jsAst.Expression thisAccess = js(r'this.$receiver');
134 memberTypeExpression =
135 backend.rti.getSignatureEncoding(memberType, thisAccess);
136 } else {
137 memberTypeExpression =
138 js.number(task.metadataCollector.reifyType(memberType));
139 }
140 } else {
141 memberTypeExpression = js('null');
142 }
143
144 expressions 130 expressions
145 ..addAll(tearOffInfo) 131 ..addAll(tearOffInfo)
146 ..add((tearOffName == null || member.isAccessor) 132 ..add((tearOffName == null || member.isAccessor)
147 ? js("null") : js.string(tearOffName)) 133 ? js("null") : js.string(tearOffName))
148 ..add(js.number(requiredParameterCount)) 134 ..add(js.number(requiredParameterCount))
149 ..add(js.number(optionalParameterCount)) 135 ..add(js.number(optionalParameterCount))
150 ..add(memberTypeExpression) 136 ..add(memberTypeExpression == null ? js("null") : memberTypeExpression)
151 ..addAll(task.metadataCollector 137 ..addAll(task.metadataCollector
152 .reifyDefaultArguments(member).map(js.number)); 138 .reifyDefaultArguments(member).map(js.number));
153 139
154 if (canBeReflected || canBeApplied) { 140 if (canBeReflected || canBeApplied) {
155 parameters.forEachParameter((Element parameter) { 141 parameters.forEachParameter((Element parameter) {
156 expressions.add( 142 expressions.add(
157 js.number(task.metadataCollector.reifyName(parameter.name))); 143 js.number(task.metadataCollector.reifyName(parameter.name)));
158 if (backend.mustRetainMetadata) { 144 if (backend.mustRetainMetadata) {
159 Iterable<int> metadataIndices = 145 Iterable<int> metadataIndices =
160 parameter.metadata.map((MetadataAnnotation annotation) { 146 parameter.metadata.map((MetadataAnnotation annotation) {
(...skipping 30 matching lines...) Expand all
191 jsAst.ArrayInitializer arrayInit = 177 jsAst.ArrayInitializer arrayInit =
192 new jsAst.ArrayInitializer(expressions.toList()); 178 new jsAst.ArrayInitializer(expressions.toList());
193 compiler.dumpInfoTask.registerElementAst(member, 179 compiler.dumpInfoTask.registerElementAst(member,
194 builder.addProperty(name, arrayInit)); 180 builder.addProperty(name, arrayInit));
195 } 181 }
196 182
197 void addMemberField(Field field, ClassBuilder builder) { 183 void addMemberField(Field field, ClassBuilder builder) {
198 // For now, do nothing. 184 // For now, do nothing.
199 } 185 }
200 } 186 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart ('k') | pkg/compiler/lib/src/js_emitter/program_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698