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

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

Issue 12334070: Support runtime check of function types. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Register dependency Created 7 years, 9 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 part of dart2js; 5 part of dart2js;
6 6
7 class EnqueueTask extends CompilerTask { 7 class EnqueueTask extends CompilerTask {
8 final ResolutionEnqueuer resolution; 8 final ResolutionEnqueuer resolution;
9 final CodegenEnqueuer codegen; 9 final CodegenEnqueuer codegen;
10 10
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 // enclosing class, since the metadata has not been parsed yet. 143 // enclosing class, since the metadata has not been parsed yet.
144 if (!member.enclosingElement.isNative()) return; 144 if (!member.enclosingElement.isNative()) return;
145 } 145 }
146 146
147 String memberName = member.name.slowToString(); 147 String memberName = member.name.slowToString();
148 148
149 if (member.kind == ElementKind.FUNCTION) { 149 if (member.kind == ElementKind.FUNCTION) {
150 if (member.name == Compiler.NO_SUCH_METHOD) { 150 if (member.name == Compiler.NO_SUCH_METHOD) {
151 enableNoSuchMethod(member); 151 enableNoSuchMethod(member);
152 } 152 }
153 if (member.name == Compiler.CALL_OPERATOR_NAME) {
154 if (!cls.typeVariables.isEmpty) {
155 compiler.backend.registerRuntimeType(compiler.globalDependencies);
156 universe.callMethods.add(member);
157 }
158 }
153 if (universe.hasInvocation(member, compiler)) { 159 if (universe.hasInvocation(member, compiler)) {
154 return addToWorkList(member); 160 return addToWorkList(member);
155 } 161 }
156 // If there is a property access with the same name as a method we 162 // If there is a property access with the same name as a method we
157 // need to emit the method. 163 // need to emit the method.
158 if (universe.hasInvokedGetter(member, compiler)) { 164 if (universe.hasInvokedGetter(member, compiler)) {
165 if (!cls.typeVariables.isEmpty) {
166 registerGenericClosure(member, compiler.globalDependencies);
167 }
159 // We will emit a closure, so make sure the closure class is 168 // We will emit a closure, so make sure the closure class is
160 // generated. 169 // generated.
161 compiler.closureClass.ensureResolved(compiler); 170 compiler.closureClass.ensureResolved(compiler);
162 registerInstantiatedClass(compiler.closureClass, 171 registerInstantiatedClass(compiler.closureClass,
163 // Precise dependency is not important here. 172 // Precise dependency is not important here.
164 compiler.globalDependencies); 173 compiler.globalDependencies);
165 return addToWorkList(member); 174 return addToWorkList(member);
166 } 175 }
167 } else if (member.kind == ElementKind.GETTER) { 176 } else if (member.kind == ElementKind.GETTER) {
168 if (universe.hasInvokedGetter(member, compiler)) { 177 if (universe.hasInvokedGetter(member, compiler)) {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 for (; !members.isEmpty; members = members.tail) { 284 for (; !members.isEmpty; members = members.tail) {
276 if (!f(members.head)) remaining.addLast(members.head); 285 if (!f(members.head)) remaining.addLast(members.head);
277 } 286 }
278 instanceMembersByName[memberName] = remaining.toLink(); 287 instanceMembersByName[memberName] = remaining.toLink();
279 } 288 }
280 } 289 }
281 290
282 void handleUnseenSelector(SourceString methodName, Selector selector) { 291 void handleUnseenSelector(SourceString methodName, Selector selector) {
283 processInstanceMembers(methodName, (Element member) { 292 processInstanceMembers(methodName, (Element member) {
284 if (selector.appliesUnnamed(member, compiler)) { 293 if (selector.appliesUnnamed(member, compiler)) {
294 if (member.isFunction() && selector.isGetter()) {
295 if (!member.getEnclosingClass().typeVariables.isEmpty) {
296 registerGenericClosure(member, compiler.globalDependencies);
297 }
298 }
285 if (member.isField() && member.enclosingElement.isNative()) { 299 if (member.isField() && member.enclosingElement.isNative()) {
286 if (selector.isGetter() || selector.isCall()) { 300 if (selector.isGetter() || selector.isCall()) {
287 nativeEnqueuer.registerFieldLoad(member); 301 nativeEnqueuer.registerFieldLoad(member);
288 // We have to also handle storing to the field because we only get 302 // We have to also handle storing to the field because we only get
289 // one look at each member and there might be a store we have not 303 // one look at each member and there might be a store we have not
290 // seen yet. 304 // seen yet.
291 // TODO(sra): Process fields for storing separately. 305 // TODO(sra): Process fields for storing separately.
292 nativeEnqueuer.registerFieldStore(member); 306 nativeEnqueuer.registerFieldStore(member);
293 } else { 307 } else {
294 nativeEnqueuer.registerFieldStore(member); 308 nativeEnqueuer.registerFieldStore(member);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 384
371 void registerFieldGetter(Element element) { 385 void registerFieldGetter(Element element) {
372 universe.fieldGetters.add(element); 386 universe.fieldGetters.add(element);
373 } 387 }
374 388
375 void registerFieldSetter(Element element) { 389 void registerFieldSetter(Element element) {
376 universe.fieldSetters.add(element); 390 universe.fieldSetters.add(element);
377 } 391 }
378 392
379 void registerIsCheck(DartType type, TreeElements elements) { 393 void registerIsCheck(DartType type, TreeElements elements) {
394 type = type.unalias(compiler);
380 // Even in checked mode, type annotations for return type and argument 395 // Even in checked mode, type annotations for return type and argument
381 // types do not imply type checks, so there should never be a check 396 // types do not imply type checks, so there should never be a check
382 // against the type variable of a typedef. 397 // against the type variable of a typedef.
383 assert(type.kind != TypeKind.TYPE_VARIABLE || 398 assert(type.kind != TypeKind.TYPE_VARIABLE ||
384 !type.element.enclosingElement.isTypedef()); 399 !type.element.enclosingElement.isTypedef());
385 universe.isChecks.add(type); 400 universe.isChecks.add(type);
386 compiler.backend.registerIsCheck(type, this, elements); 401 compiler.backend.registerIsCheck(type, this, elements);
387 } 402 }
388 403
389 void registerAsCheck(DartType type, TreeElements elements) { 404 void registerAsCheck(DartType type, TreeElements elements) {
390 registerIsCheck(type, elements); 405 registerIsCheck(type, elements);
391 compiler.backend.registerAsCheck(type, elements); 406 compiler.backend.registerAsCheck(type, elements);
392 } 407 }
393 408
409 void registerGenericClosure(Element element, TreeElements elements) {
410 compiler.backend.registerGenericClosure(this, elements);
411 universe.closurizedMembers.add(element);
412 }
413
394 void forEach(f(WorkItem work)); 414 void forEach(f(WorkItem work));
395 415
396 void logSummary(log(message)) { 416 void logSummary(log(message)) {
397 _logSpecificSummary(log); 417 _logSpecificSummary(log);
398 nativeEnqueuer.logSummary(log); 418 nativeEnqueuer.logSummary(log);
399 } 419 }
400 420
401 /// Log summary specific to the concrete enqueuer. 421 /// Log summary specific to the concrete enqueuer.
402 void _logSpecificSummary(log(message)); 422 void _logSpecificSummary(log(message));
403 423
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 while(!queue.isEmpty) { 582 while(!queue.isEmpty) {
563 // TODO(johnniwinther): Find an optimal process order for codegen. 583 // TODO(johnniwinther): Find an optimal process order for codegen.
564 f(queue.removeLast()); 584 f(queue.removeLast());
565 } 585 }
566 } 586 }
567 587
568 void _logSpecificSummary(log(message)) { 588 void _logSpecificSummary(log(message)) {
569 log('Compiled ${generatedCode.length} methods.'); 589 log('Compiled ${generatedCode.length} methods.');
570 } 590 }
571 } 591 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698