JVM test

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ravem.cpp Source File

ravem.cpp

00001 /*
00002  * RAVEM.c
00003  *
00004  *  Created on: return 2013/07/18
00005  *      Author: return lynxeyed
00006  */
00007 #include <stdio.h>
00008 #include <string.h>
00009 #include "ravem.h"
00010 
00011 
00012 
00013 /*
00014 const unsigned char vm_array[] = {
00015     0xCA, 0xFE, 0xBA, 0xBE, 0x00, 0x00, 0x00, 0x32, 0x00, 0x35, 0x0A, 0x00, 0x0F, 
00016     0x00, 0x1B, 0x09, 0x00, 0x1C, 0x00, 0x1D, 0x08, 0x00, 0x1E, 0x0A, 0x00, 0x1F, 0x00, 0x20, 0x0A, 
00017     0x00, 0x0B, 0x00, 0x21, 0x0A, 0x00, 0x1F, 0x00, 0x22, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
00018     0x03, 0xE8, 0x0A, 0x00, 0x0B, 0x00, 0x23, 0x07, 0x00, 0x24, 0x07, 0x00, 0x25, 0x0A, 0x00, 0x0B, 
00019     0x00, 0x1B, 0x0A, 0x00, 0x0B, 0x00, 0x26, 0x08, 0x00, 0x27, 0x07, 0x00, 0x28, 0x01, 0x00, 0x06, 
00020     0x3C, 0x69, 0x6E, 0x69, 0x74, 0x3E, 0x01, 0x00, 0x03, 0x28, 0x29, 0x56, 0x01, 0x00, 0x04, 0x43, 
00021     0x6F, 0x64, 0x65, 0x01, 0x00, 0x0F, 0x4C, 0x69, 0x6E, 0x65, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 
00022     0x54, 0x61, 0x62, 0x6C, 0x65, 0x01, 0x00, 0x03, 0x72, 0x75, 0x6E, 0x01, 0x00, 0x0D, 0x53, 0x74, 
00023     0x61, 0x63, 0x6B, 0x4D, 0x61, 0x70, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x07, 0x00, 0x24, 0x01, 0x00, 
00024     0x04, 0x6D, 0x61, 0x69, 0x6E, 0x01, 0x00, 0x16, 0x28, 0x5B, 0x4C, 0x6A, 0x61, 0x76, 0x61, 0x2F, 
00025     0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x29, 0x56, 0x01, 0x00, 
00026     0x0A, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6C, 0x65, 0x01, 0x00, 0x0A, 0x68, 0x6F, 
00027     0x67, 0x65, 0x31, 0x2E, 0x6A, 0x61, 0x76, 0x61, 0x0C, 0x00, 0x10, 0x00, 0x11, 0x07, 0x00, 0x29, 
00028     0x0C, 0x00, 0x2A, 0x00, 0x2B, 0x01, 0x00, 0x0E, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x4E, 
00029     0x75, 0x6D, 0x62, 0x65, 0x72, 0x3D, 0x07, 0x00, 0x2C, 0x0C, 0x00, 0x2D, 0x00, 0x2E, 0x0C, 0x00, 
00030     0x2F, 0x00, 0x30, 0x0C, 0x00, 0x31, 0x00, 0x2E, 0x0C, 0x00, 0x32, 0x00, 0x33, 0x01, 0x00, 0x1E, 
00031     0x6A, 0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x72, 
00032     0x75, 0x70, 0x74, 0x65, 0x64, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x01, 0x00, 
00033     0x05, 0x68, 0x6F, 0x67, 0x65, 0x31, 0x0C, 0x00, 0x34, 0x00, 0x11, 0x01, 0x00, 0x0B, 0x54, 0x68, 
00034     0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x65, 0x73, 0x74, 0x01, 0x00, 0x10, 0x6A, 0x61, 0x76, 0x61, 
00035     0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x01, 0x00, 0x10, 0x6A, 
00036     0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x01, 
00037     0x00, 0x03, 0x6F, 0x75, 0x74, 0x01, 0x00, 0x15, 0x4C, 0x6A, 0x61, 0x76, 0x61, 0x2F, 0x69, 0x6F, 
00038     0x2F, 0x50, 0x72, 0x69, 0x6E, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6D, 0x3B, 0x01, 0x00, 0x13, 
00039     0x6A, 0x61, 0x76, 0x61, 0x2F, 0x69, 0x6F, 0x2F, 0x50, 0x72, 0x69, 0x6E, 0x74, 0x53, 0x74, 0x72, 
00040     0x65, 0x61, 0x6D, 0x01, 0x00, 0x05, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x01, 0x00, 0x15, 0x28, 0x4C, 
00041     0x6A, 0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 
00042     0x3B, 0x29, 0x56, 0x01, 0x00, 0x07, 0x67, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x01, 0x00, 0x14, 
00043     0x28, 0x29, 0x4C, 0x6A, 0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F, 0x53, 0x74, 0x72, 
00044     0x69, 0x6E, 0x67, 0x3B, 0x01, 0x00, 0x07, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x6C, 0x6E, 0x01, 0x00, 
00045     0x05, 0x73, 0x6C, 0x65, 0x65, 0x70, 0x01, 0x00, 0x04, 0x28, 0x4A, 0x29, 0x56, 0x01, 0x00, 0x05, 
00046     0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x20, 0x00, 0x0B, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 
00047     0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1D, 0x00, 
00048     0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x2A, 0xB7, 0x00, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x01, 
00049     0x00, 0x13, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x14, 
00050     0x00, 0x11, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x60, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 
00051     0x00, 0x1F, 0xB2, 0x00, 0x02, 0x12, 0x03, 0xB6, 0x00, 0x04, 0xB2, 0x00, 0x02, 0x2A, 0xB6, 0x00, 
00052     0x05, 0xB6, 0x00, 0x06, 0x14, 0x00, 0x07, 0xB8, 0x00, 0x09, 0xA7, 0xFF, 0xE8, 0x4C, 0xA7, 0xFF, 
00053     0xE4, 0x00, 0x01, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1B, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x13, 0x00, 
00054     0x00, 0x00, 0x1A, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x12, 0x00, 
00055     0x08, 0x00, 0x18, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x1C, 0x00, 0x0A, 0x00, 0x15, 0x00, 
00056     0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x5A, 0x07, 0x00, 0x16, 0x00, 0x09, 0x00, 0x17, 0x00, 0x18, 
00057     0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x21, 
00058     0xBB, 0x00, 0x0B, 0x59, 0xB7, 0x00, 0x0C, 0x4C, 0xBB, 0x00, 0x0B, 0x59, 0xB7, 0x00, 0x0C, 0x4D, 
00059     0x2B, 0xB6, 0x00, 0x0D, 0x2C, 0xB6, 0x00, 0x0D, 0xB2, 0x00, 0x02, 0x12, 0x0E, 0xB6, 0x00, 0x06, 
00060     0xB1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x06, 0x00, 0x00, 0x00, 
00061     0x11, 0x00, 0x08, 0x00, 0x12, 0x00, 0x10, 0x00, 0x14, 0x00, 0x14, 0x00, 0x15, 0x00, 0x18, 0x00, 
00062     0x17, 0x00, 0x20, 0x00, 0x18, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1A, 0x00, 
00063     0x00, 0x00
00064 };
00065 */
00066 char cp_str[32];
00067 int32_t total_const_pool_num;
00068 int32_t methods_count;
00069 
00070 void bc_init(void){
00071     bytecode_read_init();
00072 }
00073 char *bc_seek(int bc_num, int length){
00074 
00075     return bytecode_read(bc_num, length);
00076 }
00077 
00078 int32_t getLengthOfConstantInfo(uint8_t constantType)
00079 {
00080     switch (constantType) {
00081 
00082         case CONSTANT_Class:        
00083         case CONSTANT_String:       
00084         case CONSTANT_MethodType:       
00085         case CONSTANT_InvokeDynamic:    
00086             return  3;
00087 
00088         case CONSTANT_Fieldref:
00089         case CONSTANT_Methodref:
00090         case CONSTANT_InterfaceMethodref:
00091         case CONSTANT_Integer:      
00092         case CONSTANT_Float:    
00093         case CONSTANT_MethodHandle:
00094         case CONSTANT_NameAndType:
00095             return  5;
00096      
00097         case CONSTANT_Long:     
00098         case CONSTANT_Double:       
00099             return  9;
00100      
00101         case CONSTANT_Utf8:     
00102             return  (-1);       //4 or more (see 'length')
00103 
00104      default:
00105          return 0;
00106     }
00107 }
00108 
00109 const_pool_t getConstantPoolInfo(int const_num){
00110     
00111     const_pool_t c;
00112     int i=0, j=1, length;
00113 
00114     total_const_pool_num = (*bc_seek(8,1) << 8) + *bc_seek(9,1);
00115     
00116     if ((const_num ==0)||(const_num >= total_const_pool_num))
00117     {
00118         c.index = 0;
00119         return c;
00120     }
00121     
00122     while(1)
00123     {
00124         c.tag = *bc_seek(10+i,1);   // tag
00125         length = getLengthOfConstantInfo(*bc_seek(10+i,1));
00126         
00127         // Constant_UTF8
00128         if(length == -1){
00129             length = ((*bc_seek(11+i,1)<<8) + *bc_seek(12+i,1)) + 3 /* tag + length = 3byte*/ ;         
00130         }
00131 
00132         if(j == const_num)break;
00133         if((c.tag == CONSTANT_Long)||(c.tag == CONSTANT_Double)){
00134             j = j + 2;
00135         }else{
00136             j = j + 1;
00137         }
00138             
00139         if(j >= total_const_pool_num)break;
00140         i += length;
00141     }
00142 
00143     c.index = ((*bc_seek(11+i,1)<<8) + *bc_seek(12+i,1));
00144     c.index2 = ((*bc_seek(13+i,1)<<8) + *bc_seek(14+i,1));
00145     c.bc_num = 10 + i; //todo: fix this
00146     switch(c.tag)
00147     {
00148         case CONSTANT_Utf8:
00149             memcpy((char*)cp_str,  bc_seek(13+i,c.index), c.index);
00150             cp_str[c.index] = '\0';
00151             c.stack_pt = (char *)&cp_str;
00152             break;
00153         
00154         //case CONSTANT_Float:
00155         //case CONSTANT_Long:
00156         //case CONSTANT_Double:
00157         case CONSTANT_Integer:
00158         case CONSTANT_Float:        
00159             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);
00160             break;
00161         case CONSTANT_Double:
00162         case CONSTANT_Long:
00163             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);
00164             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);
00165             break;
00166         default:
00167             break;
00168                     
00169     }
00170     
00171     return c;
00172 }
00173 
00174 //seek class_name_index,Strings,Numerics from Constant Pool 
00175 const_pool_t seekConstClassNumString(int const_num)
00176 {
00177     const_pool_t c;
00178     c = getConstantPoolInfo(const_num);
00179     
00180     switch (c.tag)
00181     {
00182         case CONSTANT_String:
00183         case CONSTANT_Class:
00184             c = getConstantPoolInfo(c.index);
00185             break;
00186         
00187         default:
00188             break;
00189     }       
00190     return c;
00191 }
00192 
00193 // for methodref & Fieldref 
00194 const_pool_t seekClassIndex(int const_num){
00195     const_pool_t c;
00196     c = getConstantPoolInfo(const_num);
00197     
00198     switch(c.tag)
00199     {
00200         case CONSTANT_Methodref:
00201         case CONSTANT_Fieldref:
00202             c = seekConstClassNumString(c.index);
00203             break;
00204         
00205         default:
00206             break;  // in fact,we must program in error process but tedious;-P 
00207     }
00208     
00209     return c;
00210 }
00211 
00212 // For NameAndType:name index
00213 const_pool_t seekNameAndType_name(int const_num){
00214     const_pool_t c;
00215     c = getConstantPoolInfo(const_num);
00216     
00217     
00218     switch(c.tag)
00219     {
00220         case CONSTANT_Methodref:
00221         case CONSTANT_Fieldref:
00222             c = getConstantPoolInfo(c.index2); //Constant_NAmeAndType
00223             // do not insert break; here
00224         
00225         case CONSTANT_NameAndType:
00226             c = seekConstClassNumString(c.index);
00227             break;
00228         
00229         default:
00230             break;  // in fact,we must program in error process but tedious;-P          
00231     }
00232     return c;
00233 }
00234 
00235 
00236 // For NameAndType:descriptor
00237 const_pool_t seekNameAndType_desc(int const_num){
00238     const_pool_t c;
00239     c = getConstantPoolInfo(const_num);
00240     
00241     switch(c.tag)
00242     {
00243         case CONSTANT_Methodref:
00244         case CONSTANT_Fieldref:
00245             c = getConstantPoolInfo(c.index2);      // Constant_NAmeAndType
00246             c = seekConstClassNumString(c.index2);
00247             break;
00248         
00249         case CONSTANT_NameAndType:
00250             c = seekConstClassNumString(c.index2);
00251             break;
00252         
00253         default:
00254             break;
00255             
00256     }
00257     return c;
00258 }
00259 
00260 class_st seekCodeArrtibute(class_st cl, char* method_name,int strlen){
00261     
00262     int i,j;
00263     int length,cmp;
00264     volatile int pointr;
00265     int attribute_length, attributes_count,fields_count;
00266     const_pool_t z;
00267     cl.code_length = 0;
00268     
00269     
00270     // get length of Constant_pool[last_num]
00271     z = getConstantPoolInfo(total_const_pool_num - 1);
00272     
00273     if(z.tag == CONSTANT_Utf8) length = z.index + 3; else length = getLengthOfConstantInfo(z.tag);
00274     
00275     pointr = z.bc_num + length;
00276     
00277     // seek pointr to interfaces_count 
00278     pointr +=  
00279                     + 2     // access_flag
00280                     + 2     // this_class
00281                     + 2     // super_class
00282                     ;
00283     
00284     pointr += (((*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1)) * 2)  + 2; // 2 = length of 'interfaces_count'          
00285                     
00286     // now, pointr's locate is fields_count(2bytes)
00287     fields_count = ((*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1));
00288     pointr += 2;        // fields_count
00289 
00290     if(fields_count != 0){
00291         // fields info
00292         for(i = 0 ; i < fields_count ; i++){
00293             pointr +=
00294                             + 2     // access_flags
00295                             + 2     // name_index
00296                             + 2     // descriptor_index
00297                             ;
00298             attributes_count =  (*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1);
00299             pointr += 2;
00300             pointr += attributes_count;
00301         }
00302     }
00303     
00304     // now, pointr's locate is methods_count(2bytes)
00305     methods_count = ((*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1));
00306     pointr += 2;    // method info (access_flag)
00307     for(i = 0 ; i < methods_count; i++)
00308     {
00309     
00310         pointr += 2;    // name_index
00311         
00312         z = getConstantPoolInfo((*bc_seek(pointr,1)<<8)+*bc_seek(pointr + 1,1));
00313         cmp = strncmp((const char*)z.stack_pt,method_name,strlen);
00314         
00315         pointr += 2; //descriptor_index;
00316         pointr += 2;
00317         
00318         attributes_count = ((*bc_seek(pointr,1) << 8) + *bc_seek(pointr + 1,1));
00319         pointr += 2; //attributes_count;
00320         
00321         for(j = 0 ; j < attributes_count ; j++)
00322         {
00323             pointr = pointr + 2; //attribute_name_index
00324             attribute_length  = (*bc_seek(pointr,1) << 24)
00325                                                     + (*bc_seek(pointr + 1,1) << 16)
00326                                                     + (*bc_seek(pointr + 2,1) << 8)
00327                                                     +  *bc_seek(pointr + 3,1)
00328                                                     ;
00329             
00330             pointr += 4;  //attribute_length
00331             if(!cmp)
00332             {
00333                 cl.stack_num   = (*bc_seek(pointr,1) << 8)   + *bc_seek(pointr+1,1);
00334                 cl.local_num   = (*bc_seek(pointr+2,1) << 8) + *bc_seek(pointr+3,1);
00335                 cl.code_length = (*bc_seek(pointr + 4,1) << 24)
00336                                                     + (*bc_seek(pointr + 5,1) << 16)
00337                                                     + (*bc_seek(pointr + 6,1) << 8)
00338                                                     +  *bc_seek(pointr + 7,1)
00339                                                     ;
00340                 cl.bc_offset = pointr + 8;
00341                 cl.code_offset = 0;
00342             }
00343             pointr += attribute_length; // code attribute
00344         }
00345     }
00346 
00347     return cl;
00348 }
00349 
00350 char* getStringFromOperandStack(class_st cl)
00351 {
00352     int i;
00353     const_pool_t cp;
00354     
00355     for(i = 0 ; i < cl.stack_num ; i++){
00356         if(cl.op_stack_type[i]==0){         // seek top of stack
00357             if(i == 0)return NULL;  // return NULL if operand stack has no stack 
00358             break; 
00359         }
00360     }
00361     
00362     i = i - 1;
00363     
00364     if(cl.op_stack_type[i] == Stack_ConstantPool){
00365         cp = seekConstClassNumString(cl.op_stack[i]);
00366         cl.op_stack_type[i] = Stack_Nothing;
00367         return (char*)cp.stack_pt;
00368     }
00369     if(cl.op_stack_type[i] == Stack_IntType){
00370         cl.op_stack_type[i] = Stack_Nothing;
00371         sprintf(cp_str,"%d",cl.op_stack[i]);
00372         return cp_str;
00373     }
00374     if(cl.op_stack_type[i] == Stack_CharType){
00375         cl.op_stack_type[i] = Stack_Nothing;
00376         sprintf(cp_str,"%c",(char)cl.op_stack[i]);
00377         return cp_str;
00378     }
00379     
00380     return NULL;
00381 }
00382 
00383 int getIntegerFromOperandStack(class_st cl){
00384     int i;
00385     const_pool_t cp;
00386     
00387     for(i = 0 ; i < cl.stack_num ; i++){
00388             if(cl.op_stack_type[i]==0){ // seek top of stack
00389             if(i == 0)return 0;
00390             break; 
00391         }
00392     }
00393     i = i - 1;
00394             
00395     if(cl.op_stack_type[i] == Stack_ConstantPool){ // Const_Integer
00396         cp = seekConstClassNumString(cl.op_stack[i]);
00397         cl.op_stack_type[i] = 0;
00398         if((cp.tag == CONSTANT_Long)||(cp.tag == CONSTANT_Double))          
00399             return (cp.index2);
00400         else
00401             return (cp.index);
00402     }
00403     
00404     if(cl.op_stack_type[i] == Stack_IntType){       // stack direct
00405         cl.op_stack_type[i] = 0;
00406         return cl.op_stack[i];
00407     }
00408     return 0;
00409 }
00410 
00411 class_st setStackFromConstantPool(class_st cl, int cp_num){
00412     
00413     int i;
00414     for(i=0 ; i < cl.stack_num ; i++){      
00415         if(cl.op_stack_type[i]==0){                             // seek top of stack
00416             break; 
00417         }
00418     }
00419     
00420     if((i == cl.stack_num - 1)&&(cl.op_stack_type[i] != 0))
00421         return cl;// stack full
00422     
00423     cl.op_stack_type[i] = Stack_ConstantPool;
00424     cl.op_stack[i] = cp_num;
00425     i = i + 1;
00426     if(i == cl.stack_num)
00427         return cl;
00428     else 
00429         cl.op_stack_type[i] = Stack_Nothing;
00430 
00431     return cl;  
00432 }
00433 
00434 class_st changeStackType(class_st cl, int type){
00435     
00436     int i;
00437     for(i=0 ; i < cl.stack_num ; i++){      
00438         if(cl.op_stack_type[i]==0){                             // seek top of stack
00439             break; 
00440         }
00441     }
00442     
00443     i = i - 1;
00444     
00445     cl.op_stack_type[i] = type;
00446     return cl;  
00447 }
00448 
00449 
00450 class_st setIntegerToStack(class_st cl, int num){
00451     
00452     int i;
00453     for(i = 0 ; i < cl.stack_num ; i++){        
00454         if(cl.op_stack_type[i]==0){                             // seek top of stack
00455             break; 
00456         }
00457     }
00458     
00459     if((i == cl.stack_num - 1)&&(cl.op_stack_type[i]!=0))
00460         return cl;// stack full
00461     
00462     cl.op_stack_type[i] = Stack_IntType;
00463     cl.op_stack[i] = num;
00464     i = i + 1;
00465     if(i == cl.stack_num)
00466         return cl;
00467     else 
00468         cl.op_stack_type[i] = Stack_Nothing;
00469 
00470     return cl;
00471 }
00472 
00473 class_st putField(class_st cl, int cp_num){
00474     
00475         
00476     if(strncmp((const char *)seekNameAndType_desc(cp_num).stack_pt,"I",1) == 0){ // int type
00477         if(cl.field_num == 0){  // first mem alloc
00478             
00479             cl.field_mem_reg = (int *)pool_alloc(sizeof(int) * 1);
00480             cl.field_mem_type = (int *)pool_alloc(sizeof(int) * 1);
00481             cl.field_num = cl.field_num + 1;
00482             
00483             cl.field_mem_reg[0] = getIntegerFromOperandStack(cl);
00484             cl.field_mem_type[0] = cp_num; 
00485                         
00486             return cl;
00487         }
00488         else{ // field_num != 0
00489             int i;
00490             for(i = 0; i < cl.field_num ; i++){
00491                 if(cl.field_mem_type[i] == cp_num){ //already exists
00492                     cl.field_mem_reg[i] = getIntegerFromOperandStack(cl);
00493                     return cl;
00494                 }
00495             }//
00496             cl.field_num = cl.field_num + 1;
00497             cl.field_mem_reg = (int *)pool_realloc(cl.field_mem_reg, sizeof(int) * (cl.field_num));
00498             cl.field_mem_type = (int *)pool_realloc(cl.field_mem_type, sizeof(int) * (cl.field_num));
00499             
00500             cl.field_mem_reg[cl.field_num - 1] = getIntegerFromOperandStack(cl);
00501             cl.field_mem_type[cl.field_num - 1] = cp_num;
00502             
00503             return cl;
00504         }       
00505     }
00506     
00507     //memcpy(&cl.field_mem_reg, &s,strlen(s));
00508     return cl;
00509 }
00510 
00511 class_st getField(class_st cl,int cp_num){
00512     
00513     if(strncmp((const char *)seekNameAndType_desc(cp_num).stack_pt,"I",1) == 0){ // int type    
00514         int i;
00515         for(i = 0; i < cl.field_num ; i++){
00516             if(cl.field_mem_type[i] == cp_num){ //already exists    
00517                 cl = setIntegerToStack(cl,cl.field_mem_reg[i]); 
00518                 return cl;
00519             }
00520         }
00521         char s[32];
00522         sprintf(s,"Fnum=%d,memtype=%d,reg=%d\r\n",cl.field_num,cl.field_mem_type[0],cl.field_mem_reg[0]);
00523         uart_print(s);
00524         uart_print("getField error\r\n");
00525     }
00526     return cl;
00527 }
00528 
00529 
00530 class_st decodeVM(class_st cl){
00531     
00532     int now_code = 0;
00533     
00534     
00535         now_code    = cl.bc_offset + cl.code_offset;
00536         switch(*bc_seek(now_code,1)){
00537             case JAVA_nop:
00538                 now_code = now_code + 1;
00539                 break;
00540             
00541             case JAVA_ldc2_w:
00542                 cl = setStackFromConstantPool(cl, (*bc_seek(now_code + 1,1)<<8) + *bc_seek(now_code + 2,1));
00543                 now_code = now_code + 3;
00544                 break;
00545             case JAVA_ldc:
00546                 cl = setStackFromConstantPool(cl, *bc_seek(now_code + 1,1));
00547                 now_code = now_code + 2;
00548                 break;
00549             
00550             case JAVA_iconst_0:
00551                 cl = setIntegerToStack(cl,0);
00552                 now_code = now_code + 1;
00553                 break;
00554             case JAVA_iconst_1:
00555                 cl = setIntegerToStack(cl,1);
00556                 now_code = now_code + 1;
00557                 break;
00558             case JAVA_iconst_2:
00559                 cl = setIntegerToStack(cl,2);
00560                 now_code = now_code + 1;
00561                 break;
00562             case JAVA_iconst_3:
00563                 cl = setIntegerToStack(cl,3);
00564                 now_code = now_code + 1;
00565                 break;
00566             case JAVA_iconst_4:
00567                 cl = setIntegerToStack(cl,4);
00568                 now_code = now_code + 1;
00569                 break;
00570             case JAVA_iconst_5:
00571                 cl = setIntegerToStack(cl,5);
00572                 now_code = now_code + 1;
00573                 break;
00574             
00575             case JAVA_aload:
00576                 now_code = now_code + 2;
00577                 break;
00578             
00579             case JAVA_iload_0:
00580                 cl = setIntegerToStack(cl,cl.local_reg[0]);
00581                 now_code = now_code + 1;
00582                 break;
00583             case JAVA_iload_1:
00584                 cl = setIntegerToStack(cl,cl.local_reg[1]);
00585                 now_code = now_code + 1;
00586                 break;
00587             case JAVA_iload_2:
00588                 cl = setIntegerToStack(cl,cl.local_reg[2]);
00589                 now_code = now_code + 1;
00590                 break;
00591             case JAVA_iload_3:
00592                 cl = setIntegerToStack(cl,cl.local_reg[3]);
00593                 now_code = now_code + 1;
00594                 break;          
00595             
00596             case JAVA_aload_0:
00597             case JAVA_aload_1:
00598             case JAVA_aload_2:
00599             case JAVA_aload_3:
00600                 now_code = now_code + 1;
00601                 break;
00602             
00603             case JAVA_astore:
00604                 now_code = now_code + 2;
00605                 break;
00606             
00607             case JAVA_istore_0:
00608                 cl.local_reg[0] = getIntegerFromOperandStack(cl);
00609             now_code = now_code + 1;
00610                 break;
00611             case JAVA_istore_1:
00612                 cl.local_reg[1] = getIntegerFromOperandStack(cl);
00613             now_code = now_code + 1;
00614                 break;
00615             case JAVA_istore_2:
00616                 cl.local_reg[2] = getIntegerFromOperandStack(cl);
00617             now_code = now_code + 1;
00618                 break;
00619             case JAVA_istore_3:
00620                 cl.local_reg[3] = getIntegerFromOperandStack(cl);
00621             now_code = now_code + 1;
00622                 break;          
00623             
00624             case JAVA_astore_0:
00625             case JAVA_astore_1:
00626             case JAVA_astore_2:
00627             case JAVA_astore_3:
00628                 now_code = now_code + 1;
00629                 break;
00630             
00631             case JAVA_dup:
00632                 now_code = now_code + 1;
00633                 break;
00634             
00635             case JAVA_iadd:
00636                 now_code = now_code + 1;
00637                 setIntegerToStack(cl,getIntegerFromOperandStack(cl) + getIntegerFromOperandStack(cl));
00638                 break;
00639 
00640             case JAVA_iinc:
00641                 cl.local_reg[*bc_seek(now_code + 1, 1)] = cl.local_reg[*bc_seek(now_code + 1, 1)] + (int8_t)(*bc_seek(now_code + 2, 1));
00642                 now_code = now_code + 3;
00643                 break;
00644 
00645             case JAVA_getstatic:
00646                 now_code = now_code + 3;
00647                 break;
00648             
00649             case JAVA_getfield:
00650                 cl = getField(cl,(*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
00651                 now_code = now_code + 3;
00652                 break;
00653             
00654             case JAVA_putfield:
00655                 cl = putField(cl,(*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
00656                 now_code = now_code + 3;
00657                 break;
00658             
00659             case    JAVA_i2l:
00660                 //cl = changeStackType(cl, Stack_LongType);
00661                 now_code = now_code + 1;
00662             break;
00663             
00664             case JAVA_i2c:
00665                 now_code = now_code + 1;
00666                 cl = changeStackType(cl, Stack_CharType);   
00667                 break;
00668             
00669             case JAVA_if_icmplt:
00670                 if(getIntegerFromOperandStack(cl) > getIntegerFromOperandStack(cl)){
00671                     now_code = now_code +(int16_t)((*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1)); // goto
00672                     break;
00673                 }else{
00674                     now_code = now_code + 3;
00675                 }
00676                 break;
00677             
00678             case JAVA_if_icmpge:
00679                 if(getIntegerFromOperandStack(cl) <= getIntegerFromOperandStack(cl)){
00680                     now_code = now_code +(int16_t)((*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1)); // goto
00681                     break;
00682                 }else{
00683                     now_code = now_code + 3;
00684                 }               
00685                 break;
00686                 
00687             case JAVA_if_icmpgt:
00688                 if(getIntegerFromOperandStack(cl) < getIntegerFromOperandStack(cl)){
00689                     now_code = now_code +(int16_t)((*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1)); // goto
00690                     break;
00691                 }else{
00692                     now_code = now_code + 3;
00693                 }
00694                 break;
00695             
00696             case JAVA_if_icmple:
00697                 if(getIntegerFromOperandStack(cl) >= getIntegerFromOperandStack(cl)){
00698                     now_code = now_code +(int16_t)((*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1)); // goto
00699                     break;
00700                 }else{
00701                     now_code = now_code + 3;
00702                 }
00703                 break;
00704                                 
00705             case JAVA_goto:
00706                 now_code = now_code +(int16_t)((*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
00707                 break;
00708             
00709             case JAVA_bipush:
00710                 cl = setIntegerToStack(cl,*bc_seek(now_code + 1,1));
00711                 now_code = now_code + 2;
00712                 break;
00713             
00714             case JAVA_sipush:
00715                 cl = setIntegerToStack(cl,((*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1)));
00716                 now_code = now_code + 3;
00717                 break;
00718             
00719             case JAVA_invokevirtual:
00720                 cl = invokevirtual_callFunction(cl,(*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
00721                 now_code = now_code + 3;
00722                 break;
00723 
00724             case JAVA_invokestatic:
00725                 cl = invokestatic_callFunction(cl,(*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
00726                 now_code = cl.bc_offset + cl.code_offset;  
00727                 break;
00728             
00729             case JAVA_invokespecial:
00730                 cl = invokespecial_callFunction(cl, (*bc_seek(now_code + 1, 1) << 8) + *bc_seek(now_code + 2, 1));
00731                 now_code = now_code + 3;
00732                 break;
00733             
00734             case JAVA_new:
00735                 now_code = now_code + 3;
00736                 break;
00737             
00738             case JAVA_return:
00739                 cl.code_offset = 0;
00740                 cl.threadCommand = Thread_returned;
00741                 
00742             default:
00743                 break;
00744         }
00745             
00746         cl.code_offset = now_code - cl.bc_offset;
00747     
00748         
00749     return cl;
00750 }
00751 
00752 
00753 class_st invokespecial_callFunction(class_st cl, int cp_num){
00754 
00755     char* func_name = (char *)seekNameAndType_name(cp_num).stack_pt;
00756 
00757     if(strncmp(func_name,"<init>",6) == 0){
00758         if(strncmp((const char *)seekNameAndType_desc(cp_num).stack_pt,"(I",2) != 0) {return cl;}
00759         int i;
00760         for(i = 0 ; i < cl.stack_num ; i++){
00761             if(cl.op_stack_type[i] == Stack_Nothing){ // seek top of stack
00762                     if(i == 0){
00763                         cl.threadCommand = Thread_getInitMethod;
00764 
00765                         return cl;
00766                     }
00767                 break; 
00768             }
00769         }
00770         i = i - 1;
00771         cl.threadCommand = Thread_getInitMethodWithStack;
00772 
00773         cl.threadArg = i;
00774         return cl;
00775     }
00776     return cl;
00777 }
00778 
00779 class_st invokestatic_callFunction(class_st cl, int cp_num){
00780     
00781     char* func_name = (char *)seekNameAndType_name(cp_num).stack_pt;
00782     
00783     if(strncmp(func_name,"sleep",5) == 0){
00784         int hold_time = 0;
00785         hold_time = getIntegerFromOperandStack(cl);
00786         switch(cl.threadCommand){
00787             case Thread_Active:
00788                 cl.threadCommand = Thread_inSleep;
00789                 cl.threadArg     = time_millis();
00790                 cl = setIntegerToStack(cl,hold_time);
00791                 break;
00792             case Thread_inSleep:
00793                 if(time_millis() - cl.threadArg >= hold_time){
00794                     cl.threadCommand = Thread_Active;
00795                     cl.threadArg     = 0;
00796                     cl.code_offset   = cl.code_offset + 3;
00797                     hold_time        = 0;
00798                 }else{
00799                     cl = setIntegerToStack(cl,hold_time);
00800                 }
00801                 break;
00802             default:
00803                 break;
00804         }
00805         
00806         return cl;
00807     }else if(strncmp(func_name,"portWrite",9) == 0){// writePort(bit,value)
00808         int value = getIntegerFromOperandStack(cl);
00809         int bit   = getIntegerFromOperandStack(cl);
00810         port_write(0,bit,value);
00811     }
00812     cl.code_offset = cl.code_offset + 3;
00813     return cl;
00814 }
00815 
00816 //user code
00817 class_st invokevirtual_callFunction(class_st cl, int cp_num){
00818     
00819     char* func_name = (char *)seekNameAndType_name(cp_num).stack_pt;
00820     
00821     if(strncmp(func_name,"println",7) == 0){
00822         char str[64]; 
00823         char *strn = getStringFromOperandStack(cl);
00824         sprintf(str,"%s",strn);
00825         uart_print(str);
00826         uart_print("\r\n");
00827         return cl;
00828     }else if(strncmp(func_name,"print",5) == 0){
00829         char str[64]; 
00830         char *strn = getStringFromOperandStack(cl);
00831         sprintf(str,"%s",strn);
00832         uart_print(str);
00833         return cl;
00834     }else if(strncmp(func_name,"read",4) == 0){
00835         int getInt;
00836         getInt = uart_read();
00837         cl = setIntegerToStack(cl,getInt);
00838         return cl;
00839     }else if(strncmp(func_name,"start",5) == 0){
00840         cl.threadCommand = Thread_getStartMethod;
00841         return cl;
00842     }else if(strncmp(func_name,"getName",7) == 0){
00843         cl = setIntegerToStack(cl, cl.myThreadNum);
00844         return cl;
00845     }
00846     
00847     return cl;
00848 }
00849