package jvm.command.item.impl;
import jvm.classfile.ClassFile;
import jvm.classfile.ConstantPool;
import jvm.classfile.constant.item.impl.FieldRefInfo;
import jvm.classfile.field.Field;
import jvm.command.CommandIterator;
import jvm.command.item.TwoOperandCmd;
import jvm.engine.*;
import jvm.exception.ReadClassException;
public class GetStaticCmd extends TwoOperandCmd {
public GetStaticCmd(ClassFile clzFile, String opCode, CommandIterator iterator) {
super(clzFile, opCode, iterator);
}
@Override
public String toString(ConstantPool pool) {
return super.getOperandAsField(pool);
}
@Override
public void execute(StackFrame frame, ExecutionResult result) throws ReadClassException {
int index = (getOperand1() << 8) | getOperand2();
FieldRefInfo fieldRefInfo = (FieldRefInfo) getConstantInfo(index);
ClassFile classFile = MethodArea.getInstance().findClassFile(fieldRefInfo.getClassName());
String fieldName = fieldRefInfo.getNameAndType().split(":")[0];
Field field = classFile.getField(fieldName);
JavaObject object = classFile.getStaticFieldValue(field.getName());
frame.getOperandStack().push(object);
}
}