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

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

Issue 886053004: dart2js: Refactor how parameter stubs are handled. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: 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].
(...skipping 14 matching lines...) Expand all
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698