JVM test

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ravem.h Source File

ravem.h

00001 /*
00002  * RAVEM.h
00003  *
00004  *  Created on: 2013/07/18
00005  *      Author: lynxeyed
00006  */
00007 
00008 #ifndef RAVEM_H_
00009 #define RAVEM_H_
00010 
00011 //#include "type.h"
00012 #include "pool.h"
00013 #include "device_depend.h"
00014 #include <stdlib.h>
00015 
00016 // constant_pool
00017 //#define Constant_Type             Value       length (in bytes)
00018 #define CONSTANT_Class              7           // 3
00019 #define CONSTANT_Fieldref           9           // 5
00020 #define CONSTANT_Methodref          10          // 5
00021 #define CONSTANT_InterfaceMethodref 11          // 5
00022 #define CONSTANT_String             8           // 3
00023 #define CONSTANT_Integer            3           // 5
00024 #define CONSTANT_Float              4           // 5
00025 #define CONSTANT_Long               5           // 9
00026 #define CONSTANT_Double             6           // 9
00027 #define CONSTANT_NameAndType        12          // 5
00028 #define CONSTANT_Utf8               1           // 4 or more (see 'length')
00029 #define CONSTANT_MethodHandle       15          // 5
00030 #define CONSTANT_MethodType         16          // 3
00031 #define CONSTANT_InvokeDynamic      18          // 3
00032 
00033 //stack type
00034 #define Stack_Nothing       0
00035 #define Stack_CharType      1
00036 #define Stack_IntType       2
00037 #define Stack_DoubleType    3
00038 #define Stack_ConstantPool  4
00039 
00040 //Thread State and Command
00041 #define Thread_returned                     0
00042 #define Thread_Active                       1
00043 #define Thread_getStartMethod               2
00044 #define Thread_getInitMethod                3
00045 #define Thread_getInitMethodWithStack       4
00046 #define Thread_init                         5   
00047 #define Thread_initIsDone                   6   
00048 #define Thread_inSleep                      7
00049 
00050 // instruction code         mnemonic code       number of arguments(in bytes)
00051 #define JAVA_nop                            0x00                    // 0
00052 #define JAVA_iconst_0                       0x03                    // 0
00053 #define JAVA_iconst_1                       0x04                    // 0
00054 #define JAVA_iconst_2                       0x05                    // 0
00055 #define JAVA_iconst_3                       0x06                    // 0
00056 #define JAVA_iconst_4                       0x07                    // 0
00057 #define JAVA_iconst_5                       0x08                    // 0
00058 #define JAVA_bipush                         0x10                    // 1
00059 #define JAVA_sipush                         0x11                    // 2
00060 #define JAVA_ldc                            0x12                    // 1
00061 //#define JAVA_ldc_w                        0x13                    // xxx
00062 #define JAVA_ldc2_w                         0x14                    // 2
00063 //#define JAVA_iload                        0x15
00064 
00065 #define JAVA_aload                          0x19                    // 1
00066 
00067 #define JAVA_iload_0                        0x1A                    // 0
00068 #define JAVA_iload_1                        0x1B                    // 0
00069 #define JAVA_iload_2                        0x1C                    // 0
00070 #define JAVA_iload_3                        0x1D                    // 0
00071 
00072 #define JAVA_aload_0                        0x2a                    // 0
00073 #define JAVA_aload_1                        0x2b                    // 0
00074 #define JAVA_aload_2                        0x2c                    // 0
00075 #define JAVA_aload_3                        0x2d                    // 0
00076 
00077 #define JAVA_astore                         0x3A                    // 1
00078 
00079 #define JAVA_istore_0                       0x3B                    // 0
00080 #define JAVA_istore_1                       0x3C                    // 0
00081 #define JAVA_istore_2                       0x3D                    // 0
00082 #define JAVA_istore_3                       0x3E                    // 0
00083 
00084 #define JAVA_astore_0                       0x4b                    // 0
00085 #define JAVA_astore_1                       0x4c                    // 0
00086 #define JAVA_astore_2                       0x4d                    // 0
00087 #define JAVA_astore_3                       0x4e                    // 0
00088 
00089 #define JAVA_dup                            0x59                    // 0
00090 
00091 #define JAVA_iadd                           0x60                    // 0
00092 
00093 #define JAVA_iinc                           0x84                    // 2
00094 #define JAVA_i2l                            0x85                    // 0
00095 #define JAVA_i2c                            0x92                    // 0
00096 
00097 #define JAVA_if_icmplt                      0xa1                    // 2
00098 #define JAVA_if_icmpge                      0xa2                    // 2
00099 #define JAVA_if_icmpgt                      0xa3                    // 2
00100 #define JAVA_if_icmple                      0xa4                    // 2
00101 
00102 #define JAVA_goto                           0xa7                    // 2
00103 #define JAVA_return                         0xb1                    // 0
00104 #define JAVA_getstatic                      0xb2                    // 2
00105 #define JAVA_getfield                       0xb4                    // 2
00106 #define JAVA_putfield                       0xb5                    // 2
00107 #define JAVA_invokevirtual                  0xb6                    // 2
00108 #define JAVA_invokespecial                  0xb7                    // 2 
00109 #define JAVA_invokestatic                   0xb8                    // 2
00110 
00111 #define JAVA_new                            0xbb                    // 2
00112 
00113 typedef struct {
00114     int     tag;
00115     int     index;
00116     int     index2;
00117     int     bc_num;     //pointer of bytecode
00118     void*   stack_pt;   // stack pointer (int,long,float,double,string)
00119 } const_pool_t;
00120 
00121 
00122 typedef struct {
00123     int bc_offset;          // offset of bytecode (this class starts here = bc_array[bc_offset]) 
00124     int code_offset;        // offset of code (Now we translate here from bc_offset = bc_array[bc_offset+code_offset] )
00125     int code_length;        // length of code
00126     int stack_num;          // number of stacks
00127     int local_num;          // number of local registers
00128     int field_num;          // number of field length
00129     int myThreadNum;        // Number of this thread(you must put #0 "main" method, and do not put #0 any other methods)
00130     int threadCommand;      // 
00131     int threadArg;
00132     
00133     int *local_reg;         // local registers(malloc here)
00134     int *op_stack;          // operand stack(malloc here) numerics or CP num
00135     int *op_stack_type;     // type of each stack,0:nothing 1:int,byte 2:long,float,double 3:See CP 
00136 
00137     int *field_mem_reg;     // Field (getfield and putfield)
00138     int *field_mem_type;    // Member variable type (Int or String)
00139 
00140 } class_st;
00141 
00142 extern int32_t methods_count;
00143 
00144 void bc_init(void);
00145 char *bc_seek(int bc_num, int length);
00146 const_pool_t getConstantPoolInfo(int constant_num);
00147 const_pool_t seekConstClassNumString(int const_num);
00148 const_pool_t seekClassIndex(int const_num);
00149 const_pool_t seekNameAndType_name(int const_num);
00150 const_pool_t seekNameAndType_desc(int const_num);
00151 //
00152 int getIntegerFromOperandStack(class_st cl);
00153 char* getStringFromOperandStack(class_st cl);
00154 //
00155 class_st seekCodeArrtibute(class_st cl, char* method_name, int strlen);
00156 class_st setStackFromConstantPool(class_st cl, int cp_num);
00157 class_st setIntegerToStack(class_st cl, int num);
00158 //
00159 class_st getField(class_st cl, int cp_num);
00160 class_st putField(class_st cl, int cp_num);
00161 //
00162 class_st invokevirtual_callFunction(class_st cl, int cp_num);
00163 class_st invokestatic_callFunction(class_st cl, int cp_num);
00164 class_st invokespecial_callFunction(class_st cl, int cp_num);
00165 
00166 class_st decodeVM(class_st cl);
00167 
00168 #endif /* RAVEM_H_ */
00169