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

Side by Side Diff: lib/compiler/implementation/enqueue.dart

Issue 10910088: Fix host-checked + checked by registering when a class is being instantiated, not when being proces… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 3 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) 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 class EnqueueTask extends CompilerTask { 5 class EnqueueTask extends CompilerTask {
6 final Enqueuer codegen; 6 final Enqueuer codegen;
7 final Enqueuer resolution; 7 final Enqueuer resolution;
8 8
9 String get name => 'Enqueue'; 9 String get name => 'Enqueue';
10 10
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 } 162 }
163 163
164 void processInstantiatedClass(ClassElement cls) { 164 void processInstantiatedClass(ClassElement cls) {
165 cls.localMembers.forEach(processInstantiatedClassMember); 165 cls.localMembers.forEach(processInstantiatedClassMember);
166 } 166 }
167 167
168 void processInstantiatedClassMember(Element member) { 168 void processInstantiatedClassMember(Element member) {
169 if (universe.generatedCode.containsKey(member)) return; 169 if (universe.generatedCode.containsKey(member)) return;
170 if (resolvedElements[member] !== null) return; 170 if (resolvedElements[member] !== null) return;
171 if (!member.isInstanceMember()) return; 171 if (!member.isInstanceMember()) return;
172 172 if (member.isField()) return;
173 if (member.kind === ElementKind.FIELD) {
174 universe.instantiatedClassInstanceFields.add(member.name);
175 if (compiler.enableTypeAssertions) {
176 DartType type = member.computeType(compiler);
177 registerIsCheck(type.element);
178 SourceString helper = compiler.backend.getCheckedModeHelper(type);
179 if (helper != null) {
180 Element helperElement = compiler.findHelper(helper);
181 registerStaticUse(helperElement);
182 }
183 }
184 return;
185 }
186 173
187 String memberName = member.name.slowToString(); 174 String memberName = member.name.slowToString();
188 Link<Element> members = instanceMembersByName.putIfAbsent( 175 Link<Element> members = instanceMembersByName.putIfAbsent(
189 memberName, () => const EmptyLink<Element>()); 176 memberName, () => const EmptyLink<Element>());
190 instanceMembersByName[memberName] = members.prepend(member); 177 instanceMembersByName[memberName] = members.prepend(member);
191 178
192
193 if (member.kind == ElementKind.FUNCTION) { 179 if (member.kind == ElementKind.FUNCTION) {
194 if (member.name == Compiler.NO_SUCH_METHOD) { 180 if (member.name == Compiler.NO_SUCH_METHOD) {
195 compiler.enableNoSuchMethod(member); 181 compiler.enableNoSuchMethod(member);
196 } 182 }
197 if (universe.hasInvocation(member, compiler)) { 183 if (universe.hasInvocation(member, compiler)) {
198 return addToWorkList(member); 184 return addToWorkList(member);
199 } 185 }
200 // If there is a property access with the same name as a method we 186 // If there is a property access with the same name as a method we
201 // need to emit the method. 187 // need to emit the method.
202 if (universe.hasInvokedGetter(member, compiler)) { 188 if (universe.hasInvokedGetter(member, compiler)) {
203 // We will emit a closure, so make sure the closure class is 189 // We will emit a closure, so make sure the closure class is
204 // generated. 190 // generated.
205 compiler.closureClass.ensureResolved(compiler); 191 compiler.closureClass.ensureResolved(compiler);
206 registerInstantiatedClass(compiler.closureClass); 192 registerInstantiatedClass(compiler.closureClass);
207 return addToWorkList(member); 193 return addToWorkList(member);
208 } 194 }
209 } else if (member.kind == ElementKind.GETTER) { 195 } else if (member.kind == ElementKind.GETTER) {
210 universe.instantiatedClassInstanceFields.add(member.name);
211 if (universe.hasInvokedGetter(member, compiler)) { 196 if (universe.hasInvokedGetter(member, compiler)) {
212 return addToWorkList(member); 197 return addToWorkList(member);
213 } 198 }
214 // We don't know what selectors the returned closure accepts. If 199 // We don't know what selectors the returned closure accepts. If
215 // the set contains any selector we have to assume that it matches. 200 // the set contains any selector we have to assume that it matches.
216 if (universe.hasInvocation(member, compiler)) { 201 if (universe.hasInvocation(member, compiler)) {
217 return addToWorkList(member); 202 return addToWorkList(member);
218 } 203 }
219 } else if (member.kind === ElementKind.SETTER) { 204 } else if (member.kind === ElementKind.SETTER) {
220 if (universe.hasInvokedSetter(member, compiler)) { 205 if (universe.hasInvokedSetter(member, compiler)) {
(...skipping 13 matching lines...) Expand all
234 cls = supertypes.head.element; 219 cls = supertypes.head.element;
235 if (seenClasses.contains(cls)) continue; 220 if (seenClasses.contains(cls)) continue;
236 seenClasses.add(cls); 221 seenClasses.add(cls);
237 cls.ensureResolved(compiler); 222 cls.ensureResolved(compiler);
238 if (!cls.isInterface()) { 223 if (!cls.isInterface()) {
239 cls.localMembers.forEach(processInstantiatedClassMember); 224 cls.localMembers.forEach(processInstantiatedClassMember);
240 } 225 }
241 if (isResolutionQueue) { 226 if (isResolutionQueue) {
242 compiler.resolver.checkMembers(cls); 227 compiler.resolver.checkMembers(cls);
243 } 228 }
229
230 if (compiler.enableTypeAssertions) {
231 // We need to register is checks and helpers for checking
232 // assignments to fields.
233 // TODO(ngeoffray): This should really move to the backend.
234 cls.localMembers.forEach((Element member) {
235 if (!member.isInstanceMember() && !member.isField()) return;
236 DartType type = member.computeType(compiler);
237 registerIsCheck(type.element);
238 SourceString helper = compiler.backend.getCheckedModeHelper(type);
239 if (helper != null) {
240 Element helperElement = compiler.findHelper(helper);
241 registerStaticUse(helperElement);
242 }
243 });
244 }
244 } 245 }
245 }); 246 });
246 } 247 }
247 248
248 void registerNewSelector(SourceString name, 249 void registerNewSelector(SourceString name,
249 Selector selector, 250 Selector selector,
250 Map<SourceString, Set<Selector>> selectorsMap) { 251 Map<SourceString, Set<Selector>> selectorsMap) {
251 if (name != selector.name) { 252 if (name != selector.name) {
252 String message = "$name != ${selector.name} (${selector.kind})"; 253 String message = "$name != ${selector.name} (${selector.kind})";
253 compiler.internalError("Wrong selector name: $message."); 254 compiler.internalError("Wrong selector name: $message.");
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 void registerIsCheck(Element element) { 353 void registerIsCheck(Element element) {
353 universe.isChecks.add(element); 354 universe.isChecks.add(element);
354 } 355 }
355 356
356 void forEach(f(WorkItem work)) { 357 void forEach(f(WorkItem work)) {
357 while (!queue.isEmpty()) { 358 while (!queue.isEmpty()) {
358 f(queue.removeLast()); // TODO(kasperl): Why isn't this removeFirst? 359 f(queue.removeLast()); // TODO(kasperl): Why isn't this removeFirst?
359 } 360 }
360 } 361 }
361 } 362 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698