package jvm.command;
import jvm.classfile.ClassFile;
import jvm.command.item.ByteCodeCommand;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
public class CommandParser {
public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) {
String packageName = CommandParser.class.getPackage().getName() + ".item.impl.";
CommandIterator iterator = new CommandIterator(codes);
List<ByteCodeCommand> commands = new ArrayList<>();
try {
while (iterator.hasNext()) {
String opCode = iterator.next2CharAsString().toUpperCase();
String cmdName = ByteCodeCommand.codeMap.get(opCode);
String cmdClassName = packageName + cmdName.replaceAll("_", "") + "Cmd";
Class<?> clazz = Class.forName(cmdClassName);
Constructor<?> constructor = clazz.getConstructor(
ClassFile.class, String.class, CommandIterator.class);
ByteCodeCommand command = (ByteCodeCommand) constructor.newInstance(clzFile, opCode, iterator);
commands.add(command);
}
} catch (ClassNotFoundException | NoSuchMethodException
| IllegalAccessException | InvocationTargetException | InstantiationException e) {
e.printStackTrace();
}
calculateOffset(commands);
return commands.toArray(new ByteCodeCommand[commands.size()]);
}
private static void calculateOffset(List<ByteCodeCommand> commands) {
int offset = 0;
for (ByteCodeCommand cmd : commands) {
cmd.setOffset(offset);
offset += cmd.getLength();
}
}
}