package jvm.command.item.impl;
import jvm.classfile.ClassFile;
import jvm.classfile.ConstantPool;
import jvm.classfile.constant.item.impl.MethodRefInfo;
import jvm.classfile.method.Method;
import jvm.command.CommandIterator;
import jvm.command.item.TwoOperandCmd;
import jvm.engine.ExecutionResult;
import jvm.engine.MethodArea;
import jvm.engine.StackFrame;
import jvm.exception.ReadClassException;
public class InvokeSpecialCmd extends TwoOperandCmd {
public InvokeSpecialCmd(ClassFile clzFile, String opCode, CommandIterator iterator) {
super(clzFile, opCode, iterator);
}
@Override
public String toString(ConstantPool pool) {
return super.getOperandAsMethod(pool);
}
@Override
public void execute(StackFrame frame, ExecutionResult result) throws ReadClassException {
int methodIndex = (getOperand1() << 8) | getOperand2();
MethodRefInfo methodRefInfo = (MethodRefInfo) getConstantInfo(methodIndex);
// 不调用Object的构造器
if (methodRefInfo.getClassName().equals("java/lang/Object")
&& methodRefInfo.getName().equals("<init>")) {
frame.getOperandStack().pop(); // 弹出不需要的this
return;
}
result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME);
Method method = MethodArea.getInstance().getMethod(methodRefInfo);
result.setNextMethod(method);
}
}