OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/names.dart'; | 8 import '../common/names.dart'; |
9 import '../compiler.dart'; | 9 import '../compiler.dart'; |
10 import '../constants/expressions.dart'; | 10 import '../constants/expressions.dart'; |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 if (compiler.options.verbose) { | 305 if (compiler.options.verbose) { |
306 compiler.progress.reset(); | 306 compiler.progress.reset(); |
307 } | 307 } |
308 sortResolvedAsts().forEach((ResolvedAst resolvedAst) { | 308 sortResolvedAsts().forEach((ResolvedAst resolvedAst) { |
309 if (compiler.shouldPrintProgress) { | 309 if (compiler.shouldPrintProgress) { |
310 reporter.log('Added $addedInGraph elements in inferencing graph.'); | 310 reporter.log('Added $addedInGraph elements in inferencing graph.'); |
311 compiler.progress.reset(); | 311 compiler.progress.reset(); |
312 } | 312 } |
313 // This also forces the creation of the [ElementTypeInformation] to ensure | 313 // This also forces the creation of the [ElementTypeInformation] to ensure |
314 // it is in the graph. | 314 // it is in the graph. |
315 types.withMember(resolvedAst.element, () => analyze(resolvedAst, null)); | 315 MemberElement member = resolvedAst.element; |
| 316 types.withMember(member, () => analyze(resolvedAst, null)); |
316 }); | 317 }); |
317 reporter.log('Added $addedInGraph elements in inferencing graph.'); | 318 reporter.log('Added $addedInGraph elements in inferencing graph.'); |
318 | 319 |
319 TypeGraphDump dump = debug.PRINT_GRAPH ? new TypeGraphDump(this) : null; | 320 TypeGraphDump dump = debug.PRINT_GRAPH ? new TypeGraphDump(this) : null; |
320 | 321 |
321 dump?.beforeAnalysis(); | 322 dump?.beforeAnalysis(); |
322 buildWorkQueue(); | 323 buildWorkQueue(); |
323 refine(); | 324 refine(); |
324 | 325 |
325 // Try to infer element types of lists and compute their escape information. | 326 // Try to infer element types of lists and compute their escape information. |
(...skipping 15 matching lines...) Expand all Loading... |
341 Iterable<FunctionEntity> elements, ClosureTracerVisitor tracer) { | 342 Iterable<FunctionEntity> elements, ClosureTracerVisitor tracer) { |
342 tracer.run(); | 343 tracer.run(); |
343 if (!tracer.continueAnalyzing) { | 344 if (!tracer.continueAnalyzing) { |
344 elements.forEach((FunctionEntity _element) { | 345 elements.forEach((FunctionEntity _element) { |
345 MethodElement element = _element; | 346 MethodElement element = _element; |
346 MethodElement implementation = element.implementation; | 347 MethodElement implementation = element.implementation; |
347 closedWorldRefiner.registerMightBePassedToApply(element); | 348 closedWorldRefiner.registerMightBePassedToApply(element); |
348 if (debug.VERBOSE) { | 349 if (debug.VERBOSE) { |
349 print("traced closure $element as ${true} (bail)"); | 350 print("traced closure $element as ${true} (bail)"); |
350 } | 351 } |
351 implementation.functionSignature.forEachParameter((parameter) { | 352 implementation.functionSignature |
| 353 .forEachParameter((FormalElement _parameter) { |
| 354 ParameterElement parameter = _parameter; |
352 types | 355 types |
353 .getInferredTypeOfParameter(parameter) | 356 .getInferredTypeOfParameter(parameter) |
354 .giveUp(this, clearAssignments: false); | 357 .giveUp(this, clearAssignments: false); |
355 }); | 358 }); |
356 }); | 359 }); |
357 bailedOutOn.addAll(elements); | 360 bailedOutOn.addAll(elements); |
358 return; | 361 return; |
359 } | 362 } |
360 elements | 363 elements |
361 .where((e) => !bailedOutOn.contains(e)) | 364 .where((e) => !bailedOutOn.contains(e)) |
362 .forEach((FunctionEntity _element) { | 365 .forEach((FunctionEntity _element) { |
363 MethodElement element = _element; | 366 MethodElement element = _element; |
364 MethodElement implementation = element.implementation; | 367 MethodElement implementation = element.implementation; |
365 implementation.functionSignature.forEachParameter((parameter) { | 368 implementation.functionSignature |
366 var info = types.getInferredTypeOfParameter(parameter); | 369 .forEachParameter((FormalElement _parameter) { |
| 370 ParameterElement parameter = _parameter; |
| 371 ParameterTypeInformation info = |
| 372 types.getInferredTypeOfParameter(parameter); |
367 info.maybeResume(); | 373 info.maybeResume(); |
368 workQueue.add(info); | 374 workQueue.add(info); |
369 }); | 375 }); |
370 if (tracer.tracedType.mightBePassedToFunctionApply) { | 376 if (tracer.tracedType.mightBePassedToFunctionApply) { |
371 closedWorldRefiner.registerMightBePassedToApply(element); | 377 closedWorldRefiner.registerMightBePassedToApply(element); |
372 } | 378 } |
373 if (debug.VERBOSE) { | 379 if (debug.VERBOSE) { |
374 print("traced closure $element as " | 380 print("traced closure $element as " |
375 "${closedWorldRefiner | 381 "${closedWorldRefiner |
376 .getCurrentlyKnownMightBePassedToApply(element)}"); | 382 .getCurrentlyKnownMightBePassedToApply(element)}"); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 if (target is MethodElement) { | 465 if (target is MethodElement) { |
460 print( | 466 print( |
461 '${types.getInferredSignatureOfMethod(target)} for ${target}')
; | 467 '${types.getInferredSignatureOfMethod(target)} for ${target}')
; |
462 } else { | 468 } else { |
463 print( | 469 print( |
464 '${types.getInferredTypeOfMember(target).type} for ${target}')
; | 470 '${types.getInferredTypeOfMember(target).type} for ${target}')
; |
465 } | 471 } |
466 } | 472 } |
467 } else if (info is StaticCallSiteTypeInformation) { | 473 } else if (info is StaticCallSiteTypeInformation) { |
468 ClassElement cls = info.calledElement.enclosingClass; | 474 ClassElement cls = info.calledElement.enclosingClass; |
469 FunctionElement callMethod = cls.lookupMember(Identifiers.call); | 475 MethodElement callMethod = cls.lookupMember(Identifiers.call); |
470 print('${types.getInferredSignatureOfMethod(callMethod)} for ${cls}'); | 476 print('${types.getInferredSignatureOfMethod(callMethod)} for ${cls}'); |
471 } else { | 477 } else { |
472 print('${info.type} for some unknown kind of closure'); | 478 print('${info.type} for some unknown kind of closure'); |
473 } | 479 } |
474 }); | 480 }); |
475 analyzedElements.forEach((MemberElement elem) { | 481 analyzedElements.forEach((MemberElement elem) { |
476 TypeInformation type = types.getInferredTypeOfMember(elem); | 482 TypeInformation type = types.getInferredTypeOfMember(elem); |
477 print('${elem} :: ${type} from ${type.assignments} '); | 483 print('${elem} :: ${type} from ${type.assignments} '); |
478 }); | 484 }); |
479 } | 485 } |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
657 info.closurizedCount++; | 663 info.closurizedCount++; |
658 if (Elements.isStaticOrTopLevel(method)) { | 664 if (Elements.isStaticOrTopLevel(method)) { |
659 types.allocatedClosures.add(info); | 665 types.allocatedClosures.add(info); |
660 } else { | 666 } else { |
661 // We add the call-site type information here so that we | 667 // We add the call-site type information here so that we |
662 // can benefit from further refinement of the selector. | 668 // can benefit from further refinement of the selector. |
663 types.allocatedClosures.add(caller); | 669 types.allocatedClosures.add(caller); |
664 } | 670 } |
665 FunctionElement function = method.implementation; | 671 FunctionElement function = method.implementation; |
666 FunctionSignature signature = function.functionSignature; | 672 FunctionSignature signature = function.functionSignature; |
667 signature.forEachParameter((Element parameter) { | 673 signature.forEachParameter((FormalElement _parameter) { |
| 674 ParameterElement parameter = _parameter; |
668 ParameterTypeInformation info = | 675 ParameterTypeInformation info = |
669 types.getInferredTypeOfParameter(parameter); | 676 types.getInferredTypeOfParameter(parameter); |
670 info.tagAsTearOffClosureParameter(this); | 677 info.tagAsTearOffClosureParameter(this); |
671 if (addToQueue) workQueue.add(info); | 678 if (addToQueue) workQueue.add(info); |
672 }); | 679 }); |
673 } | 680 } |
674 } else { | 681 } else { |
675 MethodElement method = callee; | 682 MethodElement method = callee; |
676 FunctionElement function = method.implementation; | 683 FunctionElement function = method.implementation; |
677 FunctionSignature signature = function.functionSignature; | 684 FunctionSignature signature = function.functionSignature; |
678 int parameterIndex = 0; | 685 int parameterIndex = 0; |
679 bool visitingRequiredParameter = true; | 686 bool visitingRequiredParameter = true; |
680 signature.forEachParameter((Element parameter) { | 687 signature.forEachParameter((FormalElement _parameter) { |
| 688 ParameterElement parameter = _parameter; |
681 if (signature.hasOptionalParameters && | 689 if (signature.hasOptionalParameters && |
682 parameter == signature.optionalParameters.first) { | 690 parameter == signature.optionalParameters.first) { |
683 visitingRequiredParameter = false; | 691 visitingRequiredParameter = false; |
684 } | 692 } |
685 TypeInformation type = visitingRequiredParameter | 693 TypeInformation type = visitingRequiredParameter |
686 ? arguments.positional[parameterIndex] | 694 ? arguments.positional[parameterIndex] |
687 : signature.optionalParametersAreNamed | 695 : signature.optionalParametersAreNamed |
688 ? arguments.named[parameter.name] | 696 ? arguments.named[parameter.name] |
689 : parameterIndex < arguments.positional.length | 697 : parameterIndex < arguments.positional.length |
690 ? arguments.positional[parameterIndex] | 698 ? arguments.positional[parameterIndex] |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1107 /** | 1115 /** |
1108 * Records that the captured variable [local] is read. | 1116 * Records that the captured variable [local] is read. |
1109 */ | 1117 */ |
1110 void recordCapturedLocalRead(Local local) {} | 1118 void recordCapturedLocalRead(Local local) {} |
1111 | 1119 |
1112 /** | 1120 /** |
1113 * Records that the variable [local] is being updated. | 1121 * Records that the variable [local] is being updated. |
1114 */ | 1122 */ |
1115 void recordLocalUpdate(Local local, TypeInformation type) {} | 1123 void recordLocalUpdate(Local local, TypeInformation type) {} |
1116 } | 1124 } |
OLD | NEW |