Skip to content

Commit 30c89a4

Browse files
author
emmanue1
committed
Fix syntax errors in decompiled sources
1 parent e8462bd commit 30c89a4

File tree

3 files changed

+68
-42
lines changed

3 files changed

+68
-42
lines changed

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/util/ByteCodeParser.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
package org.jd.core.v1.service.converter.classfiletojavasyntax.util;
99

10-
import org.jd.core.v1.api.printer.Printer;
1110
import org.jd.core.v1.model.classfile.ClassFile;
1211
import org.jd.core.v1.model.classfile.ConstantPool;
1312
import org.jd.core.v1.model.classfile.Method;
@@ -90,7 +89,7 @@ public void parse(BasicBlock basicBlock, Statements statements, DefaultStack<Exp
9089

9190
for (int offset=fromOffset; offset<toOffset; offset++) {
9291
int opcode = code[offset] & 255;
93-
int lineNumber = syntheticFlag ? Printer.UNKNOWN_LINE_NUMBER : cfg.getLineNumber(offset);
92+
int lineNumber = syntheticFlag ? Expression.UNKNOWN_LINE_NUMBER : cfg.getLineNumber(offset);
9493

9594
switch (opcode) {
9695
case 0: // NOP

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/util/ControlFlowGraphLoopReducer.java

Lines changed: 66 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/util/ControlFlowGraphReducer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1319,7 +1319,7 @@ protected static BasicBlock searchUpdateBlockAndCreateContinueLoop(BitSet visite
13191319
int stackDepth = ByteCodeParser.evalStackDepth(subBasicBlock);
13201320

13211321
while (stackDepth != 0) {
1322-
Set<BasicBlock> predecessors = basicBlock.getPredecessors();
1322+
Set<BasicBlock> predecessors = subBasicBlock.getPredecessors();
13231323
if (predecessors.size() != 1) {
13241324
break;
13251325
}

0 commit comments

Comments
 (0)