JVM test

Dependencies:   mbed

Committer:
lynxeyed_atsu
Date:
Sat Aug 24 07:00:51 2013 +0000
Revision:
5:047542b65d00
Child:
6:b9d0d96b052f
KL25Z JVM test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lynxeyed_atsu 5:047542b65d00 1 /*
lynxeyed_atsu 5:047542b65d00 2 * RAVEM.c
lynxeyed_atsu 5:047542b65d00 3 *
lynxeyed_atsu 5:047542b65d00 4 * Created on: return 2013/07/18
lynxeyed_atsu 5:047542b65d00 5 * Author: return lynxeyed
lynxeyed_atsu 5:047542b65d00 6 */
lynxeyed_atsu 5:047542b65d00 7 #include <stdio.h>
lynxeyed_atsu 5:047542b65d00 8 #include <string.h>
lynxeyed_atsu 5:047542b65d00 9 #include "ravem.h"
lynxeyed_atsu 5:047542b65d00 10
lynxeyed_atsu 5:047542b65d00 11
lynxeyed_atsu 5:047542b65d00 12 const unsigned char vm_array[] = {
lynxeyed_atsu 5:047542b65d00 13 0xCA, 0xFE, 0xBA, 0xBE, 0x00, 0x00, 0x00, 0x32, 0x00, 0x35, 0x0A, 0x00, 0x0F,
lynxeyed_atsu 5:047542b65d00 14 0x00, 0x1B, 0x09, 0x00, 0x1C, 0x00, 0x1D, 0x08, 0x00, 0x1E, 0x0A, 0x00, 0x1F, 0x00, 0x20, 0x0A,
lynxeyed_atsu 5:047542b65d00 15 0x00, 0x0B, 0x00, 0x21, 0x0A, 0x00, 0x1F, 0x00, 0x22, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
lynxeyed_atsu 5:047542b65d00 16 0x03, 0xE8, 0x0A, 0x00, 0x0B, 0x00, 0x23, 0x07, 0x00, 0x24, 0x07, 0x00, 0x25, 0x0A, 0x00, 0x0B,
lynxeyed_atsu 5:047542b65d00 17 0x00, 0x1B, 0x0A, 0x00, 0x0B, 0x00, 0x26, 0x08, 0x00, 0x27, 0x07, 0x00, 0x28, 0x01, 0x00, 0x06,
lynxeyed_atsu 5:047542b65d00 18 0x3C, 0x69, 0x6E, 0x69, 0x74, 0x3E, 0x01, 0x00, 0x03, 0x28, 0x29, 0x56, 0x01, 0x00, 0x04, 0x43,
lynxeyed_atsu 5:047542b65d00 19 0x6F, 0x64, 0x65, 0x01, 0x00, 0x0F, 0x4C, 0x69, 0x6E, 0x65, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72,
lynxeyed_atsu 5:047542b65d00 20 0x54, 0x61, 0x62, 0x6C, 0x65, 0x01, 0x00, 0x03, 0x72, 0x75, 0x6E, 0x01, 0x00, 0x0D, 0x53, 0x74,
lynxeyed_atsu 5:047542b65d00 21 0x61, 0x63, 0x6B, 0x4D, 0x61, 0x70, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x07, 0x00, 0x24, 0x01, 0x00,
lynxeyed_atsu 5:047542b65d00 22 0x04, 0x6D, 0x61, 0x69, 0x6E, 0x01, 0x00, 0x16, 0x28, 0x5B, 0x4C, 0x6A, 0x61, 0x76, 0x61, 0x2F,
lynxeyed_atsu 5:047542b65d00 23 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x29, 0x56, 0x01, 0x00,
lynxeyed_atsu 5:047542b65d00 24 0x0A, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6C, 0x65, 0x01, 0x00, 0x0A, 0x68, 0x6F,
lynxeyed_atsu 5:047542b65d00 25 0x67, 0x65, 0x31, 0x2E, 0x6A, 0x61, 0x76, 0x61, 0x0C, 0x00, 0x10, 0x00, 0x11, 0x07, 0x00, 0x29,
lynxeyed_atsu 5:047542b65d00 26 0x0C, 0x00, 0x2A, 0x00, 0x2B, 0x01, 0x00, 0x0E, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x4E,
lynxeyed_atsu 5:047542b65d00 27 0x75, 0x6D, 0x62, 0x65, 0x72, 0x3D, 0x07, 0x00, 0x2C, 0x0C, 0x00, 0x2D, 0x00, 0x2E, 0x0C, 0x00,
lynxeyed_atsu 5:047542b65d00 28 0x2F, 0x00, 0x30, 0x0C, 0x00, 0x31, 0x00, 0x2E, 0x0C, 0x00, 0x32, 0x00, 0x33, 0x01, 0x00, 0x1E,
lynxeyed_atsu 5:047542b65d00 29 0x6A, 0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x72,
lynxeyed_atsu 5:047542b65d00 30 0x75, 0x70, 0x74, 0x65, 0x64, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x01, 0x00,
lynxeyed_atsu 5:047542b65d00 31 0x05, 0x68, 0x6F, 0x67, 0x65, 0x31, 0x0C, 0x00, 0x34, 0x00, 0x11, 0x01, 0x00, 0x0B, 0x54, 0x68,
lynxeyed_atsu 5:047542b65d00 32 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x65, 0x73, 0x74, 0x01, 0x00, 0x10, 0x6A, 0x61, 0x76, 0x61,
lynxeyed_atsu 5:047542b65d00 33 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x01, 0x00, 0x10, 0x6A,
lynxeyed_atsu 5:047542b65d00 34 0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x01,
lynxeyed_atsu 5:047542b65d00 35 0x00, 0x03, 0x6F, 0x75, 0x74, 0x01, 0x00, 0x15, 0x4C, 0x6A, 0x61, 0x76, 0x61, 0x2F, 0x69, 0x6F,
lynxeyed_atsu 5:047542b65d00 36 0x2F, 0x50, 0x72, 0x69, 0x6E, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6D, 0x3B, 0x01, 0x00, 0x13,
lynxeyed_atsu 5:047542b65d00 37 0x6A, 0x61, 0x76, 0x61, 0x2F, 0x69, 0x6F, 0x2F, 0x50, 0x72, 0x69, 0x6E, 0x74, 0x53, 0x74, 0x72,
lynxeyed_atsu 5:047542b65d00 38 0x65, 0x61, 0x6D, 0x01, 0x00, 0x05, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x01, 0x00, 0x15, 0x28, 0x4C,
lynxeyed_atsu 5:047542b65d00 39 0x6A, 0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67,
lynxeyed_atsu 5:047542b65d00 40 0x3B, 0x29, 0x56, 0x01, 0x00, 0x07, 0x67, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x01, 0x00, 0x14,
lynxeyed_atsu 5:047542b65d00 41 0x28, 0x29, 0x4C, 0x6A, 0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x53, 0x74, 0x72,
lynxeyed_atsu 5:047542b65d00 42 0x69, 0x6E, 0x67, 0x3B, 0x01, 0x00, 0x07, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x6C, 0x6E, 0x01, 0x00,
lynxeyed_atsu 5:047542b65d00 43 0x05, 0x73, 0x6C, 0x65, 0x65, 0x70, 0x01, 0x00, 0x04, 0x28, 0x4A, 0x29, 0x56, 0x01, 0x00, 0x05,
lynxeyed_atsu 5:047542b65d00 44 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x20, 0x00, 0x0B, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
lynxeyed_atsu 5:047542b65d00 45 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1D, 0x00,
lynxeyed_atsu 5:047542b65d00 46 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x2A, 0xB7, 0x00, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x01,
lynxeyed_atsu 5:047542b65d00 47 0x00, 0x13, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x14,
lynxeyed_atsu 5:047542b65d00 48 0x00, 0x11, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x60, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
lynxeyed_atsu 5:047542b65d00 49 0x00, 0x1F, 0xB2, 0x00, 0x02, 0x12, 0x03, 0xB6, 0x00, 0x04, 0xB2, 0x00, 0x02, 0x2A, 0xB6, 0x00,
lynxeyed_atsu 5:047542b65d00 50 0x05, 0xB6, 0x00, 0x06, 0x14, 0x00, 0x07, 0xB8, 0x00, 0x09, 0xA7, 0xFF, 0xE8, 0x4C, 0xA7, 0xFF,
lynxeyed_atsu 5:047542b65d00 51 0xE4, 0x00, 0x01, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1B, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x13, 0x00,
lynxeyed_atsu 5:047542b65d00 52 0x00, 0x00, 0x1A, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x12, 0x00,
lynxeyed_atsu 5:047542b65d00 53 0x08, 0x00, 0x18, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x1C, 0x00, 0x0A, 0x00, 0x15, 0x00,
lynxeyed_atsu 5:047542b65d00 54 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x5A, 0x07, 0x00, 0x16, 0x00, 0x09, 0x00, 0x17, 0x00, 0x18,
lynxeyed_atsu 5:047542b65d00 55 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x21,
lynxeyed_atsu 5:047542b65d00 56 0xBB, 0x00, 0x0B, 0x59, 0xB7, 0x00, 0x0C, 0x4C, 0xBB, 0x00, 0x0B, 0x59, 0xB7, 0x00, 0x0C, 0x4D,
lynxeyed_atsu 5:047542b65d00 57 0x2B, 0xB6, 0x00, 0x0D, 0x2C, 0xB6, 0x00, 0x0D, 0xB2, 0x00, 0x02, 0x12, 0x0E, 0xB6, 0x00, 0x06,
lynxeyed_atsu 5:047542b65d00 58 0xB1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x06, 0x00, 0x00, 0x00,
lynxeyed_atsu 5:047542b65d00 59 0x11, 0x00, 0x08, 0x00, 0x12, 0x00, 0x10, 0x00, 0x14, 0x00, 0x14, 0x00, 0x15, 0x00, 0x18, 0x00,
lynxeyed_atsu 5:047542b65d00 60 0x17, 0x00, 0x20, 0x00, 0x18, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1A, 0x00,
lynxeyed_atsu 5:047542b65d00 61 0x00, 0x00
lynxeyed_atsu 5:047542b65d00 62 };
lynxeyed_atsu 5:047542b65d00 63
lynxeyed_atsu 5:047542b65d00 64 char cp_str[32];
lynxeyed_atsu 5:047542b65d00 65 uint8_t bc_str[32];
lynxeyed_atsu 5:047542b65d00 66 int32_t total_const_pool_num;
lynxeyed_atsu 5:047542b65d00 67 int32_t methods_count;
lynxeyed_atsu 5:047542b65d00 68
lynxeyed_atsu 5:047542b65d00 69 uint8_t *bc_seek(int bc_num, int length){
lynxeyed_atsu 5:047542b65d00 70 memcpy(bc_str, &vm_array[bc_num],length);
lynxeyed_atsu 5:047542b65d00 71 return bc_str;
lynxeyed_atsu 5:047542b65d00 72 }
lynxeyed_atsu 5:047542b65d00 73
lynxeyed_atsu 5:047542b65d00 74 int32_t getLengthOfConstantInfo(uint8_t constantType)
lynxeyed_atsu 5:047542b65d00 75 {
lynxeyed_atsu 5:047542b65d00 76 switch (constantType) {
lynxeyed_atsu 5:047542b65d00 77
lynxeyed_atsu 5:047542b65d00 78 case CONSTANT_Class:
lynxeyed_atsu 5:047542b65d00 79 case CONSTANT_String:
lynxeyed_atsu 5:047542b65d00 80 case CONSTANT_MethodType:
lynxeyed_atsu 5:047542b65d00 81 case CONSTANT_InvokeDynamic:
lynxeyed_atsu 5:047542b65d00 82 return 3;
lynxeyed_atsu 5:047542b65d00 83
lynxeyed_atsu 5:047542b65d00 84 case CONSTANT_Fieldref:
lynxeyed_atsu 5:047542b65d00 85 case CONSTANT_Methodref:
lynxeyed_atsu 5:047542b65d00 86 case CONSTANT_InterfaceMethodref:
lynxeyed_atsu 5:047542b65d00 87 case CONSTANT_Integer:
lynxeyed_atsu 5:047542b65d00 88 case CONSTANT_Float:
lynxeyed_atsu 5:047542b65d00 89 case CONSTANT_MethodHandle:
lynxeyed_atsu 5:047542b65d00 90 case CONSTANT_NameAndType:
lynxeyed_atsu 5:047542b65d00 91 return 5;
lynxeyed_atsu 5:047542b65d00 92
lynxeyed_atsu 5:047542b65d00 93 case CONSTANT_Long:
lynxeyed_atsu 5:047542b65d00 94 case CONSTANT_Double:
lynxeyed_atsu 5:047542b65d00 95 return 9;
lynxeyed_atsu 5:047542b65d00 96
lynxeyed_atsu 5:047542b65d00 97 case CONSTANT_Utf8:
lynxeyed_atsu 5:047542b65d00 98 return (-1); //4 or more (see 'length')
lynxeyed_atsu 5:047542b65d00 99
lynxeyed_atsu 5:047542b65d00 100 default:
lynxeyed_atsu 5:047542b65d00 101 return 0;
lynxeyed_atsu 5:047542b65d00 102 }
lynxeyed_atsu 5:047542b65d00 103 }
lynxeyed_atsu 5:047542b65d00 104
lynxeyed_atsu 5:047542b65d00 105 const_pool_t getConstantPoolInfo(int const_num){
lynxeyed_atsu 5:047542b65d00 106
lynxeyed_atsu 5:047542b65d00 107 const_pool_t c;
lynxeyed_atsu 5:047542b65d00 108 int i=0, j=1, length;
lynxeyed_atsu 5:047542b65d00 109
lynxeyed_atsu 5:047542b65d00 110 total_const_pool_num = (*bc_seek(8,1) << 8) + *bc_seek(9,1);
lynxeyed_atsu 5:047542b65d00 111
lynxeyed_atsu 5:047542b65d00 112 if ((const_num ==0)||(const_num >= total_const_pool_num))
lynxeyed_atsu 5:047542b65d00 113 {
lynxeyed_atsu 5:047542b65d00 114 c.index = 0;
lynxeyed_atsu 5:047542b65d00 115 return c;
lynxeyed_atsu 5:047542b65d00 116 }
lynxeyed_atsu 5:047542b65d00 117
lynxeyed_atsu 5:047542b65d00 118 while(1)
lynxeyed_atsu 5:047542b65d00 119 {
lynxeyed_atsu 5:047542b65d00 120 c.tag = *bc_seek(10+i,1); // tag
lynxeyed_atsu 5:047542b65d00 121 length = getLengthOfConstantInfo(*bc_seek(10+i,1));
lynxeyed_atsu 5:047542b65d00 122
lynxeyed_atsu 5:047542b65d00 123 // Constant_UTF8
lynxeyed_atsu 5:047542b65d00 124 if(length == -1){
lynxeyed_atsu 5:047542b65d00 125 length = ((*bc_seek(11+i,1)<<8) + *bc_seek(12+i,1)) + 3 /* tag + length = 3byte*/ ;
lynxeyed_atsu 5:047542b65d00 126 }
lynxeyed_atsu 5:047542b65d00 127
lynxeyed_atsu 5:047542b65d00 128 if(j == const_num)break;
lynxeyed_atsu 5:047542b65d00 129 if((c.tag == CONSTANT_Long)||(c.tag == CONSTANT_Double)){
lynxeyed_atsu 5:047542b65d00 130 j = j + 2;
lynxeyed_atsu 5:047542b65d00 131 }else{
lynxeyed_atsu 5:047542b65d00 132 j = j + 1;
lynxeyed_atsu 5:047542b65d00 133 }
lynxeyed_atsu 5:047542b65d00 134
lynxeyed_atsu 5:047542b65d00 135 if(j >= total_const_pool_num)break;
lynxeyed_atsu 5:047542b65d00 136 i += length;
lynxeyed_atsu 5:047542b65d00 137 }
lynxeyed_atsu 5:047542b65d00 138
lynxeyed_atsu 5:047542b65d00 139 c.index = ((*bc_seek(11+i,1)<<8) + *bc_seek(12+i,1));
lynxeyed_atsu 5:047542b65d00 140 c.index2 = ((*bc_seek(13+i,1)<<8) + *bc_seek(14+i,1));
lynxeyed_atsu 5:047542b65d00 141 c.bc_num = 10 + i; //todo: fix this
lynxeyed_atsu 5:047542b65d00 142 switch(c.tag)
lynxeyed_atsu 5:047542b65d00 143 {
lynxeyed_atsu 5:047542b65d00 144 case CONSTANT_Utf8:
lynxeyed_atsu 5:047542b65d00 145 memcpy((char*)cp_str, bc_seek(13+i,c.index), c.index);
lynxeyed_atsu 5:047542b65d00 146 cp_str[c.index] = '\0';
lynxeyed_atsu 5:047542b65d00 147 c.stack_pt = (char *)&cp_str;
lynxeyed_atsu 5:047542b65d00 148 break;
lynxeyed_atsu 5:047542b65d00 149
lynxeyed_atsu 5:047542b65d00 150 //case CONSTANT_Float:
lynxeyed_atsu 5:047542b65d00 151 //case CONSTANT_Long:
lynxeyed_atsu 5:047542b65d00 152 //case CONSTANT_Double:
lynxeyed_atsu 5:047542b65d00 153 case CONSTANT_Integer:
lynxeyed_atsu 5:047542b65d00 154 case CONSTANT_Float:
lynxeyed_atsu 5:047542b65d00 155 c.index = (*bc_seek(11+i,1)<<24) + (*bc_seek(12+i,1) << 16) + (*bc_seek(13+i,1)<<8) + *bc_seek(14+i,1);
lynxeyed_atsu 5:047542b65d00 156 break;
lynxeyed_atsu 5:047542b65d00 157 case CONSTANT_Double:
lynxeyed_atsu 5:047542b65d00 158 case CONSTANT_Long:
lynxeyed_atsu 5:047542b65d00 159 c.index = (*bc_seek(11+i,1)<<24) + (*bc_seek(12+i,1) << 16) + (*bc_seek(13+i,1)<<8) + *bc_seek(14+i,1);
lynxeyed_atsu 5:047542b65d00 160 c.index2 = (*bc_seek(15+i,1)<<24) + (*bc_seek(16+i,1) << 16) + (*bc_seek(17+i,1)<<8) + *bc_seek(18+i,1);
lynxeyed_atsu 5:047542b65d00 161 break;
lynxeyed_atsu 5:047542b65d00 162 default:
lynxeyed_atsu 5:047542b65d00 163 break;
lynxeyed_atsu 5:047542b65d00 164
lynxeyed_atsu 5:047542b65d00 165 }
lynxeyed_atsu 5:047542b65d00 166
lynxeyed_atsu 5:047542b65d00 167 return c;
lynxeyed_atsu 5:047542b65d00 168 }
lynxeyed_atsu 5:047542b65d00 169
lynxeyed_atsu 5:047542b65d00 170 //seek class_name_index,Strings,Numerics from Constant Pool
lynxeyed_atsu 5:047542b65d00 171 const_pool_t seekConstClassNumString(int const_num)
lynxeyed_atsu 5:047542b65d00 172 {
lynxeyed_atsu 5:047542b65d00 173 const_pool_t c;
lynxeyed_atsu 5:047542b65d00 174 c = getConstantPoolInfo(const_num);
lynxeyed_atsu 5:047542b65d00 175
lynxeyed_atsu 5:047542b65d00 176 switch (c.tag)
lynxeyed_atsu 5:047542b65d00 177 {
lynxeyed_atsu 5:047542b65d00 178 case CONSTANT_String:
lynxeyed_atsu 5:047542b65d00 179 case CONSTANT_Class:
lynxeyed_atsu 5:047542b65d00 180 c = getConstantPoolInfo(c.index);
lynxeyed_atsu 5:047542b65d00 181 break;
lynxeyed_atsu 5:047542b65d00 182
lynxeyed_atsu 5:047542b65d00 183 default:
lynxeyed_atsu 5:047542b65d00 184 break;
lynxeyed_atsu 5:047542b65d00 185 }
lynxeyed_atsu 5:047542b65d00 186 return c;
lynxeyed_atsu 5:047542b65d00 187 }
lynxeyed_atsu 5:047542b65d00 188
lynxeyed_atsu 5:047542b65d00 189 // for methodref & Fieldref
lynxeyed_atsu 5:047542b65d00 190 const_pool_t seekClassIndex(int const_num){
lynxeyed_atsu 5:047542b65d00 191 const_pool_t c;
lynxeyed_atsu 5:047542b65d00 192 c = getConstantPoolInfo(const_num);
lynxeyed_atsu 5:047542b65d00 193
lynxeyed_atsu 5:047542b65d00 194 switch(c.tag)
lynxeyed_atsu 5:047542b65d00 195 {
lynxeyed_atsu 5:047542b65d00 196 case CONSTANT_Methodref:
lynxeyed_atsu 5:047542b65d00 197 case CONSTANT_Fieldref:
lynxeyed_atsu 5:047542b65d00 198 c = seekConstClassNumString(c.index);
lynxeyed_atsu 5:047542b65d00 199 break;
lynxeyed_atsu 5:047542b65d00 200
lynxeyed_atsu 5:047542b65d00 201 default:
lynxeyed_atsu 5:047542b65d00 202 break; // in fact,we must program in error process but tedious;-P
lynxeyed_atsu 5:047542b65d00 203 }
lynxeyed_atsu 5:047542b65d00 204
lynxeyed_atsu 5:047542b65d00 205 return c;
lynxeyed_atsu 5:047542b65d00 206 }
lynxeyed_atsu 5:047542b65d00 207
lynxeyed_atsu 5:047542b65d00 208 // For NameAndType:name index
lynxeyed_atsu 5:047542b65d00 209 const_pool_t seekNameAndType_name(int const_num){
lynxeyed_atsu 5:047542b65d00 210 const_pool_t c;
lynxeyed_atsu 5:047542b65d00 211 c = getConstantPoolInfo(const_num);
lynxeyed_atsu 5:047542b65d00 212
lynxeyed_atsu 5:047542b65d00 213
lynxeyed_atsu 5:047542b65d00 214 switch(c.tag)
lynxeyed_atsu 5:047542b65d00 215 {
lynxeyed_atsu 5:047542b65d00 216 case CONSTANT_Methodref:
lynxeyed_atsu 5:047542b65d00 217 case CONSTANT_Fieldref:
lynxeyed_atsu 5:047542b65d00 218 c = getConstantPoolInfo(c.index2); //Constant_NAmeAndType
lynxeyed_atsu 5:047542b65d00 219 // do not insert break; here
lynxeyed_atsu 5:047542b65d00 220
lynxeyed_atsu 5:047542b65d00 221 case CONSTANT_NameAndType:
lynxeyed_atsu 5:047542b65d00 222 c = seekConstClassNumString(c.index);
lynxeyed_atsu 5:047542b65d00 223 break;
lynxeyed_atsu 5:047542b65d00 224
lynxeyed_atsu 5:047542b65d00 225 default:
lynxeyed_atsu 5:047542b65d00 226 break; // in fact,we must program in error process but tedious;-P
lynxeyed_atsu 5:047542b65d00 227 }
lynxeyed_atsu 5:047542b65d00 228 return c;
lynxeyed_atsu 5:047542b65d00 229 }
lynxeyed_atsu 5:047542b65d00 230
lynxeyed_atsu 5:047542b65d00 231
lynxeyed_atsu 5:047542b65d00 232 // For NameAndType:descriptor
lynxeyed_atsu 5:047542b65d00 233 const_pool_t seekNameAndType_desc(int const_num){
lynxeyed_atsu 5:047542b65d00 234 const_pool_t c;
lynxeyed_atsu 5:047542b65d00 235 c = getConstantPoolInfo(const_num);
lynxeyed_atsu 5:047542b65d00 236
lynxeyed_atsu 5:047542b65d00 237 switch(c.tag)
lynxeyed_atsu 5:047542b65d00 238 {
lynxeyed_atsu 5:047542b65d00 239 case CONSTANT_Methodref:
lynxeyed_atsu 5:047542b65d00 240 case CONSTANT_Fieldref:
lynxeyed_atsu 5:047542b65d00 241 c = getConstantPoolInfo(c.index2); // Constant_NAmeAndType
lynxeyed_atsu 5:047542b65d00 242 c = seekConstClassNumString(c.index2);
lynxeyed_atsu 5:047542b65d00 243 break;
lynxeyed_atsu 5:047542b65d00 244
lynxeyed_atsu 5:047542b65d00 245 case CONSTANT_NameAndType:
lynxeyed_atsu 5:047542b65d00 246 c = seekConstClassNumString(c.index2);
lynxeyed_atsu 5:047542b65d00 247 break;
lynxeyed_atsu 5:047542b65d00 248
lynxeyed_atsu 5:047542b65d00 249 default:
lynxeyed_atsu 5:047542b65d00 250 break;
lynxeyed_atsu 5:047542b65d00 251
lynxeyed_atsu 5:047542b65d00 252 }
lynxeyed_atsu 5:047542b65d00 253 return c;
lynxeyed_atsu 5:047542b65d00 254 }
lynxeyed_atsu 5:047542b65d00 255
lynxeyed_atsu 5:047542b65d00 256 class_st seekCodeArrtibute(class_st cl, char* method_name,int strlen){
lynxeyed_atsu 5:047542b65d00 257
lynxeyed_atsu 5:047542b65d00 258 int i,j;
lynxeyed_atsu 5:047542b65d00 259 int length,cmp;
lynxeyed_atsu 5:047542b65d00 260 volatile int pointr;
lynxeyed_atsu 5:047542b65d00 261 int attribute_length, attributes_count,fields_count;
lynxeyed_atsu 5:047542b65d00 262 const_pool_t z;
lynxeyed_atsu 5:047542b65d00 263 cl.code_length = 0;
lynxeyed_atsu 5:047542b65d00 264
lynxeyed_atsu 5:047542b65d00 265
lynxeyed_atsu 5:047542b65d00 266 // get length of Constant_pool[last_num]
lynxeyed_atsu 5:047542b65d00 267 z = getConstantPoolInfo(total_const_pool_num - 1);
lynxeyed_atsu 5:047542b65d00 268
lynxeyed_atsu 5:047542b65d00 269 if(z.tag == CONSTANT_Utf8) length = z.index + 3; else length = getLengthOfConstantInfo(z.tag);
lynxeyed_atsu 5:047542b65d00 270
lynxeyed_atsu 5:047542b65d00 271 pointr = z.bc_num + length;
lynxeyed_atsu 5:047542b65d00 272
lynxeyed_atsu 5:047542b65d00 273 // seek pointr to interfaces_count
lynxeyed_atsu 5:047542b65d00 274 pointr +=
lynxeyed_atsu 5:047542b65d00 275 + 2 // access_flag
lynxeyed_atsu 5:047542b65d00 276 + 2 // this_class
lynxeyed_atsu 5:047542b65d00 277 + 2 // super_class
lynxeyed_atsu 5:047542b65d00 278 ;
lynxeyed_atsu 5:047542b65d00 279
lynxeyed_atsu 5:047542b65d00 280 pointr += (((*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1)) * 2) + 2; // 2 = length of 'interfaces_count'
lynxeyed_atsu 5:047542b65d00 281
lynxeyed_atsu 5:047542b65d00 282 // now, pointr's locate is fields_count(2bytes)
lynxeyed_atsu 5:047542b65d00 283 fields_count = ((*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1));
lynxeyed_atsu 5:047542b65d00 284 pointr += 2; // fields_count
lynxeyed_atsu 5:047542b65d00 285
lynxeyed_atsu 5:047542b65d00 286 if(fields_count != 0){
lynxeyed_atsu 5:047542b65d00 287 // fields info
lynxeyed_atsu 5:047542b65d00 288 for(i = 0 ; i < fields_count ; i++){
lynxeyed_atsu 5:047542b65d00 289 pointr +=
lynxeyed_atsu 5:047542b65d00 290 + 2 // access_flags
lynxeyed_atsu 5:047542b65d00 291 + 2 // name_index
lynxeyed_atsu 5:047542b65d00 292 + 2 // descriptor_index
lynxeyed_atsu 5:047542b65d00 293 ;
lynxeyed_atsu 5:047542b65d00 294 attributes_count = (*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1);
lynxeyed_atsu 5:047542b65d00 295 pointr += 2;
lynxeyed_atsu 5:047542b65d00 296 pointr += attributes_count;
lynxeyed_atsu 5:047542b65d00 297 }
lynxeyed_atsu 5:047542b65d00 298 }
lynxeyed_atsu 5:047542b65d00 299
lynxeyed_atsu 5:047542b65d00 300 // now, pointr's locate is methods_count(2bytes)
lynxeyed_atsu 5:047542b65d00 301 methods_count = ((*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1));
lynxeyed_atsu 5:047542b65d00 302 pointr += 2; // method info (access_flag)
lynxeyed_atsu 5:047542b65d00 303 for(i = 0 ; i < methods_count; i++)
lynxeyed_atsu 5:047542b65d00 304 {
lynxeyed_atsu 5:047542b65d00 305
lynxeyed_atsu 5:047542b65d00 306 pointr += 2; // name_index
lynxeyed_atsu 5:047542b65d00 307
lynxeyed_atsu 5:047542b65d00 308 z = getConstantPoolInfo((*bc_seek(pointr,1)<<8)+*bc_seek(pointr + 1,1));
lynxeyed_atsu 5:047542b65d00 309 cmp = strncmp((const char*)z.stack_pt,method_name,strlen);
lynxeyed_atsu 5:047542b65d00 310
lynxeyed_atsu 5:047542b65d00 311 pointr += 2; //descriptor_index;
lynxeyed_atsu 5:047542b65d00 312 pointr += 2;
lynxeyed_atsu 5:047542b65d00 313
lynxeyed_atsu 5:047542b65d00 314 attributes_count = ((*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1));
lynxeyed_atsu 5:047542b65d00 315 pointr += 2; //attributes_count;
lynxeyed_atsu 5:047542b65d00 316
lynxeyed_atsu 5:047542b65d00 317 for(j = 0 ; j < attributes_count ; j++)
lynxeyed_atsu 5:047542b65d00 318 {
lynxeyed_atsu 5:047542b65d00 319 pointr = pointr + 2; //attribute_name_index
lynxeyed_atsu 5:047542b65d00 320 attribute_length = (*bc_seek(pointr,1) << 24)
lynxeyed_atsu 5:047542b65d00 321 + (*bc_seek(pointr + 1,1) << 16)
lynxeyed_atsu 5:047542b65d00 322 + (*bc_seek(pointr + 2,1) << 8)
lynxeyed_atsu 5:047542b65d00 323 + *bc_seek(pointr + 3,1)
lynxeyed_atsu 5:047542b65d00 324 ;
lynxeyed_atsu 5:047542b65d00 325
lynxeyed_atsu 5:047542b65d00 326 pointr += 4; //attribute_length
lynxeyed_atsu 5:047542b65d00 327 if(!cmp)
lynxeyed_atsu 5:047542b65d00 328 {
lynxeyed_atsu 5:047542b65d00 329 cl.stack_num = (*bc_seek(pointr,1) << 8) + *bc_seek(pointr+1,1);
lynxeyed_atsu 5:047542b65d00 330 cl.local_num = (*bc_seek(pointr+2,1) << 8) + *bc_seek(pointr+3,1);
lynxeyed_atsu 5:047542b65d00 331 cl.code_length = (*bc_seek(pointr + 4,1) << 24)
lynxeyed_atsu 5:047542b65d00 332 + (*bc_seek(pointr + 5,1) << 16)
lynxeyed_atsu 5:047542b65d00 333 + (*bc_seek(pointr + 6,1) << 8)
lynxeyed_atsu 5:047542b65d00 334 + *bc_seek(pointr + 7,1)
lynxeyed_atsu 5:047542b65d00 335 ;
lynxeyed_atsu 5:047542b65d00 336 cl.bc_offset = pointr + 8;
lynxeyed_atsu 5:047542b65d00 337 cl.code_offset = 0;
lynxeyed_atsu 5:047542b65d00 338 }
lynxeyed_atsu 5:047542b65d00 339 pointr += attribute_length; // code attribute
lynxeyed_atsu 5:047542b65d00 340 }
lynxeyed_atsu 5:047542b65d00 341 }
lynxeyed_atsu 5:047542b65d00 342
lynxeyed_atsu 5:047542b65d00 343 return cl;
lynxeyed_atsu 5:047542b65d00 344 }
lynxeyed_atsu 5:047542b65d00 345
lynxeyed_atsu 5:047542b65d00 346 char* getStringFromOperandStack(class_st cl)
lynxeyed_atsu 5:047542b65d00 347 {
lynxeyed_atsu 5:047542b65d00 348 int i;
lynxeyed_atsu 5:047542b65d00 349 const_pool_t cp;
lynxeyed_atsu 5:047542b65d00 350
lynxeyed_atsu 5:047542b65d00 351 for(i = 0 ; i < cl.stack_num ; i++){
lynxeyed_atsu 5:047542b65d00 352 if(cl.op_stack_type[i]==0){ // seek top of stack
lynxeyed_atsu 5:047542b65d00 353 if(i == 0)return NULL; // return NULL if operand stack has no stack
lynxeyed_atsu 5:047542b65d00 354 break;
lynxeyed_atsu 5:047542b65d00 355 }
lynxeyed_atsu 5:047542b65d00 356 }
lynxeyed_atsu 5:047542b65d00 357
lynxeyed_atsu 5:047542b65d00 358 i = i - 1;
lynxeyed_atsu 5:047542b65d00 359
lynxeyed_atsu 5:047542b65d00 360 if(cl.op_stack_type[i] == Stack_ConstantPool){
lynxeyed_atsu 5:047542b65d00 361 cp = seekConstClassNumString(cl.op_stack[i]);
lynxeyed_atsu 5:047542b65d00 362 cl.op_stack_type[i] = Stack_Nothing;
lynxeyed_atsu 5:047542b65d00 363 return (char*)cp.stack_pt;
lynxeyed_atsu 5:047542b65d00 364 }
lynxeyed_atsu 5:047542b65d00 365 if(cl.op_stack_type[i] == Stack_IntType){
lynxeyed_atsu 5:047542b65d00 366 cl.op_stack_type[i] = Stack_Nothing;
lynxeyed_atsu 5:047542b65d00 367 sprintf(cp_str,"%d",cl.op_stack[i]);
lynxeyed_atsu 5:047542b65d00 368 return cp_str;
lynxeyed_atsu 5:047542b65d00 369 }
lynxeyed_atsu 5:047542b65d00 370 if(cl.op_stack_type[i] == Stack_CharType){
lynxeyed_atsu 5:047542b65d00 371 cl.op_stack_type[i] = Stack_Nothing;
lynxeyed_atsu 5:047542b65d00 372 sprintf(cp_str,"%c",(char)cl.op_stack[i]);
lynxeyed_atsu 5:047542b65d00 373 return cp_str;
lynxeyed_atsu 5:047542b65d00 374 }
lynxeyed_atsu 5:047542b65d00 375
lynxeyed_atsu 5:047542b65d00 376 return NULL;
lynxeyed_atsu 5:047542b65d00 377 }
lynxeyed_atsu 5:047542b65d00 378
lynxeyed_atsu 5:047542b65d00 379 int getIntegerFromOperandStack(class_st cl){
lynxeyed_atsu 5:047542b65d00 380 int i;
lynxeyed_atsu 5:047542b65d00 381 const_pool_t cp;
lynxeyed_atsu 5:047542b65d00 382
lynxeyed_atsu 5:047542b65d00 383 for(i = 0 ; i < cl.stack_num ; i++){
lynxeyed_atsu 5:047542b65d00 384 if(cl.op_stack_type[i]==0){ // seek top of stack
lynxeyed_atsu 5:047542b65d00 385 if(i == 0)return 0;
lynxeyed_atsu 5:047542b65d00 386 break;
lynxeyed_atsu 5:047542b65d00 387 }
lynxeyed_atsu 5:047542b65d00 388 }
lynxeyed_atsu 5:047542b65d00 389 i = i - 1;
lynxeyed_atsu 5:047542b65d00 390
lynxeyed_atsu 5:047542b65d00 391 if(cl.op_stack_type[i] == Stack_ConstantPool){ // Const_Integer
lynxeyed_atsu 5:047542b65d00 392 cp = seekConstClassNumString(cl.op_stack[i]);
lynxeyed_atsu 5:047542b65d00 393 cl.op_stack_type[i] = 0;
lynxeyed_atsu 5:047542b65d00 394 if((cp.tag == CONSTANT_Long)||(cp.tag == CONSTANT_Double))
lynxeyed_atsu 5:047542b65d00 395 return (cp.index2);
lynxeyed_atsu 5:047542b65d00 396 else
lynxeyed_atsu 5:047542b65d00 397 return (cp.index);
lynxeyed_atsu 5:047542b65d00 398 }
lynxeyed_atsu 5:047542b65d00 399
lynxeyed_atsu 5:047542b65d00 400 if(cl.op_stack_type[i] == Stack_IntType){ // stack direct
lynxeyed_atsu 5:047542b65d00 401 cl.op_stack_type[i] = 0;
lynxeyed_atsu 5:047542b65d00 402 return cl.op_stack[i];
lynxeyed_atsu 5:047542b65d00 403 }
lynxeyed_atsu 5:047542b65d00 404 return 0;
lynxeyed_atsu 5:047542b65d00 405 }
lynxeyed_atsu 5:047542b65d00 406
lynxeyed_atsu 5:047542b65d00 407 class_st setStackFromConstantPool(class_st cl, int cp_num){
lynxeyed_atsu 5:047542b65d00 408
lynxeyed_atsu 5:047542b65d00 409 int i;
lynxeyed_atsu 5:047542b65d00 410 for(i=0 ; i < cl.stack_num ; i++){
lynxeyed_atsu 5:047542b65d00 411 if(cl.op_stack_type[i]==0){ // seek top of stack
lynxeyed_atsu 5:047542b65d00 412 break;
lynxeyed_atsu 5:047542b65d00 413 }
lynxeyed_atsu 5:047542b65d00 414 }
lynxeyed_atsu 5:047542b65d00 415
lynxeyed_atsu 5:047542b65d00 416 if((i == cl.stack_num - 1)&&(cl.op_stack_type[i] != 0))
lynxeyed_atsu 5:047542b65d00 417 return cl;// stack full
lynxeyed_atsu 5:047542b65d00 418
lynxeyed_atsu 5:047542b65d00 419 cl.op_stack_type[i] = Stack_ConstantPool;
lynxeyed_atsu 5:047542b65d00 420 cl.op_stack[i] = cp_num;
lynxeyed_atsu 5:047542b65d00 421 i = i + 1;
lynxeyed_atsu 5:047542b65d00 422 if(i == cl.stack_num)
lynxeyed_atsu 5:047542b65d00 423 return cl;
lynxeyed_atsu 5:047542b65d00 424 else
lynxeyed_atsu 5:047542b65d00 425 cl.op_stack_type[i] = Stack_Nothing;
lynxeyed_atsu 5:047542b65d00 426
lynxeyed_atsu 5:047542b65d00 427 return cl;
lynxeyed_atsu 5:047542b65d00 428 }
lynxeyed_atsu 5:047542b65d00 429
lynxeyed_atsu 5:047542b65d00 430 class_st changeStackType(class_st cl, int type){
lynxeyed_atsu 5:047542b65d00 431
lynxeyed_atsu 5:047542b65d00 432 int i;
lynxeyed_atsu 5:047542b65d00 433 for(i=0 ; i < cl.stack_num ; i++){
lynxeyed_atsu 5:047542b65d00 434 if(cl.op_stack_type[i]==0){ // seek top of stack
lynxeyed_atsu 5:047542b65d00 435 break;
lynxeyed_atsu 5:047542b65d00 436 }
lynxeyed_atsu 5:047542b65d00 437 }
lynxeyed_atsu 5:047542b65d00 438
lynxeyed_atsu 5:047542b65d00 439 i = i - 1;
lynxeyed_atsu 5:047542b65d00 440
lynxeyed_atsu 5:047542b65d00 441 cl.op_stack_type[i] = type;
lynxeyed_atsu 5:047542b65d00 442 return cl;
lynxeyed_atsu 5:047542b65d00 443 }
lynxeyed_atsu 5:047542b65d00 444
lynxeyed_atsu 5:047542b65d00 445
lynxeyed_atsu 5:047542b65d00 446 class_st setIntegerToStack(class_st cl, int num){
lynxeyed_atsu 5:047542b65d00 447
lynxeyed_atsu 5:047542b65d00 448 int i;
lynxeyed_atsu 5:047542b65d00 449 for(i = 0 ; i < cl.stack_num ; i++){
lynxeyed_atsu 5:047542b65d00 450 if(cl.op_stack_type[i]==0){ // seek top of stack
lynxeyed_atsu 5:047542b65d00 451 break;
lynxeyed_atsu 5:047542b65d00 452 }
lynxeyed_atsu 5:047542b65d00 453 }
lynxeyed_atsu 5:047542b65d00 454
lynxeyed_atsu 5:047542b65d00 455 if((i == cl.stack_num - 1)&&(cl.op_stack_type[i]!=0))
lynxeyed_atsu 5:047542b65d00 456 return cl;// stack full
lynxeyed_atsu 5:047542b65d00 457
lynxeyed_atsu 5:047542b65d00 458 cl.op_stack_type[i] = Stack_IntType;
lynxeyed_atsu 5:047542b65d00 459 cl.op_stack[i] = num;
lynxeyed_atsu 5:047542b65d00 460 i = i + 1;
lynxeyed_atsu 5:047542b65d00 461 if(i == cl.stack_num)
lynxeyed_atsu 5:047542b65d00 462 return cl;
lynxeyed_atsu 5:047542b65d00 463 else
lynxeyed_atsu 5:047542b65d00 464 cl.op_stack_type[i] = Stack_Nothing;
lynxeyed_atsu 5:047542b65d00 465
lynxeyed_atsu 5:047542b65d00 466 return cl;
lynxeyed_atsu 5:047542b65d00 467 }
lynxeyed_atsu 5:047542b65d00 468
lynxeyed_atsu 5:047542b65d00 469 class_st putField(class_st cl, int cp_num){
lynxeyed_atsu 5:047542b65d00 470
lynxeyed_atsu 5:047542b65d00 471
lynxeyed_atsu 5:047542b65d00 472 if(strncmp((const char *)seekNameAndType_desc(cp_num).stack_pt,"I",1) == 0){ // int type
lynxeyed_atsu 5:047542b65d00 473 if(cl.field_num == 0){ // first mem alloc
lynxeyed_atsu 5:047542b65d00 474
lynxeyed_atsu 5:047542b65d00 475 cl.field_mem_reg = (int *)pool_alloc(sizeof(int) * 1);
lynxeyed_atsu 5:047542b65d00 476 cl.field_mem_type = (int *)pool_alloc(sizeof(int) * 1);
lynxeyed_atsu 5:047542b65d00 477 cl.field_num = cl.field_num + 1;
lynxeyed_atsu 5:047542b65d00 478
lynxeyed_atsu 5:047542b65d00 479 cl.field_mem_reg[0] = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 480 cl.field_mem_type[0] = cp_num;
lynxeyed_atsu 5:047542b65d00 481
lynxeyed_atsu 5:047542b65d00 482 return cl;
lynxeyed_atsu 5:047542b65d00 483 }
lynxeyed_atsu 5:047542b65d00 484 else{ // field_num != 0
lynxeyed_atsu 5:047542b65d00 485 int i;
lynxeyed_atsu 5:047542b65d00 486 for(i = 0; i < cl.field_num ; i++){
lynxeyed_atsu 5:047542b65d00 487 if(cl.field_mem_type[i] == cp_num){ //already exists
lynxeyed_atsu 5:047542b65d00 488 cl.field_mem_reg[i] = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 489 return cl;
lynxeyed_atsu 5:047542b65d00 490 }
lynxeyed_atsu 5:047542b65d00 491 }//
lynxeyed_atsu 5:047542b65d00 492 cl.field_num = cl.field_num + 1;
lynxeyed_atsu 5:047542b65d00 493 cl.field_mem_reg = (int *)pool_realloc(cl.field_mem_reg, sizeof(int) * (cl.field_num));
lynxeyed_atsu 5:047542b65d00 494 cl.field_mem_type = (int *)pool_realloc(cl.field_mem_type, sizeof(int) * (cl.field_num));
lynxeyed_atsu 5:047542b65d00 495
lynxeyed_atsu 5:047542b65d00 496 cl.field_mem_reg[cl.field_num - 1] = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 497 cl.field_mem_type[cl.field_num - 1] = cp_num;
lynxeyed_atsu 5:047542b65d00 498
lynxeyed_atsu 5:047542b65d00 499 return cl;
lynxeyed_atsu 5:047542b65d00 500 }
lynxeyed_atsu 5:047542b65d00 501 }
lynxeyed_atsu 5:047542b65d00 502
lynxeyed_atsu 5:047542b65d00 503 //memcpy(&cl.field_mem_reg, &s,strlen(s));
lynxeyed_atsu 5:047542b65d00 504 return cl;
lynxeyed_atsu 5:047542b65d00 505 }
lynxeyed_atsu 5:047542b65d00 506
lynxeyed_atsu 5:047542b65d00 507 class_st getField(class_st cl,int cp_num){
lynxeyed_atsu 5:047542b65d00 508
lynxeyed_atsu 5:047542b65d00 509 if(strncmp((const char *)seekNameAndType_desc(cp_num).stack_pt,"I",1) == 0){ // int type
lynxeyed_atsu 5:047542b65d00 510 int i;
lynxeyed_atsu 5:047542b65d00 511 for(i = 0; i < cl.field_num ; i++){
lynxeyed_atsu 5:047542b65d00 512 if(cl.field_mem_type[i] == cp_num){ //already exists
lynxeyed_atsu 5:047542b65d00 513 cl = setIntegerToStack(cl,cl.field_mem_reg[i]);
lynxeyed_atsu 5:047542b65d00 514 return cl;
lynxeyed_atsu 5:047542b65d00 515 }
lynxeyed_atsu 5:047542b65d00 516 }
lynxeyed_atsu 5:047542b65d00 517 char s[32];
lynxeyed_atsu 5:047542b65d00 518 sprintf(s,"Fnum=%d,memtype=%d,reg=%d\r\n",cl.field_num,cl.field_mem_type[0],cl.field_mem_reg[0]);
lynxeyed_atsu 5:047542b65d00 519 uart_print(s);
lynxeyed_atsu 5:047542b65d00 520 uart_print("getField error\r\n");
lynxeyed_atsu 5:047542b65d00 521 }
lynxeyed_atsu 5:047542b65d00 522 return cl;
lynxeyed_atsu 5:047542b65d00 523 }
lynxeyed_atsu 5:047542b65d00 524
lynxeyed_atsu 5:047542b65d00 525
lynxeyed_atsu 5:047542b65d00 526 class_st decodeVM(class_st cl){
lynxeyed_atsu 5:047542b65d00 527
lynxeyed_atsu 5:047542b65d00 528 int now_code = 0;
lynxeyed_atsu 5:047542b65d00 529
lynxeyed_atsu 5:047542b65d00 530
lynxeyed_atsu 5:047542b65d00 531 now_code = cl.bc_offset + cl.code_offset;
lynxeyed_atsu 5:047542b65d00 532 switch(*bc_seek(now_code,1)){
lynxeyed_atsu 5:047542b65d00 533 case JAVA_nop:
lynxeyed_atsu 5:047542b65d00 534 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 535 break;
lynxeyed_atsu 5:047542b65d00 536
lynxeyed_atsu 5:047542b65d00 537 case JAVA_ldc2_w:
lynxeyed_atsu 5:047542b65d00 538 cl = setStackFromConstantPool(cl, (*bc_seek(now_code + 1,1)<<8) + *bc_seek(now_code + 2,1));
lynxeyed_atsu 5:047542b65d00 539 now_code = now_code + 3;
lynxeyed_atsu 5:047542b65d00 540 break;
lynxeyed_atsu 5:047542b65d00 541 case JAVA_ldc:
lynxeyed_atsu 5:047542b65d00 542 cl = setStackFromConstantPool(cl, *bc_seek(now_code + 1,1));
lynxeyed_atsu 5:047542b65d00 543 now_code = now_code + 2;
lynxeyed_atsu 5:047542b65d00 544 break;
lynxeyed_atsu 5:047542b65d00 545
lynxeyed_atsu 5:047542b65d00 546 case JAVA_iconst_0:
lynxeyed_atsu 5:047542b65d00 547 cl = setIntegerToStack(cl,0);
lynxeyed_atsu 5:047542b65d00 548 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 549 break;
lynxeyed_atsu 5:047542b65d00 550 case JAVA_iconst_1:
lynxeyed_atsu 5:047542b65d00 551 cl = setIntegerToStack(cl,1);
lynxeyed_atsu 5:047542b65d00 552 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 553 break;
lynxeyed_atsu 5:047542b65d00 554 case JAVA_iconst_2:
lynxeyed_atsu 5:047542b65d00 555 cl = setIntegerToStack(cl,2);
lynxeyed_atsu 5:047542b65d00 556 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 557 break;
lynxeyed_atsu 5:047542b65d00 558 case JAVA_iconst_3:
lynxeyed_atsu 5:047542b65d00 559 cl = setIntegerToStack(cl,3);
lynxeyed_atsu 5:047542b65d00 560 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 561 break;
lynxeyed_atsu 5:047542b65d00 562 case JAVA_iconst_4:
lynxeyed_atsu 5:047542b65d00 563 cl = setIntegerToStack(cl,4);
lynxeyed_atsu 5:047542b65d00 564 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 565 break;
lynxeyed_atsu 5:047542b65d00 566 case JAVA_iconst_5:
lynxeyed_atsu 5:047542b65d00 567 cl = setIntegerToStack(cl,5);
lynxeyed_atsu 5:047542b65d00 568 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 569 break;
lynxeyed_atsu 5:047542b65d00 570
lynxeyed_atsu 5:047542b65d00 571 case JAVA_aload:
lynxeyed_atsu 5:047542b65d00 572 now_code = now_code + 2;
lynxeyed_atsu 5:047542b65d00 573 break;
lynxeyed_atsu 5:047542b65d00 574
lynxeyed_atsu 5:047542b65d00 575 case JAVA_iload_0:
lynxeyed_atsu 5:047542b65d00 576 cl = setIntegerToStack(cl,cl.local_reg[0]);
lynxeyed_atsu 5:047542b65d00 577 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 578 break;
lynxeyed_atsu 5:047542b65d00 579 case JAVA_iload_1:
lynxeyed_atsu 5:047542b65d00 580 cl = setIntegerToStack(cl,cl.local_reg[1]);
lynxeyed_atsu 5:047542b65d00 581 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 582 break;
lynxeyed_atsu 5:047542b65d00 583 case JAVA_iload_2:
lynxeyed_atsu 5:047542b65d00 584 cl = setIntegerToStack(cl,cl.local_reg[2]);
lynxeyed_atsu 5:047542b65d00 585 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 586 break;
lynxeyed_atsu 5:047542b65d00 587 case JAVA_iload_3:
lynxeyed_atsu 5:047542b65d00 588 cl = setIntegerToStack(cl,cl.local_reg[3]);
lynxeyed_atsu 5:047542b65d00 589 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 590 break;
lynxeyed_atsu 5:047542b65d00 591
lynxeyed_atsu 5:047542b65d00 592 case JAVA_aload_0:
lynxeyed_atsu 5:047542b65d00 593 case JAVA_aload_1:
lynxeyed_atsu 5:047542b65d00 594 case JAVA_aload_2:
lynxeyed_atsu 5:047542b65d00 595 case JAVA_aload_3:
lynxeyed_atsu 5:047542b65d00 596 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 597 break;
lynxeyed_atsu 5:047542b65d00 598
lynxeyed_atsu 5:047542b65d00 599 case JAVA_astore:
lynxeyed_atsu 5:047542b65d00 600 now_code = now_code + 2;
lynxeyed_atsu 5:047542b65d00 601 break;
lynxeyed_atsu 5:047542b65d00 602
lynxeyed_atsu 5:047542b65d00 603 case JAVA_istore_0:
lynxeyed_atsu 5:047542b65d00 604 cl.local_reg[0] = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 605 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 606 break;
lynxeyed_atsu 5:047542b65d00 607 case JAVA_istore_1:
lynxeyed_atsu 5:047542b65d00 608 cl.local_reg[1] = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 609 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 610 break;
lynxeyed_atsu 5:047542b65d00 611 case JAVA_istore_2:
lynxeyed_atsu 5:047542b65d00 612 cl.local_reg[2] = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 613 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 614 break;
lynxeyed_atsu 5:047542b65d00 615 case JAVA_istore_3:
lynxeyed_atsu 5:047542b65d00 616 cl.local_reg[3] = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 617 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 618 break;
lynxeyed_atsu 5:047542b65d00 619
lynxeyed_atsu 5:047542b65d00 620 case JAVA_astore_0:
lynxeyed_atsu 5:047542b65d00 621 case JAVA_astore_1:
lynxeyed_atsu 5:047542b65d00 622 case JAVA_astore_2:
lynxeyed_atsu 5:047542b65d00 623 case JAVA_astore_3:
lynxeyed_atsu 5:047542b65d00 624 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 625 break;
lynxeyed_atsu 5:047542b65d00 626
lynxeyed_atsu 5:047542b65d00 627 case JAVA_dup:
lynxeyed_atsu 5:047542b65d00 628 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 629 break;
lynxeyed_atsu 5:047542b65d00 630
lynxeyed_atsu 5:047542b65d00 631 case JAVA_iadd:
lynxeyed_atsu 5:047542b65d00 632 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 633 setIntegerToStack(cl,getIntegerFromOperandStack(cl) + getIntegerFromOperandStack(cl));
lynxeyed_atsu 5:047542b65d00 634 break;
lynxeyed_atsu 5:047542b65d00 635
lynxeyed_atsu 5:047542b65d00 636 case JAVA_getstatic:
lynxeyed_atsu 5:047542b65d00 637 now_code = now_code + 3;
lynxeyed_atsu 5:047542b65d00 638 break;
lynxeyed_atsu 5:047542b65d00 639
lynxeyed_atsu 5:047542b65d00 640 case JAVA_getfield:
lynxeyed_atsu 5:047542b65d00 641 cl = getField(cl,(*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
lynxeyed_atsu 5:047542b65d00 642 now_code = now_code + 3;
lynxeyed_atsu 5:047542b65d00 643 break;
lynxeyed_atsu 5:047542b65d00 644 case JAVA_putfield:
lynxeyed_atsu 5:047542b65d00 645 cl = putField(cl,(*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
lynxeyed_atsu 5:047542b65d00 646 now_code = now_code + 3;
lynxeyed_atsu 5:047542b65d00 647 break;
lynxeyed_atsu 5:047542b65d00 648
lynxeyed_atsu 5:047542b65d00 649 case JAVA_i2l:
lynxeyed_atsu 5:047542b65d00 650 //cl = changeStackType(cl, Stack_LongType);
lynxeyed_atsu 5:047542b65d00 651 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 652 break;
lynxeyed_atsu 5:047542b65d00 653
lynxeyed_atsu 5:047542b65d00 654 case JAVA_i2c:
lynxeyed_atsu 5:047542b65d00 655 now_code = now_code + 1;
lynxeyed_atsu 5:047542b65d00 656 cl = changeStackType(cl, Stack_CharType);
lynxeyed_atsu 5:047542b65d00 657 break;
lynxeyed_atsu 5:047542b65d00 658
lynxeyed_atsu 5:047542b65d00 659 case JAVA_goto:
lynxeyed_atsu 5:047542b65d00 660 now_code = now_code +(int16_t)((*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
lynxeyed_atsu 5:047542b65d00 661 break;
lynxeyed_atsu 5:047542b65d00 662
lynxeyed_atsu 5:047542b65d00 663 case JAVA_bipush:
lynxeyed_atsu 5:047542b65d00 664 cl = setIntegerToStack(cl,*bc_seek(now_code + 1,1));
lynxeyed_atsu 5:047542b65d00 665 now_code = now_code + 2;
lynxeyed_atsu 5:047542b65d00 666 break;
lynxeyed_atsu 5:047542b65d00 667
lynxeyed_atsu 5:047542b65d00 668 case JAVA_sipush:
lynxeyed_atsu 5:047542b65d00 669 cl = setIntegerToStack(cl,((*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1)));
lynxeyed_atsu 5:047542b65d00 670 now_code = now_code + 3;
lynxeyed_atsu 5:047542b65d00 671 break;
lynxeyed_atsu 5:047542b65d00 672
lynxeyed_atsu 5:047542b65d00 673 case JAVA_invokevirtual:
lynxeyed_atsu 5:047542b65d00 674 cl = invokevirtual_callFunction(cl,(*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
lynxeyed_atsu 5:047542b65d00 675 now_code = now_code + 3;
lynxeyed_atsu 5:047542b65d00 676 break;
lynxeyed_atsu 5:047542b65d00 677
lynxeyed_atsu 5:047542b65d00 678 case JAVA_invokestatic:
lynxeyed_atsu 5:047542b65d00 679 cl = invokestatic_callFunction(cl,(*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
lynxeyed_atsu 5:047542b65d00 680 now_code = cl.bc_offset + cl.code_offset;
lynxeyed_atsu 5:047542b65d00 681 break;
lynxeyed_atsu 5:047542b65d00 682
lynxeyed_atsu 5:047542b65d00 683 case JAVA_invokespecial:
lynxeyed_atsu 5:047542b65d00 684 cl = invokespecial_callFunction(cl, (*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
lynxeyed_atsu 5:047542b65d00 685 now_code = now_code + 3;
lynxeyed_atsu 5:047542b65d00 686 break;
lynxeyed_atsu 5:047542b65d00 687
lynxeyed_atsu 5:047542b65d00 688 case JAVA_new:
lynxeyed_atsu 5:047542b65d00 689 now_code = now_code + 3;
lynxeyed_atsu 5:047542b65d00 690 break;
lynxeyed_atsu 5:047542b65d00 691
lynxeyed_atsu 5:047542b65d00 692 case JAVA_return:
lynxeyed_atsu 5:047542b65d00 693 cl.code_offset = 0;
lynxeyed_atsu 5:047542b65d00 694 cl.threadCommand = Thread_returned;
lynxeyed_atsu 5:047542b65d00 695
lynxeyed_atsu 5:047542b65d00 696 default:
lynxeyed_atsu 5:047542b65d00 697 break;
lynxeyed_atsu 5:047542b65d00 698 }
lynxeyed_atsu 5:047542b65d00 699
lynxeyed_atsu 5:047542b65d00 700 cl.code_offset = now_code - cl.bc_offset;
lynxeyed_atsu 5:047542b65d00 701
lynxeyed_atsu 5:047542b65d00 702
lynxeyed_atsu 5:047542b65d00 703 return cl;
lynxeyed_atsu 5:047542b65d00 704 }
lynxeyed_atsu 5:047542b65d00 705
lynxeyed_atsu 5:047542b65d00 706 class_st invokespecial_callFunction(class_st cl, int cp_num){
lynxeyed_atsu 5:047542b65d00 707
lynxeyed_atsu 5:047542b65d00 708 char* func_name = (char *)seekNameAndType_name(cp_num).stack_pt;
lynxeyed_atsu 5:047542b65d00 709
lynxeyed_atsu 5:047542b65d00 710 if(strncmp(func_name,"<init>",6) == 0){
lynxeyed_atsu 5:047542b65d00 711 if(strncmp((const char *)seekNameAndType_desc(cp_num).stack_pt,"(I",2) != 0) {return cl;}
lynxeyed_atsu 5:047542b65d00 712 int i;
lynxeyed_atsu 5:047542b65d00 713 for(i = 0 ; i < cl.stack_num ; i++){
lynxeyed_atsu 5:047542b65d00 714 if(cl.op_stack_type[i] == Stack_Nothing){ // seek top of stack
lynxeyed_atsu 5:047542b65d00 715 if(i == 0){
lynxeyed_atsu 5:047542b65d00 716 cl.threadCommand = Thread_getInitMethod;
lynxeyed_atsu 5:047542b65d00 717
lynxeyed_atsu 5:047542b65d00 718 return cl;
lynxeyed_atsu 5:047542b65d00 719 }
lynxeyed_atsu 5:047542b65d00 720 break;
lynxeyed_atsu 5:047542b65d00 721 }
lynxeyed_atsu 5:047542b65d00 722 }
lynxeyed_atsu 5:047542b65d00 723 i = i - 1;
lynxeyed_atsu 5:047542b65d00 724 cl.threadCommand = Thread_getInitMethodWithStack;
lynxeyed_atsu 5:047542b65d00 725
lynxeyed_atsu 5:047542b65d00 726 cl.threadArg = i;
lynxeyed_atsu 5:047542b65d00 727 return cl;
lynxeyed_atsu 5:047542b65d00 728 }
lynxeyed_atsu 5:047542b65d00 729 return cl;
lynxeyed_atsu 5:047542b65d00 730 }
lynxeyed_atsu 5:047542b65d00 731
lynxeyed_atsu 5:047542b65d00 732 class_st invokestatic_callFunction(class_st cl, int cp_num){
lynxeyed_atsu 5:047542b65d00 733
lynxeyed_atsu 5:047542b65d00 734 char* func_name = (char *)seekNameAndType_name(cp_num).stack_pt;
lynxeyed_atsu 5:047542b65d00 735
lynxeyed_atsu 5:047542b65d00 736 if(strncmp(func_name,"sleep",5) == 0){
lynxeyed_atsu 5:047542b65d00 737 int hold_time = 0;
lynxeyed_atsu 5:047542b65d00 738 hold_time = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 739 switch(cl.threadCommand){
lynxeyed_atsu 5:047542b65d00 740 case Thread_Active:
lynxeyed_atsu 5:047542b65d00 741 cl.threadCommand = Thread_inSleep;
lynxeyed_atsu 5:047542b65d00 742 cl.threadArg = time_millis();
lynxeyed_atsu 5:047542b65d00 743 cl = setIntegerToStack(cl,hold_time);
lynxeyed_atsu 5:047542b65d00 744 break;
lynxeyed_atsu 5:047542b65d00 745 case Thread_inSleep:
lynxeyed_atsu 5:047542b65d00 746 if(time_millis() - cl.threadArg >= hold_time){
lynxeyed_atsu 5:047542b65d00 747 cl.threadCommand = Thread_Active;
lynxeyed_atsu 5:047542b65d00 748 cl.threadArg = 0;
lynxeyed_atsu 5:047542b65d00 749 cl.code_offset = cl.code_offset + 3;
lynxeyed_atsu 5:047542b65d00 750 hold_time = 0;
lynxeyed_atsu 5:047542b65d00 751 }else{
lynxeyed_atsu 5:047542b65d00 752 cl = setIntegerToStack(cl,hold_time);
lynxeyed_atsu 5:047542b65d00 753 }
lynxeyed_atsu 5:047542b65d00 754 break;
lynxeyed_atsu 5:047542b65d00 755 default:
lynxeyed_atsu 5:047542b65d00 756 break;
lynxeyed_atsu 5:047542b65d00 757 }
lynxeyed_atsu 5:047542b65d00 758
lynxeyed_atsu 5:047542b65d00 759 return cl;
lynxeyed_atsu 5:047542b65d00 760 }else if(strncmp(func_name,"portWrite",9) == 0){// writePort(bit,value)
lynxeyed_atsu 5:047542b65d00 761 int value = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 762 int bit = getIntegerFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 763 port_write(0,bit,value);
lynxeyed_atsu 5:047542b65d00 764 }
lynxeyed_atsu 5:047542b65d00 765 cl.code_offset = cl.code_offset + 3;
lynxeyed_atsu 5:047542b65d00 766 return cl;
lynxeyed_atsu 5:047542b65d00 767 }
lynxeyed_atsu 5:047542b65d00 768
lynxeyed_atsu 5:047542b65d00 769 //user code
lynxeyed_atsu 5:047542b65d00 770 class_st invokevirtual_callFunction(class_st cl, int cp_num){
lynxeyed_atsu 5:047542b65d00 771
lynxeyed_atsu 5:047542b65d00 772 char* func_name = (char *)seekNameAndType_name(cp_num).stack_pt;
lynxeyed_atsu 5:047542b65d00 773
lynxeyed_atsu 5:047542b65d00 774 if(strncmp(func_name,"println",7) == 0){
lynxeyed_atsu 5:047542b65d00 775 char str[64];
lynxeyed_atsu 5:047542b65d00 776 char *strn = getStringFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 777 sprintf(str,"%s",strn);
lynxeyed_atsu 5:047542b65d00 778 uart_print(str);
lynxeyed_atsu 5:047542b65d00 779 uart_print("\r\n");
lynxeyed_atsu 5:047542b65d00 780 return cl;
lynxeyed_atsu 5:047542b65d00 781 }else if(strncmp(func_name,"print",5) == 0){
lynxeyed_atsu 5:047542b65d00 782 char str[64];
lynxeyed_atsu 5:047542b65d00 783 char *strn = getStringFromOperandStack(cl);
lynxeyed_atsu 5:047542b65d00 784 sprintf(str,"%s",strn);
lynxeyed_atsu 5:047542b65d00 785 uart_print(str);
lynxeyed_atsu 5:047542b65d00 786 return cl;
lynxeyed_atsu 5:047542b65d00 787 }else if(strncmp(func_name,"read",4) == 0){
lynxeyed_atsu 5:047542b65d00 788 int getInt;
lynxeyed_atsu 5:047542b65d00 789 getInt = uart_read();
lynxeyed_atsu 5:047542b65d00 790 cl = setIntegerToStack(cl,getInt);
lynxeyed_atsu 5:047542b65d00 791 return cl;
lynxeyed_atsu 5:047542b65d00 792 }else if(strncmp(func_name,"start",5) == 0){
lynxeyed_atsu 5:047542b65d00 793 cl.threadCommand = Thread_getStartMethod;
lynxeyed_atsu 5:047542b65d00 794 return cl;
lynxeyed_atsu 5:047542b65d00 795 }else if(strncmp(func_name,"getName",7) == 0){
lynxeyed_atsu 5:047542b65d00 796 cl = setIntegerToStack(cl, cl.myThreadNum);
lynxeyed_atsu 5:047542b65d00 797 return cl;
lynxeyed_atsu 5:047542b65d00 798 }
lynxeyed_atsu 5:047542b65d00 799
lynxeyed_atsu 5:047542b65d00 800 return cl;
lynxeyed_atsu 5:047542b65d00 801 }
lynxeyed_atsu 5:047542b65d00 802