Skip to content

Commit

Permalink
完成javap打印
Browse files Browse the repository at this point in the history
  • Loading branch information
gongxun committed Apr 22, 2017
1 parent ca83f60 commit cd642e8
Show file tree
Hide file tree
Showing 15 changed files with 359 additions and 19 deletions.
8 changes: 2 additions & 6 deletions group17/785396327/4.16/print/ClassFilePrinter.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,13 @@ public void print(){

ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool());
cnstPoolPrinter.print();




}

public static void main(String[] args){
String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin";
String path = "G:\\Git\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327";
ClassFileLoader loader = new ClassFileLoader();
loader.addClassPath(path);
String className = "com.coderising.jvm.test.EmployeeV1";
String className = "jvm_1.EmployeeV1";

ClassFile clzFile = loader.loadClass(className);

Expand Down
82 changes: 74 additions & 8 deletions group17/785396327/4.16/print/ConstantPoolPrinter.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,42 +7,108 @@
*/
public class ConstantPoolPrinter {
ConstantPool pool;
ConstantPoolPrinter(ConstantPool pool){

ConstantPoolPrinter(ConstantPool pool) {
this.pool = pool;
}
public void print(){

public void print() {
System.out.println("Constant Pool:");

ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() {
@Override
public void visitClassInfo(ClassInfo info) {

// #7 = Class #44 // jvm_1/EmployeeV1
StringBuilder sb = new StringBuilder();
sb.append("Class")
.append("\t\t\t")
.append("#" + info.getUtf8Index())
.append("\t\t\t\t")
.append("//\t")
.append(info.getClassName());
System.out.println(sb.toString());
}

@Override
public void visitFieldRef(FieldRefInfo info) {

// #2 = Fieldref #7.#37 // jvm_1/EmployeeV1.name:Ljava/lang/String;
StringBuilder sb = new StringBuilder();
sb.append("Fieldref")
.append("\t\t")
.append("#" + info.getClassInfoIndex())
.append(".")
.append("#" + info.getNameAndTypeIndex())
.append("\t\t\t")
.append("//\t")
.append(info.getClassName())
.append(".")
.append(info.getFieldName())
.append(info.getFieldType());
System.out.println(sb.toString());
}

@Override
public void visitMethodRef(MethodRefInfo info) {

// #1 = Methodref #11.#36 // java/lang/Object."<init>":()V
StringBuilder sb = new StringBuilder();
sb.append("Methodref")
.append("\t\t")
.append("#" + info.getClassInfoIndex())
.append(".")
.append("#" + info.getNameAndTypeIndex())
.append("\t\t\t")
.append("//\t")
.append(info.getClassName())
.append(".")
.append(info.getMethodName());
System.out.println(sb.toString());
}

@Override
public void visitNameAndType(NameAndTypeInfo info) {

// #36 = NameAndType #16:#28 // "<init>":()V
StringBuilder sb = new StringBuilder();
sb.append("NameAndType")
.append("\t\t")
.append("#" + info.getIndex1())
.append(":")
.append("#" + info.getIndex2())
.append("\t\t\t")
.append("//\t")
.append(info.getTypeInfo())
.append(":")
.append(info.getName());
System.out.println(sb.toString());
}

@Override
public void visitString(StringInfo info) {

// #5 = String #41 // Hello , this is class Employee
StringBuilder sb = new StringBuilder();
sb.append("String")
.append("\t\t\t")
.append("#" + info.getIndex())
.append("\t\t\t\t")
.append("//\t")
.append(((UTF8Info) info.getConstantInfo(info.getIndex())).getValue());
System.out.println(sb.toString());
}

@Override
public void visistUTF8(UTF8Info info) {

// #32 = Utf8 [Ljava/lang/String;
StringBuilder sb = new StringBuilder();
sb.append("Utf8")
.append("\t\t\t")
.append(info.getValue());
System.out.println(sb.toString());
}
};

for (int i = 1; i < (Integer) pool.getSize(); i++) {
ConstantInfo constantInfo = pool.getConstantInfo(i);
System.out.print("#" + i + "\t=\t");
constantInfo.accept(visitor);
}
}
}
2 changes: 1 addition & 1 deletion group17/785396327/4.5/constant/ClassInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public int getType() {

@Override
public void accept(Visitor visitor) {

visitor.visitClassInfo(this);
}

public String getClassName() {
Expand Down
2 changes: 1 addition & 1 deletion group17/785396327/4.5/constant/FieldRefInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public int getType() {

@Override
public void accept(Visitor visitor) {

visitor.visitFieldRef(this);
}

public int getClassInfoIndex() {
Expand Down
2 changes: 1 addition & 1 deletion group17/785396327/4.5/constant/NameAndTypeInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public int getType() {

@Override
public void accept(Visitor visitor) {

visitor.visitNameAndType(this);
}


Expand Down
2 changes: 1 addition & 1 deletion group17/785396327/4.5/constant/NullConstantInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public int getType() {

@Override
public void accept(Visitor visitor) {

System.out.println("null Constant info");
}

}
2 changes: 1 addition & 1 deletion group17/785396327/4.5/constant/UTF8Info.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public int getType() {

@Override
public void accept(Visitor visitor) {

visitor.visistUTF8(this);
}

@Override
Expand Down
13 changes: 13 additions & 0 deletions group17/785396327/4.9/expr/InfixToPostfix.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package expr;

import java.util.List;

/**
* Created by gongxun on 2017/4/22.
*/
public class InfixToPostfix {
public static List<Token> convert(String expr) {

return null;
}
}
16 changes: 16 additions & 0 deletions group17/785396327/4.9/expr/PostfixExpr.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package expr;

/**
* Created by gongxun on 2017/4/22.
*/
public class PostfixExpr {
String expr = null;

public PostfixExpr(String expr) {
this.expr = expr;
}

public float evaluate() {
return 0.0f;
}
}
38 changes: 38 additions & 0 deletions group17/785396327/4.9/expr/PostfixExprTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package expr;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
* Created by gongxun on 2017/4/22.
*/
public class PostfixExprTest {
@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public void testEvaluate() {
{
PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
Assert.assertEquals(288, expr.evaluate(), 0.0f);
}
{
//9+(3-1)*3+10/2
PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
Assert.assertEquals(20, expr.evaluate(),0.0f);
}

{
//10-2*3+50
PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
Assert.assertEquals(54, expr.evaluate(),0.0f);
}
}
}
16 changes: 16 additions & 0 deletions group17/785396327/4.9/expr/PrefixExpr.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package expr;

/**
* Created by gongxun on 2017/4/22.
*/
public class PrefixExpr {
String expr = null;

public PrefixExpr(String expr) {
this.expr = expr;
}

public float evaluate() {
return 0.0f;
}
}
45 changes: 45 additions & 0 deletions group17/785396327/4.9/expr/PrefixExprTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package expr;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
* Created by gongxun on 2017/4/22.
*/
public class PrefixExprTest {
@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public void testEvaluate() {
{
// 2*3+4*5
PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
Assert.assertEquals(26, expr.evaluate(), 0.001f);
}
{
// 4*2 + 6+9*2/3 -8
PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
Assert.assertEquals(12, expr.evaluate(),0.001f);
}
{
//(3+4)*5-6
PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
Assert.assertEquals(29, expr.evaluate(),0.001f);
}
{
//1+((2+3)*4)-5
PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
Assert.assertEquals(16, expr.evaluate(),0.001f);
}


}
}
52 changes: 52 additions & 0 deletions group17/785396327/4.9/expr/Token.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package expr;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Created by gongxun on 2017/4/22.
*/
public class Token {
public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
private static final Map<String,Integer> priorities = new HashMap<String,Integer>();
static {
priorities.put("+", 1);
priorities.put("-", 1);
priorities.put("*", 2);
priorities.put("/", 2);
}
static final int OPERATOR = 1;
static final int NUMBER = 2;
String value;
int type;
public Token(int type, String value){
this.type = type;
this.value = value;
}

public boolean isNumber() {
return type == NUMBER;
}

public boolean isOperator() {
return type == OPERATOR;
}

public int getIntValue() {
return Integer.valueOf(value).intValue();
}
public String toString(){
return value;
}

public boolean hasHigherPriority(Token t){
if(!this.isOperator() && !t.isOperator()){
throw new RuntimeException("numbers can't compare priority");
}
return priorities.get(this.value) - priorities.get(t.value) > 0;
}


}
Loading

0 comments on commit cd642e8

Please sign in to comment.