Skip to content

Commit f1da047

Browse files
committed
Add workaround for invalid signatures
1 parent ffa0574 commit f1da047

File tree

1 file changed

+22
-3
lines changed
  • dex-translator/src/main/java/com/googlecode/d2j/dex

1 file changed

+22
-3
lines changed

dex-translator/src/main/java/com/googlecode/d2j/dex/Dex2Asm.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,16 @@ private static MethodVisitor collectBasicMethodInfo(DexMethodNode methodNode, Cl
327327
final int cleanFlag = ~((DexConstants.ACC_DECLARED_SYNCHRONIZED | DexConstants.ACC_CONSTRUCTOR
328328
| Opcodes.ACC_SYNTHETIC));
329329
access &= cleanFlag;
330-
return cv.visitMethod(access, methodNode.method.getName(), methodNode.method.getDesc(), signature, xthrows);
330+
try {
331+
return cv.visitMethod(access, methodNode.method.getName(), methodNode.method.getDesc(), signature, xthrows);
332+
} catch (StringIndexOutOfBoundsException | IllegalArgumentException e) {
333+
System.err.println("Applying workaround to method "
334+
+ methodNode.method.getOwner() + "#" + methodNode.method.getName()
335+
+ " with original signature " + signature
336+
+ " by changing its types to java.lang.Object.");
337+
return cv.visitMethod(access, methodNode.method.getName(), methodNode.method.getDesc(),
338+
"(Ljava/lang/Object;)Ljava/lang/Object;", xthrows);
339+
}
331340
}
332341

333342
protected static Map<String, Clz> collectClzInfo(DexFileNode fileNode) {
@@ -568,8 +577,18 @@ public void convertField(DexClassNode classNode, DexFieldNode fieldNode, ClassVi
568577
}
569578
Object value = convertConstantValue(fieldNode.cst);
570579
final int fieldCleanFlag = ~((DexConstants.ACC_DECLARED_SYNCHRONIZED | Opcodes.ACC_SYNTHETIC));
571-
FieldVisitor fv = cv.visitField(fieldNode.access & fieldCleanFlag, fieldNode.field.getName(),
572-
fieldNode.field.getType(), signature == null || !signature.contains(";") ? null : signature, value);
580+
FieldVisitor fv;
581+
try {
582+
fv = cv.visitField(fieldNode.access & fieldCleanFlag, fieldNode.field.getName(),
583+
fieldNode.field.getType(), signature, value);
584+
} catch (StringIndexOutOfBoundsException | IllegalArgumentException e) {
585+
System.err.println("Applying workaround to field "
586+
+ classNode.className + "#" + fieldNode.field.getName()
587+
+ " with original signature " + signature
588+
+ " by changing its type to java.lang.Object.");
589+
fv = cv.visitField(fieldNode.access & fieldCleanFlag, fieldNode.field.getName(),
590+
fieldNode.field.getType(), "Ljava/lang/Object;", value);
591+
}
573592
if (fv == null) {
574593
return;
575594
}

0 commit comments

Comments
 (0)