paul@4 | 1 | #!/usr/bin/env python |
paul@4 | 2 | |
paul@4 | 3 | """ |
paul@4 | 4 | Java bytecode conversion. Specification found at the following URL: |
paul@4 | 5 | http://java.sun.com/docs/books/vmspec/2nd-edition/html/Instructions2.doc.html |
paul@4 | 6 | """ |
paul@4 | 7 | |
paul@4 | 8 | import dis # for access to Python bytecode values |
paul@4 | 9 | |
paul@4 | 10 | # Bytecode conversion. |
paul@4 | 11 | |
paul@4 | 12 | def get_instructions(code): |
paul@4 | 13 | global java_bytecodes |
paul@4 | 14 | |
paul@4 | 15 | i = 0 |
paul@4 | 16 | instructions = [] |
paul@4 | 17 | while i < len(code): |
paul@4 | 18 | bytecode = ord(code[i]) |
paul@4 | 19 | mnemonic, number_of_arguments, stack_change = java_bytecodes[bytecode] |
paul@4 | 20 | |
paul@4 | 21 | # NOTE: To be fixed. |
paul@4 | 22 | if number_of_arguments is None: |
paul@4 | 23 | print "Stop at", mnemonic |
paul@4 | 24 | return instructions |
paul@4 | 25 | |
paul@4 | 26 | arguments = [] |
paul@4 | 27 | for j in range(0, number_of_arguments): |
paul@4 | 28 | arguments.append(ord(code[i + 1 + j])) |
paul@4 | 29 | |
paul@4 | 30 | i = i + 1 + number_of_arguments |
paul@4 | 31 | instructions.append((mnemonic, arguments)) |
paul@4 | 32 | |
paul@4 | 33 | return instructions |
paul@4 | 34 | |
paul@4 | 35 | java_bytecodes = { |
paul@4 | 36 | # code : (mnemonic, number of following bytes, change in stack) |
paul@4 | 37 | 0 : ("nop", 0, 0), |
paul@4 | 38 | 1 : ("aconst_null", 0, 1), |
paul@4 | 39 | 2 : ("iconst_m1", 0, 1), |
paul@4 | 40 | 3 : ("iconst_0", 0, 1), |
paul@4 | 41 | 4 : ("iconst_1", 0, 1), |
paul@4 | 42 | 5 : ("iconst_2", 0, 1), |
paul@4 | 43 | 6 : ("iconst_3", 0, 1), |
paul@4 | 44 | 7 : ("iconst_4", 0, 1), |
paul@4 | 45 | 8 : ("iconst_5", 0, 1), |
paul@4 | 46 | 9 : ("lconst_0", 0, 1), |
paul@4 | 47 | 10 : ("lconst_1", 0, 1), |
paul@4 | 48 | 11 : ("fconst_0", 0, 1), |
paul@4 | 49 | 12 : ("fconst_1", 0, 1), |
paul@4 | 50 | 13 : ("fconst_2", 0, 1), |
paul@4 | 51 | 14 : ("dconst_0", 0, 1), |
paul@4 | 52 | 15 : ("dconst_1", 0, 1), |
paul@4 | 53 | 16 : ("bipush", 1, 1), |
paul@4 | 54 | 17 : ("sipush", 2, 1), |
paul@4 | 55 | 18 : ("ldc", 1, 1), |
paul@4 | 56 | 19 : ("ldc_w", 2, 1), |
paul@4 | 57 | 20 : ("ldc2_w", 2, 1), |
paul@4 | 58 | 21 : ("iload", 1, 1), |
paul@4 | 59 | 22 : ("lload", 1, 1), |
paul@4 | 60 | 23 : ("fload", 1, 1), |
paul@4 | 61 | 24 : ("dload", 1, 1), |
paul@4 | 62 | 25 : ("aload", 1, 1), |
paul@4 | 63 | 26 : ("iload_0", 0, 1), |
paul@4 | 64 | 27 : ("iload_1", 0, 1), |
paul@4 | 65 | 28 : ("iload_2", 0, 1), |
paul@4 | 66 | 29 : ("iload_3", 0, 1), |
paul@4 | 67 | 30 : ("lload_0", 0, 1), |
paul@4 | 68 | 31 : ("lload_1", 0, 1), |
paul@4 | 69 | 32 : ("lload_2", 0, 1), |
paul@4 | 70 | 33 : ("lload_3", 0, 1), |
paul@4 | 71 | 34 : ("fload_0", 0, 1), |
paul@4 | 72 | 35 : ("fload_1", 0, 1), |
paul@4 | 73 | 36 : ("fload_2", 0, 1), |
paul@4 | 74 | 37 : ("fload_3", 0, 1), |
paul@4 | 75 | 38 : ("dload_0", 0, 1), |
paul@4 | 76 | 39 : ("dload_1", 0, 1), |
paul@4 | 77 | 40 : ("dload_2", 0, 1), |
paul@4 | 78 | 41 : ("dload_3", 0, 1), |
paul@4 | 79 | 42 : ("aload_0", 0, 1), |
paul@4 | 80 | 43 : ("aload_1", 0, 1), |
paul@4 | 81 | 44 : ("aload_2", 0, 1), |
paul@4 | 82 | 45 : ("aload_3", 0, 1), |
paul@4 | 83 | 46 : ("iaload", 0, -1), |
paul@4 | 84 | 47 : ("laload", 0, -1), |
paul@4 | 85 | 48 : ("faload", 0, -1), |
paul@4 | 86 | 49 : ("daload", 0, -1), |
paul@4 | 87 | 50 : ("aaload", 0, -1), |
paul@4 | 88 | 51 : ("baload", 0, -1), |
paul@4 | 89 | 52 : ("caload", 0, -1), |
paul@4 | 90 | 53 : ("saload", 0, -1), |
paul@4 | 91 | 54 : ("istore", 1, -1), |
paul@4 | 92 | 55 : ("lstore", 1, -1), |
paul@4 | 93 | 56 : ("fstore", 1, -1), |
paul@4 | 94 | 57 : ("dstore", 1, -1), |
paul@4 | 95 | 58 : ("astore", 1, -1), |
paul@4 | 96 | 59 : ("istore_0", 0, -1), |
paul@4 | 97 | 60 : ("istore_1", 0, -1), |
paul@4 | 98 | 61 : ("istore_2", 0, -1), |
paul@4 | 99 | 62 : ("istore_3", 0, -1), |
paul@4 | 100 | 63 : ("lstore_0", 0, -1), |
paul@4 | 101 | 64 : ("lstore_1", 0, -1), |
paul@4 | 102 | 65 : ("lstore_2", 0, -1), |
paul@4 | 103 | 66 : ("lstore_3", 0, -1), |
paul@4 | 104 | 67 : ("fstore_0", 0, -1), |
paul@4 | 105 | 68 : ("fstore_1", 0, -1), |
paul@4 | 106 | 69 : ("fstore_2", 0, -1), |
paul@4 | 107 | 70 : ("fstore_3", 0, -1), |
paul@4 | 108 | 71 : ("dstore_0", 0, -1), |
paul@4 | 109 | 72 : ("dstore_1", 0, -1), |
paul@4 | 110 | 73 : ("dstore_2", 0, -1), |
paul@4 | 111 | 74 : ("dstore_3", 0, -1), |
paul@4 | 112 | 75 : ("astore_0", 0, -1), |
paul@4 | 113 | 76 : ("astore_1", 0, -1), |
paul@4 | 114 | 77 : ("astore_2", 0, -1), |
paul@4 | 115 | 78 : ("astore_3", 0, -1), |
paul@4 | 116 | 79 : ("iastore", 0, -3), |
paul@4 | 117 | 80 : ("lastore", 0, -3), |
paul@4 | 118 | 81 : ("fastore", 0, -3), |
paul@4 | 119 | 82 : ("dastore", 0, -3), |
paul@4 | 120 | 83 : ("aastore", 0, -3), |
paul@4 | 121 | 84 : ("bastore", 0, -3), |
paul@4 | 122 | 85 : ("castore", 0, -3), |
paul@4 | 123 | 86 : ("sastore", 0, -3), |
paul@4 | 124 | 87 : ("pop", 0, -1), |
paul@4 | 125 | 88 : ("pop2", 0, None), # variable number of elements removed |
paul@4 | 126 | 89 : ("dup", 0, 1), |
paul@4 | 127 | 90 : ("dup_x1", 0, 1), |
paul@4 | 128 | 91 : ("dup_x2", 0, 1), |
paul@4 | 129 | 92 : ("dup2", 0, 2), # or 1 extra stack value |
paul@4 | 130 | 93 : ("dup2_x1", 0, 2), # or 1 extra stack value |
paul@4 | 131 | 94 : ("dup2_x2", 0, 2), # or 1 extra stack value |
paul@4 | 132 | 95 : ("swap", 0, 0), |
paul@4 | 133 | 96 : ("iadd", 0, -1), |
paul@4 | 134 | 97 : ("ladd", 0, -1), |
paul@4 | 135 | 98 : ("fadd", 0, -1), |
paul@4 | 136 | 99 : ("dadd", 0, -1), |
paul@4 | 137 | 100 : ("isub", 0, -1), |
paul@4 | 138 | 101 : ("lsub", 0, -1), |
paul@4 | 139 | 102 : ("fsub", 0, -1), |
paul@4 | 140 | 103 : ("dsub", 0, -1), |
paul@4 | 141 | 104 : ("imul", 0, -1), |
paul@4 | 142 | 105 : ("lmul", 0, -1), |
paul@4 | 143 | 106 : ("fmul", 0, -1), |
paul@4 | 144 | 107 : ("dmul", 0, -1), |
paul@4 | 145 | 108 : ("idiv", 0, -1), |
paul@4 | 146 | 109 : ("ldiv", 0, -1), |
paul@4 | 147 | 110 : ("fdiv", 0, -1), |
paul@4 | 148 | 111 : ("ddiv", 0, -1), |
paul@4 | 149 | 112 : ("irem", 0, -1), |
paul@4 | 150 | 113 : ("lrem", 0, -1), |
paul@4 | 151 | 114 : ("frem", 0, -1), |
paul@4 | 152 | 115 : ("drem", 0, -1), |
paul@4 | 153 | 116 : ("ineg", 0, 0), |
paul@4 | 154 | 117 : ("lneg", 0, 0), |
paul@4 | 155 | 118 : ("fneg", 0, 0), |
paul@4 | 156 | 119 : ("dneg", 0, 0), |
paul@4 | 157 | 120 : ("ishl", 0, -1), |
paul@4 | 158 | 121 : ("lshl", 0, -1), |
paul@4 | 159 | 122 : ("ishr", 0, -1), |
paul@4 | 160 | 123 : ("lshr", 0, -1), |
paul@4 | 161 | 124 : ("iushr", 0, -1), |
paul@4 | 162 | 125 : ("lushr", 0, -1), |
paul@4 | 163 | 126 : ("iand", 0, -1), |
paul@4 | 164 | 127 : ("land", 0, -1), |
paul@4 | 165 | 128 : ("ior", 0, -1), |
paul@4 | 166 | 129 : ("lor", 0, -1), |
paul@4 | 167 | 130 : ("ixor", 0, -1), |
paul@4 | 168 | 131 : ("lxor", 0, -1), |
paul@4 | 169 | 132 : ("iinc", 2, 0), |
paul@4 | 170 | 133 : ("i2l", 0, 0), |
paul@4 | 171 | 134 : ("i2f", 0, 0), |
paul@4 | 172 | 135 : ("i2d", 0, 0), |
paul@4 | 173 | 136 : ("l2i", 0, 0), |
paul@4 | 174 | 137 : ("l2f", 0, 0), |
paul@4 | 175 | 138 : ("l2d", 0, 0), |
paul@4 | 176 | 139 : ("f2i", 0, 0), |
paul@4 | 177 | 140 : ("f2l", 0, 0), |
paul@4 | 178 | 141 : ("f2d", 0, 0), |
paul@4 | 179 | 142 : ("d2i", 0, 0), |
paul@4 | 180 | 143 : ("d2l", 0, 0), |
paul@4 | 181 | 144 : ("d2f", 0, 0), |
paul@4 | 182 | 145 : ("i2b", 0, 0), |
paul@4 | 183 | 146 : ("i2c", 0, 0), |
paul@4 | 184 | 147 : ("i2s", 0, 0), |
paul@4 | 185 | 148 : ("lcmp", 0, -1), |
paul@4 | 186 | 149 : ("fcmpl", 0, -1), |
paul@4 | 187 | 150 : ("fcmpg", 0, -1), |
paul@4 | 188 | 151 : ("dcmpl", 0, -1), |
paul@4 | 189 | 152 : ("dcmpg", 0, -1), |
paul@4 | 190 | 153 : ("ifeq", 2, -1), |
paul@4 | 191 | 154 : ("ifne", 2, -1), |
paul@4 | 192 | 155 : ("iflt", 2, -1), |
paul@4 | 193 | 156 : ("ifge", 2, -1), |
paul@4 | 194 | 157 : ("ifgt", 2, -1), |
paul@4 | 195 | 158 : ("ifle", 2, -1), |
paul@4 | 196 | 159 : ("if_icmpeq", 2, -2), |
paul@4 | 197 | 160 : ("if_icmpne", 2, -2), |
paul@4 | 198 | 161 : ("if_icmplt", 2, -2), |
paul@4 | 199 | 162 : ("if_icmpge", 2, -2), |
paul@4 | 200 | 163 : ("if_icmpgt", 2, -2), |
paul@4 | 201 | 164 : ("if_icmple", 2, -2), |
paul@4 | 202 | 165 : ("if_acmpeq", 2, -2), |
paul@4 | 203 | 166 : ("if_acmpne", 2, -2), |
paul@4 | 204 | 167 : ("goto", 2, 0), |
paul@4 | 205 | 168 : ("jsr", 2, 1), |
paul@4 | 206 | 169 : ("ret", 1, 0), |
paul@4 | 207 | 170 : ("tableswitch", None, -1), # variable number of arguments |
paul@4 | 208 | 171 : ("lookupswitch", None, -1), # variable number of arguments |
paul@4 | 209 | 172 : ("ireturn", 0, -1), |
paul@4 | 210 | 173 : ("lreturn", 0, -1), |
paul@4 | 211 | 174 : ("freturn", 0, -1), |
paul@4 | 212 | 175 : ("dreturn", 0, -1), |
paul@4 | 213 | 176 : ("areturn", 0, -1), |
paul@4 | 214 | 177 : ("return", 0, 0), |
paul@4 | 215 | 178 : ("getstatic", 2, 1), |
paul@4 | 216 | 179 : ("putstatic", 2, -1), |
paul@4 | 217 | 180 : ("getfield", 2, 0), |
paul@4 | 218 | 181 : ("putfield", 2, -2), |
paul@4 | 219 | 182 : ("invokevirtual", 2, None), # variable number of elements removed |
paul@4 | 220 | 183 : ("invokespecial", 2, None), # variable number of elements removed |
paul@4 | 221 | 184 : ("invokestatic", 2, None), # variable number of elements removed |
paul@4 | 222 | 185 : ("invokeinterface", 4, None), # variable number of elements removed |
paul@4 | 223 | 187 : ("new", 2, 1), |
paul@4 | 224 | 188 : ("newarray", 1, 0), |
paul@4 | 225 | 189 : ("anewarray", 2, 0), |
paul@4 | 226 | 190 : ("arraylength", 0, 0), |
paul@4 | 227 | 191 : ("athrow", 0, 0), |
paul@4 | 228 | 192 : ("checkcast", 2, 0), |
paul@4 | 229 | 193 : ("instanceof", 2, 0), |
paul@4 | 230 | 194 : ("monitorenter", 0, -1), |
paul@4 | 231 | 195 : ("monitorexit", 0, -1), |
paul@4 | 232 | 196 : ("wide", None, None), # 3 or 5 arguments, stack changes according to modified element |
paul@4 | 233 | 197 : ("multianewarray", 3, None), # variable number of elements removed |
paul@4 | 234 | 198 : ("ifnull", 2, -1), |
paul@4 | 235 | 199 : ("ifnonnull", 2, -1), |
paul@4 | 236 | 200 : ("goto_w", 4, 0), |
paul@4 | 237 | 201 : ("jsr_w", 4, 1), |
paul@4 | 238 | } |
paul@4 | 239 | |
paul@4 | 240 | # vim: tabstop=4 expandtab shiftwidth=4 |