Skip to content
Open
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
2 changes: 0 additions & 2 deletions group02/812350401/.gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
target/
.idea/
src/main/java/train/
!src/main/resources/**/*.class
!src/main/resources/**/*.xml
src/main/resources/**/*.png
src/main/java/assignments
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public String toString(ConstantPool pool){
StringBuilder buffer = new StringBuilder();
buffer.append("Code:").append(code).append("\n");
for(int i=0;i<cmds.length;i++){
buffer.append(cmds[i].toString(pool)).append("\n");
buffer.append(cmds[i].toString()).append("\n");
}
buffer.append("\n");
buffer.append(this.lineNumTable.toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@


import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;

public class BiPushCmd extends OneOperandCmd {

Expand All @@ -12,11 +13,15 @@ public BiPushCmd(ClassFile clzFile, String opCode) {
}

@Override
public String toString(ConstantPool pool) {
public String toString() {

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



@Override
public void execute(StackFrame frame, ExecutionResult result) {

}


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

import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -109,15 +111,18 @@ public String toString(){
return buffer.toString();
}

public abstract String toString(ConstantPool pool);

public String getReadableCodeText(){
String txt = codeMap.get(opCode);
if(txt == null){
throw new RuntimeException("codeMap don't contain: " + opCode);
}
return txt;
}

//public abstract void execute(StackFrame frame,FrameResult result);

/**
* 每个命令都要实现自己的功能
* @param frame 命令执行过程中需要访问函数栈帧中的操作数栈和局部变量表,因此把frame传入
* @param result
*/
public abstract void execute(StackFrame frame, ExecutionResult result);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@


import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;

public class GetFieldCmd extends TwoOperandCmd {

Expand All @@ -11,12 +12,15 @@ public GetFieldCmd(ClassFile clzFile, String opCode) {
}

@Override
public String toString(ConstantPool pool) {
public String toString() {

return super.getOperandAsField(pool);
return super.getOperandAsField();
}

@Override
public void execute(StackFrame frame, ExecutionResult result) {

}




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

import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;

public class GetStaticFieldCmd extends TwoOperandCmd {

Expand All @@ -12,9 +14,14 @@ public GetStaticFieldCmd(ClassFile clzFile, String opCode) {
}

@Override
public String toString(ConstantPool pool) {
public String toString() {

return super.getOperandAsField(pool);
return super.getOperandAsField();
}

@Override
public void execute(StackFrame frame, ExecutionResult result) {

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.github.miniyk2012.coding2017.coderising.jvm.cmd;


import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;

public class IncrementCmd extends TwoOperandCmd {

public IncrementCmd(ClassFile clzFile, String opCode) {
super(clzFile, opCode);

}

@Override
public String toString() {

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

@Override
public void execute(StackFrame frame, ExecutionResult result) {
return;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,28 @@


import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;

/**
* 调用实例初始化方法
*/
public class InvokeSpecialCmd extends TwoOperandCmd {

public InvokeSpecialCmd(ClassFile clzFile, String opCode) {
super(clzFile,opCode);

}

@Override
public String toString(ConstantPool pool) {
public String toString() {

return super.getOperandAsMethod(pool);
return super.getOperandAsMethod();
}

@Override
public void execute(StackFrame frame, ExecutionResult result) {

}



}
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,29 @@


import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;


/**
* 调用实例方法
*/
public class InvokeVirtualCmd extends TwoOperandCmd {

public InvokeVirtualCmd(ClassFile clzFile, String opCode) {
super(clzFile,opCode);
}

@Override
public String toString(ConstantPool pool) {
public String toString() {

return super.getOperandAsMethod(pool);
return super.getOperandAsMethod();
}

@Override
public void execute(StackFrame frame, ExecutionResult result) {

}




}
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,28 @@

import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantInfo;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.StringInfo;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.Heap;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.JavaObject;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;


/**
* 如果运行时常量池项是一个 int 或者 float 类型的运行时常量,则将对应的数值 value 将被压入到操作数栈之中(暂时不处理)。
* 如果运行时常量池项是一个代表字符串字面量的 String 类的引用,那这个实例的引用所对应的 reference 类型数据
* value 将被压入 到操作数栈之中。
*/
public class LdcCmd extends OneOperandCmd {

public LdcCmd(ClassFile clzFile, String opCode) {
super(clzFile,opCode);
}

@Override
public String toString(ConstantPool pool) {
public String toString() {

ConstantInfo info = pool.getConstantInfo(this.getOperand());
ConstantInfo info = getConstantInfo(this.getOperand());

String value = "TBD";
if(info instanceof StringInfo){
Expand All @@ -26,5 +35,19 @@ public String toString(ConstantPool pool) {
return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value;

}


@Override
public void execute(StackFrame frame, ExecutionResult result) {
ConstantInfo info = getConstantInfo(getOperand());
if (info instanceof StringInfo) {
StringInfo strInfo = (StringInfo)info;
String value = strInfo.toString();
JavaObject jo = Heap.getInstance().newString(value);
frame.getOprandStack().push(jo);
return;
}
// todo 处理其他类型(int 或者 float 类型)
throw new RuntimeException("Only support StringInfo constant");
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.github.miniyk2012.coding2017.coderising.jvm.cmd;

import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ClassInfo;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.Heap;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.JavaObject;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;

public class NewObjectCmd extends TwoOperandCmd{

Expand All @@ -10,10 +14,22 @@ public NewObjectCmd(ClassFile clzFile, String opCode){
}

@Override
public String toString(ConstantPool pool) {

return super.getOperandAsClassInfo(pool);
public String toString() {
return super.getOperandAsClassInfo();
}


/**
* 创建一个对象,并将其引用值压入栈顶。
* @param frame 命令执行过程中需要访问函数栈帧中的操作数栈和局部变量表,因此把frame传入
* @param result
*/
@Override
public void execute(StackFrame frame, ExecutionResult result) {
int classIndex = getIndex();
String className = ((ClassInfo)getConstantInfo(classIndex)).getClassName();
JavaObject jo = Heap.getInstance().newObject(className);
frame.getOprandStack().push(jo);
}


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

import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;

public class NoOperandCmd extends ByteCodeCommand{

Expand All @@ -10,12 +12,16 @@ public NoOperandCmd(ClassFile clzFile, String opCode) {
}

@Override
public String toString(ConstantPool pool) {
public String toString() {
return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText();
}



@Override
public void execute(StackFrame frame, ExecutionResult result) {

}


public int getLength(){
return 1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@


import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile;
import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.ExecutionResult;
import com.github.miniyk2012.coding2017.coderising.jvm.engine.StackFrame;

public class PutFieldCmd extends TwoOperandCmd {

Expand All @@ -11,8 +12,13 @@ public PutFieldCmd(ClassFile clzFile, String opCode) {
}

@Override
public String toString(ConstantPool pool) {
public String toString() {

return super.getOperandAsField(pool);
return super.getOperandAsField();
}

@Override
public void execute(StackFrame frame, ExecutionResult result) {

}
}
Loading