case "IINC":
return new IincInsnNode(toint(args[1]), toint(args[2]));
case "FRAME":
switch (args[1].toUpperCase()) {
case "SAME":
return new FrameNode(F_SAME, 0, null, 0, null);
case "SAME1":
switch (Character.toUpperCase(args[2].charAt(0))) {
case 'T':
return new FrameNode(F_SAME1, 0, null, 1, new Object[] {0});
case 'I':
return new FrameNode(F_SAME1, 0, null, 1, new Object[] {1});
case 'F':
return new FrameNode(F_SAME1, 0, null, 1, new Object[] {2});
case 'D':
return new FrameNode(F_SAME1, 0, null, 1, new Object[] {3});
case 'J':
return new FrameNode(F_SAME1, 0, null, 1, new Object[] {4});
case 'N':
return new FrameNode(F_SAME1, 0, null, 1, new Object[] {5});
case 'U':
return new FrameNode(F_SAME1, 0, null, 1, new Object[] {6});
case 'L':
return new FrameNode(F_SAME1, 0, null, 1, new Object[] {new Label()});// FIXME
case '[':
default:
return new FrameNode(F_SAME1, 0, null, 1, new Object[] {args[2]});
}
case "CHOP":
return new FrameNode(F_CHOP, toint(args[2]), null, 0, null);
case "FULL":
case "NEW": {// DAMN THIS IS GONNA SUCK DDD:
boolean doingLocals = true;
boolean done = false;
List<Object> locals = new ArrayList<Object>();
List<Object> stack = new ArrayList<Object>();
for (int i = 2; i < args.length; i++) {
if (args[i].length() > 0) {
String part = args[i];
if (part.charAt(0) == '[') {
part = part.substring(1);
} else if (part.endsWith("]")) {
if (!doingLocals) {
done = true;
} else {
locals.add(part.substring(0, part.length() - 1));
doingLocals = false;
}
part = part.substring(0, part.length() - 1);
switch (Character.toUpperCase(args[i].charAt(0))) {
case 'T':
(doingLocals ? locals : stack).add(0);
case 'I':
(doingLocals ? locals : stack).add(1);
case 'F':
(doingLocals ? locals : stack).add(2);
case 'D':
(doingLocals ? locals : stack).add(3);
case 'J':
(doingLocals ? locals : stack).add(4);
case 'N':
(doingLocals ? locals : stack).add(5);
case 'U':
(doingLocals ? locals : stack).add(6);
case 'L':
(doingLocals ? locals : stack).add(new CustomLabel(toint(part
.substring(1))));
case '[':
default:
(doingLocals ? locals : stack).add(args[i]);
}
}
if (done) {
break;
}
}
}
return new FrameNode(args[1].equalsIgnoreCase("new") ? F_NEW : F_FULL,
locals.size(), locals.toArray(), stack.size(), stack.toArray());
}
case "APPEND": {
boolean done = false;
List<Object> locals = new ArrayList<Object>();
for (int i = 2; i < args.length; i++) {
String part = args[i];
if (part.length() > 0) {
if (part.charAt(0) == '[') {
part = part.substring(1);
} else if (part.endsWith("]")) {
done = true;
part = part.substring(0, part.length() - 1);
}
if (!part.contains("/")) {
switch (Character.toUpperCase(part.charAt(0))) {
case 'T':
locals.add(0);
case 'I':
locals.add(1);
case 'F':
locals.add(2);
case 'D':
locals.add(3);
case 'J':
locals.add(4);
case 'N':
locals.add(5);
case 'U':
locals.add(6);
case 'L':
locals.add(new CustomLabel(toint(part.substring(1))));
case '[':
default:
locals.add(part);
}
} else {
locals.add(part);
}
}
if (done) {
break;
}
}
return new FrameNode(F_APPEND, locals.size(), locals.toArray(), 0, null);
}
}
}
throw new InvalidBytecodeException(args);