From 0e158b1cccd7e2f46d20c633ed687455c3e1b45c Mon Sep 17 00:00:00 2001
From: mengxz <82427129@qq.com>
Date: Sat, 1 Apr 2017 09:42:36 +0800
Subject: [PATCH 001/151] update .gitignore file
---
group17/82427129/.gitignore | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/group17/82427129/.gitignore b/group17/82427129/.gitignore
index 090f729088..35cadcc5f6 100644
--- a/group17/82427129/.gitignore
+++ b/group17/82427129/.gitignore
@@ -14,4 +14,6 @@
.project
-Test.java
\ No newline at end of file
+Test.java
+
+Algorithms/
\ No newline at end of file
From 2beb5229e0943c8f49bf49036636d89e8293d7b7 Mon Sep 17 00:00:00 2001
From: Ren650119726 <102228177@qq.com>
Date: Sun, 9 Apr 2017 22:54:02 +0800
Subject: [PATCH 002/151] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?=
=?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
group17/102228177/work2_26/.classpath | 16 +-
.../src/com/coderising/array/ArrayUtil.java | 19 +-
.../jvm/loader/ClassFileLoader.java | 81 +++++++
.../jvm/test/ClassFileloaderTest.java | 93 ++++++++
.../com/coderising/jvm/test/EmployeeV1.java | 28 +++
.../coding/basic/linklist/LRUPageFrame.java | 150 +++++++++++++
.../basic/linklist/LRUPageFrameTest.java | 31 +++
.../src/com/coderising/data/LinkedList.java | 42 ++--
.../com/coderising/data/LinkedListTest.java | 7 +-
.../coderising/download/DownloadThread.java | 2 +-
.../coderising/download/FileDownloader.java | 2 +-
.../download/FileDownloaderTest.java | 5 +-
.../download/impl/ConnectionImpl.java | 2 +-
.../download/impl/ConnectionManagerImpl.java | 2 +-
.../com/coderising/jvm/clz/AccessFlag.java | 25 +++
.../src/com/coderising/jvm/clz/ClassFile.java | 75 +++++++
.../com/coderising/jvm/clz/ClassIndex.java | 19 ++
.../coderising/jvm/constant/ClassInfo.java | 33 +++
.../coderising/jvm/constant/ConstantInfo.java | 38 ++++
.../coderising/jvm/constant/ConstantPool.java | 39 ++++
.../coderising/jvm/constant/FieldRefInfo.java | 54 +++++
.../jvm/constant/MethodRefInfo.java | 55 +++++
.../jvm/constant/NameAndTypeInfo.java | 45 ++++
.../jvm/constant/NullConstantInfo.java | 13 ++
.../coderising/jvm/constant/StringInfo.java | 26 +++
.../com/coderising/jvm/constant/UTF8Info.java | 32 +++
.../jvm/loader/ByteCodeIterator.java | 49 +++++
.../jvm/loader/ClassFileLoader.java | 137 ++++++++++++
.../jvm/loader/ClassFileParser.java | 115 ++++++++++
.../jvm/test/ClassFileloaderTest.java | 203 ++++++++++++++++++
.../com/coderising/jvm/test/EmployeeV1.java | 28 +++
.../src/com/coderising/jvm/util/Util.java | 24 +++
.../src/com/coding/basic/stack/ArrayList.java | 150 +++++++++++++
.../src/com/coding/basic/stack/Iterator.java | 8 +
.../src/com/coding/basic/stack/List.java | 10 +
.../src/com/coding/basic/stack/Stack.java | 22 ++
.../src/com/coding/basic/stack/StackUtil.java | 45 ++++
37 files changed, 1673 insertions(+), 52 deletions(-)
create mode 100644 group17/102228177/work3_26/src/com/coderising/jvm/loader/ClassFileLoader.java
create mode 100644 group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java
create mode 100644 group17/102228177/work3_26/src/com/coderising/jvm/test/EmployeeV1.java
create mode 100644 group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrame.java
create mode 100644 group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/AccessFlag.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/ClassFile.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/ClassIndex.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ClassInfo.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ConstantInfo.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ConstantPool.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileParser.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/test/ClassFileloaderTest.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java
create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java
create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/ArrayList.java
create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java
create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/List.java
create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java
create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java
diff --git a/group17/102228177/work2_26/.classpath b/group17/102228177/work2_26/.classpath
index 80437ca942..dfa83d7793 100644
--- a/group17/102228177/work2_26/.classpath
+++ b/group17/102228177/work2_26/.classpath
@@ -1,8 +1,8 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java
index 60949d043e..a0dc5262db 100644
--- a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java
+++ b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java
@@ -34,7 +34,7 @@ public static void main(String[] args) {
// System.out.println(Arrays.toString(util.merge(a1, a2)));
System.out.println(Arrays.toString(util.fibonacci(15)));
- System.out.println(Arrays.toString(util.getPrimes(23)));
+// System.out.println(Arrays.toString(util.getPrimes(23)));
}
/**
@@ -115,14 +115,15 @@ public int[] grow(int [] oldArray, int size){
*/
public int[] fibonacci(int max){
List list = new ArrayList();
- int f1 = 1, f2 = 1, f = 0;
- list.add(f1);
- list.add(f2);
- while(f < max){
- f = f1+f2;
- f1 = f2;
- f2 = f;
- list.add(f);
+ if (max <= 1) {
+ return new int[]{};
+ }
+ int lo = 0;
+ int hi = 1;
+ while(hi clzPaths = new ArrayList();
+
+ public byte[] readBinaryCode(String className) {
+ String name = "";
+ for (int i = 0; i < className.length(); i++) {
+ if(className.charAt(i)=='.'){
+ name += File.separatorChar;
+ }else{
+ name += className.charAt(i);
+ }
+ }
+ File file = new File(getClassPath()+ File.separatorChar +name+".class");
+ InputStream in = null;
+ ByteArrayOutputStream out = null;
+ try {
+ in = new FileInputStream(file);
+ out = new ByteArrayOutputStream();
+ byte[] buff = new byte[1024*2];
+ int len = 0;
+ while((len=in.read(buff))!=-1){
+ out.write(buff, 0, len);
+ }
+ return out.toByteArray();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ finally {
+ if(in!=null){
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if(out!=null){
+ try {
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return null;
+
+
+ }
+
+
+ public void addClassPath(String path) {
+ clzPaths.add(path);
+ }
+
+
+
+ public String getClassPath(){
+ StringBuilder sb = new StringBuilder();
+ for (String string : clzPaths) {
+ sb.append(string).append(";");
+ }
+ sb = sb.deleteCharAt(sb.length()-1);
+ return sb.toString();
+ }
+}
\ No newline at end of file
diff --git a/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java
new file mode 100644
index 0000000000..1e51c27361
--- /dev/null
+++ b/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java
@@ -0,0 +1,93 @@
+package com.coderising.jvm.test;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.jvm.loader.ClassFileLoader;
+
+
+
+
+
+public class ClassFileloaderTest {
+
+
+// static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin";
+ static String path1 = "D:\\git\\coding2017\\group17\\102228177\\work3_26\\bin";
+ static String path2 = "C:\temp";
+
+
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testClassPath(){
+
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+ loader.addClassPath(path2);
+
+ String clzPath = loader.getClassPath();
+
+ Assert.assertEquals(path1+";"+path2,clzPath);
+
+ }
+
+ @Test
+ public void testClassFileLength() {
+
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+
+ String className = "com.coderising.jvm.test.EmployeeV1";
+
+ byte[] byteCodes = loader.readBinaryCode(className);
+
+ // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大
+ Assert.assertEquals(1056, byteCodes.length);
+
+ }
+
+
+ @Test
+ public void testMagicNumber(){
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+ String className = "com.coderising.jvm.test.EmployeeV1";
+ byte[] byteCodes = loader.readBinaryCode(className);
+ byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
+
+
+ String acctualValue = this.byteToHexString(codes);
+
+ Assert.assertEquals("cafebabe", acctualValue);
+ }
+
+
+
+
+
+
+ private String byteToHexString(byte[] codes ){
+ StringBuffer buffer = new StringBuffer();
+ for(int i=0;i= capacity) {
+ removeLast();
+ }
+ addNewNodetoHead(node);
+ }
+ }
+
+ private void addNewNodetoHead(Node node) {
+
+ if(isEmpty()){
+
+ node.prev = null;
+ node.next = null;
+ first = node;
+ last = node;
+
+ } else{
+ node.prev = null;
+ node.next = first;
+ first.prev = node;
+ first = node;
+ }
+ this.currentSize ++;
+ }
+
+ private Node find(int data){
+
+ Node node = first;
+ while(node != null){
+ if(node.pageNum == data){
+ return node;
+ }
+ node = node.next;
+ }
+ return null;
+
+ }
+
+
+
+ /**
+ * 删除链表尾部节点 表示 删除最少使用的缓存对象
+ */
+ private void removeLast() {
+ Node prev = last.prev;
+ prev.next = null;
+ last.prev = null;
+ last = prev;
+ this.currentSize --;
+ }
+
+ /**
+ * 移动到链表头,表示这个节点是最新使用过的
+ *
+ * @param node
+ */
+ private void moveExistingNodeToHead(Node node) {
+
+ if (node == first) {
+
+ return;
+ }
+ else if(node == last){
+ //当前节点是链表尾, 需要放到链表头
+ Node prevNode = node.prev;
+ prevNode.next = null;
+ last.prev = null;
+ last = prevNode;
+
+ } else{
+ //node 在链表的中间, 把node 的前后节点连接起来
+ Node prevNode = node.prev;
+ prevNode.next = node.next;
+
+ Node nextNode = node.next;
+ nextNode.prev = prevNode;
+
+
+ }
+
+ node.prev = null;
+ node.next = first;
+ first.prev = node;
+ first = node;
+
+ }
+ private boolean isEmpty(){
+ return (first == null) && (last == null);
+ }
+
+ public String toString(){
+ StringBuilder buffer = new StringBuilder();
+ Node node = first;
+ while(node != null){
+ buffer.append(node.pageNum);
+
+ node = node.next;
+ if(node != null){
+ buffer.append(",");
+ }
+ }
+ return buffer.toString();
+ }
+}
\ No newline at end of file
diff --git a/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 0000000000..c323d03b3f
--- /dev/null
+++ b/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,31 @@
+package com.coding.basic.linklist;
+
+import org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+
+ @Test
+ public void testAccess() {
+ LRUPageFrame frame = new LRUPageFrame(3);
+ frame.access(7);
+ frame.access(0);
+ frame.access(1);
+ Assert.assertEquals("1,0,7", frame.toString());
+ frame.access(2);
+ Assert.assertEquals("2,1,0", frame.toString());
+ frame.access(0);
+ Assert.assertEquals("0,2,1", frame.toString());
+ frame.access(0);
+ Assert.assertEquals("0,2,1", frame.toString());
+ frame.access(3);
+ Assert.assertEquals("3,0,2", frame.toString());
+ frame.access(0);
+ Assert.assertEquals("0,3,2", frame.toString());
+ frame.access(4);
+ Assert.assertEquals("4,0,3", frame.toString());
+ }
+
+}
\ No newline at end of file
diff --git a/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java
index 22a72affaf..ee2a7fd554 100644
--- a/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java
+++ b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java
@@ -292,22 +292,19 @@ public void removeRange(int min, int max){
throw new RuntimeException("LinkedList is empty!");
}else{
Node q = head;
- //头判断
- if((int)q.data>min && (int)q.datamin && (int)p.data constantInfos = new ArrayList();
+
+
+ public ConstantPool(){
+
+ }
+ public void addConstantInfo(ConstantInfo info){
+
+ this.constantInfos.add(info);
+
+ }
+
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantInfos.get(index);
+ }
+ public String getUTF8String(int index){
+ return ((UTF8Info)this.constantInfos.get(index)).getValue();
+ }
+ public Object getSize() {
+ return this.constantInfos.size() -1;
+ }
+}
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..65475e194c
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,54 @@
+package com.coderising.jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo{
+ private int type = ConstantInfo.FIELD_INFO;
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public FieldRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+
+ return getClassName() +" : "+ typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]";
+ }
+
+ public String getClassName(){
+
+ ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+
+ UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index());
+
+ return utf8Info.getValue();
+
+ }
+
+ public String getFieldName(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+
+ public String getFieldType(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getTypeInfo();
+ }
+}
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..7f05870020
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,55 @@
+package com.coderising.jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+
+ private int type = ConstantInfo.METHOD_INFO;
+
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public MethodRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ;
+ }
+ public String getClassName(){
+ ConstantPool pool = this.getConstantPool();
+ ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex());
+ return clzInfo.getClassName();
+ }
+
+ public String getMethodName(){
+ ConstantPool pool = this.getConstantPool();
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+
+ public String getParamAndReturnType(){
+ ConstantPool pool = this.getConstantPool();
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getTypeInfo();
+ }
+
+
+
+}
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..402f9dec86
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,45 @@
+package com.coderising.jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo{
+ public int type = ConstantInfo.NAME_AND_TYPE_INFO;
+
+ private int index1;
+ private int index2;
+
+ public NameAndTypeInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getIndex1() {
+ return index1;
+ }
+ public void setIndex1(int index1) {
+ this.index1 = index1;
+ }
+ public int getIndex2() {
+ return index2;
+ }
+ public void setIndex2(int index2) {
+ this.index2 = index2;
+ }
+ public int getType() {
+ return type;
+ }
+
+
+ public String getName(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1);
+ return utf8Info1.getValue();
+ }
+
+ public String getTypeInfo(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2);
+ return utf8Info2.getValue();
+ }
+
+ public String toString(){
+ return "(" + getName() + "," + getTypeInfo()+")";
+ }
+}
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..936736016f
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,13 @@
+package com.coderising.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+
+ public NullConstantInfo(){
+
+ }
+ @Override
+ public int getType() {
+ return -1;
+ }
+
+}
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java
new file mode 100644
index 0000000000..f1f8eb4ed4
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java
@@ -0,0 +1,26 @@
+package com.coderising.jvm.constant;
+
+public class StringInfo extends ConstantInfo{
+ private int type = ConstantInfo.STRING_INFO;
+ private int index;
+ public StringInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+ public void setIndex(int index) {
+ this.index = index;
+ }
+
+
+ public String toString(){
+ return this.getConstantPool().getUTF8String(index);
+ }
+
+}
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java
new file mode 100644
index 0000000000..5cac9f04f7
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java
@@ -0,0 +1,32 @@
+package com.coderising.jvm.constant;
+
+public class UTF8Info extends ConstantInfo{
+ private int type = ConstantInfo.UTF8_INFO;
+ private int length ;
+ private String value;
+ public UTF8Info(ConstantPool pool) {
+ super(pool);
+ }
+ public int getLength() {
+ return length;
+ }
+ public void setLength(int length) {
+ this.length = length;
+ }
+ public int getType() {
+ return type;
+ }
+ @Override
+ public String toString() {
+ return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]";
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+
+
+}
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..8334e80b63
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,49 @@
+package com.coderising.jvm.loader;
+
+import java.util.Arrays;
+
+import com.coderising.jvm.util.Util;
+
+public class ByteCodeIterator {
+ byte[] codes;
+ int pos = 0;
+ ByteCodeIterator(byte[] codes) {
+ this.codes = codes;
+ }
+ public byte[] getBytes(int len) {
+ if (pos + len >= codes.length) {
+ throw new ArrayIndexOutOfBoundsException();
+ }
+
+ byte[] data = Arrays.copyOfRange(codes, pos, pos + len);
+ pos += len;
+ return data;
+ }
+
+ public int nextU1toInt() {
+
+ return Util.byteToInt(new byte[] { codes[pos++] });
+ }
+
+ public int nextU2ToInt() {
+ return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] });
+ }
+
+ public int nextU4ToInt() {
+ return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] });
+ }
+
+ public String nextU4ToHexString() {
+ return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }));
+ }
+
+ public String nextUxToHexString(int len) {
+ byte[] tmp = new byte[len];
+
+ for (int i = 0; i < len; i++) {
+ tmp[i] = codes[pos++];
+ }
+ return Util.byteToHexString(tmp).toLowerCase();
+
+ }
+}
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java
new file mode 100644
index 0000000000..81264ceed7
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java
@@ -0,0 +1,137 @@
+package com.coderising.jvm.loader;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.jvm.clz.ClassFile;
+
+
+
+
+
+public class ClassFileLoader {
+
+ private List clzPaths = new ArrayList();
+
+ public byte[] readBinaryCode(String className) {
+
+ className = className.replace('.', File.separatorChar) +".class";
+
+ for(String path : this.clzPaths){
+
+ String clzFileName = path + File.separatorChar + className;
+ byte[] codes = loadClassFile(clzFileName);
+ if(codes != null){
+ return codes;
+ }
+ }
+
+ return null;
+
+
+
+ }
+
+ /*private byte[] loadClassFile(String clzFileName) {
+
+ File f = new File(clzFileName);
+
+ try {
+
+ return IOUtils.toByteArray(new FileInputStream(f));
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }*/
+
+
+
+ public void addClassPath(String path) {
+ if(this.clzPaths.contains(path)){
+ return;
+ }
+
+ this.clzPaths.add(path);
+
+ }
+
+
+
+ /*public String getClassPath(){
+ return StringUtils.join(this.clzPaths,";");
+ }
+*/
+ public ClassFile loadClass(String className) {
+ byte[] codes = this.readBinaryCode(className);
+ ClassFileParser parser = new ClassFileParser();
+ return parser.parse(codes);
+
+ }
+
+
+
+ // ------------------------------backup------------------------
+ public String getClassPath(){
+
+ StringBuffer buffer = new StringBuffer();
+ for(int i=0;i", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(10);
+ Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(11);
+ Assert.assertEquals("Code", utf8Info.getValue());
+ }
+
+ {
+ MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
+ Assert.assertEquals(3, methodRef.getClassInfoIndex());
+ Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+ Assert.assertEquals(9, nameAndType.getIndex1());
+ Assert.assertEquals(14, nameAndType.getIndex2());
+ }
+ //抽查几个吧
+ {
+ MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
+ Assert.assertEquals(1, methodRef.getClassInfoIndex());
+ Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+ Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+ }
+ }
+ @Test
+ public void testClassIndex(){
+
+ ClassIndex clzIndex = clzFile.getClzIndex();
+ ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+ ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+
+
+ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+ }
+
+
+
+}
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java b/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java
new file mode 100644
index 0000000000..12e3d7efdd
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java
@@ -0,0 +1,28 @@
+package com.coderising.jvm.test;
+
+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();
+
+ }
+}
\ No newline at end of file
diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java b/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java
new file mode 100644
index 0000000000..0c4cc8c57c
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java
@@ -0,0 +1,24 @@
+package com.coderising.jvm.util;
+
+public class Util {
+ public static int byteToInt(byte[] codes){
+ String s1 = byteToHexString(codes);
+ return Integer.valueOf(s1, 16).intValue();
+ }
+
+
+
+ public static String byteToHexString(byte[] codes ){
+ StringBuffer buffer = new StringBuffer();
+ for(int i=0;i= maxLen){
+ grow();
+ }
+ elements[size] = o;
+ size++;
+ }
+
+ /**
+ * 数组扩容
+ */
+ private void grow(){
+ maxLen = maxLen + (maxLen >> 1);
+ Object[] newArr = new Object[maxLen];
+ System.arraycopy(elements, 0, newArr, 0, size);
+ elements = newArr;
+ }
+
+ /**
+ * 在指定索引处添加元素
+ * @param i 指定索引
+ * @param o 添加元素
+ */
+ public void add(int i,Object o){
+ //判断插入位置大于数组实际长度
+ if(i > size){
+ size = i;
+ if(size >= maxLen){//数组大小大于数组最大容量则需要扩容
+ grow();
+ }
+ }
+ //插入位置不大于数组实际长度时,将插入位置的元素向后移。
+ for (int j = size; j > i ; j++) {
+ elements[j] = elements[j-1];
+ }
+ elements[i] = o;
+ size++;
+ }
+
+ /**
+ * 获取传入索引的元素
+ * @param index 索引
+ * @return 返回传入索引的元素
+ */
+ public Object get(int index){
+ //索引不在实际范围内
+ if(index < 0||index >= size){
+ throw new ArrayIndexOutOfBoundsException();
+ }
+ for (int i = 0; i < size; i++) {
+ return elements[index];
+ }
+ return null;
+ }
+
+ /**
+ * 删除指定索引元素并返回
+ * @param index
+ * @return 该索引处元素
+ */
+ public Object remove(int index){
+ //索引不在实际范围内
+ if(index < 0||index >= size){
+ throw new ArrayIndexOutOfBoundsException();
+ }else{
+ for (int j = index; j < size-1; j++) {
+ elements[j]=elements[j+1];
+ }
+ size--;
+ return elements[index];
+ }
+ }
+
+ /**
+ * 获取大小
+ * @return
+ */
+ public int size(){
+ return size;
+ }
+
+ public Iterator iterator(){
+ return new ArrayListIterator();
+ }
+
+ private class ArrayListIterator implements Iterator{
+ int cursor;
+
+ @Override
+ public boolean hasNext() {
+ return cursor != size;
+ }
+
+ @Override
+ public Object next() {
+ int i = cursor;
+ if(i >= size){
+ throw new NoSuchElementException();
+ }
+ if (i >= elements.length){
+ throw new ConcurrentModificationException();
+ }
+ cursor = i+1;
+ return elements[i];
+ }
+ }
+
+ public static void main(String[] args) {
+ ArrayList list = new ArrayList();
+ list.add(0);
+ list.add(1);
+ list.add(2);
+ list.add(3);
+ list.add(4);
+ list.add(6, 6);
+ list.remove(3);
+ for (int i = 0; i < list.size(); i++) {
+ System.out.println(i+":"+list.get(i));
+ }
+
+ Iterator it = list.iterator();
+ while (it.hasNext()) {
+ System.out.println(it.next());
+ }
+ }
+}
diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java
new file mode 100644
index 0000000000..f51a971a1c
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java
@@ -0,0 +1,8 @@
+package com.coding.basic.stack;
+
+public interface Iterator {
+
+ public boolean hasNext();
+ public Object next();
+
+}
\ No newline at end of file
diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/List.java b/group17/102228177/work4_09/src/com/coding/basic/stack/List.java
new file mode 100644
index 0000000000..2d2c693e0d
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coding/basic/stack/List.java
@@ -0,0 +1,10 @@
+package com.coding.basic.stack;
+
+public interface List {
+
+ public void add(Object o);
+ public void add(int index, Object o);
+ public Object get(int index);
+ public Object remove(int index);
+ public int size();
+}
\ No newline at end of file
diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java
new file mode 100644
index 0000000000..1af8fbfb7a
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java
@@ -0,0 +1,22 @@
+package com.coding.basic.stack;
+
+public class Stack {
+ private ArrayList elementData = new ArrayList();
+
+ public void push(Object o){
+ }
+
+ public Object pop(){
+ return null;
+ }
+
+ public Object peek(){
+ return null;
+ }
+ public boolean isEmpty(){
+ return false;
+ }
+ public int size(){
+ return -1;
+ }
+}
\ No newline at end of file
diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..2ecca1811c
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack;
+
+public class StackUtil {
+
+
+ /**
+ * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5
+ * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ */
+ public static void reverse(Stack s) {
+
+ }
+
+ /**
+ * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ *
+ * @param o
+ */
+ public static void remove(Stack s,Object o) {
+
+ }
+
+ /**
+ * 从栈顶取得len个元素, 原来的栈中元素保持不变
+ * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ * @param len
+ * @return
+ */
+ public static Object[] getTop(Stack s,int len) {
+ return null;
+ }
+ /**
+ * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz
+ * 使用堆栈检查字符串s中的括号是不是成对出现的。
+ * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true
+ * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false;
+ * @param s
+ * @return
+ */
+ public static boolean isValidPairs(String s){
+ return false;
+ }
+
+
+}
\ No newline at end of file
From fe754de1bc1ddbaccb4b29010da90075fea42f15 Mon Sep 17 00:00:00 2001
From: earliest
Date: Sun, 9 Apr 2017 22:51:08 -0700
Subject: [PATCH 003/151] jvm constant pool assignemnt
---
.../jvm/loader/ClassFileLoader.java | 20 +-
.../jvm/test/ClassFileloaderTest.java | 308 ++++++++++++------
group17/article/20170402-20170409.md | 2 +-
3 files changed, 223 insertions(+), 107 deletions(-)
mode change 100644 => 100755 group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java
diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java
index 6d669e294f..ec9ea83caf 100644
--- a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java
+++ b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java
@@ -9,18 +9,24 @@
import java.util.Collection;
import java.util.List;
+import com.coderising.jvm.clz.ClassFile;
+
public class ClassFileLoader {
private List clzPaths = new ArrayList();
+ public ClassFileLoader(){
+
+ }
+
public byte[] readBinaryCode(String className) {
String classPath = convertToFilePath(className);
File targetFile = null;
for(int i = 0; i< clzPaths.size(); i++){
String fullPath = clzPaths.get(i)+File.separator+classPath;
- System.out.println("path: " + fullPath);
+ //System.out.println("path: " + fullPath);
File temp = new File(fullPath);
if(temp.exists()) {
targetFile = temp;
@@ -29,10 +35,10 @@ public byte[] readBinaryCode(String className) {
}
if(targetFile != null){
- System.out.println("targetFile: " + targetFile.getAbsolutePath());
+ //System.out.println("targetFile: " + targetFile.getAbsolutePath());
}
long fileLength = targetFile.length();
- System.out.println("File length: " + fileLength);
+ //System.out.println("File length: " + fileLength);
byte[] byteArray = new byte[(int)fileLength];
FileInputStream is = null;
try {
@@ -61,6 +67,14 @@ public byte[] readBinaryCode(String className) {
}
+ public ClassFile loadClass(String className){
+ byte[] ba = readBinaryCode(className);
+ ClassFileParser parser = new ClassFileParser();
+ return parser.parse(ba);
+ }
+
+
+
private String convertToFilePath(String className){
return className.replaceAll("\\.", File.separator) + ".class";
}
diff --git a/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java
old mode 100644
new mode 100755
index 4df3f4b529..d3e036dee0
--- a/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java
+++ b/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java
@@ -1,103 +1,205 @@
-package com.coderising.jvm.test;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.coderising.jvm.loader.ClassFileLoader;
-
-
-
-
-
-public class ClassFileloaderTest {
-
-
- static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin";
- static String path2 = "C:\temp";
- static String path3 = "/Users/erlisuo/Documents/workspace/codeRising2017working/1282579502/bin";
-
-
- @Before
- public void setUp() throws Exception {
- }
-
- @After
- public void tearDown() throws Exception {
- }
-
- @Test
- public void testClassPath(){
-
- ClassFileLoader loader = new ClassFileLoader();
- loader.addClassPath(path1);
- loader.addClassPath(path2);
-
- String clzPath = loader.getClassPath();
-
- Assert.assertEquals(path1+";"+path2,clzPath);
-
- }
-
- @Test
- public void testClassFileLength() {
-
- ClassFileLoader loader = new ClassFileLoader();
- loader.addClassPath(path1);
- loader.addClassPath(path2);
- loader.addClassPath(path3);
- String className = "com.coderising.jvm.test.EmployeeV1";
-
- byte[] byteCodes = loader.readBinaryCode(className);
-
- // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大
- Assert.assertEquals(1056, byteCodes.length);
-
- }
-
-
- @Test
- public void testMagicNumber(){
- ClassFileLoader loader = new ClassFileLoader();
- loader.addClassPath(path1);
- loader.addClassPath(path3);
- String className = "com.coderising.jvm.test.EmployeeV1";
- byte[] byteCodes = loader.readBinaryCode(className);
- byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
-
-
- String acctualValue = this.byteToHexString(codes);
-
- Assert.assertEquals("cafebabe", acctualValue);
- }
-
-
- @Test
- public void testToHexString(){
- byte b1 = 'a';
- byte b2 = 'b';
- System.out.println("Binary: " + Integer.toBinaryString(b1) + " decimal: " + Integer.toString(b1) + " hex: " + Integer.toHexString(b1));
- System.out.println("Binary: " + Integer.toBinaryString(b2) + " decimal: " + Integer.toString(b2) + " hex: " + Integer.toHexString(b2));
-
- byte[] bArray = new byte[]{b1, b2};
- System.out.println(byteToHexString(bArray));
- }
-
-
-
- private String byteToHexString(byte[] codes ){
- StringBuffer buffer = new StringBuffer();
- for(int i=0;i", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(10);
+ Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(11);
+ Assert.assertEquals("Code", utf8Info.getValue());
+ }
+
+ {
+ MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
+ Assert.assertEquals(3, methodRef.getClassInfoIndex());
+ Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+ Assert.assertEquals(9, nameAndType.getIndex1());
+ Assert.assertEquals(14, nameAndType.getIndex2());
+ }
+ //抽查几个吧
+ {
+ MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
+ Assert.assertEquals(1, methodRef.getClassInfoIndex());
+ Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+ Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+ }
+ }
+
+ @Test
+ public void testClassIndex(){
+
+ ClassIndex clzIndex = clzFile.getClzIndex();
+ ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+ ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+
+
+ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+ }
+
+
+
+}
diff --git a/group17/article/20170402-20170409.md b/group17/article/20170402-20170409.md
index 3d45ad0516..f0d32f145f 100644
--- a/group17/article/20170402-20170409.md
+++ b/group17/article/20170402-20170409.md
@@ -30,7 +30,7 @@
516886559
-1282579502
+1282579502 https://www.evernote.com/l/AZ3ajLOAlTVHw7foK2KLb-bWZ7kw6FjljDA
614982500
From 83bb942114853f18699d0d5e2b33e82e824c6b3f Mon Sep 17 00:00:00 2001
From: earliest
Date: Sun, 9 Apr 2017 22:53:56 -0700
Subject: [PATCH 004/151] jvm constant pool assignment
---
.../com/coderising/jvm/clz/AccessFlag.java | 25 ++++
.../src/com/coderising/jvm/clz/ClassFile.java | 75 ++++++++++++
.../com/coderising/jvm/clz/ClassIndex.java | 19 +++
.../coderising/jvm/constant/ClassInfo.java | 24 ++++
.../coderising/jvm/constant/ConstantInfo.java | 30 +++++
.../jvm/constant/ConstantInfoFactory.java | 93 +++++++++++++++
.../coderising/jvm/constant/ConstantPool.java | 29 +++++
.../coderising/jvm/constant/FieldRefInfo.java | 54 +++++++++
.../coderising/jvm/constant/FloatRefInfo.java | 15 +++
.../coderising/jvm/constant/IntegerInfo.java | 22 ++++
.../InvalidConstantInfoTypeException.java | 11 ++
.../jvm/constant/MethodRefInfo.java | 55 +++++++++
.../jvm/constant/NameAndTypeInfo.java | 45 ++++++++
.../jvm/constant/NullConstantInfo.java | 13 +++
.../coderising/jvm/constant/StringInfo.java | 26 +++++
.../com/coderising/jvm/constant/UTF8Info.java | 32 +++++
.../jvm/loader/ByteCodeIterator.java | 63 ++++++++++
.../jvm/loader/ClassFileParser.java | 96 +++++++++++++++
.../jvm/test/ByteCodeIteratorTest.java | 51 ++++++++
.../src/com/coderising/jvm/util/Util.java | 24 ++++
.../src/com/coding/basic/stack/Stack.java | 24 ++++
.../src/com/coding/basic/stack/StackUtil.java | 109 ++++++++++++++++++
22 files changed, 935 insertions(+)
create mode 100755 group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java
create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java
create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java
create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java
create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java
create mode 100644 group17/1282579502/src/com/coderising/jvm/test/ByteCodeIteratorTest.java
create mode 100755 group17/1282579502/src/com/coderising/jvm/util/Util.java
create mode 100755 group17/1282579502/src/com/coding/basic/stack/Stack.java
create mode 100755 group17/1282579502/src/com/coding/basic/stack/StackUtil.java
diff --git a/group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java b/group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java
new file mode 100755
index 0000000000..aab65b780b
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java
@@ -0,0 +1,25 @@
+ package com.coderising.jvm.clz;
+
+public class AccessFlag {
+ private int flagValue;
+
+ public AccessFlag(int value) {
+ this.flagValue = value;
+ }
+
+ public int getFlagValue() {
+ return flagValue;
+ }
+
+ public void setFlagValue(int flag) {
+ this.flagValue = flag;
+ }
+
+ public boolean isPublicClass(){
+ return (this.flagValue & 0x0001) != 0;
+ }
+ public boolean isFinalClass(){
+ return (this.flagValue & 0x0010) != 0;
+ }
+
+}
\ No newline at end of file
diff --git a/group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java b/group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java
new file mode 100755
index 0000000000..650ca8375d
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java
@@ -0,0 +1,75 @@
+package com.coderising.jvm.clz;
+
+import com.coderising.jvm.constant.ClassInfo;
+import com.coderising.jvm.constant.ConstantPool;
+
+public class ClassFile {
+
+ private int minorVersion;
+ private int majorVersion;
+
+ private AccessFlag accessFlag;
+ private ClassIndex clzIndex;
+ private ConstantPool pool;
+
+
+ public ClassIndex getClzIndex() {
+ return clzIndex;
+ }
+ public AccessFlag getAccessFlag() {
+ return accessFlag;
+ }
+ public void setAccessFlag(AccessFlag accessFlag) {
+ this.accessFlag = accessFlag;
+ }
+
+
+
+ public ConstantPool getConstantPool() {
+ return pool;
+ }
+ public int getMinorVersion() {
+ return minorVersion;
+ }
+ public void setMinorVersion(int minorVersion) {
+ this.minorVersion = minorVersion;
+ }
+ public int getMajorVersion() {
+ return majorVersion;
+ }
+ public void setMajorVersion(int majorVersion) {
+ this.majorVersion = majorVersion;
+ }
+ public void setConstPool(ConstantPool pool) {
+ this.pool = pool;
+
+ }
+ public void setClassIndex(ClassIndex clzIndex) {
+ this.clzIndex = clzIndex;
+ }
+
+
+
+
+ public void print(){
+
+ if(this.accessFlag.isPublicClass()){
+ System.out.println("Access flag : public ");
+ }
+ System.out.println("Class Name:"+ getClassName());
+
+ System.out.println("Super Class Name:"+ getSuperClassName());
+
+
+ }
+
+ private String getClassName(){
+ int thisClassIndex = this.clzIndex.getThisClassIndex();
+ ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex);
+ return thisClass.getClassName();
+ }
+ private String getSuperClassName(){
+ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+ return superClass.getClassName();
+ }
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java b/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java
new file mode 100755
index 0000000000..e424f284b3
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java
@@ -0,0 +1,19 @@
+package com.coderising.jvm.clz;
+
+public class ClassIndex {
+ private int thisClassIndex;
+ private int superClassIndex;
+
+ public int getThisClassIndex() {
+ return thisClassIndex;
+ }
+ public void setThisClassIndex(int thisClassIndex) {
+ this.thisClassIndex = thisClassIndex;
+ }
+ public int getSuperClassIndex() {
+ return superClassIndex;
+ }
+ public void setSuperClassIndex(int superClassIndex) {
+ this.superClassIndex = superClassIndex;
+ }
+}
\ No newline at end of file
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java
new file mode 100755
index 0000000000..aea9048ea4
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java
@@ -0,0 +1,24 @@
+package com.coderising.jvm.constant;
+
+public class ClassInfo extends ConstantInfo {
+ private int type = ConstantInfo.CLASS_INFO;
+ private int utf8Index ;
+ public ClassInfo(ConstantPool pool) {
+ super(pool);
+ }
+ public int getUtf8Index() {
+ return utf8Index;
+ }
+ public void setUtf8Index(int utf8Index) {
+ this.utf8Index = utf8Index;
+ }
+ public int getType() {
+ return type;
+ }
+
+ public String getClassName() {
+ int index = getUtf8Index();
+ UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index);
+ return utf8Info.getValue();
+ }
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java
new file mode 100755
index 0000000000..b99ed30fbf
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java
@@ -0,0 +1,30 @@
+package com.coderising.jvm.constant;
+
+public abstract class ConstantInfo {
+ public static final int UTF8_INFO = 1;
+ public static final int INTEGER_INFO = 3;
+ public static final int FLOAT_INFO = 4;
+ public static final int CLASS_INFO = 7;
+ public static final int STRING_INFO = 8;
+ public static final int FIELD_INFO = 9;
+ public static final int METHOD_INFO = 10;
+ public static final int NAME_AND_TYPE_INFO = 12;
+ protected ConstantPool constantPool;
+
+ public ConstantInfo(){
+
+ }
+
+ public ConstantInfo(ConstantPool pool) {
+ this.constantPool = pool;
+ }
+ public abstract int getType();
+
+ public ConstantPool getConstantPool() {
+ return constantPool;
+ }
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantPool.getConstantInfo(index);
+ }
+
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java
new file mode 100644
index 0000000000..01df38c682
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java
@@ -0,0 +1,93 @@
+package com.coderising.jvm.constant;
+
+import java.io.UnsupportedEncodingException;
+
+import com.coderising.jvm.loader.ByteCodeIterator;
+import com.coderising.jvm.util.Util;
+
+public class ConstantInfoFactory {
+ public ByteCodeIterator iter = null;
+ public ConstantPool pool = null;
+ public ConstantInfoFactory(ByteCodeIterator iter, ConstantPool pool){
+ this.iter = iter;
+ this.pool = pool;
+ }
+
+ public void fillNextConstantInfo() throws InvalidConstantInfoTypeException, UnsupportedEncodingException{
+ int constantIdentifier = iter.getNextByte();
+ ConstantInfo var = null;
+ System.out.println("constant identifyer: " + constantIdentifier);
+ var = classify(constantIdentifier);
+ pool.addConstantInfo(var);
+ }
+
+ public ConstantInfo classify(int constantInfoTypeId) throws InvalidConstantInfoTypeException, UnsupportedEncodingException{
+ ConstantInfo ret = null;
+ switch(constantInfoTypeId){
+ case ConstantInfo.CLASS_INFO:
+ ClassInfo classInfo = new ClassInfo(pool);
+ byte[] utf8Index = iter.getNextNBytes(2);
+ System.out.println("constant classInfo: utf index: " + Util.byteToInt(utf8Index));
+ classInfo.setUtf8Index(Util.byteToInt(utf8Index));
+ ret = classInfo;
+
+ break;
+ case ConstantInfo.FIELD_INFO:
+ FieldRefInfo fieldInfo = new FieldRefInfo(pool);
+ int classInfoIndex = Util.byteToInt(iter.getNextNBytes(2));
+ fieldInfo.setClassInfoIndex(classInfoIndex);
+ int nameAndTypeIndex = Util.byteToInt(iter.getNextNBytes(2));
+ fieldInfo.setNameAndTypeIndex(nameAndTypeIndex);
+ ret = fieldInfo;
+ break;
+ case ConstantInfo.INTEGER_INFO:
+ IntegerInfo integerInfo = new IntegerInfo(pool);
+ int val = Util.byteToInt(iter.getNextNBytes(4));
+ integerInfo.setInteger(val);
+ ret = integerInfo;
+ break;
+ case ConstantInfo.FLOAT_INFO:
+ FloatRefInfo floatInfo = new FloatRefInfo(pool);
+ ret = floatInfo;
+ throw new InvalidConstantInfoTypeException("Flat info has not been properly implemented yet");
+ //break;
+ case ConstantInfo.METHOD_INFO:
+ MethodRefInfo methodInfo = new MethodRefInfo(pool);
+ int methodClassInfoIndex = Util.byteToInt(iter.getNextNBytes(2));
+ methodInfo.setClassInfoIndex(methodClassInfoIndex);
+ int methodNameAndTypeIndex = Util.byteToInt(iter.getNextNBytes(2));
+ methodInfo.setNameAndTypeIndex(methodNameAndTypeIndex);
+ ret = methodInfo;
+ break;
+ case ConstantInfo.NAME_AND_TYPE_INFO:
+ NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool);
+ int nameIndex = Util.byteToInt(iter.getNextNBytes(2));
+ nameAndTypeInfo.setIndex1(nameIndex);
+ int descriptorIndex = Util.byteToInt(iter.getNextNBytes(2));
+ nameAndTypeInfo.setIndex2(descriptorIndex);
+ ret = nameAndTypeInfo;
+ break;
+ case ConstantInfo.STRING_INFO:
+ StringInfo stringInfo = new StringInfo(pool);
+ int index = Util.byteToInt(iter.getNextNBytes(2));
+ stringInfo.setIndex(index);
+ ret = stringInfo;
+ break;
+ case ConstantInfo.UTF8_INFO:
+ UTF8Info utfInfo = new UTF8Info(pool);
+ int length = Util.byteToInt(iter.getNextNBytes(2));
+ utfInfo.setLength(length);
+
+ String utf8Val = new String(iter.getNextNBytes(length), "UTF-8");
+ System.out.println("UTF 8 content " + utf8Val);
+
+ utfInfo.setValue(utf8Val);
+ ret = utfInfo;
+ break;
+
+ default:
+ throw new InvalidConstantInfoTypeException();
+ }
+ return ret;
+ }
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java
new file mode 100755
index 0000000000..9a1a998f41
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java
@@ -0,0 +1,29 @@
+package com.coderising.jvm.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+
+ private List constantInfos = new ArrayList();
+
+
+ public ConstantPool(){
+
+ }
+ public void addConstantInfo(ConstantInfo info){
+ System.out.println("added: " + info.getClass().getName() + " current size; " + constantInfos.size());
+ this.constantInfos.add(info);
+
+ }
+
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantInfos.get(index);
+ }
+ public String getUTF8String(int index){
+ return ((UTF8Info)this.constantInfos.get(index)).getValue();
+ }
+ public int getSize() {
+ return this.constantInfos.size() -1;
+ }
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java
new file mode 100755
index 0000000000..65475e194c
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,54 @@
+package com.coderising.jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo{
+ private int type = ConstantInfo.FIELD_INFO;
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public FieldRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+
+ return getClassName() +" : "+ typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]";
+ }
+
+ public String getClassName(){
+
+ ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+
+ UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index());
+
+ return utf8Info.getValue();
+
+ }
+
+ public String getFieldName(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+
+ public String getFieldType(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getTypeInfo();
+ }
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java
new file mode 100644
index 0000000000..356216a166
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java
@@ -0,0 +1,15 @@
+package com.coderising.jvm.constant;
+
+public class FloatRefInfo extends ClassInfo{
+
+ public FloatRefInfo(ConstantPool pool) {
+ super(pool);
+ // TODO Auto-generated constructor stub
+ }
+
+ public int getType(){
+ return ConstantInfo.FLOAT_INFO;
+ }
+
+
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java
new file mode 100644
index 0000000000..1980de8f2f
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java
@@ -0,0 +1,22 @@
+package com.coderising.jvm.constant;
+
+public class IntegerInfo extends ConstantInfo{
+
+ int val = 0;
+ public IntegerInfo(ConstantPool pool) {
+ super(pool);
+ // TODO Auto-generated constructor stub
+ }
+
+ public int getType(){
+ return ConstantInfo.INTEGER_INFO;
+ }
+
+ public void setInteger(int val){
+ this.val = val;
+ }
+
+ public int getInteger(){
+ return val;
+ }
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java b/group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java
new file mode 100644
index 0000000000..ac33ac7f9c
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java
@@ -0,0 +1,11 @@
+package com.coderising.jvm.constant;
+
+public class InvalidConstantInfoTypeException extends Exception{
+
+ public InvalidConstantInfoTypeException(){
+ super();
+ }
+ public InvalidConstantInfoTypeException(String message){
+ super(message);
+ }
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java
new file mode 100755
index 0000000000..7f05870020
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,55 @@
+package com.coderising.jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+
+ private int type = ConstantInfo.METHOD_INFO;
+
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public MethodRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ;
+ }
+ public String getClassName(){
+ ConstantPool pool = this.getConstantPool();
+ ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex());
+ return clzInfo.getClassName();
+ }
+
+ public String getMethodName(){
+ ConstantPool pool = this.getConstantPool();
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+
+ public String getParamAndReturnType(){
+ ConstantPool pool = this.getConstantPool();
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getTypeInfo();
+ }
+
+
+
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java
new file mode 100755
index 0000000000..402f9dec86
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,45 @@
+package com.coderising.jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo{
+ public int type = ConstantInfo.NAME_AND_TYPE_INFO;
+
+ private int index1;
+ private int index2;
+
+ public NameAndTypeInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getIndex1() {
+ return index1;
+ }
+ public void setIndex1(int index1) {
+ this.index1 = index1;
+ }
+ public int getIndex2() {
+ return index2;
+ }
+ public void setIndex2(int index2) {
+ this.index2 = index2;
+ }
+ public int getType() {
+ return type;
+ }
+
+
+ public String getName(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1);
+ return utf8Info1.getValue();
+ }
+
+ public String getTypeInfo(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2);
+ return utf8Info2.getValue();
+ }
+
+ public String toString(){
+ return "(" + getName() + "," + getTypeInfo()+")";
+ }
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java
new file mode 100755
index 0000000000..936736016f
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,13 @@
+package com.coderising.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+
+ public NullConstantInfo(){
+
+ }
+ @Override
+ public int getType() {
+ return -1;
+ }
+
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java
new file mode 100755
index 0000000000..f1f8eb4ed4
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java
@@ -0,0 +1,26 @@
+package com.coderising.jvm.constant;
+
+public class StringInfo extends ConstantInfo{
+ private int type = ConstantInfo.STRING_INFO;
+ private int index;
+ public StringInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+ public void setIndex(int index) {
+ this.index = index;
+ }
+
+
+ public String toString(){
+ return this.getConstantPool().getUTF8String(index);
+ }
+
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java b/group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java
new file mode 100755
index 0000000000..5cac9f04f7
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java
@@ -0,0 +1,32 @@
+package com.coderising.jvm.constant;
+
+public class UTF8Info extends ConstantInfo{
+ private int type = ConstantInfo.UTF8_INFO;
+ private int length ;
+ private String value;
+ public UTF8Info(ConstantPool pool) {
+ super(pool);
+ }
+ public int getLength() {
+ return length;
+ }
+ public void setLength(int length) {
+ this.length = length;
+ }
+ public int getType() {
+ return type;
+ }
+ @Override
+ public String toString() {
+ return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]";
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+
+
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java
new file mode 100755
index 0000000000..f312b513ac
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,63 @@
+package com.coderising.jvm.loader;
+
+public class ByteCodeIterator {
+
+ byte[] source = null;
+ int currentPos = 0;
+
+ public ByteCodeIterator(byte[] source){
+ this.source = source;
+ }
+
+ public byte getNextByte(){
+ if(currentPos > source.length -1){
+ throw new IndexOutOfBoundsException();
+ }
+ return getByteAt(currentPos++);
+ }
+
+ public byte[] getNextNBytes(int n){
+ byte[] retArray = new byte[n];
+ for(int i = 0; isource.length-1){
+ throw new IndexOutOfBoundsException();
+ }
+ return source[n];
+ }
+
+
+ public String getNextHexString(){
+ byte b1 = getNextByte();
+ int i1 = b1 & 0xFF;
+ String strVal = Integer.toHexString(i1);
+ if(strVal.length() < 2){
+ strVal = "0".concat(strVal);
+ }
+ return strVal;
+ }
+
+ public String getNextNHexString(int n){
+ StringBuilder sb = new StringBuilder();
+ while(n-->0){
+ sb.append(getNextHexString());
+ }
+
+ return sb.toString();
+ }
+
+
+
+ public static void printByteInNumber(byte b){
+ int tmp = b;
+ System.out.println(Integer.toBinaryString(tmp));
+ int tmp1 = tmp & 0xFF;
+ System.out.println(Integer.toBinaryString(tmp1));
+ System.out.println(Integer.toHexString(tmp1));
+ }
+}
diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java
new file mode 100755
index 0000000000..7c5809efec
--- /dev/null
+++ b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java
@@ -0,0 +1,96 @@
+package com.coderising.jvm.loader;
+
+import java.io.UnsupportedEncodingException;
+
+import com.coderising.jvm.clz.AccessFlag;
+import com.coderising.jvm.clz.ClassFile;
+import com.coderising.jvm.clz.ClassIndex;
+import com.coderising.jvm.constant.ClassInfo;
+import com.coderising.jvm.constant.ConstantInfo;
+import com.coderising.jvm.constant.ConstantInfoFactory;
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.constant.FieldRefInfo;
+import com.coderising.jvm.constant.InvalidConstantInfoTypeException;
+import com.coderising.jvm.constant.MethodRefInfo;
+import com.coderising.jvm.constant.NameAndTypeInfo;
+import com.coderising.jvm.constant.NullConstantInfo;
+import com.coderising.jvm.constant.StringInfo;
+import com.coderising.jvm.constant.UTF8Info;
+
+public class ClassFileParser {
+ ClassFile clz = null;
+ public ClassFile parse(byte[] codes) {
+ clz = new ClassFile();
+ ByteCodeIterator iter = new ByteCodeIterator(codes);
+ String magicHex = iter.getNextNHexString(4);
+ System.out.println("Magic Number: "+magicHex);
+
+ String minorHex = iter.getNextHexString() + iter.getNextHexString();
+ int minorVersionInt = Integer.parseInt(minorHex, 16);
+ String majorHex = iter.getNextHexString() + iter.getNextHexString();
+ int majorVersionInt = Integer.parseInt(majorHex, 16);
+ clz.setMajorVersion(majorVersionInt);clz.setMinorVersion(minorVersionInt);
+ System.out.println("Major version: " + majorVersionInt + " minor version: " + minorVersionInt);
+ clz.setConstPool(parseConstantPool(iter));
+ fillClassInfo(clz, clz.getConstantPool());
+ return clz;
+ }
+
+ private AccessFlag parseAccessFlag(ByteCodeIterator iter) {
+
+ return null;
+ }
+
+ private ClassIndex parseClassInfex(ByteCodeIterator iter) {
+
+ return null;
+
+ }
+
+ private void fillClassInfo(ClassFile clz, ConstantPool pool){
+ ClassIndex newClassIndex = new ClassIndex();
+ clz.setClassIndex(newClassIndex);
+ for(int i = 0; i< pool.getSize(); i++){
+ if(pool.getConstantInfo(i) instanceof ClassInfo){
+ if(clz.getClzIndex().getThisClassIndex() == 0){
+ System.out.println("class");
+ clz.getClzIndex().setThisClassIndex(i);
+ }
+ else if(clz.getClzIndex().getSuperClassIndex() == 0){
+ clz.getClzIndex().setSuperClassIndex(i);
+ }
+ else{
+ break;
+ }
+ }
+ }
+ }
+
+ private ConstantPool parseConstantPool(ByteCodeIterator iter) {
+ String constantPoolSizeHex = iter.getNextHexString() + iter.getNextHexString();
+ System.out.println("hex string: " + constantPoolSizeHex + " integer value: " + Integer.parseInt(constantPoolSizeHex, 16));
+ int constantCount = Integer.parseInt(constantPoolSizeHex, 16);
+ ConstantPool constantPool = new ConstantPool();
+ constantPool.addConstantInfo(new NullConstantInfo());
+ ConstantInfoFactory constantInfoFactory = new ConstantInfoFactory(iter, constantPool);
+ while(constantCount-- > 1){
+ try {
+ constantInfoFactory.fillNextConstantInfo();
+ } catch ( Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ break;
+ }
+
+ }
+
+ for(int i = 0; i
Date: Mon, 10 Apr 2017 14:14:27 +0800
Subject: [PATCH 005/151] =?UTF-8?q?jvm=E5=B8=B8=E9=87=8F=E6=B1=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../1264835468/src/assignment/BinaryTree.java | 10 +-
.../1264835468/src/assignment/MyStack.java | 39 ------
.../assignment/{MyQueue.java => Queue.java} | 2 +-
group17/1264835468/src/assignment/Stack.java | 53 +++++++
.../assignment0326/jvm/clz/AccessFlag.java | 25 ++++
.../src/assignment0326/jvm/clz/ClassFile.java | 77 +++++++++++
.../assignment0326/jvm/clz/ClassIndex.java | 19 +++
.../jvm/constant/ClassInfo.java | 24 ++++
.../jvm/constant/ConstantInfo.java | 29 ++++
.../jvm/constant/ConstantPool.java | 29 ++++
.../jvm/constant/FieldRefInfo.java | 54 ++++++++
.../jvm/constant/MethodRefInfo.java | 55 ++++++++
.../jvm/constant/NameAndTypeInfo.java | 45 ++++++
.../jvm/constant/NullConstantInfo.java | 13 ++
.../jvm/constant/StringInfo.java | 26 ++++
.../assignment0326/jvm/constant/UTF8Info.java | 32 +++++
.../jvm/loader/ByteCodeIterator.java | 34 +++++
.../jvm/loader/ClassFileLoader.java | 25 ++++
.../jvm/loader/ClassFileParser.java | 122 +++++++++++++++++
.../jvm/test/ClassFileLoaderTest.java | 129 ++++++++++++++++--
.../src/assignment0326/jvm/util/Util.java | 24 ++++
.../src/assignment0326/lru/Clock.java | 99 --------------
.../src/assignment0405/StackUtil.java | 104 ++++++++++++++
.../src/assignment0405/StackUtilTest.java | 61 +++++++++
.../com/coderising/jvm/test/EmployeeV1.java | 28 ++++
25 files changed, 1000 insertions(+), 158 deletions(-)
delete mode 100644 group17/1264835468/src/assignment/MyStack.java
rename group17/1264835468/src/assignment/{MyQueue.java => Queue.java} (95%)
create mode 100644 group17/1264835468/src/assignment/Stack.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java
create mode 100644 group17/1264835468/src/assignment0326/jvm/util/Util.java
delete mode 100644 group17/1264835468/src/assignment0326/lru/Clock.java
create mode 100644 group17/1264835468/src/assignment0405/StackUtil.java
create mode 100644 group17/1264835468/src/assignment0405/StackUtilTest.java
create mode 100644 group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java
diff --git a/group17/1264835468/src/assignment/BinaryTree.java b/group17/1264835468/src/assignment/BinaryTree.java
index 1d76a7ce2c..882a87f6ed 100644
--- a/group17/1264835468/src/assignment/BinaryTree.java
+++ b/group17/1264835468/src/assignment/BinaryTree.java
@@ -53,10 +53,10 @@ public String toString() {
*
*/
private class BFSNodeQueue {
- private MyQueue> nodeQueue;
+ private Queue> nodeQueue;
public BFSNodeQueue() {
- nodeQueue = new MyQueue<>();
+ nodeQueue = new Queue<>();
}
public boolean isEmpty() {
@@ -79,9 +79,9 @@ public BinaryTreeNode deQueue() {
}
// 把所有出队节点放进另一个队列中
- public MyQueue> getResult() {
+ public Queue> getResult() {
prepare();
- MyQueue> result = new MyQueue<>();
+ Queue> result = new Queue<>();
while (!isEmpty()) {
result.enQueue(deQueue());
}
@@ -121,7 +121,7 @@ private class BFSIterator implements Iterator> {
Iterator> iterator;
public BFSIterator() {
- MyQueue> BFSQueue = new BFSNodeQueue().getResult();
+ Queue> BFSQueue = new BFSNodeQueue().getResult();
list = new MyArrayList<>();
while (!BFSQueue.isEmpty()) {
list.add(BFSQueue.deQueue());
diff --git a/group17/1264835468/src/assignment/MyStack.java b/group17/1264835468/src/assignment/MyStack.java
deleted file mode 100644
index 0c3d30337b..0000000000
--- a/group17/1264835468/src/assignment/MyStack.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package assignment;
-
-public class MyStack {
- private MyArrayList elementData = new MyArrayList<>();
-
- public void push(T o) {
- elementData.add(o);
- }
-
- public T pop() {
- if (!isEmpty()) {
- T data = elementData.remove(elementData.size() - 1);
- return data;
- }
- throw new StackIsEmptyException();
- }
-
- public T peek() {
- return elementData.get(elementData.size() - 1);
- }
-
- public boolean isEmpty() {
- return elementData.size() == 0;
- }
-
- public int size() {
- return elementData.size();
- }
-}
-
-class StackIsEmptyException extends RuntimeException {
- public StackIsEmptyException() {
- super();
- }
-
- public StackIsEmptyException(String string) {
- super(string);
- }
-}
diff --git a/group17/1264835468/src/assignment/MyQueue.java b/group17/1264835468/src/assignment/Queue.java
similarity index 95%
rename from group17/1264835468/src/assignment/MyQueue.java
rename to group17/1264835468/src/assignment/Queue.java
index c5e3e8ce88..eb3b474e75 100644
--- a/group17/1264835468/src/assignment/MyQueue.java
+++ b/group17/1264835468/src/assignment/Queue.java
@@ -1,6 +1,6 @@
package assignment;
-public class MyQueue {
+public class Queue {
private MyLinkedList elementData = new MyLinkedList<>();
public void enQueue(T o) {
diff --git a/group17/1264835468/src/assignment/Stack.java b/group17/1264835468/src/assignment/Stack.java
new file mode 100644
index 0000000000..9100544ee3
--- /dev/null
+++ b/group17/1264835468/src/assignment/Stack.java
@@ -0,0 +1,53 @@
+package assignment;
+
+public class Stack {
+ private MyArrayList elementData = new MyArrayList<>();
+
+ public void push(T o) {
+ elementData.add(o);
+ }
+
+ public T pop() {
+ if (!isEmpty()) {
+ T data = elementData.remove(elementData.size() - 1);
+ return data;
+ }
+ throw new EmptyStackException();
+ }
+
+ public T peek() {
+ if(!isEmpty())
+ return elementData.get(elementData.size() - 1);
+ throw new EmptyStackException();
+ }
+
+ public boolean isEmpty() {
+ return elementData.size() == 0;
+ }
+
+ public int size() {
+ return elementData.size();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder stringBuilder = new StringBuilder();
+ for (int i = elementData.size()-1; i >=0; i--) {
+ stringBuilder.append(elementData.get(i));
+ if (i != 0) {
+ stringBuilder.append(", ");
+ }
+ }
+ return stringBuilder.toString();
+ }
+}
+
+class EmptyStackException extends RuntimeException {
+ public EmptyStackException() {
+ super();
+ }
+
+ public EmptyStackException(String string) {
+ super(string);
+ }
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java b/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java
new file mode 100644
index 0000000000..f95bc2e902
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java
@@ -0,0 +1,25 @@
+package assignment0326.jvm.clz;
+
+public class AccessFlag {
+ private int flagValue;
+
+ public AccessFlag(int value) {
+ this.flagValue = value;
+ }
+
+ public int getFlagValue() {
+ return flagValue;
+ }
+
+ public void setFlagValue(int flag) {
+ this.flagValue = flag;
+ }
+
+ public boolean isPublicClass(){
+ return (this.flagValue & 0x0001) != 0;
+ }
+ public boolean isFinalClass(){
+ return (this.flagValue & 0x0010) != 0;
+ }
+
+}
\ No newline at end of file
diff --git a/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java b/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java
new file mode 100644
index 0000000000..2cb501297d
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java
@@ -0,0 +1,77 @@
+package assignment0326.jvm.clz;
+
+
+import assignment0326.jvm.constant.ClassInfo;
+import assignment0326.jvm.constant.ConstantPool;
+
+public class ClassFile {
+
+ private int minorVersion;
+ private int majorVersion;
+
+ private AccessFlag accessFlag;
+ private ClassIndex clzIndex;
+ private ConstantPool pool;
+
+
+ public ClassIndex getClzIndex() {
+ return clzIndex;
+ }
+ public AccessFlag getAccessFlag() {
+ return accessFlag;
+ }
+ public void setAccessFlag(AccessFlag accessFlag) {
+ this.accessFlag = accessFlag;
+ }
+
+
+
+ public ConstantPool getConstantPool() {
+ return pool;
+ }
+ public int getMinorVersion() {
+ return minorVersion;
+ }
+ public void setMinorVersion(int minorVersion) {
+ this.minorVersion = minorVersion;
+ }
+ public int getMajorVersion() {
+ return majorVersion;
+ }
+ public void setMajorVersion(int majorVersion) {
+ this.majorVersion = majorVersion;
+ }
+ public void setConstPool(ConstantPool pool) {
+ this.pool = pool;
+
+ }
+ public void setClassIndex(ClassIndex clzIndex) {
+ this.clzIndex = clzIndex;
+ }
+
+
+
+
+ public void print(){
+
+ if(this.accessFlag.isPublicClass()){
+ System.out.println("Access flag : public ");
+ }
+ System.out.println("Class Name:"+ getClassName());
+
+ System.out.println("Super Class Name:"+ getSuperClassName());
+
+
+ }
+
+ private String getClassName(){
+ int thisClassIndex = this.clzIndex.getThisClassIndex();
+ ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex);
+ return thisClass.getClassName();
+ }
+
+ private String getSuperClassName(){
+ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+ return superClass.getClassName();
+ }
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java b/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java
new file mode 100644
index 0000000000..a3e5c3d350
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java
@@ -0,0 +1,19 @@
+package assignment0326.jvm.clz;
+
+public class ClassIndex {
+ private int thisClassIndex;
+ private int superClassIndex;
+
+ public int getThisClassIndex() {
+ return thisClassIndex;
+ }
+ public void setThisClassIndex(int thisClassIndex) {
+ this.thisClassIndex = thisClassIndex;
+ }
+ public int getSuperClassIndex() {
+ return superClassIndex;
+ }
+ public void setSuperClassIndex(int superClassIndex) {
+ this.superClassIndex = superClassIndex;
+ }
+}
\ No newline at end of file
diff --git a/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java
new file mode 100644
index 0000000000..4a7397478e
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java
@@ -0,0 +1,24 @@
+package assignment0326.jvm.constant;
+
+public class ClassInfo extends ConstantInfo {
+ private int type = ConstantInfo.CLASS_INFO;
+ private int utf8Index ;
+ public ClassInfo(ConstantPool pool) {
+ super(pool);
+ }
+ public int getUtf8Index() {
+ return utf8Index;
+ }
+ public void setUtf8Index(int utf8Index) {
+ this.utf8Index = utf8Index;
+ }
+ public int getType() {
+ return type;
+ }
+
+ public String getClassName() {
+ int index = getUtf8Index();
+ UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index);
+ return utf8Info.getValue();
+ }
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java
new file mode 100644
index 0000000000..f6acdc0580
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java
@@ -0,0 +1,29 @@
+package assignment0326.jvm.constant;
+
+public abstract class ConstantInfo {
+ public static final int UTF8_INFO = 1;
+ public static final int FLOAT_INFO = 4;
+ public static final int CLASS_INFO = 7;
+ public static final int STRING_INFO = 8;
+ public static final int FIELD_INFO = 9;
+ public static final int METHOD_INFO = 10;
+ public static final int NAME_AND_TYPE_INFO = 12;
+ protected ConstantPool constantPool;
+
+ public ConstantInfo(){
+
+ }
+
+ public ConstantInfo(ConstantPool pool) {
+ this.constantPool = pool;
+ }
+ public abstract int getType();
+
+ public ConstantPool getConstantPool() {
+ return constantPool;
+ }
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantPool.getConstantInfo(index);
+ }
+
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java b/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java
new file mode 100644
index 0000000000..96f40534da
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java
@@ -0,0 +1,29 @@
+package assignment0326.jvm.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+
+ private List constantInfos = new ArrayList();
+
+
+ public ConstantPool(){
+
+ }
+ public void addConstantInfo(ConstantInfo info){
+
+ this.constantInfos.add(info);
+
+ }
+
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantInfos.get(index);
+ }
+ public String getUTF8String(int index){
+ return ((UTF8Info)this.constantInfos.get(index)).getValue();
+ }
+ public Object getSize() {
+ return this.constantInfos.size() -1;
+ }
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..d0beb7f1f2
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,54 @@
+package assignment0326.jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo{
+ private int type = ConstantInfo.FIELD_INFO;
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public FieldRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+
+ return getClassName() +" : "+ typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]";
+ }
+
+ public String getClassName(){
+
+ ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+
+ UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index());
+
+ return utf8Info.getValue();
+
+ }
+
+ public String getFieldName(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+
+ public String getFieldType(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getTypeInfo();
+ }
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..3678f46c39
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,55 @@
+package assignment0326.jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+
+ private int type = ConstantInfo.METHOD_INFO;
+
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public MethodRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ;
+ }
+ public String getClassName(){
+ ConstantPool pool = this.getConstantPool();
+ ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex());
+ return clzInfo.getClassName();
+ }
+
+ public String getMethodName(){
+ ConstantPool pool = this.getConstantPool();
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+
+ public String getParamAndReturnType(){
+ ConstantPool pool = this.getConstantPool();
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getTypeInfo();
+ }
+
+
+
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..7659657b94
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,45 @@
+package assignment0326.jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo{
+ public int type = ConstantInfo.NAME_AND_TYPE_INFO;
+
+ private int index1;
+ private int index2;
+
+ public NameAndTypeInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getIndex1() {
+ return index1;
+ }
+ public void setIndex1(int index1) {
+ this.index1 = index1;
+ }
+ public int getIndex2() {
+ return index2;
+ }
+ public void setIndex2(int index2) {
+ this.index2 = index2;
+ }
+ public int getType() {
+ return type;
+ }
+
+
+ public String getName(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1);
+ return utf8Info1.getValue();
+ }
+
+ public String getTypeInfo(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2);
+ return utf8Info2.getValue();
+ }
+
+ public String toString(){
+ return "(" + getName() + "," + getTypeInfo()+")";
+ }
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..d8f8bda26e
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,13 @@
+package assignment0326.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+
+ public NullConstantInfo(){
+
+ }
+ @Override
+ public int getType() {
+ return -1;
+ }
+
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java
new file mode 100644
index 0000000000..eb6b9b4d7e
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java
@@ -0,0 +1,26 @@
+package assignment0326.jvm.constant;
+
+public class StringInfo extends ConstantInfo{
+ private int type = ConstantInfo.STRING_INFO;
+ private int index;
+ public StringInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+ public void setIndex(int index) {
+ this.index = index;
+ }
+
+
+ public String toString(){
+ return this.getConstantPool().getUTF8String(index);
+ }
+
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java b/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java
new file mode 100644
index 0000000000..80f3389bd9
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java
@@ -0,0 +1,32 @@
+package assignment0326.jvm.constant;
+
+public class UTF8Info extends ConstantInfo{
+ private int type = ConstantInfo.UTF8_INFO;
+ private int length ;
+ private String value;
+ public UTF8Info(ConstantPool pool) {
+ super(pool);
+ }
+ public int getLength() {
+ return length;
+ }
+ public void setLength(int length) {
+ this.length = length;
+ }
+ public int getType() {
+ return type;
+ }
+ @Override
+ public String toString() {
+ return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]";
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+
+
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..e9b9fdaf2e
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,34 @@
+package assignment0326.jvm.loader;
+
+public class ByteCodeIterator {
+ int curPos;
+ byte[] bytes;
+
+ public ByteCodeIterator(byte[] bytes) {
+ curPos=0;
+ this.bytes = bytes;
+ }
+
+ public byte nextByte(){
+ return bytes[curPos++];
+ }
+ public int nextByteToInt(){
+ return Byte.toUnsignedInt(nextByte());
+ }
+ public int next2BytesToInt(){
+ int hi=Byte.toUnsignedInt(nextByte());
+ int lo = Byte.toUnsignedInt(nextByte());
+ int i=hi<<8|lo;
+ return i;
+ }
+ public byte[] nextNBytes(int n){
+ byte[] bytes = new byte[n];
+ for (int i = 0; i < n; i++) {
+ bytes[i]=nextByte();
+ }
+ return bytes;
+ }
+ public void skip(int n){
+ curPos+=n;
+ }
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java
index a5add91113..4aaf67a2d1 100644
--- a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java
+++ b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java
@@ -1,9 +1,13 @@
package assignment0326.jvm.loader;
+import assignment0326.jvm.clz.ClassFile;
+
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
@@ -38,6 +42,9 @@ public byte[] readBinaryCode(String className) {
public void addClassPath(String path) {
+ if(this.clzPaths.contains(path)){
+ return;
+ }
clzPaths.add(path);
}
@@ -53,7 +60,25 @@ public String getClassPath(){
}
+ private byte[] loadClassFile(String clzFileName) {
+
+ try {
+
+ return Files.readAllBytes(Paths.get(clzFileName));
+
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public ClassFile loadClass(String className) {
+ byte[] codes = this.readBinaryCode(className);
+ ClassFileParser parser = new ClassFileParser();
+ return parser.parse(codes);
+ }
}
diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java
new file mode 100644
index 0000000000..92aaa75d3a
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java
@@ -0,0 +1,122 @@
+package assignment0326.jvm.loader;
+
+import assignment0326.jvm.clz.AccessFlag;
+import assignment0326.jvm.clz.ClassFile;
+import assignment0326.jvm.clz.ClassIndex;
+import assignment0326.jvm.constant.*;
+
+
+public class ClassFileParser {
+
+ private ConstantPool constantPool;
+ public ClassFile parse(byte[] codes) {
+ ClassFile classFile=new ClassFile();
+ ByteCodeIterator iterator = new ByteCodeIterator(codes);
+ iterator.skip(4);
+
+ classFile.setMinorVersion(iterator.next2BytesToInt());
+ classFile.setMajorVersion(iterator.next2BytesToInt());
+
+ classFile.setConstPool(parseConstantPool(iterator));
+
+ classFile.setAccessFlag(parseAccessFlag(iterator));
+
+ classFile.setClassIndex(parseClassIndex(iterator));
+ return classFile;
+ }
+
+ private AccessFlag parseAccessFlag(ByteCodeIterator iter) {
+ AccessFlag flag = new AccessFlag(iter.next2BytesToInt());
+ return flag;
+ }
+
+ private ClassIndex parseClassIndex(ByteCodeIterator iter) {
+ ClassIndex classIndex=new ClassIndex();
+ classIndex.setThisClassIndex(iter.next2BytesToInt());
+ classIndex.setSuperClassIndex(iter.next2BytesToInt());
+ return classIndex;
+
+ }
+
+ private ConstantPool parseConstantPool(ByteCodeIterator iter) {
+ constantPool=new ConstantPool();
+ int size=iter.next2BytesToInt();
+ constantPool.addConstantInfo(new NullConstantInfo());
+ for (int i = 0; i < size-1; i++) {
+ parseConstant(iter);
+ }
+ return constantPool;
+ }
+
+ private void parseConstant(ByteCodeIterator iter) {
+ int flag=iter.nextByteToInt();
+ ConstantInfo constantInfo;
+ switch (flag){
+ case ConstantInfo.UTF8_INFO:
+ constantInfo=parseUTF8Info(iter);
+ break;
+ case ConstantInfo.CLASS_INFO:
+ constantInfo = parseClassInfo(iter);
+ break;
+ case ConstantInfo.STRING_INFO:
+ constantInfo = parseStringInfo(iter);
+ break;
+ case ConstantInfo.FIELD_INFO:
+ constantInfo = parseFieldInfo(iter);
+ break;
+ case ConstantInfo.METHOD_INFO:
+ constantInfo = parseMethodInfo(iter);
+ break;
+ case ConstantInfo.NAME_AND_TYPE_INFO:
+ constantInfo = parseNameAndTypeInfo(iter);
+ break;
+ default:
+ throw new RuntimeException("Unsupported flag");
+ }
+ constantPool.addConstantInfo(constantInfo);
+ }
+
+ private ConstantInfo parseUTF8Info(ByteCodeIterator iter) {
+ UTF8Info utf8Info = new UTF8Info(constantPool);
+ int length=iter.next2BytesToInt();
+ String value=new String(iter.nextNBytes(length));
+ utf8Info.setLength(length);
+ utf8Info.setValue(value);
+ return utf8Info;
+ }
+
+ private ConstantInfo parseClassInfo(ByteCodeIterator iter) {
+ ClassInfo classInfo = new ClassInfo(constantPool);
+ classInfo.setUtf8Index(iter.next2BytesToInt());
+ return classInfo;
+ }
+
+ private ConstantInfo parseStringInfo(ByteCodeIterator iter) {
+ StringInfo stringInfo = new StringInfo(constantPool);
+ stringInfo.setIndex(iter.next2BytesToInt());
+ return stringInfo;
+ }
+
+ private ConstantInfo parseFieldInfo(ByteCodeIterator iter) {
+ FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool);
+ fieldRefInfo.setClassInfoIndex(iter.next2BytesToInt());
+ fieldRefInfo.setNameAndTypeIndex(iter.next2BytesToInt());
+ return fieldRefInfo;
+ }
+
+ private ConstantInfo parseMethodInfo(ByteCodeIterator iter) {
+ MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool);
+ methodRefInfo.setClassInfoIndex(iter.next2BytesToInt());
+ methodRefInfo.setNameAndTypeIndex(iter.next2BytesToInt());
+ return methodRefInfo;
+ }
+
+ private ConstantInfo parseNameAndTypeInfo(ByteCodeIterator iter) {
+ NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool);
+ nameAndTypeInfo.setIndex1(iter.next2BytesToInt());
+ nameAndTypeInfo.setIndex2(iter.next2BytesToInt());
+ return nameAndTypeInfo;
+ }
+
+
+}
diff --git a/group17/1264835468/src/assignment0326/jvm/test/ClassFileLoaderTest.java b/group17/1264835468/src/assignment0326/jvm/test/ClassFileLoaderTest.java
index 5ebb4075a6..3b507732bb 100644
--- a/group17/1264835468/src/assignment0326/jvm/test/ClassFileLoaderTest.java
+++ b/group17/1264835468/src/assignment0326/jvm/test/ClassFileLoaderTest.java
@@ -4,6 +4,9 @@
* Created by Administrator on 2017/3/30.
*/
+import assignment0326.jvm.clz.ClassFile;
+import assignment0326.jvm.clz.ClassIndex;
+import assignment0326.jvm.constant.*;
import assignment0326.jvm.loader.ClassFileLoader;
import org.junit.After;
import org.junit.Assert;
@@ -11,16 +14,23 @@
import org.junit.Test;
-
-
-
public class ClassFileLoaderTest {
+ private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1";
static String path1 = "D:\\GitHub\\group17\\1264835468\\bin";
static String path2 = "C:\\Temp";
+ static ClassFile clzFile = null;
+ static {
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+ String className = "com.coderising.jvm.test.EmployeeV1";
+
+ clzFile = loader.loadClass(className);
+ //clzFile.print();
+ }
@Before
public void setUp() throws Exception {
@@ -31,7 +41,7 @@ public void tearDown() throws Exception {
}
@Test
- public void testClassPath(){
+ public void testClassPath() {
ClassFileLoader loader = new ClassFileLoader();
loader.addClassPath(path1);
@@ -39,7 +49,7 @@ public void testClassPath(){
String clzPath = loader.getClassPath();
- Assert.assertEquals(path1+";"+path2,clzPath);
+ Assert.assertEquals(path1 + ";" + path2, clzPath);
}
@@ -60,12 +70,12 @@ public void testClassFileLength() {
@Test
- public void testMagicNumber(){
+ public void testMagicNumber() {
ClassFileLoader loader = new ClassFileLoader();
loader.addClassPath(path1);
String className = "assignment0326.jvm.test.EmployeeV1";
byte[] byteCodes = loader.readBinaryCode(className);
- byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
+ byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]};
String acctualValue = this.byteToHexString(codes);
@@ -74,17 +84,13 @@ public void testMagicNumber(){
}
-
-
-
-
- private String byteToHexString(byte[] codes ){
+ private String byteToHexString(byte[] codes) {
StringBuffer buffer = new StringBuffer();
- for(int i=0;i", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(10);
+ Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(11);
+ Assert.assertEquals("Code", utf8Info.getValue());
+ }
+
+ {
+ MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(12);
+ Assert.assertEquals(3, methodRef.getClassInfoIndex());
+ Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+ Assert.assertEquals(9, nameAndType.getIndex1());
+ Assert.assertEquals(14, nameAndType.getIndex2());
+ }
+ //抽查几个吧
+ {
+ MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(45);
+ Assert.assertEquals(1, methodRef.getClassInfoIndex());
+ Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+ Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+ }
+ }
+
+ @Test
+ public void testClassIndex() {
+
+ ClassIndex clzIndex = clzFile.getClzIndex();
+ ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+ ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+
+
+ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+ }
+
+
}
\ No newline at end of file
diff --git a/group17/1264835468/src/assignment0326/jvm/util/Util.java b/group17/1264835468/src/assignment0326/jvm/util/Util.java
new file mode 100644
index 0000000000..5855550bf8
--- /dev/null
+++ b/group17/1264835468/src/assignment0326/jvm/util/Util.java
@@ -0,0 +1,24 @@
+package assignment0326.jvm.util;
+
+public class Util {
+ public static int byteToInt(byte[] codes){
+ String s1 = byteToHexString(codes);
+ return Integer.valueOf(s1, 16).intValue();
+ }
+
+
+
+ public static String byteToHexString(byte[] codes ){
+ StringBuffer buffer = new StringBuffer();
+ for(int i=0;i strings=new ArrayList<>();
- for (int i = 0; i <10; i++) {
- strings.add(String.valueOf(new Random().nextInt(3000)));
- }
- System.out.println(strings);
- System.out.println(strings.stream().map(s-> s.charAt(0)).sorted().distinct().limit(5).collect(Collectors.toList()));
- }
-
- public int findMinDifference(List timePoints) {
- List list=new ArrayList<>();
-
- for (String s:timePoints) {
- list.add(parse(s));
- }
- Collections.sort(list);
- int min=Integer.MAX_VALUE;
- for (int i = 0; i < list.size()-1; i++) {
- min=Math.min(min,Math.min(Math.abs(list.get(i+1)-list.get(i)),24*60-Math.abs(list.get(i+1)-list.get(i))));
- }
- return min;
- }
-
- private Integer parse(String s) {
- return Integer.parseInt(s.substring(0, 2)) * 60 + Integer.parseInt(s.substring(3, 5));
- }
-}
diff --git a/group17/1264835468/src/assignment0405/StackUtil.java b/group17/1264835468/src/assignment0405/StackUtil.java
new file mode 100644
index 0000000000..469a13f9a9
--- /dev/null
+++ b/group17/1264835468/src/assignment0405/StackUtil.java
@@ -0,0 +1,104 @@
+package assignment0405;
+
+import assignment.Stack;
+
+/**
+ * Created by Administrator on 2017/4/6.
+ */
+public class StackUtil {
+
+
+ /**
+ * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5
+ * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ */
+ public static void reverse(Stack s) {
+ Stack stack1 = new Stack();
+ Stack stack2 = new Stack();
+ popAllToAnotherStack(s, stack1);
+ popAllToAnotherStack(stack1, stack2);
+ popAllToAnotherStack(stack2, s);
+ }
+
+ private static void popAllToAnotherStack(Stack s, Stack another) {
+ while (!s.isEmpty()) {
+ another.push(s.pop());
+ }
+ }
+
+ /**
+ * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ *
+ * @param o
+ */
+ public static void remove(Stack s, Object o) {
+ Stack stack2 = new Stack();
+ while (!s.isEmpty()) {
+ Object top = s.pop();
+ if (!top.equals(o)) {
+ stack2.push(top);
+ }
+ }
+ popAllToAnotherStack(stack2, s);
+ }
+
+ /**
+ * 从栈顶取得len个元素, 原来的栈中元素保持不变
+ * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ *
+ * @param len
+ * @return
+ */
+ public static Object[] getTop(Stack s, int len) {
+ if(len>s.size())
+ throw new RuntimeException("Stack size:" + s.size() + " < " + len);
+ Object[] objects = new Object[len];
+ for (int i = 0; i < len; i++) {
+ objects[i] = s.pop();
+ }
+ for (int i = len - 1; i >= 0; i--) {
+ s.push(objects[i]);
+ }
+ return objects;
+ }
+
+ /**
+ * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz
+ * 使用堆栈检查字符串s中的括号是不是成对出现的。
+ * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true
+ * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false;
+ *
+ * @param s
+ * @return
+ */
+ public static boolean isValidPairs(String s) {
+ Stack stack = new Stack<>();
+
+ for (char c : s.toCharArray()) {
+ if (isLeft(c)) {
+ stack.push(c);
+ continue;
+ }
+ if (isRight(c)) {
+ if (stack.isEmpty() || !match(stack.pop(), c)) {
+ return false;
+ }
+ }
+ }
+ return stack.isEmpty();
+ }
+
+ private static boolean isLeft(char c) {
+ return c == '[' || c == '(' || c == '{';
+ }
+
+ private static boolean isRight(char c) {
+ return c == ']' || c == ')' || c == '}';
+ }
+
+ private static boolean match(char c1, char c2) {
+ return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}');
+ }
+
+
+}
diff --git a/group17/1264835468/src/assignment0405/StackUtilTest.java b/group17/1264835468/src/assignment0405/StackUtilTest.java
new file mode 100644
index 0000000000..58be1302f6
--- /dev/null
+++ b/group17/1264835468/src/assignment0405/StackUtilTest.java
@@ -0,0 +1,61 @@
+package assignment0405;
+
+import assignment.Stack;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Created by Administrator on 2017/4/9.
+ */
+public class StackUtilTest {
+ @Test
+ public void reverse() throws Exception {
+ Stack stack = new Stack();
+ pushAll(stack, 1, 2, 3, 4);
+ Assert.assertEquals("4, 3, 2, 1", stack.toString());
+ StackUtil.reverse(stack);
+ Assert.assertEquals("1, 2, 3, 4", stack.toString());
+ StackUtil.reverse(stack);
+ Assert.assertEquals("4, 3, 2, 1", stack.toString());
+ }
+
+
+ @Test
+ public void remove() throws Exception {
+ Stack stack = new Stack();
+ pushAll(stack, 0, 1, 2, 3);
+ StackUtil.remove(stack, 1);
+ Assert.assertEquals("3, 2, 0", stack.toString());
+ pushAll(stack, 4, 5, 6, 5);
+ Assert.assertEquals("5, 6, 5, 4, 3, 2, 0", stack.toString());
+ StackUtil.remove(stack, 5);
+ Assert.assertEquals("6, 4, 3, 2, 0", stack.toString());
+
+ }
+
+ @Test(expected = RuntimeException.class)
+ public void getTop() throws Exception {
+ Stack stack = new Stack();
+ pushAll(stack, 1, 2, 3, 4, 5);
+ Assert.assertArrayEquals(new Object[]{5, 4, 3}, StackUtil.getTop(stack, 3));
+ Assert.assertArrayEquals(new Object[]{5}, StackUtil.getTop(stack, 1));
+ Assert.assertArrayEquals(new Object[]{5, 4, 3, 2, 1}, StackUtil.getTop(stack, 5));
+ //异常
+ StackUtil.getTop(stack, 6);
+ }
+
+ @Test
+ public void isValidPairs() throws Exception {
+ Assert.assertTrue(StackUtil.isValidPairs("()[]{}([])"));
+ Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+ Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+ Assert.assertFalse(StackUtil.isValidPairs("((a)[]{b(c)}"));
+ }
+
+ private void pushAll(Stack s, Object... objects) {
+ for (Object object : objects) {
+ s.push(object);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java b/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java
new file mode 100644
index 0000000000..8ba6ebd501
--- /dev/null
+++ b/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java
@@ -0,0 +1,28 @@
+package com.coderising.jvm.test;
+
+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();
+
+ }
+}
\ No newline at end of file
From e93808e860d874b3281784886ec2d230f05813bb Mon Sep 17 00:00:00 2001
From: liuxianan// <1264835468@qq.com>
Date: Mon, 10 Apr 2017 14:55:02 +0800
Subject: [PATCH 006/151] =?UTF-8?q?jvm=E5=B8=B8=E9=87=8F=E6=B1=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../jvm/loader/ByteCodeIterator.java | 28 ++-
.../jvm/loader/ClassFileLoader.java | 65 +++--
.../jvm/loader/ClassFileParser.java | 229 +++++++++---------
.../src/assignment0405/StackUtil.java | 6 +-
4 files changed, 173 insertions(+), 155 deletions(-)
diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java
index e9b9fdaf2e..09d87c13b6 100644
--- a/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java
+++ b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java
@@ -5,30 +5,38 @@ public class ByteCodeIterator {
byte[] bytes;
public ByteCodeIterator(byte[] bytes) {
- curPos=0;
+ curPos = 0;
this.bytes = bytes;
}
- public byte nextByte(){
+ public boolean hasNext() {
+ return !(curPos >= bytes.length);
+ }
+
+ public byte nextByte() {
return bytes[curPos++];
}
- public int nextByteToInt(){
+
+ public int nextByteToInt() {
return Byte.toUnsignedInt(nextByte());
}
- public int next2BytesToInt(){
- int hi=Byte.toUnsignedInt(nextByte());
+
+ public int next2BytesToInt() {
+ int hi = Byte.toUnsignedInt(nextByte());
int lo = Byte.toUnsignedInt(nextByte());
- int i=hi<<8|lo;
+ int i = hi << 8 | lo;
return i;
}
- public byte[] nextNBytes(int n){
+
+ public byte[] nextNBytes(int n) {
byte[] bytes = new byte[n];
for (int i = 0; i < n; i++) {
- bytes[i]=nextByte();
+ bytes[i] = nextByte();
}
return bytes;
}
- public void skip(int n){
- curPos+=n;
+
+ public void skip(int n) {
+ curPos += n;
}
}
diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java
index 4aaf67a2d1..3b05a1f761 100644
--- a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java
+++ b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java
@@ -17,47 +17,46 @@
public class ClassFileLoader {
- private List clzPaths = new ArrayList();
-
- public byte[] readBinaryCode(String className) {
- String path = className.replace(".", File.separator);
- File classFile=null;
- for (String p: clzPaths) {
- classFile=new File(p+File.separator+path+".class");
- if(classFile.exists())
- break;
- }
- if(classFile==null)
- throw new RuntimeException("no such class file");
-
- byte[] bytes=new byte[(int)classFile.length()];
- try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(classFile))){
- bufferedInputStream.read(bytes, 0, bytes.length);
-
- } catch (IOException e) {
- e.printStackTrace();
- }
- return bytes;
+ private List clzPaths = new ArrayList<>();
+
+ public byte[] readBinaryCode(String className) {
+ String path = className.replace(".", File.separator);
+ File classFile = null;
+ for (String p : clzPaths) {
+ classFile = new File(p + File.separator + path + ".class");
+ if (classFile.exists())
+ break;
}
+ if (classFile == null)
+ throw new RuntimeException("no such class file");
+ byte[] bytes = new byte[(int) classFile.length()];
+ try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(classFile))) {
+ bufferedInputStream.read(bytes, 0, bytes.length);
- public void addClassPath(String path) {
- if(this.clzPaths.contains(path)){
- return;
- }
- clzPaths.add(path);
+ } catch (IOException e) {
+ e.printStackTrace();
}
+ return bytes;
+ }
+ public void addClassPath(String path) {
+ if (this.clzPaths.contains(path)) {
+ return;
+ }
+ clzPaths.add(path);
+ }
+
- public String getClassPath(){
- StringBuilder stringBuilder=new StringBuilder();
- for (int i = 0; i s.size())
+ if (len > s.size())
throw new RuntimeException("Stack size:" + s.size() + " < " + len);
Object[] objects = new Object[len];
for (int i = 0; i < len; i++) {
@@ -96,8 +96,8 @@ private static boolean isRight(char c) {
return c == ']' || c == ')' || c == '}';
}
- private static boolean match(char c1, char c2) {
- return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}');
+ private static boolean match(char left, char right) {
+ return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}');
}
From cae45cdc6480ce170cd0ddb5560ad6b2503614a7 Mon Sep 17 00:00:00 2001
From: zhanglei <383117348@qq.com>
Date: Mon, 10 Apr 2017 15:10:09 +0800
Subject: [PATCH 007/151] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BD=9C=E4=B8=9A?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E7=BB=93=E6=9E=84=E5=B9=B6=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E7=AC=AC=E5=85=AD=E6=AC=A1=E4=BD=9C=E4=B8=9A=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
group27/383117348/.classpath | 3 +-
.../coderising/download/DownloadThread.java | 0
.../coderising/download/FileDownloader.java | 0
.../download/FileDownloaderTest.java | 0
.../coderising/download/api/Connection.java | 0
.../download/api/ConnectionException.java | 0
.../download/api/ConnectionManager.java | 0
.../download/api/DownloadListener.java | 0
.../download/impl/ConnectionImpl.java | 0
.../download/impl/ConnectionManagerImpl.java | 0
.../coderising/litestruts/LoginAction.java | 0
.../com/coderising/litestruts/Struts.java | 0
.../com/coderising/litestruts/StrutsTest.java | 0
.../com/coderising/litestruts/View.java | 0
.../com/coderising/litestruts/struts.xml | 0
.../com/coding/basic/BinaryTreeNode.java | 0
.../com/coding/basic/Iterator.java | 0
.../com/coding/basic/List.java | 0
.../com/coding/basic/Queue.java | 0
.../com/coding/basic/array/ArrayList.java | 0
.../com/coding/basic/array/ArrayUtil.java | 0
.../coding/basic/linklist/LRUPageFrame.java | 0
.../basic/linklist/LRUPageFrameTest.java | 0
.../com/coding/basic/linklist/LinkedList.java | 0
.../com/coding/basic/stack/Stack.java | 0
.../com/coding/basic/stack/StackUtil.java | 0
.../coding/basic/stack/expr/InfixExpr.java | 15 ++++
.../basic/stack/expr/InfixExprTest.java | 46 ++++++++++++
.../basic/stack/test/StackUtilTest.java | 0
.../coderising/jvm/attr/AttributeInfo.java | 17 +++++
.../com/coderising/jvm/attr/CodeAttr.java | 49 ++++++++++++
.../coderising/jvm/attr/LineNumberTable.java | 46 ++++++++++++
.../jvm/attr/LocalVariableItem.java | 39 ++++++++++
.../jvm/attr/LocalVariableTable.java | 25 +++++++
.../coderising/jvm/attr/StackMapTable.java | 29 ++++++++
.../com/coderising/jvm/clz/AccessFlag.java | 0
.../com/coderising/jvm/clz/ClassFile.java | 24 ++++--
.../com/coderising/jvm/clz/ClassIndex.java | 0
.../coderising/jvm/constant/ClassInfo.java | 0
.../coderising/jvm/constant/ConstantInfo.java | 0
.../coderising/jvm/constant/ConstantPool.java | 0
.../coderising/jvm/constant/FieldRefInfo.java | 0
.../coderising/jvm/constant/FloatInfo.java | 0
.../coderising/jvm/constant/IntegerInfo.java | 0
.../jvm/constant/MethodRefInfo.java | 0
.../jvm/constant/NameAndTypeInfo.java | 0
.../jvm/constant/NullConstantInfo.java | 0
.../coderising/jvm/constant/StringInfo.java | 0
.../com/coderising/jvm/constant/UTF8Info.java | 0
.../com/coderising/jvm/field/Field.java | 31 ++++++++
.../jvm/loader/ByteCodeIterator.java | 14 ++++
.../jvm/loader/ClassFileLoader.java | 0
.../jvm/loader/ClassFileLoader_backup.java | 0
.../jvm/loader/ClassFileParser.java | 14 ++++
.../com/coderising/jvm/method/Method.java | 52 +++++++++++++
.../jvm/test/ClassFileloaderTest.java | 74 +++++++++++++++++++
.../com/coderising/jvm/test/EmployeeV1.java | 0
.../com/coderising/jvm/util/Util.java | 0
58 files changed, 472 insertions(+), 6 deletions(-)
rename group27/383117348/{src => data-structure}/com/coderising/download/DownloadThread.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/download/FileDownloader.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/download/FileDownloaderTest.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/download/api/Connection.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/download/api/ConnectionException.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/download/api/ConnectionManager.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/download/api/DownloadListener.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/download/impl/ConnectionImpl.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/download/impl/ConnectionManagerImpl.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/litestruts/LoginAction.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/litestruts/Struts.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/litestruts/StrutsTest.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/litestruts/View.java (100%)
rename group27/383117348/{src => data-structure}/com/coderising/litestruts/struts.xml (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/BinaryTreeNode.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/Iterator.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/List.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/Queue.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/array/ArrayList.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/array/ArrayUtil.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/linklist/LRUPageFrame.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/linklist/LRUPageFrameTest.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/linklist/LinkedList.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/stack/Stack.java (100%)
rename group27/383117348/{src => data-structure}/com/coding/basic/stack/StackUtil.java (100%)
create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java
create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java
rename group27/383117348/{src => data-structure}/com/coding/basic/stack/test/StackUtilTest.java (100%)
create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java
create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java
create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java
create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java
create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java
create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/clz/AccessFlag.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/clz/ClassFile.java (74%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/clz/ClassIndex.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/ClassInfo.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/ConstantInfo.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/ConstantPool.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/FieldRefInfo.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/FloatInfo.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/IntegerInfo.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/MethodRefInfo.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/NameAndTypeInfo.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/NullConstantInfo.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/StringInfo.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/UTF8Info.java (100%)
create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ByteCodeIterator.java (76%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ClassFileLoader.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ClassFileLoader_backup.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ClassFileParser.java (92%)
create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/test/ClassFileloaderTest.java (71%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/test/EmployeeV1.java (100%)
rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/util/Util.java (100%)
diff --git a/group27/383117348/.classpath b/group27/383117348/.classpath
index a96bb3c428..58f336f5a2 100644
--- a/group27/383117348/.classpath
+++ b/group27/383117348/.classpath
@@ -1,7 +1,8 @@
-
+
+
diff --git a/group27/383117348/src/com/coderising/download/DownloadThread.java b/group27/383117348/data-structure/com/coderising/download/DownloadThread.java
similarity index 100%
rename from group27/383117348/src/com/coderising/download/DownloadThread.java
rename to group27/383117348/data-structure/com/coderising/download/DownloadThread.java
diff --git a/group27/383117348/src/com/coderising/download/FileDownloader.java b/group27/383117348/data-structure/com/coderising/download/FileDownloader.java
similarity index 100%
rename from group27/383117348/src/com/coderising/download/FileDownloader.java
rename to group27/383117348/data-structure/com/coderising/download/FileDownloader.java
diff --git a/group27/383117348/src/com/coderising/download/FileDownloaderTest.java b/group27/383117348/data-structure/com/coderising/download/FileDownloaderTest.java
similarity index 100%
rename from group27/383117348/src/com/coderising/download/FileDownloaderTest.java
rename to group27/383117348/data-structure/com/coderising/download/FileDownloaderTest.java
diff --git a/group27/383117348/src/com/coderising/download/api/Connection.java b/group27/383117348/data-structure/com/coderising/download/api/Connection.java
similarity index 100%
rename from group27/383117348/src/com/coderising/download/api/Connection.java
rename to group27/383117348/data-structure/com/coderising/download/api/Connection.java
diff --git a/group27/383117348/src/com/coderising/download/api/ConnectionException.java b/group27/383117348/data-structure/com/coderising/download/api/ConnectionException.java
similarity index 100%
rename from group27/383117348/src/com/coderising/download/api/ConnectionException.java
rename to group27/383117348/data-structure/com/coderising/download/api/ConnectionException.java
diff --git a/group27/383117348/src/com/coderising/download/api/ConnectionManager.java b/group27/383117348/data-structure/com/coderising/download/api/ConnectionManager.java
similarity index 100%
rename from group27/383117348/src/com/coderising/download/api/ConnectionManager.java
rename to group27/383117348/data-structure/com/coderising/download/api/ConnectionManager.java
diff --git a/group27/383117348/src/com/coderising/download/api/DownloadListener.java b/group27/383117348/data-structure/com/coderising/download/api/DownloadListener.java
similarity index 100%
rename from group27/383117348/src/com/coderising/download/api/DownloadListener.java
rename to group27/383117348/data-structure/com/coderising/download/api/DownloadListener.java
diff --git a/group27/383117348/src/com/coderising/download/impl/ConnectionImpl.java b/group27/383117348/data-structure/com/coderising/download/impl/ConnectionImpl.java
similarity index 100%
rename from group27/383117348/src/com/coderising/download/impl/ConnectionImpl.java
rename to group27/383117348/data-structure/com/coderising/download/impl/ConnectionImpl.java
diff --git a/group27/383117348/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group27/383117348/data-structure/com/coderising/download/impl/ConnectionManagerImpl.java
similarity index 100%
rename from group27/383117348/src/com/coderising/download/impl/ConnectionManagerImpl.java
rename to group27/383117348/data-structure/com/coderising/download/impl/ConnectionManagerImpl.java
diff --git a/group27/383117348/src/com/coderising/litestruts/LoginAction.java b/group27/383117348/data-structure/com/coderising/litestruts/LoginAction.java
similarity index 100%
rename from group27/383117348/src/com/coderising/litestruts/LoginAction.java
rename to group27/383117348/data-structure/com/coderising/litestruts/LoginAction.java
diff --git a/group27/383117348/src/com/coderising/litestruts/Struts.java b/group27/383117348/data-structure/com/coderising/litestruts/Struts.java
similarity index 100%
rename from group27/383117348/src/com/coderising/litestruts/Struts.java
rename to group27/383117348/data-structure/com/coderising/litestruts/Struts.java
diff --git a/group27/383117348/src/com/coderising/litestruts/StrutsTest.java b/group27/383117348/data-structure/com/coderising/litestruts/StrutsTest.java
similarity index 100%
rename from group27/383117348/src/com/coderising/litestruts/StrutsTest.java
rename to group27/383117348/data-structure/com/coderising/litestruts/StrutsTest.java
diff --git a/group27/383117348/src/com/coderising/litestruts/View.java b/group27/383117348/data-structure/com/coderising/litestruts/View.java
similarity index 100%
rename from group27/383117348/src/com/coderising/litestruts/View.java
rename to group27/383117348/data-structure/com/coderising/litestruts/View.java
diff --git a/group27/383117348/src/com/coderising/litestruts/struts.xml b/group27/383117348/data-structure/com/coderising/litestruts/struts.xml
similarity index 100%
rename from group27/383117348/src/com/coderising/litestruts/struts.xml
rename to group27/383117348/data-structure/com/coderising/litestruts/struts.xml
diff --git a/group27/383117348/src/com/coding/basic/BinaryTreeNode.java b/group27/383117348/data-structure/com/coding/basic/BinaryTreeNode.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/BinaryTreeNode.java
rename to group27/383117348/data-structure/com/coding/basic/BinaryTreeNode.java
diff --git a/group27/383117348/src/com/coding/basic/Iterator.java b/group27/383117348/data-structure/com/coding/basic/Iterator.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/Iterator.java
rename to group27/383117348/data-structure/com/coding/basic/Iterator.java
diff --git a/group27/383117348/src/com/coding/basic/List.java b/group27/383117348/data-structure/com/coding/basic/List.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/List.java
rename to group27/383117348/data-structure/com/coding/basic/List.java
diff --git a/group27/383117348/src/com/coding/basic/Queue.java b/group27/383117348/data-structure/com/coding/basic/Queue.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/Queue.java
rename to group27/383117348/data-structure/com/coding/basic/Queue.java
diff --git a/group27/383117348/src/com/coding/basic/array/ArrayList.java b/group27/383117348/data-structure/com/coding/basic/array/ArrayList.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/array/ArrayList.java
rename to group27/383117348/data-structure/com/coding/basic/array/ArrayList.java
diff --git a/group27/383117348/src/com/coding/basic/array/ArrayUtil.java b/group27/383117348/data-structure/com/coding/basic/array/ArrayUtil.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/array/ArrayUtil.java
rename to group27/383117348/data-structure/com/coding/basic/array/ArrayUtil.java
diff --git a/group27/383117348/src/com/coding/basic/linklist/LRUPageFrame.java b/group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrame.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/linklist/LRUPageFrame.java
rename to group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrame.java
diff --git a/group27/383117348/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrameTest.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/linklist/LRUPageFrameTest.java
rename to group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrameTest.java
diff --git a/group27/383117348/src/com/coding/basic/linklist/LinkedList.java b/group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/linklist/LinkedList.java
rename to group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java
diff --git a/group27/383117348/src/com/coding/basic/stack/Stack.java b/group27/383117348/data-structure/com/coding/basic/stack/Stack.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/stack/Stack.java
rename to group27/383117348/data-structure/com/coding/basic/stack/Stack.java
diff --git a/group27/383117348/src/com/coding/basic/stack/StackUtil.java b/group27/383117348/data-structure/com/coding/basic/stack/StackUtil.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/stack/StackUtil.java
rename to group27/383117348/data-structure/com/coding/basic/stack/StackUtil.java
diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 0000000000..cc084db36d
--- /dev/null
+++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,15 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+ String expr = null;
+
+ public InfixExpr(String expr) {
+ this.expr = expr;
+ }
+
+ public float evaluate() {
+
+ return 0.0f;
+ }
+
+}
diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 0000000000..e2de427e62
--- /dev/null
+++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,46 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class InfixExprTest {
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testEvaluate() {
+ //InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+ {
+ InfixExpr expr = new InfixExpr("2+3*4+5");
+ Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+ }
+ {
+ InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+ Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+ }
+
+ {
+ InfixExpr expr = new InfixExpr("3*20/2");
+ Assert.assertEquals(30, expr.evaluate(), 0.001f);
+ }
+
+ {
+ InfixExpr expr = new InfixExpr("20/2*3");
+ Assert.assertEquals(30, expr.evaluate(), 0.001f);
+ }
+
+ {
+ InfixExpr expr = new InfixExpr("10-30+50");
+ Assert.assertEquals(30, expr.evaluate(), 0.001f);
+ }
+
+ }
+
+}
diff --git a/group27/383117348/src/com/coding/basic/stack/test/StackUtilTest.java b/group27/383117348/data-structure/com/coding/basic/stack/test/StackUtilTest.java
similarity index 100%
rename from group27/383117348/src/com/coding/basic/stack/test/StackUtilTest.java
rename to group27/383117348/data-structure/com/coding/basic/stack/test/StackUtilTest.java
diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java
new file mode 100644
index 0000000000..85156946eb
--- /dev/null
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java
@@ -0,0 +1,17 @@
+package com.coderising.jvm.attr;
+
+public 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;
+ }
+}
diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java
new file mode 100644
index 0000000000..63f4503244
--- /dev/null
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java
@@ -0,0 +1,49 @@
+package com.coderising.jvm.attr;
+
+import com.coderising.jvm.clz.ClassFile;
+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){
+
+
+ return null;
+ }
+ private void setStackMapTable(StackMapTable t) {
+ this.stackMapTable = t;
+
+ }
+}
diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java
new file mode 100644
index 0000000000..0e072f6d66
--- /dev/null
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java
@@ -0,0 +1,46 @@
+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 items = new ArrayList();
+
+ 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) {
+
+ return null;
+ }
+
+}
diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java
new file mode 100644
index 0000000000..3eb2654e36
--- /dev/null
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java
@@ -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;
+ }
+}
diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java
new file mode 100644
index 0000000000..e69728e6aa
--- /dev/null
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java
@@ -0,0 +1,25 @@
+package com.coderising.jvm.attr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class LocalVariableTable extends AttributeInfo{
+
+ List items = new ArrayList();
+
+ public LocalVariableTable(int attrNameIndex, int attrLen) {
+ super(attrNameIndex, attrLen);
+ }
+
+ public static LocalVariableTable parse(ByteCodeIterator iter){
+
+ return null;
+ }
+ private void addLocalVariableItem(LocalVariableItem item) {
+ this.items.add(item);
+ }
+
+
+}
diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java
new file mode 100644
index 0000000000..70387e2bb2
--- /dev/null
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java
@@ -0,0 +1,29 @@
+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.nextU2Int();
+ int len = iter.nextU4Integer();
+ 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;
+
+ }
+}
diff --git a/group27/383117348/src/com/coderising/jvm/clz/AccessFlag.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/AccessFlag.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/clz/AccessFlag.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/clz/AccessFlag.java
diff --git a/group27/383117348/src/com/coderising/jvm/clz/ClassFile.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java
similarity index 74%
rename from group27/383117348/src/com/coderising/jvm/clz/ClassFile.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java
index 1b5a8b95a6..9827aa2937 100644
--- a/group27/383117348/src/com/coderising/jvm/clz/ClassFile.java
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java
@@ -1,7 +1,12 @@
package com.coderising.jvm.clz;
+import java.util.ArrayList;
+import java.util.List;
+
import com.coderising.jvm.constant.ClassInfo;
import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.field.Field;
+import com.coderising.jvm.method.Method;
public class ClassFile {
@@ -11,7 +16,8 @@ public class ClassFile {
private AccessFlag accessFlag;
private ClassIndex clzIndex;
private ConstantPool pool;
-
+ private List fields = new ArrayList();
+ private List methods = new ArrayList();
public ClassIndex getClzIndex() {
return clzIndex;
@@ -22,9 +28,6 @@ public AccessFlag getAccessFlag() {
public void setAccessFlag(AccessFlag accessFlag) {
this.accessFlag = accessFlag;
}
-
-
-
public ConstantPool getConstantPool() {
return pool;
}
@@ -48,7 +51,18 @@ public void setClassIndex(ClassIndex clzIndex) {
this.clzIndex = clzIndex;
}
-
+ public void addField(Field f){
+ this.fields.add(f);
+ }
+ public List getFields(){
+ return this.fields;
+ }
+ public void addMethod(Method m){
+ this.methods.add(m);
+ }
+ public List getMethods() {
+ return methods;
+ }
public void print(){
diff --git a/group27/383117348/src/com/coderising/jvm/clz/ClassIndex.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassIndex.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/clz/ClassIndex.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassIndex.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/ClassInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/ClassInfo.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/ConstantInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/ConstantInfo.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/ConstantPool.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/ConstantPool.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/FieldRefInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/FieldRefInfo.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/FloatInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/FloatInfo.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/IntegerInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/IntegerInfo.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/MethodRefInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/MethodRefInfo.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/NameAndTypeInfo.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/NullConstantInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/NullConstantInfo.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/StringInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/StringInfo.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java
diff --git a/group27/383117348/src/com/coderising/jvm/constant/UTF8Info.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/constant/UTF8Info.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java
diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java
new file mode 100644
index 0000000000..17e3b77754
--- /dev/null
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java
@@ -0,0 +1,31 @@
+package com.coderising.jvm.field;
+
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class Field {
+ private int accessFlag;
+ private int nameIndex;
+ private int descriptorIndex;
+
+
+
+ private ConstantPool pool;
+
+ public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) {
+
+ this.accessFlag = accessFlag;
+ this.nameIndex = nameIndex;
+ this.descriptorIndex = descriptorIndex;
+ this.pool = pool;
+ }
+
+
+
+
+ public static Field parse(ConstantPool pool,ByteCodeIterator iter){
+
+ return null;
+ }
+
+}
diff --git a/group27/383117348/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java
similarity index 76%
rename from group27/383117348/src/com/coderising/jvm/loader/ByteCodeIterator.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java
index 2688ae5810..3a3e4dd7b9 100644
--- a/group27/383117348/src/com/coderising/jvm/loader/ByteCodeIterator.java
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java
@@ -48,4 +48,18 @@ private byte[] getByteBySize(int size){
}
return by;
}
+
+ public String nextUxToHexString(int len) {
+ byte[] tmp = new byte[len];
+
+ for (int i = 0; i < len; i++) {
+ tmp[i] = code[pos++];
+ }
+ return Util.byteToHexString(tmp).toLowerCase();
+
+ }
+
+ public void back(int n) {
+ this.pos -= n;
+ }
}
diff --git a/group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java
diff --git a/group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader_backup.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader_backup.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader_backup.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader_backup.java
diff --git a/group27/383117348/src/com/coderising/jvm/loader/ClassFileParser.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java
similarity index 92%
rename from group27/383117348/src/com/coderising/jvm/loader/ClassFileParser.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java
index 209ee78d36..8a42fe4cb4 100644
--- a/group27/383117348/src/com/coderising/jvm/loader/ClassFileParser.java
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java
@@ -26,6 +26,7 @@ public ClassFile parse(byte[] codes) {
if(!magicNum.equals("cafebabe")){
throw new RuntimeException("文件类型错误");
}
+ ByteCodeIterator iter = new ByteCodeIterator(codes);
int minVersion = by.nextU2Int();
int majorVersion = by.nextU2Int();
@@ -34,14 +35,20 @@ public ClassFile parse(byte[] codes) {
AccessFlag flag = parseAccessFlag(by);
ClassIndex index = parseClassIndex(by);
+ parseInterfaces(iter);
+
file.setMinorVersion(minVersion);
file.setMajorVersion(majorVersion);
file.setAccessFlag(flag);
file.setClassIndex(index);
file.setConstPool(constant);
+
+
return file;
}
+
+
private AccessFlag parseAccessFlag(ByteCodeIterator iter) {
AccessFlag flag = new AccessFlag(iter.nextU2Int());
return flag;
@@ -105,6 +112,13 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) {
}
return pool;
}
+
+ private void parseInterfaces(ByteCodeIterator iter) {
+ int interfaceCount = iter.nextU2Int();
+
+
+ }
+
}
diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java b/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java
new file mode 100644
index 0000000000..e46b5885ab
--- /dev/null
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java
@@ -0,0 +1,52 @@
+package com.coderising.jvm.method;
+
+import com.coderising.jvm.attr.CodeAttr;
+import com.coderising.jvm.clz.ClassFile;
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class Method {
+
+ private int accessFlag;
+ private int nameIndex;
+ private int descriptorIndex;
+
+ private CodeAttr codeAttr;
+
+ private ClassFile clzFile;
+
+
+ public ClassFile getClzFile() {
+ return clzFile;
+ }
+
+ public int getNameIndex() {
+ return nameIndex;
+ }
+ public int getDescriptorIndex() {
+ return descriptorIndex;
+ }
+
+ public CodeAttr getCodeAttr() {
+ return codeAttr;
+ }
+
+ public void setCodeAttr(CodeAttr code) {
+ this.codeAttr = code;
+ }
+
+ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) {
+ this.clzFile = clzFile;
+ this.accessFlag = accessFlag;
+ this.nameIndex = nameIndex;
+ this.descriptorIndex = descriptorIndex;
+ }
+
+
+
+
+
+ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){
+ return null;
+
+ }
+}
diff --git a/group27/383117348/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java
similarity index 71%
rename from group27/383117348/src/com/coderising/jvm/test/ClassFileloaderTest.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java
index ff026ee819..fa5e910f98 100644
--- a/group27/383117348/src/com/coderising/jvm/test/ClassFileloaderTest.java
+++ b/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java
@@ -1,5 +1,7 @@
package com.coderising.jvm.test;
+import java.util.List;
+
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -12,7 +14,9 @@
import com.coderising.jvm.constant.MethodRefInfo;
import com.coderising.jvm.constant.NameAndTypeInfo;
import com.coderising.jvm.constant.UTF8Info;
+import com.coderising.jvm.field.Field;
import com.coderising.jvm.loader.ClassFileLoader;
+import com.coderising.jvm.method.Method;
public class ClassFileloaderTest {
@@ -193,6 +197,76 @@ public void testClassIndex(){
Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
}
+ /**
+ * 下面是第三次JVM课应实现的测试用例
+ */
+ @Test
+ public void testReadFields(){
+ List fields = clzFile.getFields();
+ Assert.assertEquals(2, fields.size());
+ {
+ Field f = fields.get(0);
+ Assert.assertEquals("name:Ljava/lang/String;", f.toString());
+ }
+ {
+ Field f = fields.get(1);
+ Assert.assertEquals("age:I", f.toString());
+ }
+ }
+ @Test
+ public void testMethods(){
+
+ List methods = clzFile.getMethods();
+ ConstantPool pool = clzFile.getConstantPool();
+
+ {
+ Method m = methods.get(0);
+ assertMethodEquals(pool,m,
+ "",
+ "(Ljava/lang/String;I)V",
+ "2ab7000c2a2bb5000f2a1cb50011b1");
+
+ }
+ {
+ Method m = methods.get(1);
+ assertMethodEquals(pool,m,
+ "setName",
+ "(Ljava/lang/String;)V",
+ "2a2bb5000fb1");
+
+ }
+ {
+ Method m = methods.get(2);
+ assertMethodEquals(pool,m,
+ "setAge",
+ "(I)V",
+ "2a1bb50011b1");
+ }
+ {
+ Method m = methods.get(3);
+ assertMethodEquals(pool,m,
+ "sayHello",
+ "()V",
+ "b2001c1222b60024b1");
+
+ }
+ {
+ Method m = methods.get(4);
+ assertMethodEquals(pool,m,
+ "main",
+ "([Ljava/lang/String;)V",
+ "bb000159122b101db7002d4c2bb6002fb1");
+ }
+ }
+
+ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){
+ String methodName = pool.getUTF8String(m.getNameIndex());
+ String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
+ String code = m.getCodeAttr().getCode();
+ Assert.assertEquals(expectedName, methodName);
+ Assert.assertEquals(expectedDesc, methodDesc);
+ Assert.assertEquals(expectedCode, code);
+ }
}
diff --git a/group27/383117348/src/com/coderising/jvm/test/EmployeeV1.java b/group27/383117348/mini-jvm/com/coderising/jvm/test/EmployeeV1.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/test/EmployeeV1.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/test/EmployeeV1.java
diff --git a/group27/383117348/src/com/coderising/jvm/util/Util.java b/group27/383117348/mini-jvm/com/coderising/jvm/util/Util.java
similarity index 100%
rename from group27/383117348/src/com/coderising/jvm/util/Util.java
rename to group27/383117348/mini-jvm/com/coderising/jvm/util/Util.java
From 7adfa4e86575800dcaa83b5fb2239ed14e7ffbc5 Mon Sep 17 00:00:00 2001
From: Ren650119726 <102228177@qq.com>
Date: Mon, 10 Apr 2017 15:18:38 +0800
Subject: [PATCH 008/151] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?=
=?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/com/coding/basic/stack/Stack.java | 38 ++++++++--
.../src/com/coding/basic/stack/StackUtil.java | 73 ++++++++++++++++++-
.../com/coding/basic/stack/StackUtilTest.java | 44 +++++++++++
3 files changed, 146 insertions(+), 9 deletions(-)
create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java
diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java
index 1af8fbfb7a..42b6362e2f 100644
--- a/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java
+++ b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java
@@ -1,22 +1,48 @@
package com.coding.basic.stack;
+import java.util.EmptyStackException;
+
public class Stack {
- private ArrayList elementData = new ArrayList();
+ private ArrayList elementData;
+ private int elementCount;
- public void push(Object o){
+ public Stack() {
+ this.elementData = new ArrayList();
+ this.elementCount = 0;
+ }
+ public void push(Object o){
+ elementData.add(o);
+ elementCount++;
}
public Object pop(){
- return null;
+ Object object = elementData.remove(elementCount-1);
+ elementCount--;
+ return object;
}
public Object peek(){
- return null;
+ if(isEmpty()){
+ throw new EmptyStackException();
+ }
+ return elementData.get(elementCount-1);
}
public boolean isEmpty(){
- return false;
+ return elementCount==0;
}
public int size(){
- return -1;
+ return elementCount;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[");
+ for (int i = 0; i < elementData.size(); i++) {
+ sb.append(elementData.get(i)).append(",");
+ }
+ sb = sb.deleteCharAt(sb.length()-1);
+ sb.append("]");
+ return sb.toString();
}
}
\ No newline at end of file
diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java
index 2ecca1811c..5b8019e2b7 100644
--- a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java
+++ b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java
@@ -8,8 +8,22 @@ public class StackUtil {
* 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
*/
public static void reverse(Stack s) {
-
+ if(s.isEmpty()){
+ return ;
+ }
+ int temp1 = (int) s.pop();
+ reverse(s);
+ if(s.isEmpty()){
+ s.push(temp1);
+ return ;
+ }
+ int temp2 = (int) s.pop();
+ reverse(s);
+ s.push(temp1);
+ reverse(s);
+ s.push(temp2);
}
+
/**
* 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
@@ -17,7 +31,19 @@ public static void reverse(Stack s) {
* @param o
*/
public static void remove(Stack s,Object o) {
-
+ if(s.isEmpty()){
+ return ;
+ }
+ Stack stack = new Stack();
+ while(!s.isEmpty()){
+ Object pop = s.pop();
+ if(!pop.equals(o)){
+ stack.push(pop);
+ }
+ }
+ while(!stack.isEmpty()){
+ s.push(stack.pop());
+ }
}
/**
@@ -27,7 +53,19 @@ public static void remove(Stack s,Object o) {
* @return
*/
public static Object[] getTop(Stack s,int len) {
- return null;
+ int i = 0;
+ Stack stack = new Stack();
+ Object[] objects = new Object[len];
+ while(i < len){
+ Object o = s.pop();
+ stack.push(o);
+ objects[i] = o;
+ i++;
+ }
+ while(!stack.isEmpty()){
+ s.push(stack.pop());
+ }
+ return objects;
}
/**
* 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz
@@ -38,6 +76,35 @@ public static Object[] getTop(Stack s,int len) {
* @return
*/
public static boolean isValidPairs(String s){
+ Stack stack = new Stack();
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ switch (c) {
+ case '(':
+ case '[':
+ case '{':
+ stack.push(c);
+ break;
+ case ')':
+ if((char)stack.pop()!='('){
+ return false;
+ }
+ break;
+ case ']':
+ if((char)stack.pop()!='['){
+ return false;
+ }
+ break;
+ case '}':
+ if((char)stack.pop()!='{'){
+ return false;
+ }
+ break;
+ }
+ }
+ if(stack.isEmpty()){
+ return true;
+ }
return false;
}
diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..722dd25846
--- /dev/null
+++ b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,44 @@
+package com.coding.basic.stack;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class StackUtilTest {
+ Stack stack ;
+ {
+ stack = new Stack();
+ stack.push(1);
+ stack.push(2);
+ stack.push(3);
+ stack.push(4);
+ stack.push(5);
+ }
+ @Before
+ public void setUp() throws Exception {
+
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testReverse() {
+ StackUtil.reverse(stack);
+ Assert.assertEquals("[5,4,3,2,1]", stack.toString());
+ }
+ @Test
+ public void testRemove() {
+ StackUtil.remove(stack, 3);
+ Assert.assertEquals("[1,2,4,5]", stack.toString());
+ }
+ @Test
+ public void testGetTop(){
+ Assert.assertEquals(new Object[]{5,4}, StackUtil.getTop(stack, 2));
+ Assert.assertEquals("[1,2,3,4,5]", stack.toString());
+ }
+}
From 14b90bcd79c5479a0fd663dce1e14e66dc4f6714 Mon Sep 17 00:00:00 2001
From: mengxz <82427129@qq.com>
Date: Mon, 10 Apr 2017 18:52:40 +0800
Subject: [PATCH 009/151] homework of 17/4/5 first commit ,read constantpool
---
.../coderising/jvm/attr/AttributeInfo.java | 18 +++
.../com/coderising/jvm/attr/CodeAttr.java | 10 ++
.../com/coderising/jvm/clz/AccessFlag.java | 24 ++++
.../com/coderising/jvm/clz/ClassFile.java | 76 ++++++++++
.../com/coderising/jvm/clz/ClassIndex.java | 19 +++
.../coderising/jvm/constant/ClassInfo.java | 26 ++++
.../coderising/jvm/constant/ConstantInfo.java | 32 +++++
.../coderising/jvm/constant/ConstantPool.java | 29 ++++
.../coderising/jvm/constant/DoubleInfo.java | 10 ++
.../coderising/jvm/constant/FieldRefInfo.java | 52 +++++++
.../coderising/jvm/constant/FloatInfo.java | 10 ++
.../coderising/jvm/constant/IntegerInfo.java | 20 +++
.../com/coderising/jvm/constant/LongInfo.java | 10 ++
.../jvm/constant/MethodRefInfo.java | 52 +++++++
.../jvm/constant/NameAndTypeInfo.java | 43 ++++++
.../jvm/constant/NullConstantInfo.java | 10 ++
.../coderising/jvm/constant/StringInfo.java | 25 ++++
.../com/coderising/jvm/constant/UTF8Info.java | 31 +++++
.../java/com/coderising/jvm/field/Field.java | 51 +++++++
.../jvm/loader/ByteCodeIterator.java | 41 ++++++
.../jvm/loader/ClassFileLoader.java | 5 -
.../jvm/loader/ClassFileParser.java | 130 ++++++++++++++++++
.../com/coderising/jvm/method/Method.java | 27 ++++
.../java/com/coderising/jvm/util/Util.java | 21 +++
.../com/coding/basic/{ => stack}/Stack.java | 4 +-
.../com/coding/basic/stack/StackUtil.java | 47 +++++++
.../coding/basic/stack/expr/InfixExpr.java | 14 ++
.../com/coding/basic/stack/StackUtilTest.java | 65 +++++++++
.../basic/stack/expr/InfixExprTest.java | 35 +++++
29 files changed, 931 insertions(+), 6 deletions(-)
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java
rename group17/82427129/JavaUtil/src/main/java/com/coding/basic/{ => stack}/Stack.java (88%)
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java
create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java
create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java
new file mode 100644
index 0000000000..11e25039c3
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java
@@ -0,0 +1,18 @@
+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;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java
new file mode 100644
index 0000000000..bdf080d421
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java
@@ -0,0 +1,10 @@
+package com.coderising.jvm.attr;
+
+public class CodeAttr extends AttributeInfo{
+
+ public CodeAttr(int attrNameIndex, int attrLen) {
+ super(attrNameIndex, attrLen);
+ // TODO Auto-generated constructor stub
+ }
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java
new file mode 100644
index 0000000000..ee70c4305c
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java
@@ -0,0 +1,24 @@
+package com.coderising.jvm.clz;
+
+public class AccessFlag {
+ private int flagValue;
+
+ public AccessFlag(int value) {
+ this.flagValue = value;
+ }
+
+ public int getFlagValue() {
+ return flagValue;
+ }
+
+ public void setFlagValue(int flag) {
+ this.flagValue = flag;
+ }
+
+ public boolean isPublicClass(){
+ return (this.flagValue & 0x0001) != 0;
+ }
+ public boolean isFinalClass(){
+ return (this.flagValue & 0x0010) != 0;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java
new file mode 100644
index 0000000000..d1d3b4159d
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java
@@ -0,0 +1,76 @@
+package com.coderising.jvm.clz;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.field.Field;
+import com.coderising.jvm.method.Method;
+
+public class ClassFile {
+ private int minorVersion;
+ private int majorVersion;
+
+ private AccessFlag accessFlag;
+ private ClassIndex clzIndex;
+ private ConstantPool pool;
+ private List fields = new ArrayList();
+ private List methods = new ArrayList();
+
+ public int getMinorVersion() {
+ return minorVersion;
+ }
+
+ public void setMinorVersion(int minorVersion) {
+ this.minorVersion = minorVersion;
+ }
+
+ public int getMajorVersion() {
+ return majorVersion;
+ }
+
+ public void setMajorVersion(int majorVersion) {
+ this.majorVersion = majorVersion;
+ }
+
+ public AccessFlag getAccessFlag() {
+ return accessFlag;
+ }
+
+ public void setAccessFlag(AccessFlag accessFlag) {
+ this.accessFlag = accessFlag;
+ }
+
+ public ClassIndex getClzIndex() {
+ return clzIndex;
+ }
+
+ public void setClzIndex(ClassIndex clzIndex) {
+ this.clzIndex = clzIndex;
+ }
+
+ public ConstantPool getPool() {
+ return pool;
+ }
+
+ public void setPool(ConstantPool pool) {
+ this.pool = pool;
+ }
+
+ public List getFields() {
+ return fields;
+ }
+
+ public void addFields(Field f){
+ this.fields.add(f);
+ }
+
+ public List getMethods() {
+ return methods;
+ }
+
+ public void addMethods(Method m){
+ this.methods.add(m);
+ }
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java
new file mode 100644
index 0000000000..7750d4439d
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java
@@ -0,0 +1,19 @@
+package com.coderising.jvm.clz;
+
+public class ClassIndex {
+ private int thisClassIndex;
+ private int superClassIndex;
+
+ public int getThisClassIndex() {
+ return thisClassIndex;
+ }
+ public void setThisClassIndex(int thisClassIndex) {
+ this.thisClassIndex = thisClassIndex;
+ }
+ public int getSuperClassIndex() {
+ return superClassIndex;
+ }
+ public void setSuperClassIndex(int superClassIndex) {
+ this.superClassIndex = superClassIndex;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java
new file mode 100644
index 0000000000..c0d67993ed
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java
@@ -0,0 +1,26 @@
+package com.coderising.jvm.constant;
+
+public class ClassInfo extends ConstantInfo {
+ private int type = CLASS_INFO;// u1 tag
+ private int name_index;// u2 name_index
+
+ @Override
+ public int getType() {
+ return type;
+ }
+
+ public int getName_index() {
+ return name_index;
+ }
+
+ public void setName_index(int name_index) {
+ this.name_index = name_index;
+ }
+
+ public String getClassName() {
+ int name_index = getName_index();
+ UTF8Info utf8 = (UTF8Info) this.constantPool
+ .getConstantInfo(name_index);
+ return utf8.getValue();
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
new file mode 100644
index 0000000000..885fba98b5
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
@@ -0,0 +1,32 @@
+package com.coderising.jvm.constant;
+
+public abstract class ConstantInfo {
+ public static final int UTF8_INFO = 1;
+ public static final int INTEGER_INFO = 3;
+ public static final int FLOAT_INFO = 4;
+ public static final int LONG_INFO = 5;
+ public static final int DOUBLE_INFO = 6;
+ public static final int CLASS_INFO = 7;
+ public static final int STRING_INFO = 8;
+ public static final int FIELD_INFO = 9;
+ public static final int METHOD_INFO = 10;
+ public static final int NAME_AND_TYPE_INFO = 12;
+
+ protected ConstantPool constantPool;
+
+ public ConstantInfo() {}
+
+ public ConstantInfo(ConstantPool cp){
+ this.constantPool = cp;
+ }
+
+ public abstract int getType();
+
+ public ConstantPool getConstantPool(){
+ return this.constantPool;
+ }
+
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantPool.getConstantInfo(index);
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java
new file mode 100644
index 0000000000..179b5ad9bf
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java
@@ -0,0 +1,29 @@
+package com.coderising.jvm.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+ private List cl = new ArrayList();
+ private int constant_pool_size;
+
+ public int getConstant_pool_size() {
+ return constant_pool_size;
+ }
+
+ public void setConstant_pool_size(int constant_pool_size) {
+ this.constant_pool_size = constant_pool_size;
+ }
+
+ public void addConstantInfo(ConstantInfo e){
+ cl.add(e);
+ }
+
+ public ConstantInfo getConstantInfo(int index) {
+ return cl.get(index);
+ }
+
+ public int getSize() {
+ return cl.size() - 1;// 减去常量池的长度一项
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java
new file mode 100644
index 0000000000..9d6112ee35
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java
@@ -0,0 +1,10 @@
+package com.coderising.jvm.constant;
+
+public class DoubleInfo extends ConstantInfo {
+ private int type = DOUBLE_INFO;
+
+ @Override
+ public int getType() {
+ return type;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..8d3a8c25c8
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,52 @@
+package com.coderising.jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo {
+ private int type = FIELD_INFO;//u1 tag
+ private int class_index;//u2 class_index
+ private int name_and_type_index;//u2 name_and_type_index
+
+ @Override
+ public int getType() {
+ return type;
+ }
+
+ public int getClass_index() {
+ return class_index;
+ }
+
+ public void setClass_index(int class_index) {
+ this.class_index = class_index;
+ }
+
+ public int getName_and_type_index() {
+ return name_and_type_index;
+ }
+
+ public void setName_and_type_index(int name_and_type_index) {
+ this.name_and_type_index = name_and_type_index;
+ }
+
+ @Override
+ public String toString() {
+ return getClassName() + ":"+getFieldName()+" : "+getFieldType();
+ }
+
+ public String getClassName() {
+ ClassInfo classInfo = (ClassInfo) this.constantPool
+ .getConstantInfo(class_index);
+ return classInfo.getClassName();
+ }
+
+ public String getFieldName() {
+ NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) this.constantPool
+ .getConstantInfo(name_and_type_index);
+ return nameAndTypeInfo.getName();
+ }
+
+ public String getFieldType() {
+ NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) this.constantPool
+ .getConstantInfo(name_and_type_index);
+ return nameAndTypeInfo.getTypeInfo();
+ }
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java
new file mode 100644
index 0000000000..d02f37f6d8
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java
@@ -0,0 +1,10 @@
+package com.coderising.jvm.constant;
+
+public class FloatInfo extends ConstantInfo {
+ private int type = FLOAT_INFO;
+
+ @Override
+ public int getType() {
+ return type;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java
new file mode 100644
index 0000000000..b89a8925c4
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java
@@ -0,0 +1,20 @@
+package com.coderising.jvm.constant;
+
+public class IntegerInfo extends ConstantInfo {
+ private int type = INTEGER_INFO;
+ private int Num;
+
+ @Override
+ public int getType() {
+ return type;
+ }
+
+ public int getNum() {
+ return Num;
+ }
+
+ public void setNum(int num) {
+ Num = num;
+ }
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java
new file mode 100644
index 0000000000..23c80a2640
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java
@@ -0,0 +1,10 @@
+package com.coderising.jvm.constant;
+
+public class LongInfo extends ConstantInfo {
+ private int type = LONG_INFO;
+
+ @Override
+ public int getType() {
+ return type;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..86a199808b
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,52 @@
+package com.coderising.jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+ private int type = METHOD_INFO;//u1 tag
+ private int class_index;//u2 class_index
+ private int name_and_type_index;//u2 name_and_type_index
+
+ @Override
+ public int getType() {
+ return type;
+ }
+
+ public int getClass_index() {
+ return class_index;
+ }
+
+ public void setClass_index(int class_index) {
+ this.class_index = class_index;
+ }
+
+ public int getName_and_type_index() {
+ return name_and_type_index;
+ }
+
+ public void setName_and_type_index(int name_and_type_index) {
+ this.name_and_type_index = name_and_type_index;
+ }
+
+ public String getClassName() {
+ ClassInfo c = (ClassInfo) this.constantPool
+ .getConstantInfo(class_index);
+ return c.getClassName();
+ }
+
+ public String getMethodName() {
+ NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool
+ .getConstantInfo(name_and_type_index);
+ return nt.getName();
+ }
+
+ public String getParamsAndReturnType() {
+ NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool
+ .getConstantInfo(name_and_type_index);
+ return nt.getTypeInfo();
+ }
+
+ @Override
+ public String toString() {
+ return getClassName() + ":" + getMethodName() + ":"
+ + getParamsAndReturnType();
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..61b434d245
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,43 @@
+package com.coderising.jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo {
+ private int type = NAME_AND_TYPE_INFO;// u1 tag
+ private int name_index;//u2 name_index
+ private int descriptor_index;//u2 descriptor_index
+
+ @Override
+ public int getType() {
+ return type;
+ }
+
+ public int getName_index() {
+ return name_index;
+ }
+
+ public void setName_index(int name_index) {
+ this.name_index = name_index;
+ }
+
+ public int getDescriptor_index() {
+ return descriptor_index;
+ }
+
+ public void setDescriptor_index(int descriptor_index) {
+ this.descriptor_index = descriptor_index;
+ }
+
+ public String getName() {
+ UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(name_index);
+ return u.getValue();
+ }
+
+ public String getTypeInfo() {
+ UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(descriptor_index);
+ return u.getValue();
+ }
+
+ @Override
+ public String toString() {
+ return "(" + getName() + "," + getTypeInfo() + ")";
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..b383988fe7
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,10 @@
+package com.coderising.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo{
+
+ @Override
+ public int getType() {
+ return -1;
+ }
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java
new file mode 100644
index 0000000000..b2bbbe9093
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java
@@ -0,0 +1,25 @@
+package com.coderising.jvm.constant;
+
+public class StringInfo extends ConstantInfo {
+ private int type = STRING_INFO;//u1 tag
+ private int string_index;//u2 string_index
+ @Override
+ public int getType() {
+ return type;
+ }
+ public int getString_index() {
+ return string_index;
+ }
+ public void setString_index(int string_index) {
+ this.string_index = string_index;
+ }
+ public String getString(){
+ UTF8Info u = (UTF8Info)this.constantPool.getConstantInfo(string_index);
+ return u.getValue();
+ }
+ @Override
+ public String toString() {
+ return getString();
+ }
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java
new file mode 100644
index 0000000000..4bcf998504
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java
@@ -0,0 +1,31 @@
+package com.coderising.jvm.constant;
+
+public class UTF8Info extends ConstantInfo {
+ private int type = UTF8_INFO;//u1 tag
+ private int length;//u2 length
+ private String value;//n 个 u1
+ public UTF8Info(ConstantPool pool) {
+ super(pool);
+ }
+ @Override
+ public int getType() {
+ return type;
+ }
+ public int getLength() {
+ return length;
+ }
+ public void setLength(int length) {
+ this.length = length;
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+ @Override
+ public String toString() {
+ return "UTF8Info [type="+type+",length="+length+",value="+value+"]";
+ }
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java
new file mode 100644
index 0000000000..19fcec9e46
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java
@@ -0,0 +1,51 @@
+package com.coderising.jvm.field;
+
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class Field {
+ private int accessFlag;//u2 access_flags
+ private int nameIndex;//u2 name_index
+ private int descriptorIndex;//u2 descriptor_index
+ //attr 属性表信息首次写jvm先放弃,以后再加
+
+ private ConstantPool pool;
+
+ public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) {
+
+ this.accessFlag = accessFlag;
+ this.nameIndex = nameIndex;
+ this.descriptorIndex = descriptorIndex;
+ this.pool = pool;
+ }
+
+ public static Field parse(ConstantPool pool,ByteCodeIterator iter){
+
+ return null;
+ }
+
+ public int getAccessFlag() {
+ return accessFlag;
+ }
+
+ public void setAccessFlag(int accessFlag) {
+ this.accessFlag = accessFlag;
+ }
+
+ public int getNameIndex() {
+ return nameIndex;
+ }
+
+ public void setNameIndex(int nameIndex) {
+ this.nameIndex = nameIndex;
+ }
+
+ public int getDescriptorIndex() {
+ return descriptorIndex;
+ }
+
+ public void setDescriptorIndex(int descriptorIndex) {
+ this.descriptorIndex = descriptorIndex;
+ }
+
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..7bd30d2832
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,41 @@
+package com.coderising.jvm.loader;
+
+import com.coderising.jvm.util.Util;
+
+public class ByteCodeIterator {
+ private byte[] codes;
+ private int pos = 0;
+
+ public void back(int length) {
+ if (pos - length < 0) {
+ throw new RuntimeException("back length is too long:" + length
+ + ",pos:" + pos);
+ }
+ pos -= length;
+ }
+
+ public ByteCodeIterator(byte[] codes) {
+ this.codes = codes;
+ }
+
+ public int nextU1toInt() {
+ return Util.byteToInt(new byte[] { codes[pos++] });
+ }
+
+ public int nextU2toInt() {
+ return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] });
+ }
+
+ public int nextU4toInt() {
+ return Util.byteToInt(new byte[] { codes[pos++], codes[pos++],
+ codes[pos++], codes[pos++] });
+ }
+
+ public String nextUxtoHexString(int len) {
+ byte[] bytes = new byte[len];
+ for (int i = 0; i < len; i++) {
+ bytes[i] = codes[pos++];
+ }
+ return Util.byteToHexString(bytes);
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
index fafac43407..d8818219ed 100644
--- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
@@ -96,9 +96,4 @@ private String convertName(String className) {
return sb.toString();
}
- public static void main(String[] args) {
- String d = "com.taiji.array.Load";
- ClassFileLoader cc = new ClassFileLoader();
- System.out.print(cc.convertName(d));
- }
}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
new file mode 100644
index 0000000000..888dfe4817
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
@@ -0,0 +1,130 @@
+package com.coderising.jvm.loader;
+
+import com.coderising.jvm.clz.AccessFlag;
+import com.coderising.jvm.clz.ClassFile;
+import com.coderising.jvm.clz.ClassIndex;
+import com.coderising.jvm.constant.ClassInfo;
+import com.coderising.jvm.constant.ConstantInfo;
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.constant.FieldRefInfo;
+import com.coderising.jvm.constant.MethodRefInfo;
+import com.coderising.jvm.constant.NameAndTypeInfo;
+import com.coderising.jvm.constant.NullConstantInfo;
+import com.coderising.jvm.constant.StringInfo;
+import com.coderising.jvm.constant.UTF8Info;
+
+public class ClassFileParser {
+ /**
+ * 读取ClassFile对象
+ * @param codes
+ * @return
+ */
+ public ClassFile parse(byte[] codes) {
+ ClassFile cf = new ClassFile();
+ ByteCodeIterator itr = new ByteCodeIterator(codes);
+ String magicNumber = itr.nextUxtoHexString(4);//1读取魔数
+ if (!magicNumber.equals("cafebabe")) {
+ throw new RuntimeException("magicNum not ok");
+ }
+ cf.setMajorVersion(itr.nextU2toInt());//2读取主版本号
+ cf.setMinorVersion(itr.nextU2toInt());//3读取次版本号
+
+ ConstantPool pool = parseConstantPool(itr);//4、5读取常量池
+ cf.setPool(pool);
+
+ cf.setAccessFlag(new AccessFlag(itr.nextU2toInt()));//6读取访问标志
+
+ ClassIndex classIndex = parseClassIndex(itr);//读取类引用7this和8super
+ cf.setClzIndex(classIndex);
+
+ return cf;
+ }
+
+ /**
+ * 读取this super对象引用
+ * @param itr
+ * @return
+ */
+ public ClassIndex parseClassIndex(ByteCodeIterator itr) {
+ ClassIndex classIndex = new ClassIndex();
+ classIndex.setThisClassIndex(itr.nextU2toInt());
+ classIndex.setSuperClassIndex(itr.nextU2toInt());
+ return classIndex;
+ }
+ /**
+ * 读取常量池
+ * @param itr
+ * @return
+ */
+ public ConstantPool parseConstantPool(ByteCodeIterator itr) {
+ int count = itr.nextU2toInt();
+ ConstantPool pool = new ConstantPool();
+ pool.setConstant_pool_size(count);
+ pool.addConstantInfo(new NullConstantInfo());// 占住常量池的第一个,常量池是的index从1开始
+
+ for (int i = 1; i < count; i++) {
+ int tag = itr.nextU1toInt();
+ switch (tag) {
+ case ConstantInfo.CLASS_INFO:
+ ClassInfo classInfo = new ClassInfo();
+ classInfo.setName_index(itr.nextU2toInt());
+ pool.addConstantInfo(classInfo);
+ break;
+
+ case ConstantInfo.UTF8_INFO:
+ UTF8Info utf8Info = new UTF8Info(pool);
+ int length = itr.nextU2toInt();
+ String value = itr.nextUxtoHexString(length);
+ utf8Info.setLength(length);
+ utf8Info.setValue(value);
+ pool.addConstantInfo(utf8Info);
+ break;
+
+ case ConstantInfo.STRING_INFO:
+ StringInfo si = new StringInfo();
+ si.setString_index(itr.nextU2toInt());
+ pool.addConstantInfo(si);
+ break;
+
+ case ConstantInfo.NAME_AND_TYPE_INFO:
+ NameAndTypeInfo nt = new NameAndTypeInfo();
+ nt.setName_index(itr.nextU2toInt());
+ nt.setDescriptor_index(itr.nextU2toInt());
+ pool.addConstantInfo(nt);
+ break;
+
+ case ConstantInfo.METHOD_INFO:
+ MethodRefInfo m = new MethodRefInfo();
+ m.setClass_index(itr.nextU2toInt());
+ m.setName_and_type_index(itr.nextU2toInt());
+ pool.addConstantInfo(m);
+ break;
+
+ case ConstantInfo.FIELD_INFO:
+ FieldRefInfo f = new FieldRefInfo();
+ f.setClass_index(itr.nextU2toInt());
+ f.setName_and_type_index(itr.nextU2toInt());
+ pool.addConstantInfo(f);
+ break;
+
+ /*case ConstantInfo.FLOAT_INFO:
+
+ break;
+
+ case ConstantInfo.INTEGER_INFO:
+ break;
+
+ case ConstantInfo.DOUBLE_INFO:
+ break;
+
+ case ConstantInfo.LONG_INFO:
+ break;*/
+
+ default:
+ throw new RuntimeException("the constant pool tag " + tag
+ + " has not been implemented yet.");
+ }
+ }
+ return pool;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java
new file mode 100644
index 0000000000..8a876551a0
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java
@@ -0,0 +1,27 @@
+package com.coderising.jvm.method;
+
+public class Method {
+ private int access_flags;
+ private int name_index;
+ private int type_index;
+
+
+ public int getAccess_flags() {
+ return access_flags;
+ }
+ public void setAccess_flags(int access_flags) {
+ this.access_flags = access_flags;
+ }
+ public int getName_index() {
+ return name_index;
+ }
+ public void setName_index(int name_index) {
+ this.name_index = name_index;
+ }
+ public int getType_index() {
+ return type_index;
+ }
+ public void setType_index(int type_index) {
+ this.type_index = type_index;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java
new file mode 100644
index 0000000000..2201593cd2
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java
@@ -0,0 +1,21 @@
+package com.coderising.jvm.util;
+
+public class Util {
+ public static int byteToInt(byte[] codes){
+ String s1 = byteToHexString(codes);
+ return Integer.valueOf(s1, 16).intValue();
+ }
+ public static String byteToHexString(byte[] codes) {
+ StringBuffer buffer = new StringBuffer();
+ for (int i = 0; i < codes.length; i++) {
+ byte b = codes[i];
+ int value = b & 0xFF;
+ String strHex = Integer.toHexString(value);
+ if (strHex.length() < 2) {
+ strHex = "0" + strHex;
+ }
+ buffer.append(strHex);
+ }
+ return buffer.toString();
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java
similarity index 88%
rename from group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java
rename to group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java
index 6bde3e3105..007362e95a 100644
--- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java
+++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java
@@ -1,7 +1,9 @@
-package com.coding.basic;
+package com.coding.basic.stack;
import java.util.EmptyStackException;
+import com.coding.basic.ArrayList;
+
public class Stack {
private ArrayList elementData = new ArrayList();
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..e1bc00858f
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,47 @@
+package com.coding.basic.stack;
+
+public class StackUtil {
+ /**
+ * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5
+ * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ */
+ public static void reverse(Stack s) {
+
+ }
+ /**
+ * 添加元素到栈底部
+ * @param s
+ * @param value
+ */
+ public static void addToBottom(Stack s, Integer value){
+
+ }
+ /**
+ * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ *
+ * @param o
+ */
+ public static void remove(Stack> s,Object o) {
+
+ }
+ /**
+ * 从栈顶取得len个元素, 原来的栈中元素保持不变
+ * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ * @param len
+ * @return
+ */
+ public static Object[] getTop(Stack> s,int len) {
+ return null;
+ }
+ /**
+ * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz
+ * 使用堆栈检查字符串s中的括号是不是成对出现的。
+ * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true
+ * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false;
+ * @param s
+ * @return
+ */
+ public static boolean isValidPairs(String s){
+ return false;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 0000000000..cd086dfe79
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,14 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+ String expr = null;
+
+ public InfixExpr(String expr) {
+ this.expr = expr;
+ }
+
+ public float evaluate() {
+
+ return 0.0f;
+ }
+}
diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..e47a5d44d4
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StackUtilTest {
+
+ @Test
+ public void testReverse() {
+ Stack s = new Stack<>();
+ s.push(1);
+ s.push(2);
+ s.push(3);
+ s.push(4);
+ s.push(5);
+ Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+ StackUtil.reverse(s);
+ Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+ }
+
+ @Test
+ public void testAddToBottom() {
+ Stack s = new Stack<>();
+ s.push(1);
+ s.push(2);
+ s.push(3);
+
+ StackUtil.addToBottom(s, 0);
+
+ Assert.assertEquals("[0, 1, 2, 3]", s.toString());
+ }
+
+ @Test
+ public void testRemove() {
+ Stack s = new Stack<>();
+ s.push(1);
+ s.push(2);
+ s.push(3);
+ StackUtil.remove(s, 2);
+ Assert.assertEquals("[1, 3]", s.toString());
+ }
+
+ @Test
+ public void testGetTop() {
+ Stack s = new Stack<>();
+ s.push(1);
+ s.push(2);
+ s.push(3);
+ s.push(4);
+ s.push(5);
+ {
+ Object[] values = StackUtil.getTop(s, 3);
+ Assert.assertEquals(5, values[0]);
+ Assert.assertEquals(4, values[1]);
+ Assert.assertEquals(3, values[2]);
+ }
+ }
+
+ @Test
+ public void testIsValidPairs() {
+ Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+ Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+ }
+
+}
diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 0000000000..4152869ad2
--- /dev/null
+++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,35 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class InfixExprTest {
+
+ @Test
+ public void testEvaluate() {
+ {
+ InfixExpr expr = new InfixExpr("2+3*4+5");
+ Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+ }
+ {
+ InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+ Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+ }
+
+ {
+ InfixExpr expr = new InfixExpr("3*20/2");
+ Assert.assertEquals(30, expr.evaluate(), 0.001f);
+ }
+
+ {
+ InfixExpr expr = new InfixExpr("20/2*3");
+ Assert.assertEquals(30, expr.evaluate(), 0.001f);
+ }
+
+ {
+ InfixExpr expr = new InfixExpr("10-30+50");
+ Assert.assertEquals(30, expr.evaluate(), 0.001f);
+ }
+ }
+
+}
From 35f6dba078285f5d8fc93b8b397a2797cf05cc16 Mon Sep 17 00:00:00 2001
From: gongxun
Date: Mon, 10 Apr 2017 23:26:44 +0800
Subject: [PATCH 010/151] template
---
.../785396327/3.26/jvm_1/ClassFileLoader.java | 2 +-
group17/785396327/4.5/clz/AccessFlag.java | 28 ++
group17/785396327/4.5/clz/ClassFile.java | 89 ++++++
group17/785396327/4.5/clz/ClassIndex.java | 25 ++
group17/785396327/4.5/constant/ClassInfo.java | 27 ++
.../785396327/4.5/constant/ConstantInfo.java | 31 ++
.../785396327/4.5/constant/ConstantPool.java | 31 ++
.../785396327/4.5/constant/FieldRefInfo.java | 57 ++++
.../785396327/4.5/constant/MethodRefInfo.java | 48 ++++
.../4.5/constant/NameAndTypeInfo.java | 48 ++++
.../4.5/constant/NullConstantInfo.java | 14 +
.../785396327/4.5/constant/StringInfo.java | 29 ++
group17/785396327/4.5/constant/UTF8Info.java | 33 +++
.../4.5/test/ClassFileloaderTest.java | 265 ++++++++++++++++++
group17/785396327/4.5/util/Util.java | 27 ++
15 files changed, 753 insertions(+), 1 deletion(-)
create mode 100644 group17/785396327/4.5/clz/AccessFlag.java
create mode 100644 group17/785396327/4.5/clz/ClassFile.java
create mode 100644 group17/785396327/4.5/clz/ClassIndex.java
create mode 100644 group17/785396327/4.5/constant/ClassInfo.java
create mode 100644 group17/785396327/4.5/constant/ConstantInfo.java
create mode 100644 group17/785396327/4.5/constant/ConstantPool.java
create mode 100644 group17/785396327/4.5/constant/FieldRefInfo.java
create mode 100644 group17/785396327/4.5/constant/MethodRefInfo.java
create mode 100644 group17/785396327/4.5/constant/NameAndTypeInfo.java
create mode 100644 group17/785396327/4.5/constant/NullConstantInfo.java
create mode 100644 group17/785396327/4.5/constant/StringInfo.java
create mode 100644 group17/785396327/4.5/constant/UTF8Info.java
create mode 100644 group17/785396327/4.5/test/ClassFileloaderTest.java
create mode 100644 group17/785396327/4.5/util/Util.java
diff --git a/group17/785396327/3.26/jvm_1/ClassFileLoader.java b/group17/785396327/3.26/jvm_1/ClassFileLoader.java
index 95f68a5a7f..9a937ba631 100644
--- a/group17/785396327/3.26/jvm_1/ClassFileLoader.java
+++ b/group17/785396327/3.26/jvm_1/ClassFileLoader.java
@@ -12,7 +12,7 @@ public class ClassFileLoader {
public byte[] readBinaryCode(String className) {
InputStream fis = null;
- String filePath = clzPaths.get(0) + "\\\\" + className.replaceAll("\\.", "\\\\") + ".class";
+ String filePath = clzPaths.get(0) + File.pathSeparator + className.replaceAll("\\.", File.pathSeparator) + ".class";
byte[] buffer = new byte[(int) new File(filePath).length()];
try {
if (clzPaths.size() > 0 && className != null && !className.trim().equals("")) {
diff --git a/group17/785396327/4.5/clz/AccessFlag.java b/group17/785396327/4.5/clz/AccessFlag.java
new file mode 100644
index 0000000000..bbdf7c8818
--- /dev/null
+++ b/group17/785396327/4.5/clz/AccessFlag.java
@@ -0,0 +1,28 @@
+package clz;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class AccessFlag {
+ private int flagValue;
+
+ public AccessFlag(int value) {
+ this.flagValue = value;
+ }
+
+ public int getFlagValue() {
+ return flagValue;
+ }
+
+ public void setFlagValue(int flag) {
+ this.flagValue = flag;
+ }
+
+ public boolean isPublicClass(){
+ return (this.flagValue & 0x0001) != 0;
+ }
+ public boolean isFinalClass(){
+ return (this.flagValue & 0x0010) != 0;
+ }
+
+}
diff --git a/group17/785396327/4.5/clz/ClassFile.java b/group17/785396327/4.5/clz/ClassFile.java
new file mode 100644
index 0000000000..d4a8b8ed0c
--- /dev/null
+++ b/group17/785396327/4.5/clz/ClassFile.java
@@ -0,0 +1,89 @@
+package clz;
+
+import constant.ClassInfo;
+import constant.ConstantPool;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class ClassFile {
+ private int minorVersion;
+ private int majorVersion;
+
+ private AccessFlag accessFlag;
+ private ClassIndex clzIndex;
+ private ConstantPool pool;
+// private List fields = new ArrayList();
+// private List methods = new ArrayList();
+
+ public ClassIndex getClzIndex() {
+ return clzIndex;
+ }
+ public AccessFlag getAccessFlag() {
+ return accessFlag;
+ }
+ public void setAccessFlag(AccessFlag accessFlag) {
+ this.accessFlag = accessFlag;
+ }
+
+
+
+ public ConstantPool getConstantPool() {
+ return pool;
+ }
+ public int getMinorVersion() {
+ return minorVersion;
+ }
+ public void setMinorVersion(int minorVersion) {
+ this.minorVersion = minorVersion;
+ }
+ public int getMajorVersion() {
+ return majorVersion;
+ }
+ public void setMajorVersion(int majorVersion) {
+ this.majorVersion = majorVersion;
+ }
+ public void setConstPool(ConstantPool pool) {
+ this.pool = pool;
+
+ }
+ public void setClassIndex(ClassIndex clzIndex) {
+ this.clzIndex = clzIndex;
+ }
+
+// public void addField(Field f){
+// this.fields.add(f);
+// }
+// public List getFields(){
+// return this.fields;
+// }
+// public void addMethod(Method m){
+// this.methods.add(m);
+// }
+// public List getMethods() {
+// return methods;
+// }
+
+
+ public void print(){
+
+ if(this.accessFlag.isPublicClass()){
+ System.out.println("Access flag : public ");
+ }
+ System.out.println("Class Name:"+ getClassName());
+
+ System.out.println("Super Class Name:"+ getSuperClassName());
+
+
+ }
+
+ private String getClassName(){
+ int thisClassIndex = this.clzIndex.getThisClassIndex();
+ ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex);
+ return thisClass.getClassName();
+ }
+ private String getSuperClassName(){
+ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+ return superClass.getClassName();
+ }
+}
diff --git a/group17/785396327/4.5/clz/ClassIndex.java b/group17/785396327/4.5/clz/ClassIndex.java
new file mode 100644
index 0000000000..d0eb281a09
--- /dev/null
+++ b/group17/785396327/4.5/clz/ClassIndex.java
@@ -0,0 +1,25 @@
+package clz;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class ClassIndex {
+ private int thisClassIndex;
+ private int superClassIndex;
+
+ public int getThisClassIndex() {
+ return thisClassIndex;
+ }
+
+ public void setThisClassIndex(int thisClassIndex) {
+ this.thisClassIndex = thisClassIndex;
+ }
+
+ public int getSuperClassIndex() {
+ return superClassIndex;
+ }
+
+ public void setSuperClassIndex(int superClassIndex) {
+ this.superClassIndex = superClassIndex;
+ }
+}
diff --git a/group17/785396327/4.5/constant/ClassInfo.java b/group17/785396327/4.5/constant/ClassInfo.java
new file mode 100644
index 0000000000..1143ac1faa
--- /dev/null
+++ b/group17/785396327/4.5/constant/ClassInfo.java
@@ -0,0 +1,27 @@
+package constant;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class ClassInfo extends ConstantInfo {
+ private int type = ConstantInfo.CLASS_INFO;
+ private int utf8Index ;
+ public ClassInfo(ConstantPool pool) {
+ super(pool);
+ }
+ public int getUtf8Index() {
+ return utf8Index;
+ }
+ public void setUtf8Index(int utf8Index) {
+ this.utf8Index = utf8Index;
+ }
+ public int getType() {
+ return type;
+ }
+
+ public String getClassName() {
+ int index = getUtf8Index();
+ UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index);
+ return utf8Info.getValue();
+ }
+}
diff --git a/group17/785396327/4.5/constant/ConstantInfo.java b/group17/785396327/4.5/constant/ConstantInfo.java
new file mode 100644
index 0000000000..8e6eaf72cf
--- /dev/null
+++ b/group17/785396327/4.5/constant/ConstantInfo.java
@@ -0,0 +1,31 @@
+package constant;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public abstract class ConstantInfo {
+ public static final int UTF8_INFO = 1;
+ public static final int FLOAT_INFO = 4;
+ public static final int CLASS_INFO = 7;
+ public static final int STRING_INFO = 8;
+ public static final int FIELD_INFO = 9;
+ public static final int METHOD_INFO = 10;
+ public static final int NAME_AND_TYPE_INFO = 12;
+ protected ConstantPool constantPool;
+
+ public ConstantInfo(){
+
+ }
+
+ public ConstantInfo(ConstantPool pool) {
+ this.constantPool = pool;
+ }
+ public abstract int getType();
+
+ public ConstantPool getConstantPool() {
+ return constantPool;
+ }
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantPool.getConstantInfo(index);
+ }
+}
diff --git a/group17/785396327/4.5/constant/ConstantPool.java b/group17/785396327/4.5/constant/ConstantPool.java
new file mode 100644
index 0000000000..b7b29bf115
--- /dev/null
+++ b/group17/785396327/4.5/constant/ConstantPool.java
@@ -0,0 +1,31 @@
+package constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class ConstantPool {
+ private List constantInfos = new ArrayList();
+
+
+ public ConstantPool(){
+
+ }
+ public void addConstantInfo(ConstantInfo info){
+
+ this.constantInfos.add(info);
+
+ }
+
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantInfos.get(index);
+ }
+ public String getUTF8String(int index){
+ return ((UTF8Info)this.constantInfos.get(index)).getValue();
+ }
+ public Object getSize() {
+ return this.constantInfos.size() -1;
+ }
+}
diff --git a/group17/785396327/4.5/constant/FieldRefInfo.java b/group17/785396327/4.5/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..1e86db4134
--- /dev/null
+++ b/group17/785396327/4.5/constant/FieldRefInfo.java
@@ -0,0 +1,57 @@
+package constant;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class FieldRefInfo extends ConstantInfo {
+ private int type = ConstantInfo.FIELD_INFO;
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public FieldRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+
+ return getClassName() +" : "+ typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]";
+ }
+
+ public String getClassName(){
+
+ ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+
+ UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index());
+
+ return utf8Info.getValue();
+
+ }
+
+ public String getFieldName(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+
+ public String getFieldType(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getTypeInfo();
+ }
+}
diff --git a/group17/785396327/4.5/constant/MethodRefInfo.java b/group17/785396327/4.5/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..a3df142200
--- /dev/null
+++ b/group17/785396327/4.5/constant/MethodRefInfo.java
@@ -0,0 +1,48 @@
+package constant;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class MethodRefInfo extends ConstantInfo {
+ private int type = ConstantInfo.METHOD_INFO;
+
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public MethodRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ return getClassName() +" : "+ this.getMethodName() + " : " + this.getNameAndTypeIndex() ;
+ }
+ public String getClassName(){
+ ConstantPool pool = this.getConstantPool();
+ ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex());
+ return clzInfo.getClassName();
+ }
+
+ public String getMethodName(){
+ ConstantPool pool = this.getConstantPool();
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+}
diff --git a/group17/785396327/4.5/constant/NameAndTypeInfo.java b/group17/785396327/4.5/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..f59efe07c0
--- /dev/null
+++ b/group17/785396327/4.5/constant/NameAndTypeInfo.java
@@ -0,0 +1,48 @@
+package constant;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class NameAndTypeInfo extends ConstantInfo {
+ public int type = ConstantInfo.NAME_AND_TYPE_INFO;
+
+ private int index1;
+ private int index2;
+
+ public NameAndTypeInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getIndex1() {
+ return index1;
+ }
+ public void setIndex1(int index1) {
+ this.index1 = index1;
+ }
+ public int getIndex2() {
+ return index2;
+ }
+ public void setIndex2(int index2) {
+ this.index2 = index2;
+ }
+ public int getType() {
+ return type;
+ }
+
+
+ public String getName(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1);
+ return utf8Info1.getValue();
+ }
+
+ public String getTypeInfo(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2);
+ return utf8Info2.getValue();
+ }
+
+ public String toString(){
+ return "(" + getName() + "," + getTypeInfo()+")";
+ }
+}
diff --git a/group17/785396327/4.5/constant/NullConstantInfo.java b/group17/785396327/4.5/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..c6bc0c17e5
--- /dev/null
+++ b/group17/785396327/4.5/constant/NullConstantInfo.java
@@ -0,0 +1,14 @@
+package constant;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class NullConstantInfo extends ConstantInfo {
+ public NullConstantInfo(){
+
+ }
+ @Override
+ public int getType() {
+ return -1;
+ }
+}
diff --git a/group17/785396327/4.5/constant/StringInfo.java b/group17/785396327/4.5/constant/StringInfo.java
new file mode 100644
index 0000000000..595eed7f47
--- /dev/null
+++ b/group17/785396327/4.5/constant/StringInfo.java
@@ -0,0 +1,29 @@
+package constant;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class StringInfo extends ConstantInfo {
+ private int type = ConstantInfo.STRING_INFO;
+ private int index;
+ public StringInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+ public void setIndex(int index) {
+ this.index = index;
+ }
+
+
+ public String toString(){
+ return this.getConstantPool().getUTF8String(index);
+ }
+
+}
diff --git a/group17/785396327/4.5/constant/UTF8Info.java b/group17/785396327/4.5/constant/UTF8Info.java
new file mode 100644
index 0000000000..12b8395559
--- /dev/null
+++ b/group17/785396327/4.5/constant/UTF8Info.java
@@ -0,0 +1,33 @@
+package constant;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class UTF8Info extends ConstantInfo {
+ private int type = ConstantInfo.UTF8_INFO;
+ private int length ;
+ private String value;
+ public UTF8Info(ConstantPool pool) {
+ super(pool);
+ }
+ public int getLength() {
+ return length;
+ }
+ public void setLength(int length) {
+ this.length = length;
+ }
+ public int getType() {
+ return type;
+ }
+ @Override
+ public String toString() {
+ return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]";
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+}
diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java
new file mode 100644
index 0000000000..7c32811a45
--- /dev/null
+++ b/group17/785396327/4.5/test/ClassFileloaderTest.java
@@ -0,0 +1,265 @@
+package test;
+
+import clz.ClassFile;
+import constant.*;
+import jvm_1.ClassFileLoader;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class ClassFileloaderTest {
+ private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1";
+
+ static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin";
+ static String path2 = "C:\temp";
+
+ static ClassFile clzFile = null;
+ static {
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+ String className = "com.coderising.jvm.test.EmployeeV1";
+
+// clzFile = loader.loadClass(className);
+ clzFile.print();
+ }
+
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testClassPath(){
+
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+ loader.addClassPath(path2);
+
+ String clzPath = loader.getClassPath();
+
+ Assert.assertEquals(path1+";"+path2,clzPath);
+
+ }
+
+ @Test
+ public void testClassFileLength() {
+
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+
+ String className = "com.coderising.jvm.test.EmployeeV1";
+
+ byte[] byteCodes = loader.readBinaryCode(className);
+
+ // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大
+ Assert.assertEquals(1056, byteCodes.length);
+
+ }
+
+
+ @Test
+ public void testMagicNumber(){
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+ String className = "com.coderising.jvm.test.EmployeeV1";
+ byte[] byteCodes = loader.readBinaryCode(className);
+ byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
+
+
+ String acctualValue = this.byteToHexString(codes);
+
+ Assert.assertEquals("cafebabe", acctualValue);
+ }
+
+
+
+ private String byteToHexString(byte[] codes ){
+ StringBuffer buffer = new StringBuffer();
+ for(int i=0;i", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(10);
+ Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(11);
+ Assert.assertEquals("Code", utf8Info.getValue());
+ }
+
+ {
+ MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
+ Assert.assertEquals(3, methodRef.getClassInfoIndex());
+ Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+ Assert.assertEquals(9, nameAndType.getIndex1());
+ Assert.assertEquals(14, nameAndType.getIndex2());
+ }
+ //抽查几个吧
+ {
+ MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
+ Assert.assertEquals(1, methodRef.getClassInfoIndex());
+ Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+ Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+ }
+ }
+ @Test
+ public void testClassIndex(){
+
+// ClassIndex clzIndex = clzFile.getClzIndex();
+// ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+// ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+//
+//
+// Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+// Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+ }
+
+ /**
+ * 下面是第三次JVM课应实现的测试用例
+ */
+ @Test
+ public void testReadFields(){
+
+// List fields = clzFile.getFields();
+// Assert.assertEquals(2, fields.size());
+// {
+// Field f = fields.get(0);
+// Assert.assertEquals("name:Ljava/lang/String;", f.toString());
+// }
+// {
+// Field f = fields.get(1);
+// Assert.assertEquals("age:I", f.toString());
+// }
+ }
+ @Test
+ public void testMethods(){
+
+// List methods = clzFile.getMethods();
+// ConstantPool pool = clzFile.getConstantPool();
+//
+// {
+// Method m = methods.get(0);
+// assertMethodEquals(pool,m,
+// "",
+// "(Ljava/lang/String;I)V",
+// "2ab7000c2a2bb5000f2a1cb50011b1");
+//
+// }
+// {
+// Method m = methods.get(1);
+// assertMethodEquals(pool,m,
+// "setName",
+// "(Ljava/lang/String;)V",
+// "2a2bb5000fb1");
+//
+// }
+// {
+// Method m = methods.get(2);
+// assertMethodEquals(pool,m,
+// "setAge",
+// "(I)V",
+// "2a1bb50011b1");
+// }
+// {
+// Method m = methods.get(3);
+// assertMethodEquals(pool,m,
+// "sayHello",
+// "()V",
+// "b2001c1222b60024b1");
+//
+// }
+// {
+// Method m = methods.get(4);
+// assertMethodEquals(pool,m,
+// "main",
+// "([Ljava/lang/String;)V",
+// "bb000159122b101db7002d4c2bb6002fb1");
+// }
+ }
+
+ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){
+// String methodName = pool.getUTF8String(m.getNameIndex());
+// String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
+// String code = m.getCodeAttr().getCode();
+// Assert.assertEquals(expectedName, methodName);
+// Assert.assertEquals(expectedDesc, methodDesc);
+// Assert.assertEquals(expectedCode, code);
+ }
+
+}
diff --git a/group17/785396327/4.5/util/Util.java b/group17/785396327/4.5/util/Util.java
new file mode 100644
index 0000000000..9bcb3c4e10
--- /dev/null
+++ b/group17/785396327/4.5/util/Util.java
@@ -0,0 +1,27 @@
+package util;
+
+/**
+ * Created by IBM on 2017/4/10.
+ */
+public class Util {
+ public static int byteToInt(byte[] codes){
+ String s1 = byteToHexString(codes);
+ return Integer.valueOf(s1, 16).intValue();
+ }
+
+
+
+ public static String byteToHexString(byte[] codes ){
+ StringBuffer buffer = new StringBuffer();
+ for(int i=0;i
Date: Mon, 10 Apr 2017 23:53:14 +0800
Subject: [PATCH 011/151] test04 test05
---
group17/1158154002/.classpath | 2 +
.../src/test04/loader/ClassFileLoader.java | 61 ++++++++++
.../test04/loader/ClassFileloaderTest.java | 84 +++++++++++++
.../src/test04/loader/EmployeeV1.java | 28 +++++
.../src/test04/lru/LRUPageFrame.java | 112 +++++++++++++++++
.../src/test04/lru/LRUPageFrameTest.java | 29 +++++
.../1158154002/src/test05/stack/Stack.java | 43 +++++++
.../src/test05/stack/StackTest.java | 52 ++++++++
.../src/test05/stack/StackUtil.java | 113 ++++++++++++++++++
9 files changed, 524 insertions(+)
create mode 100644 group17/1158154002/src/test04/loader/ClassFileLoader.java
create mode 100644 group17/1158154002/src/test04/loader/ClassFileloaderTest.java
create mode 100644 group17/1158154002/src/test04/loader/EmployeeV1.java
create mode 100644 group17/1158154002/src/test04/lru/LRUPageFrame.java
create mode 100644 group17/1158154002/src/test04/lru/LRUPageFrameTest.java
create mode 100644 group17/1158154002/src/test05/stack/Stack.java
create mode 100644 group17/1158154002/src/test05/stack/StackTest.java
create mode 100644 group17/1158154002/src/test05/stack/StackUtil.java
diff --git a/group17/1158154002/.classpath b/group17/1158154002/.classpath
index 2d7497573f..44f39c3ace 100644
--- a/group17/1158154002/.classpath
+++ b/group17/1158154002/.classpath
@@ -3,5 +3,7 @@
+
+
diff --git a/group17/1158154002/src/test04/loader/ClassFileLoader.java b/group17/1158154002/src/test04/loader/ClassFileLoader.java
new file mode 100644
index 0000000000..0f144fbb43
--- /dev/null
+++ b/group17/1158154002/src/test04/loader/ClassFileLoader.java
@@ -0,0 +1,61 @@
+package test04.loader;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+
+
+public class ClassFileLoader {
+ private List clzPaths = new ArrayList();
+
+
+ public byte[] readBinaryCode(String className) {
+ className=className.replace(".", File.separator)+".class";
+ for (String path : clzPaths) {
+ String clzFileName=path+File.separator+className;
+ byte[] codes=loadClassFile(clzFileName);
+ if (codes!=null) {
+ return codes;
+ }
+ }
+ return null;
+
+
+ }
+
+ private byte[] loadClassFile(String clzFileName) {
+ File file=new File(clzFileName);
+ try {
+ return IOUtils.toByteArray(new FileInputStream(file));
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ return null;
+ }
+
+ }
+
+
+
+ public void addClassPath(String path) {
+ if (this.clzPaths.contains(path)) {
+ return;
+ }
+ this.clzPaths.add(path);
+ }
+
+ public String getClassPath_V1(){
+
+ return null;
+ }
+
+ public String getClassPath(){
+ return StringUtils.join(this.clzPaths,";");
+ }
+}
diff --git a/group17/1158154002/src/test04/loader/ClassFileloaderTest.java b/group17/1158154002/src/test04/loader/ClassFileloaderTest.java
new file mode 100644
index 0000000000..8897e72c91
--- /dev/null
+++ b/group17/1158154002/src/test04/loader/ClassFileloaderTest.java
@@ -0,0 +1,84 @@
+package test04.loader;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ClassFileloaderTest {
+
+ static String path1 = "D:/mygit/coding2017/group17/1158154002/bin/";
+ static String path2 = "file:/";
+
+
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testClassPath(){
+
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+ loader.addClassPath(path2);
+
+ String clzPath = loader.getClassPath();
+ System.out.println(clzPath);
+ Assert.assertEquals(path1+";"+path2,clzPath);
+
+ }
+
+ @Test
+ public void testClassFileLength() {
+
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+
+ String className = "test04.loader.EmployeeV1";
+
+ byte[] byteCodes = loader.readBinaryCode(className);
+
+ // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大
+ Assert.assertEquals(1036, byteCodes.length);
+
+ }
+
+
+ @Test
+ public void testMagicNumber(){
+ ClassFileLoader loader = new ClassFileLoader();
+ loader.addClassPath(path1);
+ String className = "test04.loader.EmployeeV1";
+ byte[] byteCodes = loader.readBinaryCode(className);
+ byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
+
+
+ String acctualValue = this.byteToHexString(codes);
+
+ Assert.assertEquals("cafebabe", acctualValue);
+ }
+
+
+
+
+
+
+ private String byteToHexString(byte[] codes ){
+ StringBuffer buffer = new StringBuffer();
+ for(int i=0;i elementData = new ArrayList