Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.coding.mini_jvm.src.com.coderising.jvm;

public class EmployeeV1 {


private String name;
private int age;

public EmployeeV1(String name, int age) {
this.name = name;
this.age = age;
}

public void setName(String name) {
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public void sayHello() {
System.out.println("Hello , this is class Employee ");
}
public static void main(String[] args){
EmployeeV1 p = new EmployeeV1("Andy",29);
p.sayHello();

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.Heap;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;

public class BiPushCmd extends OneOperandCmd {

Expand All @@ -15,7 +19,13 @@ public String toString(ConstantPool pool) {

return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand();
}



@Override
public void execute(StackFrame frame, ExecutionResult result) {
int value = this.getOperand();
JavaObject jo = Heap.getInstance().newInt(value);
frame.getOprandStack().push(jo);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;

import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -123,5 +125,5 @@ public String getReadableCodeText(){
return txt;
}

//public abstract void execute(StackFrame frame,FrameResult result);
public abstract void execute(StackFrame frame,ExecutionResult result);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.FieldRefInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;

public class GetFieldCmd extends TwoOperandCmd {

Expand All @@ -15,7 +19,13 @@ public String toString(ConstantPool pool) {
return super.getOperandAsField(pool);
}



@Override
public void execute(StackFrame frame, ExecutionResult result) {
FieldRefInfo fieldRefInfo = (FieldRefInfo)this.getConstantInfo(this.getIndex());
String fieldName = fieldRefInfo.getFieldName();
JavaObject jo = frame.getOprandStack().pop();
frame.getOprandStack().push(jo.getFieldValue(fieldName));
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@

import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.FieldRefInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.Heap;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;

public class GetStaticFieldCmd extends TwoOperandCmd {

Expand All @@ -17,4 +22,20 @@ public String toString(ConstantPool pool) {
return super.getOperandAsField(pool);
}

@Override
public void execute(StackFrame frame, ExecutionResult result) {
FieldRefInfo fieldRefInfo = (FieldRefInfo)this.getConstantInfo(this.getIndex());
String fieldName = fieldRefInfo.getFieldName();
String className = fieldRefInfo.getClassName();
String fieldType = fieldRefInfo.getFieldType();
if("java/lang/System".equals(className)
&& "out".equals(fieldName)
&& "Ljava/io/PrintStream;".equals(fieldType)){
JavaObject jo = Heap.getInstance().newObject(className);
frame.getOprandStack().push(jo);
}
// JavaObject jo = Heap.getInstance().newObject(className);
// frame.getOprandStack().push(jo);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@

import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.MethodRefInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.MethodArea;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;
import com.coding.mini_jvm.src.com.coderising.jvm.method.Method;

public class InvokeSpecialCmd extends TwoOperandCmd {

Expand All @@ -17,6 +22,17 @@ public String toString(ConstantPool pool) {
return super.getOperandAsMethod(pool);
}


@Override
public void execute(StackFrame frame, ExecutionResult result) {
MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex());
if (methodRefInfo.getClassName().equals("java/lang/Object")
&& methodRefInfo.getMethodName().equals("<init>")) {
return;
}
Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo);
result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME);
result.setNextMethod(nextMethod);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@

import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.MethodRefInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.MethodArea;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;
import com.coding.mini_jvm.src.com.coderising.jvm.method.Method;

public class InvokeVirtualCmd extends TwoOperandCmd {

Expand All @@ -12,11 +18,25 @@ public InvokeVirtualCmd(ClassFile clzFile,String opCode) {

@Override
public String toString(ConstantPool pool) {

return super.getOperandAsMethod(pool);
}



@Override
public void execute(StackFrame frame, ExecutionResult result) {
MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex());
String methodName = methodRefInfo.getMethodName();
String className = methodRefInfo.getClassName();
if ("java/io/PrintStream".equals(className) && "println".equals(methodName)) {
JavaObject jo = frame.getOprandStack().pop();
System.out.println("***********"+jo.toString()+"***********");

frame.getOprandStack().pop();
return;
}
Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo);
result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME);
result.setNextMethod(nextMethod);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.StringInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;

public class LdcCmd extends OneOperandCmd {

Expand All @@ -26,5 +29,19 @@ public String toString(ConstantPool pool) {
return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value;

}


@Override
public void execute(StackFrame frame, ExecutionResult result) {
ClassFile clzFile = this.getClassFile();
ConstantInfo info = (ConstantInfo)clzFile.getConstantPool().getConstantInfo(this.getOperand());
String value = "TBD";
if (info instanceof StringInfo) {
StringInfo strInfo = (StringInfo)info;
value = strInfo.toString();
}
JavaObject jo = new JavaObject(JavaObject.STRING);
jo.setStringValue(value);
frame.getOprandStack().push(jo);
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package com.coding.mini_jvm.src.com.coderising.jvm.cmd;

import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ClassInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.Heap;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;

public class NewObjectCmd extends TwoOperandCmd{

Expand All @@ -15,5 +20,12 @@ public String toString(ConstantPool pool) {
return super.getOperandAsClassInfo(pool);
}


@Override
public void execute(StackFrame frame, ExecutionResult result) {
ClassInfo clzInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(getIndex());
JavaObject jo = Heap.getInstance().newObject(clzInfo.getClassName());
frame.getOprandStack().push(jo);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@

import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;

public class NoOperandCmd extends ByteCodeCommand{

Expand All @@ -15,8 +18,37 @@ public String toString(ConstantPool pool) {
return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText();
}



@Override
public void execute(StackFrame frame, ExecutionResult result) {
if (CommandParser.astore_1.equals(this.getOpCode())) {
JavaObject jo = frame.getOprandStack().pop();
frame.setLocalVariableValue(1, jo);
} else if (CommandParser.aload_0.equals(this.getOpCode())) {
JavaObject jo = frame.getLocalVariableValue(0);
frame.getOprandStack().push(jo);
} else if (CommandParser.aload_1.equals(this.getOpCode())) {
JavaObject jo = frame.getLocalVariableValue(1);
frame.getOprandStack().push(jo);
} else if (CommandParser.iload_1.equals(this.getOpCode())) {
JavaObject jo = frame.getLocalVariableValue(1);
frame.getOprandStack().push(jo);
} else if (CommandParser.iload_2.equals(this.getOpCode())) {
JavaObject jo = frame.getLocalVariableValue(2);
frame.getOprandStack().push(jo);
} else if (CommandParser.istore_1.equals(this.getOpCode())) {
JavaObject jo = frame.getOprandStack().pop();
frame.setLocalVariableValue(1, jo);
} else if (CommandParser.voidreturn.equals(this.getOpCode())) {
result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME);
} else if (CommandParser.dup.equals(this.getOpCode())) {
JavaObject jo = frame.getOprandStack().peek();
frame.getOprandStack().push(jo);
} else {
throw new RuntimeException("this operator ["+this.getOpCode()+"] not support yet");
}
}


public int getLength(){
return 1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@

import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.FieldRefInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.constant.NameAndTypeInfo;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject;
import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame;

public class PutFieldCmd extends TwoOperandCmd {

Expand All @@ -16,5 +21,15 @@ public String toString(ConstantPool pool) {
return super.getOperandAsField(pool);
}

@Override
public void execute(StackFrame frame, ExecutionResult result) {
FieldRefInfo fieldRefInfo = (FieldRefInfo)this.getConstantInfo(this.getIndex());
NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRefInfo.getNameAndTypeIndex());
String fieldName = nameAndTypeInfo.getName();
JavaObject fieldValue = frame.getOprandStack().pop();
JavaObject objectRef = frame.getOprandStack().pop();
objectRef.setFieldValue(fieldName, fieldValue);
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.coding.mini_jvm.src.com.coderising.jvm.engine;


import com.coding.mini_jvm.src.com.coderising.jvm.method.Method;

public class ExecutionResult {
public static final int RUN_NEXT_CMD = 1;
public static final int JUMP = 2;
public static final int EXIT_CURRENT_FRAME = 3;
public static final int PAUSE_AND_RUN_NEW_FRAME = 4;

private int nextAction = RUN_NEXT_CMD;

private int nextCmdOffset = 0;

private Method nextMethod;

public Method getNextMethod() {
return nextMethod;
}

public void setNextMethod(Method nextMethod) {
this.nextMethod = nextMethod;
}


public void setNextAction(int action){
this.nextAction = action;
}
public boolean isPauseAndRunNewFrame(){
return this.nextAction == PAUSE_AND_RUN_NEW_FRAME;
}
public boolean isExitCurrentFrame(){
return this.nextAction == EXIT_CURRENT_FRAME;
}

public boolean isRunNextCmd(){
return this.nextAction == RUN_NEXT_CMD;
}

public boolean isJump(){
return this.nextAction == JUMP;
}

public int getNextCmdOffset() {
return nextCmdOffset;
}

public void setNextCmdOffset(int nextCmdOffset) {
this.nextCmdOffset = nextCmdOffset;
}





}
Loading