xeye_ atsu
/
FRDM_RaVem_JVM
JVM test
ravem.cpp@5:047542b65d00, 2013-08-24 (annotated)
- 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?
User | Revision | Line number | New 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 |