Skip to content

Commit

Permalink
Merge pull request #33 from foreverkai/master
Browse files Browse the repository at this point in the history
第六次作业
  • Loading branch information
diliuzuzhanghao authored May 7, 2017
2 parents 45152e1 + e5ab1a8 commit 9955c22
Show file tree
Hide file tree
Showing 68 changed files with 3,664 additions and 68 deletions.
2 changes: 2 additions & 0 deletions group06/1378560653/article.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
ÿ������
--------------------------------------------------------------------
��һƪ���£�http://blog.csdn.net/raymond120/article/details/57415472
�ڶ�ƪ���£�http://blog.csdn.net/raymond120/article/details/58043040
����ƪ���£�http://blog.csdn.net/raymond120/article/details/60759278
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.coderising.jvm.attr;

public abstract class AttributeInfo {
public static final String CODE = "Code";
public static final String CONST_VALUE = "ConstantValue";
public static final String EXCEPTIONS = "Exceptions";
public static final String LINE_NUM_TABLE = "LineNumberTable";
public static final String LOCAL_VAR_TABLE = "LocalVariableTable";
public static final String STACK_MAP_TABLE = "StackMapTable";
int attrNameIndex;
int attrLen ;
public AttributeInfo(int attrNameIndex, int attrLen) {

this.attrNameIndex = attrNameIndex;
this.attrLen = attrLen;
}


}
116 changes: 116 additions & 0 deletions group06/1378560653/mini-jvm/com/coderising/jvm/attr/CodeAttr.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package com.coderising.jvm.attr;

import com.coderising.jvm.clz.ClassFile;
import com.coderising.jvm.cmd.ByteCodeCommand;
import com.coderising.jvm.cmd.CommandParser;
import com.coderising.jvm.constant.ConstantPool;
import com.coderising.jvm.loader.ByteCodeIterator;


public class CodeAttr extends AttributeInfo {
private int maxStack ;
private int maxLocals ;
private int codeLen ;
private String code;
public String getCode() {
return code;
}

private ByteCodeCommand[] cmds ;
public ByteCodeCommand[] getCmds() {
return cmds;
}
private LineNumberTable lineNumTable;
private LocalVariableTable localVarTable;
private StackMapTable stackMapTable;

public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) {
super(attrNameIndex, attrLen);
this.maxStack = maxStack;
this.maxLocals = maxLocals;
this.codeLen = codeLen;
this.code = code;
this.cmds = cmds;
}

public void setLineNumberTable(LineNumberTable t) {
this.lineNumTable = t;
}

public void setLocalVariableTable(LocalVariableTable t) {
this.localVarTable = t;
}

public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){

int attrNameIndex = iter.nextU2ToInt();
int attrLen = iter.nextU4ToInt();
int maxStack = iter.nextU2ToInt();
int maxLocals = iter.nextU2ToInt();
int codeLen = iter.nextU4ToInt();

String code = iter.nextUxToHexString(codeLen);


ByteCodeCommand[] cmds = CommandParser.parse(clzFile,code);

CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code,cmds);

int exceptionTableLen = iter.nextU2ToInt();
//TODO 处理exception
if(exceptionTableLen>0){
String exTable = iter.nextUxToHexString(exceptionTableLen);
System.out.println("Encountered exception table , just ignore it :" + exTable);

}


int subAttrCount = iter.nextU2ToInt();

for(int x=1; x<=subAttrCount; x++){
int subAttrIndex = iter.nextU2ToInt();
String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex);

//已经向前移动了U2, 现在退回去。
iter.back(2);
//line item table
if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){

LineNumberTable t = LineNumberTable.parse(iter);
codeAttr.setLineNumberTable(t);
}
else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){
LocalVariableTable t = LocalVariableTable.parse(iter);
codeAttr.setLocalVariableTable(t);
}
else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){
StackMapTable t = StackMapTable.parse(iter);
codeAttr.setStackMapTable(t);
}
else{
throw new RuntimeException("Need code to process " + subAttrName);
}


}

return codeAttr;
}


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()).append("\n");
}
buffer.append("\n");
buffer.append(this.lineNumTable.toString());
buffer.append(this.localVarTable.toString(pool));
return buffer.toString();
}
private void setStackMapTable(StackMapTable t) {
this.stackMapTable = t;

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.coderising.jvm.attr;

import java.util.ArrayList;
import java.util.List;


import com.coderising.jvm.loader.ByteCodeIterator;

public class LineNumberTable extends AttributeInfo {
List<LineNumberItem> items = new ArrayList<LineNumberItem>();

private static class LineNumberItem{
int startPC;
int lineNum;
public int getStartPC() {
return startPC;
}
public void setStartPC(int startPC) {
this.startPC = startPC;
}
public int getLineNum() {
return lineNum;
}
public void setLineNum(int lineNum) {
this.lineNum = lineNum;
}
}

public void addLineNumberItem(LineNumberItem item){
this.items.add(item);
}
public LineNumberTable(int attrNameIndex, int attrLen) {
super(attrNameIndex, attrLen);

}

public static LineNumberTable parse(ByteCodeIterator iter){

int index = iter.nextU2ToInt();
int len = iter.nextU4ToInt();

LineNumberTable table = new LineNumberTable(index,len);

int itemLen = iter.nextU2ToInt();

for(int i=1; i<=itemLen; i++){
LineNumberItem item = new LineNumberItem();
item.setStartPC(iter.nextU2ToInt());
item.setLineNum(iter.nextU2ToInt());
table.addLineNumberItem(item);
}
return table;
}

public String toString(){
StringBuilder buffer = new StringBuilder();
buffer.append("Line Number Table:\n");
for(LineNumberItem item : items){
buffer.append("startPC:"+item.getStartPC()).append(",");
buffer.append("lineNum:"+item.getLineNum()).append("\n");
}
buffer.append("\n");
return buffer.toString();

}



}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.coderising.jvm.attr;

public class LocalVariableItem {
private int startPC;
private int length;
private int nameIndex;
private int descIndex;
private int index;
public int getStartPC() {
return startPC;
}
public void setStartPC(int startPC) {
this.startPC = startPC;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getNameIndex() {
return nameIndex;
}
public void setNameIndex(int nameIndex) {
this.nameIndex = nameIndex;
}
public int getDescIndex() {
return descIndex;
}
public void setDescIndex(int descIndex) {
this.descIndex = descIndex;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.coderising.jvm.attr;


import java.util.ArrayList;
import java.util.List;

import com.coderising.jvm.constant.ConstantPool;

import com.coderising.jvm.loader.ByteCodeIterator;

public class LocalVariableTable extends AttributeInfo{

List<LocalVariableItem> items = new ArrayList<LocalVariableItem>();

public LocalVariableTable(int attrNameIndex, int attrLen) {
super(attrNameIndex, attrLen);
}


private void addLocalVariableItem(LocalVariableItem item) {
this.items.add(item);
}

public static LocalVariableTable parse(ByteCodeIterator iter){

int index = iter.nextU2ToInt();
int len = iter.nextU4ToInt();

LocalVariableTable table = new LocalVariableTable(index,len);

int itemLen = iter.nextU2ToInt();

for(int i=1; i<=itemLen; i++){
LocalVariableItem item = new LocalVariableItem();
item.setStartPC(iter.nextU2ToInt());
item.setLength(iter.nextU2ToInt());
item.setNameIndex(iter.nextU2ToInt());
item.setDescIndex(iter.nextU2ToInt());
item.setIndex(iter.nextU2ToInt());
table.addLocalVariableItem(item);
}
return table;
}


public String toString(ConstantPool pool){
StringBuilder buffer = new StringBuilder();
buffer.append("Local Variable Table:\n");
for(LocalVariableItem item : items){
buffer.append("startPC:"+item.getStartPC()).append(",");
buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(",");
buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(",");
buffer.append("slotIndex:"+ item.getIndex()).append("\n");
}
buffer.append("\n");
return buffer.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.coderising.jvm.attr;


import com.coderising.jvm.loader.ByteCodeIterator;

public class StackMapTable extends AttributeInfo{

private String originalCode;

public StackMapTable(int attrNameIndex, int attrLen) {
super(attrNameIndex, attrLen);
}

public static StackMapTable parse(ByteCodeIterator iter){
int index = iter.nextU2ToInt();
int len = iter.nextU4ToInt();
StackMapTable t = new StackMapTable(index,len);

//后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存
String code = iter.nextUxToHexString(len);
t.setOriginalCode(code);

return t;
}

private void setOriginalCode(String code) {
this.originalCode = code;

}
}
Loading

0 comments on commit 9955c22

Please sign in to comment.