Skip to content

Commit 1e34e52

Browse files
author
emmanue1
committed
Fix syntax errors in decompiled sources
1 parent 0f94f87 commit 1e34e52

File tree

4 files changed

+24
-26
lines changed

4 files changed

+24
-26
lines changed

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/model/localvariable/Frame.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -196,16 +196,19 @@ public void createNames(HashSet<String> parentNames) {
196196
AbstractLocalVariable lv = localVariableArray[i];
197197

198198
while (lv != null) {
199-
if (lv.name == null) {
200-
if (types.containsKey(lv.getType())) {
201-
// Non unique type
202-
types.put(lv.getType(), Boolean.TRUE);
199+
if (types.containsKey(lv.getType())) {
200+
// Non unique type
201+
types.put(lv.getType(), Boolean.TRUE);
202+
} else {
203+
// Unique type
204+
types.put(lv.getType(), Boolean.FALSE);
205+
}
206+
if (lv.name != null) {
207+
if (names.contains(lv.name)) {
208+
lv.name = null;
203209
} else {
204-
// Unique type
205-
types.put(lv.getType(), Boolean.FALSE);
210+
names.add(lv.name);
206211
}
207-
} else {
208-
names.add(lv.name);
209212
}
210213
assert lv != lv.getNext();
211214
lv = lv.getNext();
@@ -318,6 +321,7 @@ protected boolean createInlineDeclarations() {
318321
for (AbstractLocalVariable lv : sorted) {
319322
// Add declaration before current statement
320323
iterator.add(new LocalVariableDeclarationStatement(lv.getType(), new LocalVariableDeclarator(lv.getName())));
324+
lv.setDeclared(true);
321325
undeclaredLocalVariables.remove(lv);
322326
}
323327

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

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ public LocalVariableMaker(TypeMaker typeMaker, ClassFileConstructorOrMethodDecla
5959
if (descriptor.charAt(descriptor.length() - 1) == ';') {
6060
typeMaker.makeFromDescriptor(descriptor).accept(populateBlackListNamesVisitor);
6161
}
62-
63-
blackListNames.add(field.getName());
6462
}
6563
}
6664

@@ -96,7 +94,6 @@ public LocalVariableMaker(TypeMaker typeMaker, ClassFileConstructorOrMethodDecla
9694
if (localVariableSet.root(0) == null) {
9795
// Local variable missing
9896
localVariableSet.add(0, new ObjectLocalVariable(typeMaker, 0, 0, typeMaker.makeFromInternalTypeName(classFile.getInternalTypeName()), "this"));
99-
blackListNames.add("this");
10097
}
10198
firstVariableIndex = 1;
10299
}
@@ -106,23 +103,20 @@ public LocalVariableMaker(TypeMaker typeMaker, ClassFileConstructorOrMethodDecla
106103
if (localVariableSet.root(1) == null) {
107104
// Local variable missing
108105
localVariableSet.add(1, new ObjectLocalVariable(typeMaker, 1, 0, ObjectType.TYPE_STRING, "this$enum$name"));
109-
blackListNames.add("this$enum$name");
110106
}
111107
if (localVariableSet.root(2) == null) {
112108
// Local variable missing
113109
localVariableSet.add(2, new PrimitiveLocalVariable(2, 0, PrimitiveType.TYPE_INT, "this$enum$index"));
114-
blackListNames.add("this$enum$index");
115110
}
116111
} else if ((classFile.getOuterClassFile() != null) && ((classFile.getAccessFlags() & FLAG_STATIC) == 0)) {
117112
if (localVariableSet.root(1) == null) {
118113
// Local variable missing
119114
localVariableSet.add(1, new ObjectLocalVariable(typeMaker, 1, 0, typeMaker.makeFromInternalTypeName(classFile.getOuterClassFile().getInternalTypeName()), "this$0"));
120-
blackListNames.add("this$0");
121115
}
122116
}
123117
}
124118

125-
if ((parameterTypes != null) && (parameterTypes != null)) {
119+
if (parameterTypes != null) {
126120
int lastParameterIndex = parameterTypes.size() - 1;
127121
boolean varargs = ((method.getAccessFlags() & FLAG_VARARGS) != 0);
128122

@@ -199,7 +193,6 @@ protected void initLocalVariablesFromAttributes(Method method) {
199193
}
200194

201195
localVariableSet.add(index, lv);
202-
blackListNames.add(name);
203196
names.add(name);
204197
}
205198
}
@@ -272,13 +265,13 @@ protected void initLocalVariablesFromParameterTypes(ClassFile classFile, BaseTyp
272265

273266
String name = sb.toString();
274267

275-
while (blackListNames.contains(name)) {
268+
while (names.contains(name)) {
276269
sb.setLength(length);
277270
sb.append(counter++);
278271
name = sb.toString();
279272
}
280273

281-
blackListNames.add(name);
274+
names.add(name);
282275
createParameterVisitor.init(variableIndex, name);
283276
type.accept(createParameterVisitor);
284277

@@ -326,11 +319,11 @@ protected AbstractLocalVariable searchLocalVariable(int index, int offset) {
326319
} else {
327320
AbstractLocalVariable lv2 = currentFrame.getLocalVariable(index);
328321

329-
if ((lv2 != null) && (lv.getFromOffset() < lv2.getFromOffset())) {
322+
if ((lv2 != null) && ((lv.getName() == null) ? (lv2.getName() == null) : lv.getName().equals(lv2.getName())) && lv.getType().equals(lv2.getType())) {
330323
lv = lv2;
331-
} else {
332-
localVariableSet.remove(index, offset);
333324
}
325+
326+
localVariableSet.remove(index, offset);
334327
}
335328

336329
return lv;

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/visitor/UpdateBridgeMethodVisitor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,10 @@ protected Expression updateExpression(Expression expression) {
181181

182182
protected static FieldReferenceExpression getFieldReferenceExpression(Expression expression) {
183183
FieldReferenceExpression fre = (FieldReferenceExpression) expression;
184+
Expression freExpression = fre.getExpression();
184185

185-
if (fre.getExpression().getClass() == ObjectTypeReferenceExpression.class) {
186-
((ObjectTypeReferenceExpression)fre.getExpression()).setExplicit(true);
186+
if ((freExpression != null) && (freExpression.getClass() == ObjectTypeReferenceExpression.class)) {
187+
((ObjectTypeReferenceExpression)freExpression).setExplicit(true);
187188
}
188189

189190
return fre;

src/test/java/org/jd/core/v1/ClassFileToJavaSourceTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ public void testJdk170For() throws Exception {
713713
assertTrue(source.matches(PatternMaker.make(": 245 */", "for (int i = 0, j = i, size = 10; i < size; j += ++i);")));
714714
assertTrue(source.matches(PatternMaker.make("/* 253: 0 */", "while (true) {")));
715715
assertTrue(source.matches(PatternMaker.make(": 264 */", "for (String s : list)")));
716-
assertTrue(source.matches(PatternMaker.make(": 310 */", "for (int i : new int[] { 4 })")));
716+
assertTrue(source.matches(PatternMaker.make(": 310 */", "for (int j : new int[] { 4 })")));
717717
assertTrue(source.matches(PatternMaker.make(": 389 */", "for (String s : array)")));
718718
assertTrue(source.matches(PatternMaker.make(": 403 */", "for (String s : list)")));
719719
assertTrue(source.matches(PatternMaker.make(": 411 */", "Iterator<Class<?>> iterator = Arrays.asList(getClass().getInterfaces()).iterator()")));
@@ -839,7 +839,7 @@ public void testJdk160For() throws Exception {
839839
assertTrue(source.matches(PatternMaker.make(": 16 */", "for (int i = 0; i < 10; i++)")));
840840
assertTrue(source.matches(PatternMaker.make(": 84 */", "while (i < 10)")));
841841
assertTrue(source.matches(PatternMaker.make(": 269 */", "for (i = 0; i < 10; i++)")));
842-
assertTrue(source.matches(PatternMaker.make(": 306 */", "for (int i : new int[] { 4 })")));
842+
assertTrue(source.matches(PatternMaker.make(": 306 */", "for (int j : new int[] { 4 })")));
843843
assertTrue(source.matches(PatternMaker.make("/* 343: 0 */", "do {")));
844844
assertTrue(source.matches(PatternMaker.make(": 345 */", "while (i < 10);")));
845845
assertTrue(source.matches(PatternMaker.make(": 381 */", "for (String s : array)")));
@@ -882,7 +882,7 @@ public void testIbmJ9For() throws Exception {
882882
// Check decompiled source code
883883
assertTrue(source.matches(PatternMaker.make(": 84 */", "while (i < 10)")));
884884
assertTrue(source.matches(PatternMaker.make(": 269 */", "for (i = 0; i < 10; i++)")));
885-
assertTrue(source.matches(PatternMaker.make(": 306 */", "for (int i : new int[] { 4 })")));
885+
assertTrue(source.matches(PatternMaker.make(": 306 */", "for (int j : new int[] { 4 })")));
886886
assertTrue(source.matches(PatternMaker.make("/* 343: 0 */", "do")));
887887
assertTrue(source.matches(PatternMaker.make(": 345 */", "while (i < 10);")));
888888
assertTrue(source.matches(PatternMaker.make(": 381 */", "for (String s : array)")));

0 commit comments

Comments
 (0)