OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 '../closure.dart'; | 7 import '../closure.dart'; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/codegen.dart' show CodegenRegistry; | 9 import '../common/codegen.dart' show CodegenRegistry; |
10 import '../common/names.dart'; | 10 import '../common/names.dart'; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 final MemberEntity targetElement; | 51 final MemberEntity targetElement; |
52 | 52 |
53 /// The root node of [targetElement]. This is used as the key into the | 53 /// The root node of [targetElement]. This is used as the key into the |
54 /// [startFunction] of the locals handler. | 54 /// [startFunction] of the locals handler. |
55 // TODO(johnniwinther,efortuna): Avoid the need for AST nodes in the locals | 55 // TODO(johnniwinther,efortuna): Avoid the need for AST nodes in the locals |
56 // handler. | 56 // handler. |
57 final Node functionNode; | 57 final Node functionNode; |
58 final ClosedWorld closedWorld; | 58 final ClosedWorld closedWorld; |
59 final CodegenWorldBuilder _worldBuilder; | 59 final CodegenWorldBuilder _worldBuilder; |
60 final CodegenRegistry registry; | 60 final CodegenRegistry registry; |
61 final ClosureClassMaps closureToClassMapper; | 61 final ClosureDataLookup closureDataLookup; |
62 | 62 |
63 /// Helper accessor for all kernel function-like targets (Procedure, | 63 /// Helper accessor for all kernel function-like targets (Procedure, |
64 /// FunctionExpression, FunctionDeclaration) of the inner FunctionNode itself. | 64 /// FunctionExpression, FunctionDeclaration) of the inner FunctionNode itself. |
65 /// If the current target is not a function-like target, _targetFunction will | 65 /// If the current target is not a function-like target, _targetFunction will |
66 /// be null. | 66 /// be null. |
67 ir.FunctionNode _targetFunction; | 67 ir.FunctionNode _targetFunction; |
68 | 68 |
69 /// A stack of [ResolutionDartType]s that have been seen during inlining of | 69 /// A stack of [ResolutionDartType]s that have been seen during inlining of |
70 /// factory constructors. These types are preserved in [HInvokeStatic]s and | 70 /// factory constructors. These types are preserved in [HInvokeStatic]s and |
71 /// [HCreate]s inside the inline code and registered during code generation | 71 /// [HCreate]s inside the inline code and registered during code generation |
(...skipping 30 matching lines...) Expand all Loading... |
102 this.targetElement, | 102 this.targetElement, |
103 ClassEntity contextClass, | 103 ClassEntity contextClass, |
104 this.target, | 104 this.target, |
105 this.compiler, | 105 this.compiler, |
106 this._elementMap, | 106 this._elementMap, |
107 this._typeInferenceMap, | 107 this._typeInferenceMap, |
108 this.localsMap, | 108 this.localsMap, |
109 this.closedWorld, | 109 this.closedWorld, |
110 this._worldBuilder, | 110 this._worldBuilder, |
111 this.registry, | 111 this.registry, |
112 this.closureToClassMapper, | 112 this.closureDataLookup, |
113 // TODO(het): Should sourceInformationBuilder be in GraphBuilder? | 113 // TODO(het): Should sourceInformationBuilder be in GraphBuilder? |
114 this.sourceInformationBuilder, | 114 this.sourceInformationBuilder, |
115 this.functionNode, | 115 this.functionNode, |
116 {bool targetIsConstructorBody: false}) | 116 {bool targetIsConstructorBody: false}) |
117 : this._targetIsConstructorBody = targetIsConstructorBody { | 117 : this._targetIsConstructorBody = targetIsConstructorBody { |
118 this.loopHandler = new KernelLoopHandler(this); | 118 this.loopHandler = new KernelLoopHandler(this); |
119 typeBuilder = new TypeBuilder(this); | 119 typeBuilder = new TypeBuilder(this); |
120 graph.element = targetElement; | 120 graph.element = targetElement; |
121 graph.sourceInformation = | 121 graph.sourceInformation = |
122 sourceInformationBuilder.buildVariableDeclaration(); | 122 sourceInformationBuilder.buildVariableDeclaration(); |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 } | 332 } |
333 | 333 |
334 // Provide the parameters to the generative constructor body. | 334 // Provide the parameters to the generative constructor body. |
335 body.function.positionalParameters.forEach(handleParameter); | 335 body.function.positionalParameters.forEach(handleParameter); |
336 body.function.namedParameters.toList() | 336 body.function.namedParameters.toList() |
337 ..sort(namedOrdering) | 337 ..sort(namedOrdering) |
338 ..forEach(handleParameter); | 338 ..forEach(handleParameter); |
339 | 339 |
340 // If there are locals that escape (i.e. mutated in closures), we pass the | 340 // If there are locals that escape (i.e. mutated in closures), we pass the |
341 // box to the constructor. | 341 // box to the constructor. |
342 ClosureAnalysisInfo scopeData = closureToClassMapper | 342 ClosureAnalysisInfo scopeData = closureDataLookup |
343 .getClosureAnalysisInfo(constructorElement.resolvedAst.node); | 343 .getClosureAnalysisInfo(constructorElement.resolvedAst.node); |
344 if (scopeData.requiresContextBox()) { | 344 if (scopeData.requiresContextBox()) { |
345 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); | 345 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); |
346 } | 346 } |
347 | 347 |
348 // Pass type arguments. | 348 // Pass type arguments. |
349 ir.Class currentClass = body.enclosingClass; | 349 ir.Class currentClass = body.enclosingClass; |
350 if (backend.rtiNeed.classNeedsRti(_elementMap.getClass(currentClass))) { | 350 if (backend.rtiNeed.classNeedsRti(_elementMap.getClass(currentClass))) { |
351 for (ir.DartType typeParameter in currentClass.thisType.typeArguments) { | 351 for (ir.DartType typeParameter in currentClass.thisType.typeArguments) { |
352 HInstruction argument = localsHandler.readLocal(localsHandler | 352 HInstruction argument = localsHandler.readLocal(localsHandler |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 | 590 |
591 constructor.function.positionalParameters.forEach(handleParameter); | 591 constructor.function.positionalParameters.forEach(handleParameter); |
592 constructor.function.namedParameters.toList() | 592 constructor.function.namedParameters.toList() |
593 ..sort(namedOrdering) | 593 ..sort(namedOrdering) |
594 ..forEach(handleParameter); | 594 ..forEach(handleParameter); |
595 | 595 |
596 // Set the locals handler state as if we were inlining the constructor. | 596 // Set the locals handler state as if we were inlining the constructor. |
597 ConstructorEntity astElement = _elementMap.getConstructor(constructor); | 597 ConstructorEntity astElement = _elementMap.getConstructor(constructor); |
598 ClosureRepresentationInfo oldClosureData = localsHandler.closureData; | 598 ClosureRepresentationInfo oldClosureData = localsHandler.closureData; |
599 ClosureRepresentationInfo newClosureData = | 599 ClosureRepresentationInfo newClosureData = |
600 closureToClassMapper.getClosureRepresentationInfo(astElement); | 600 closureDataLookup.getClosureRepresentationInfo(astElement); |
601 if (astElement is ConstructorElement) { | 601 if (astElement is ConstructorElement) { |
602 // TODO(johnniwinther): Support constructor (body) entities. | 602 // TODO(johnniwinther): Support constructor (body) entities. |
603 ResolvedAst resolvedAst = astElement.resolvedAst; | 603 ResolvedAst resolvedAst = astElement.resolvedAst; |
604 localsHandler.closureData = newClosureData; | 604 localsHandler.closureData = newClosureData; |
605 if (resolvedAst.kind == ResolvedAstKind.PARSED) { | 605 if (resolvedAst.kind == ResolvedAstKind.PARSED) { |
606 localsHandler.enterScope( | 606 localsHandler.enterScope( |
607 closureToClassMapper.getClosureAnalysisInfo(resolvedAst.node), | 607 closureDataLookup.getClosureAnalysisInfo(resolvedAst.node), |
608 forGenerativeConstructorBody: | 608 forGenerativeConstructorBody: |
609 astElement.isGenerativeConstructorBody); | 609 astElement.isGenerativeConstructorBody); |
610 } | 610 } |
611 } | 611 } |
612 inlinedFrom(astElement, () { | 612 inlinedFrom(astElement, () { |
613 _buildInitializers(constructor, constructorChain, fieldValues); | 613 _buildInitializers(constructor, constructorChain, fieldValues); |
614 }); | 614 }); |
615 localsHandler.closureData = oldClosureData; | 615 localsHandler.closureData = oldClosureData; |
616 } | 616 } |
617 | 617 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 function.namedParameters.toList() | 688 function.namedParameters.toList() |
689 ..sort(namedOrdering) | 689 ..sort(namedOrdering) |
690 ..forEach(handleParameter); | 690 ..forEach(handleParameter); |
691 } | 691 } |
692 | 692 |
693 HBasicBlock block = graph.addNewBlock(); | 693 HBasicBlock block = graph.addNewBlock(); |
694 open(graph.entry); | 694 open(graph.entry); |
695 | 695 |
696 localsHandler.startFunction( | 696 localsHandler.startFunction( |
697 targetElement, | 697 targetElement, |
698 closureToClassMapper.getClosureRepresentationInfo(targetElement), | 698 closureDataLookup.getClosureRepresentationInfo(targetElement), |
699 closureToClassMapper.getClosureAnalysisInfo(functionNode), | 699 closureDataLookup.getClosureAnalysisInfo(functionNode), |
700 parameterMap, | 700 parameterMap, |
701 isGenerativeConstructorBody: _targetIsConstructorBody); | 701 isGenerativeConstructorBody: _targetIsConstructorBody); |
702 close(new HGoto()).addSuccessor(block); | 702 close(new HGoto()).addSuccessor(block); |
703 | 703 |
704 open(block); | 704 open(block); |
705 } | 705 } |
706 | 706 |
707 void closeFunction() { | 707 void closeFunction() { |
708 if (!isAborted()) closeAndGotoExit(new HGoto()); | 708 if (!isAborted()) closeAndGotoExit(new HGoto()); |
709 graph.finalize(); | 709 graph.finalize(); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
893 } | 893 } |
894 } | 894 } |
895 | 895 |
896 void buildBody() { | 896 void buildBody() { |
897 forStatement.body.accept(this); | 897 forStatement.body.accept(this); |
898 } | 898 } |
899 | 899 |
900 loopHandler.handleLoop( | 900 loopHandler.handleLoop( |
901 forStatement, | 901 forStatement, |
902 localsMap.getClosureRepresentationInfoForLoop( | 902 localsMap.getClosureRepresentationInfoForLoop( |
903 closureToClassMapper, forStatement), | 903 closureDataLookup, forStatement), |
904 buildInitializer, | 904 buildInitializer, |
905 buildCondition, | 905 buildCondition, |
906 buildUpdate, | 906 buildUpdate, |
907 buildBody); | 907 buildBody); |
908 } | 908 } |
909 | 909 |
910 @override | 910 @override |
911 void visitForInStatement(ir.ForInStatement forInStatement) { | 911 void visitForInStatement(ir.ForInStatement forInStatement) { |
912 if (forInStatement.isAsync) { | 912 if (forInStatement.isAsync) { |
913 _buildAsyncForIn(forInStatement); | 913 _buildAsyncForIn(forInStatement); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 HInstruction one = graph.addConstantInt(1, closedWorld); | 1022 HInstruction one = graph.addConstantInt(1, closedWorld); |
1023 HInstruction addInstruction = | 1023 HInstruction addInstruction = |
1024 new HAdd(index, one, null, commonMasks.positiveIntType); | 1024 new HAdd(index, one, null, commonMasks.positiveIntType); |
1025 add(addInstruction); | 1025 add(addInstruction); |
1026 localsHandler.updateLocal(indexVariable, addInstruction); | 1026 localsHandler.updateLocal(indexVariable, addInstruction); |
1027 } | 1027 } |
1028 | 1028 |
1029 loopHandler.handleLoop( | 1029 loopHandler.handleLoop( |
1030 forInStatement, | 1030 forInStatement, |
1031 localsMap.getClosureRepresentationInfoForLoop( | 1031 localsMap.getClosureRepresentationInfoForLoop( |
1032 closureToClassMapper, forInStatement), | 1032 closureDataLookup, forInStatement), |
1033 buildInitializer, | 1033 buildInitializer, |
1034 buildCondition, | 1034 buildCondition, |
1035 buildUpdate, | 1035 buildUpdate, |
1036 buildBody); | 1036 buildBody); |
1037 } | 1037 } |
1038 | 1038 |
1039 _buildForInIterator(ir.ForInStatement forInStatement) { | 1039 _buildForInIterator(ir.ForInStatement forInStatement) { |
1040 // Generate a structure equivalent to: | 1040 // Generate a structure equivalent to: |
1041 // Iterator<E> $iter = <iterable>.iterator; | 1041 // Iterator<E> $iter = <iterable>.iterator; |
1042 // while ($iter.moveNext()) { | 1042 // while ($iter.moveNext()) { |
(...skipping 30 matching lines...) Expand all Loading... |
1073 // Hint to name loop value after name of loop variable. | 1073 // Hint to name loop value after name of loop variable. |
1074 if (loopVariableLocal is! SyntheticLocal) { | 1074 if (loopVariableLocal is! SyntheticLocal) { |
1075 value.sourceElement ??= loopVariableLocal; | 1075 value.sourceElement ??= loopVariableLocal; |
1076 } | 1076 } |
1077 forInStatement.body.accept(this); | 1077 forInStatement.body.accept(this); |
1078 } | 1078 } |
1079 | 1079 |
1080 loopHandler.handleLoop( | 1080 loopHandler.handleLoop( |
1081 forInStatement, | 1081 forInStatement, |
1082 localsMap.getClosureRepresentationInfoForLoop( | 1082 localsMap.getClosureRepresentationInfoForLoop( |
1083 closureToClassMapper, forInStatement), | 1083 closureDataLookup, forInStatement), |
1084 buildInitializer, | 1084 buildInitializer, |
1085 buildCondition, | 1085 buildCondition, |
1086 () {}, | 1086 () {}, |
1087 buildBody); | 1087 buildBody); |
1088 } | 1088 } |
1089 | 1089 |
1090 void _buildAsyncForIn(ir.ForInStatement forInStatement) { | 1090 void _buildAsyncForIn(ir.ForInStatement forInStatement) { |
1091 // The async-for is implemented with a StreamIterator. | 1091 // The async-for is implemented with a StreamIterator. |
1092 HInstruction streamIterator; | 1092 HInstruction streamIterator; |
1093 | 1093 |
(...skipping 26 matching lines...) Expand all Loading... |
1120 } | 1120 } |
1121 | 1121 |
1122 void buildUpdate() {} | 1122 void buildUpdate() {} |
1123 | 1123 |
1124 // Creates a synthetic try/finally block in case anything async goes amiss. | 1124 // Creates a synthetic try/finally block in case anything async goes amiss. |
1125 TryCatchFinallyBuilder tryBuilder = new TryCatchFinallyBuilder(this); | 1125 TryCatchFinallyBuilder tryBuilder = new TryCatchFinallyBuilder(this); |
1126 // Build fake try body: | 1126 // Build fake try body: |
1127 loopHandler.handleLoop( | 1127 loopHandler.handleLoop( |
1128 forInStatement, | 1128 forInStatement, |
1129 localsMap.getClosureRepresentationInfoForLoop( | 1129 localsMap.getClosureRepresentationInfoForLoop( |
1130 closureToClassMapper, forInStatement), | 1130 closureDataLookup, forInStatement), |
1131 buildInitializer, | 1131 buildInitializer, |
1132 buildCondition, | 1132 buildCondition, |
1133 buildUpdate, | 1133 buildUpdate, |
1134 buildBody); | 1134 buildBody); |
1135 | 1135 |
1136 void finalizerFunction() { | 1136 void finalizerFunction() { |
1137 _pushDynamicInvocation(forInStatement, null, [streamIterator], | 1137 _pushDynamicInvocation(forInStatement, null, [streamIterator], |
1138 selector: Selectors.cancel); | 1138 selector: Selectors.cancel); |
1139 add(new HAwait(pop(), closedWorld.commonMasks.dynamicType)); | 1139 add(new HAwait(pop(), closedWorld.commonMasks.dynamicType)); |
1140 } | 1140 } |
(...skipping 30 matching lines...) Expand all Loading... |
1171 void visitWhileStatement(ir.WhileStatement whileStatement) { | 1171 void visitWhileStatement(ir.WhileStatement whileStatement) { |
1172 assert(isReachable); | 1172 assert(isReachable); |
1173 HInstruction buildCondition() { | 1173 HInstruction buildCondition() { |
1174 whileStatement.condition.accept(this); | 1174 whileStatement.condition.accept(this); |
1175 return popBoolified(); | 1175 return popBoolified(); |
1176 } | 1176 } |
1177 | 1177 |
1178 loopHandler.handleLoop( | 1178 loopHandler.handleLoop( |
1179 whileStatement, | 1179 whileStatement, |
1180 localsMap.getClosureRepresentationInfoForLoop( | 1180 localsMap.getClosureRepresentationInfoForLoop( |
1181 closureToClassMapper, whileStatement), | 1181 closureDataLookup, whileStatement), |
1182 () {}, | 1182 () {}, |
1183 buildCondition, | 1183 buildCondition, |
1184 () {}, () { | 1184 () {}, () { |
1185 whileStatement.body.accept(this); | 1185 whileStatement.body.accept(this); |
1186 }); | 1186 }); |
1187 } | 1187 } |
1188 | 1188 |
1189 @override | 1189 @override |
1190 visitDoStatement(ir.DoStatement doStatement) { | 1190 visitDoStatement(ir.DoStatement doStatement) { |
1191 // TODO(efortuna): I think this can be rewritten using | 1191 // TODO(efortuna): I think this can be rewritten using |
1192 // LoopHandler.handleLoop with some tricks about when the "update" happens. | 1192 // LoopHandler.handleLoop with some tricks about when the "update" happens. |
1193 LocalsHandler savedLocals = new LocalsHandler.from(localsHandler); | 1193 LocalsHandler savedLocals = new LocalsHandler.from(localsHandler); |
1194 LoopClosureRepresentationInfo loopClosureInfo = localsMap | 1194 LoopClosureRepresentationInfo loopClosureInfo = localsMap |
1195 .getClosureRepresentationInfoForLoop(closureToClassMapper, doStatement); | 1195 .getClosureRepresentationInfoForLoop(closureDataLookup, doStatement); |
1196 localsHandler.startLoop(loopClosureInfo); | 1196 localsHandler.startLoop(loopClosureInfo); |
1197 JumpHandler jumpHandler = loopHandler.beginLoopHeader(doStatement); | 1197 JumpHandler jumpHandler = loopHandler.beginLoopHeader(doStatement); |
1198 HLoopInformation loopInfo = current.loopInformation; | 1198 HLoopInformation loopInfo = current.loopInformation; |
1199 HBasicBlock loopEntryBlock = current; | 1199 HBasicBlock loopEntryBlock = current; |
1200 HBasicBlock bodyEntryBlock = current; | 1200 HBasicBlock bodyEntryBlock = current; |
1201 JumpTarget target = localsMap.getJumpTarget(doStatement); | 1201 JumpTarget target = localsMap.getJumpTarget(doStatement); |
1202 bool hasContinues = target != null && target.isContinueTarget; | 1202 bool hasContinues = target != null && target.isContinueTarget; |
1203 if (hasContinues) { | 1203 if (hasContinues) { |
1204 // Add extra block to hang labels on. | 1204 // Add extra block to hang labels on. |
1205 // It doesn't currently work if they are on the same block as the | 1205 // It doesn't currently work if they are on the same block as the |
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1706 switchStatement.cases, | 1706 switchStatement.cases, |
1707 getConstants, | 1707 getConstants, |
1708 (_) => false, // No case is default. | 1708 (_) => false, // No case is default. |
1709 buildSwitchCase); | 1709 buildSwitchCase); |
1710 } | 1710 } |
1711 | 1711 |
1712 void buildLoop() { | 1712 void buildLoop() { |
1713 loopHandler.handleLoop( | 1713 loopHandler.handleLoop( |
1714 switchStatement, | 1714 switchStatement, |
1715 localsMap.getClosureRepresentationInfoForLoop( | 1715 localsMap.getClosureRepresentationInfoForLoop( |
1716 closureToClassMapper, switchStatement), | 1716 closureDataLookup, switchStatement), |
1717 () {}, | 1717 () {}, |
1718 buildCondition, | 1718 buildCondition, |
1719 () {}, | 1719 () {}, |
1720 buildSwitch); | 1720 buildSwitch); |
1721 } | 1721 } |
1722 | 1722 |
1723 if (hasDefault) { | 1723 if (hasDefault) { |
1724 buildLoop(); | 1724 buildLoop(); |
1725 } else { | 1725 } else { |
1726 // If the switch statement has no default case, surround the loop with | 1726 // If the switch statement has no default case, surround the loop with |
(...skipping 1100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2827 } else { | 2827 } else { |
2828 push(new HInvokeDynamicMethod( | 2828 push(new HInvokeDynamicMethod( |
2829 selector, mask, inputs, type, isIntercepted)); | 2829 selector, mask, inputs, type, isIntercepted)); |
2830 } | 2830 } |
2831 } | 2831 } |
2832 | 2832 |
2833 @override | 2833 @override |
2834 visitFunctionNode(ir.FunctionNode node) { | 2834 visitFunctionNode(ir.FunctionNode node) { |
2835 Local methodElement = _elementMap.getLocalFunction(node); | 2835 Local methodElement = _elementMap.getLocalFunction(node); |
2836 ClosureRepresentationInfo closureInfo = | 2836 ClosureRepresentationInfo closureInfo = |
2837 closureToClassMapper.getClosureRepresentationInfo(methodElement); | 2837 closureDataLookup.getClosureRepresentationInfo(methodElement); |
2838 ClassEntity closureClassEntity = closureInfo.closureClassEntity; | 2838 ClassEntity closureClassEntity = closureInfo.closureClassEntity; |
2839 | 2839 |
2840 List<HInstruction> capturedVariables = <HInstruction>[]; | 2840 List<HInstruction> capturedVariables = <HInstruction>[]; |
2841 closureInfo.createdFieldEntities.forEach((Local capturedLocal) { | 2841 closureInfo.createdFieldEntities.forEach((Local capturedLocal) { |
2842 assert(capturedLocal != null); | 2842 assert(capturedLocal != null); |
2843 capturedVariables.add(localsHandler.readLocal(capturedLocal)); | 2843 capturedVariables.add(localsHandler.readLocal(capturedLocal)); |
2844 }); | 2844 }); |
2845 | 2845 |
2846 TypeMask type = new TypeMask.nonNullExact(closureClassEntity, closedWorld); | 2846 TypeMask type = new TypeMask.nonNullExact(closureClassEntity, closedWorld); |
2847 // TODO(efortuna): Add source information here. | 2847 // TODO(efortuna): Add source information here. |
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3471 enterBlock.setBlockFlow( | 3471 enterBlock.setBlockFlow( |
3472 new HTryBlockInformation( | 3472 new HTryBlockInformation( |
3473 kernelBuilder.wrapStatementGraph(bodyGraph), | 3473 kernelBuilder.wrapStatementGraph(bodyGraph), |
3474 exception, | 3474 exception, |
3475 kernelBuilder.wrapStatementGraph(catchGraph), | 3475 kernelBuilder.wrapStatementGraph(catchGraph), |
3476 kernelBuilder.wrapStatementGraph(finallyGraph)), | 3476 kernelBuilder.wrapStatementGraph(finallyGraph)), |
3477 exitBlock); | 3477 exitBlock); |
3478 kernelBuilder.inTryStatement = previouslyInTryStatement; | 3478 kernelBuilder.inTryStatement = previouslyInTryStatement; |
3479 } | 3479 } |
3480 } | 3480 } |
OLD | NEW |