Fixed an undocumented access_flag bug

This commit is contained in:
SuspiciousActivity committed 2018-06-22 15:09:43 +02:00
1 parent 7b95716a5c
commit 4624d64f0f
2 files changed
+68 -57

No files matched your search

+67 -56
View File
@@ -170,53 +170,57 @@ public class Assembler {
if (split.length > 2) { if (split.length > 2) {
String cons = consolidateStrings(split, 0, split.length - 2); String cons = consolidateStrings(split, 0, split.length - 2);
if (cons.contains("public")) { if (cons.startsWith("0x")) {
access ^= ClassUtil.ACC_PUBLIC; access = Integer.parseInt(cons.substring(2), 16);
} } else {
if (cons.contains("private")) { if (cons.contains("public")) {
access ^= ClassUtil.ACC_PRIVATE; access ^= ClassUtil.ACC_PUBLIC;
} }
if (cons.contains("protected")) { if (cons.contains("private")) {
access ^= ClassUtil.ACC_PROTECTED; access ^= ClassUtil.ACC_PRIVATE;
} }
if (cons.contains("static")) { if (cons.contains("protected")) {
access ^= ClassUtil.ACC_STATIC; access ^= ClassUtil.ACC_PROTECTED;
} }
if (cons.contains("final")) { if (cons.contains("static")) {
access ^= ClassUtil.ACC_FINAL; access ^= ClassUtil.ACC_STATIC;
} }
if (cons.contains("synchronized")) { if (cons.contains("final")) {
access ^= ClassUtil.ACC_SYNCHRONIZED; access ^= ClassUtil.ACC_FINAL;
} }
if (cons.contains("bridge")) { if (cons.contains("synchronized")) {
access ^= ClassUtil.ACC_BRIDGE; access ^= ClassUtil.ACC_SYNCHRONIZED;
} }
if (cons.contains("varargs")) { if (cons.contains("bridge")) {
access ^= ClassUtil.ACC_VARARGS; access ^= ClassUtil.ACC_BRIDGE;
} }
if (cons.contains("native")) { if (cons.contains("varargs")) {
access ^= ClassUtil.ACC_NATIVE; access ^= ClassUtil.ACC_VARARGS;
} }
if (cons.contains("interface")) { if (cons.contains("native")) {
access ^= ClassUtil.ACC_INTERFACE; access ^= ClassUtil.ACC_NATIVE;
} }
if (cons.contains("abstract")) { if (cons.contains("interface")) {
access ^= ClassUtil.ACC_ABSTRACT; access ^= ClassUtil.ACC_INTERFACE;
} }
if (cons.contains("strictfp")) { if (cons.contains("abstract")) {
access ^= ClassUtil.ACC_STRICTFP; access ^= ClassUtil.ACC_ABSTRACT;
} }
if (cons.contains("synthetic")) { if (cons.contains("strictfp")) {
access ^= ClassUtil.ACC_SYNTHETIC; access ^= ClassUtil.ACC_STRICTFP;
} }
if (cons.contains("annotation")) { if (cons.contains("synthetic")) {
access ^= ClassUtil.ACC_ANNOTATION; access ^= ClassUtil.ACC_SYNTHETIC;
} }
if (cons.contains("enum")) { if (cons.contains("annotation")) {
access ^= ClassUtil.ACC_ENUM; access ^= ClassUtil.ACC_ANNOTATION;
} }
if (cons.contains("mandated")) { if (cons.contains("enum")) {
access ^= ClassUtil.ACC_MANDATED; access ^= ClassUtil.ACC_ENUM;
}
if (cons.contains("mandated")) {
access ^= ClassUtil.ACC_MANDATED;
}
} }
} }
FieldNode node = new FieldNode(access, name, desc, signature, value); FieldNode node = new FieldNode(access, name, desc, signature, value);
@@ -1184,7 +1188,11 @@ public class Assembler {
LinkedHashMap<Integer, LabelNode> labelMap = new LinkedHashMap<>(); LinkedHashMap<Integer, LabelNode> labelMap = new LinkedHashMap<>();
for (int i = 4; i < split2.length - 1; i++) { for (int i = 4; i < split2.length - 1; i++) {
labelMap.put(Integer.parseInt(split2[i]), null); if (split2[i].equals("null")) {
labelMap.put(-1 - labelMap.size(), null);
} else {
labelMap.put(Integer.parseInt(split2[i]), null);
}
} }
LabelNode dflt = null; LabelNode dflt = null;
@@ -1231,7 +1239,7 @@ public class Assembler {
String split2[] = str.split("\n"); String split2[] = str.split("\n");
ArrayList<Integer> keys = new ArrayList<>(); ArrayList<Integer> keys = new ArrayList<>();
LinkedHashMap<Integer, LabelNode> labelMap = new LinkedHashMap<>(); LinkedHashMap<Integer, LabelNode> labelMap = new LinkedHashMap<>();
int stage = 0; int stage = 0;
for (int i = 2; i < split2.length; i++) { for (int i = 2; i < split2.length; i++) {
String spl = split2[i]; String spl = split2[i];
@@ -1242,7 +1250,11 @@ public class Assembler {
} else if (stage == 0) { } else if (stage == 0) {
keys.add(Integer.parseInt(spl)); keys.add(Integer.parseInt(spl));
} else if (stage == 2) { } else if (stage == 2) {
labelMap.put(Integer.parseInt(spl), null); if (spl.equals("null")) {
labelMap.put(-1 - labelMap.size(), null);
} else {
labelMap.put(Integer.parseInt(spl), null);
}
} }
} }
@@ -1263,7 +1275,7 @@ public class Assembler {
} }
LabelNode[] arr = new LabelNode[labelMap.size()]; LabelNode[] arr = new LabelNode[labelMap.size()];
int counter = 0; int counter = 0;
for (Entry<Integer, LabelNode> entry : labelMap.entrySet()) { for (Entry<Integer, LabelNode> entry : labelMap.entrySet()) {
LabelNode ln; LabelNode ln;
@@ -1330,25 +1342,24 @@ public class Assembler {
String target = split[2]; String target = split[2];
int index = target.lastIndexOf("/"); int index = target.lastIndexOf("/");
return new MethodInsnNode(182, target.substring(0, index), target.substring(index + 1), split[1], return new MethodInsnNode(182, target.substring(0, index), target.substring(index + 1), split[1],
split.length == 4); false);
} }
case "invokespecial": { case "invokespecial": {
String target = split[2]; String target = split[2];
int index = target.lastIndexOf("/"); int index = target.lastIndexOf("/");
return new MethodInsnNode(183, target.substring(0, index), target.substring(index + 1), split[1], return new MethodInsnNode(183, target.substring(0, index), target.substring(index + 1), split[1],
split.length == 4); false);
} }
case "invokestatic": { case "invokestatic": {
String target = split[2]; String target = split[2];
int index = target.lastIndexOf("/"); int index = target.lastIndexOf("/");
return new MethodInsnNode(184, target.substring(0, index), target.substring(index + 1), split[1], return new MethodInsnNode(184, target.substring(0, index), target.substring(index + 1), split[1],
split.length == 4); false);
} }
case "invokeinterface": { case "invokeinterface": {
String target = split[2]; String target = split[2];
int index = target.lastIndexOf("/"); int index = target.lastIndexOf("/");
return new MethodInsnNode(185, target.substring(0, index), target.substring(index + 1), split[1], return new MethodInsnNode(185, target.substring(0, index), target.substring(index + 1), split[1], true);
split.length == 4);
} }
case "invokedynamic": { case "invokedynamic": {
String str = s.substring(16, s.length() - 2).replace("", ""); String str = s.substring(16, s.length() - 2).replace("", "");
+1 -1
View File
@@ -421,7 +421,7 @@ public class Disassembler {
case "MethodInsnNode": { case "MethodInsnNode": {
MethodInsnNode node = (MethodInsnNode) n; MethodInsnNode node = (MethodInsnNode) n;
s += "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " " + node.desc + " " + node.owner + "/" s += "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " " + node.desc + " " + node.owner + "/"
+ node.name + (node.itf ? " true" : "") + "\n"; + node.name + "\n";
break; break;
} }
case "TypeInsnNode": { case "TypeInsnNode": {