@@ -274,46 +274,24 @@ protected static Loop makeLoop(List<BasicBlock> list, BasicBlock start, BitSet s
274274
275275 if (end == END ) {
276276 // Not found, check all member blocks
277- for (BasicBlock member : members ) {
278- switch (member .getType ()) {
279- case TYPE_CONDITIONAL_BRANCH :
280- BasicBlock bb = member .getBranch ();
281- if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
282- end = bb ;
283- maxOffset = bb .getFromOffset ();
284- break ;
285- }
286- case TYPE_STATEMENTS :
287- case TYPE_GOTO :
288- bb = member .getNext ();
289- if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
290- end = bb ;
291- maxOffset = bb .getFromOffset ();
292- }
293- break ;
294- case TYPE_SWITCH_DECLARATION :
295- for (SwitchCase switchCase : member .getSwitchCases ()) {
296- bb = switchCase .getBasicBlock ();
297- if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
298- end = bb ;
299- maxOffset = bb .getFromOffset ();
300- }
301- }
302- break ;
303- case TYPE_TRY_DECLARATION :
304- bb = member .getNext ();
305- if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
306- end = bb ;
307- maxOffset = bb .getFromOffset ();
308- }
309- for (ExceptionHandler exceptionHandler : member .getExceptionHandlers ()) {
310- bb = exceptionHandler .getBasicBlock ();
311- if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
312- end = bb ;
313- maxOffset = bb .getFromOffset ();
314- }
277+ end = searchEndBasicBlock (memberIndexes , maxOffset , members );
278+
279+ if (!end .matchType (TYPE_END |TYPE_RETURN |TYPE_LOOP_START |TYPE_LOOP_CONTINUE |TYPE_LOOP_END ) &&
280+ (end .getPredecessors ().size () == 1 ) &&
281+ (end .getPredecessors ().iterator ().next ().getLastLineNumber () + 1 >= end .getFirstLineNumber ()))
282+ {
283+ HashSet <BasicBlock > set = new HashSet <>();
284+
285+ if (recursiveForwardSearchLastLoopMemberIndexes (members , searchZoneIndexes , set , end , null )) {
286+ members .addAll (set );
287+
288+ for (BasicBlock member : set ) {
289+ if (member .getIndex () >= 0 ) {
290+ memberIndexes .set (member .getIndex ());
315291 }
316- break ;
292+ }
293+
294+ end = searchEndBasicBlock (memberIndexes , maxOffset , set );
317295 }
318296 }
319297 }
@@ -340,6 +318,55 @@ protected static Loop makeLoop(List<BasicBlock> list, BasicBlock start, BitSet s
340318 return new Loop (start , members , end );
341319 }
342320
321+ private static BasicBlock searchEndBasicBlock (BitSet memberIndexes , int maxOffset , Set <BasicBlock > members ) {
322+ BasicBlock end = END ;
323+
324+ for (BasicBlock member : members ) {
325+ switch (member .getType ()) {
326+ case TYPE_CONDITIONAL_BRANCH :
327+ BasicBlock bb = member .getBranch ();
328+ if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
329+ end = bb ;
330+ maxOffset = bb .getFromOffset ();
331+ break ;
332+ }
333+ case TYPE_STATEMENTS :
334+ case TYPE_GOTO :
335+ bb = member .getNext ();
336+ if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
337+ end = bb ;
338+ maxOffset = bb .getFromOffset ();
339+ }
340+ break ;
341+ case TYPE_SWITCH_DECLARATION :
342+ for (SwitchCase switchCase : member .getSwitchCases ()) {
343+ bb = switchCase .getBasicBlock ();
344+ if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
345+ end = bb ;
346+ maxOffset = bb .getFromOffset ();
347+ }
348+ }
349+ break ;
350+ case TYPE_TRY_DECLARATION :
351+ bb = member .getNext ();
352+ if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
353+ end = bb ;
354+ maxOffset = bb .getFromOffset ();
355+ }
356+ for (ExceptionHandler exceptionHandler : member .getExceptionHandlers ()) {
357+ bb = exceptionHandler .getBasicBlock ();
358+ if (!memberIndexes .get (bb .getIndex ()) && (maxOffset < bb .getFromOffset ())) {
359+ end = bb ;
360+ maxOffset = bb .getFromOffset ();
361+ }
362+ }
363+ break ;
364+ }
365+ }
366+
367+ return end ;
368+ }
369+
343370 private static int checkMaxOffset (BasicBlock basicBlock ) {
344371 int maxOffset = basicBlock .getFromOffset ();
345372 int offset ;
0 commit comments