Properly parse Code attribute.
[hs-java.git] / JVM / Assembler.hs
1 {-# LANGUAGE TypeFamilies, StandaloneDeriving, FlexibleInstances, FlexibleContexts, UndecidableInstances, RecordWildCards, OverloadedStrings, TypeSynonymInstances, MultiParamTypeClasses #-}
2 module JVM.Assembler where
3
4 import Control.Monad
5 import Control.Applicative
6 import Data.Ix (inRange)
7 import Data.List
8 import Data.Word
9 import Data.Bits
10 import qualified Data.Binary as Binary
11 import qualified Data.Binary.Get as Get
12 import Data.Char
13 import Data.String
14 import qualified Data.ByteString.Lazy as B
15 import Data.Array
16 import qualified Data.Set as S
17 import qualified Data.Map as M
18
19 import Data.BinaryState
20 import JVM.ClassFile
21 import JVM.Types
22
23 data IMM =
24     I0
25   | I1
26   | I2
27   | I3
28   deriving (Eq, Ord, Enum, Show)
29
30 data CMP =
31     C_EQ
32   | C_NE
33   | C_LT
34   | C_GE
35   | C_GT
36   | C_LE
37   deriving (Eq, Ord, Enum, Show)
38
39 data Code = Code {
40     codeStackSize :: Word16,
41     codeMaxLocals :: Word16,
42     codeLength :: Word32,
43     codeInstructions :: [Instruction],
44     codeExceptionsN :: Word16,
45     codeExceptions :: [CodeException],
46     codeAttrsN :: Word16,
47     codeAttributes :: [AttributeInfo] }
48   deriving (Eq, Show)
49
50 data CodeException = CodeException {
51     eStartPC :: Word16,
52     eEndPC :: Word16,
53     eHandlerPC :: Word16,
54     eCatchType :: Word16 }
55   deriving (Eq, Show)
56
57 instance BinaryState Integer CodeException where
58   put (CodeException {..}) = do
59     put eStartPC
60     put eEndPC
61     put eHandlerPC
62     put eCatchType
63
64   get = CodeException <$> get <*> get <*> get <*> get
65
66 instance BinaryState Integer AttributeInfo where
67   put a = do
68     let sz = 6 + attributeLength a      -- full size of AttributeInfo structure
69     liftOffset (fromIntegral sz) Binary.put a
70
71   get = getZ
72
73 instance BinaryState Integer Code where
74   put (Code {..}) = do
75     put codeStackSize
76     put codeMaxLocals
77     put codeLength
78     forM_ codeInstructions put
79     put codeExceptionsN
80     forM_ codeExceptions put
81     put codeAttrsN
82     forM_ codeAttributes put
83
84   get = do
85     stackSz <- get
86     locals <- get
87     len <- get
88     bytes <- replicateM (fromIntegral len) get
89     let bytecode = B.pack bytes
90         code = decodeWith readInstructions 0 bytecode
91     excn <- get
92     excs <- replicateM (fromIntegral excn) get
93     nAttrs <- get
94     attrs <- replicateM (fromIntegral nAttrs) get
95     return $ Code stackSz locals len code excn excs nAttrs attrs
96
97 readInstructions :: GetState Integer [Instruction]
98 readInstructions = do
99    end <- isEmpty
100    if end
101      then return []
102      else do
103           x <- get
104           next <- readInstructions
105           return (x: next)
106
107 data Instruction =
108     NOP            -- 0
109   | ACONST_NULL    -- 1
110   | ICONST_M1      -- 2
111   | ICONST_0       -- 3
112   | ICONST_1       -- 4
113   | ICONST_2       -- 5
114   | ICONST_3       -- 6
115   | ICONST_4       -- 7
116   | ICONST_5       -- 8
117   | LCONST_0       -- 9
118   | LCONST_1       -- 10
119   | FCONST_0       -- 11
120   | FCONST_1       -- 12
121   | FCONST_2       -- 13
122   | DCONST_0       -- 14
123   | DCONST_1       -- 15
124   | BIPUSH Word8   -- 16
125   | SIPUSH Word16  -- 17
126   | LDC1 Word8     -- 18
127   | LDC2 Word16    -- 19
128   | LDC2W Word16   -- 20
129   | ILOAD Word8    -- 21
130   | LLOAD Word8    -- 22
131   | FLOAD Word8    -- 23
132   | DLOAD Word8    -- 24
133   | ALOAD Word8    -- 25
134   | ILOAD_ IMM     -- 26, 27, 28, 29
135   | LLOAD_ IMM     -- 30, 31, 32, 33
136   | FLOAD_ IMM     -- 34, 35, 36, 37
137   | DLOAD_ IMM     -- 38, 39, 40, 41
138   | ALOAD_ IMM     -- 42, 43, 44, 45
139   | IALOAD         -- 46
140   | LALOAD         -- 47
141   | FALOAD         -- 48
142   | DALOAD         -- 49
143   | AALOAD         -- 50
144   | BALOAD         -- 51
145   | CALOAD         -- 52
146   | SALOAD         -- 53
147   | ISTORE Word8   -- 54
148   | LSTORE Word8   -- 55
149   | FSTORE Word8   -- 56
150   | DSTORE Word8   -- 57
151   | ASTORE Word8   -- 58
152   | ISTORE_ IMM    -- 59, 60, 61, 62
153   | LSTORE_ IMM    -- 63, 64, 65, 66
154   | FSTORE_ IMM    -- 67, 68, 69, 70
155   | DSTORE_ IMM    -- 71, 72, 73, 74
156   | ASTORE_ IMM    -- 75, 76, 77, 78
157   | IASTORE        -- 79
158   | LASTORE        -- 80
159   | FASTORE        -- 81
160   | DASTORE        -- 82
161   | AASTORE        -- 83
162   | BASTORE        -- 84
163   | CASTORE        -- 85
164   | SASTORE        -- 86
165   | POP            -- 87
166   | POP2           -- 88
167   | DUP            -- 89
168   | DUP_X1         -- 90
169   | DUP_X2         -- 91
170   | DUP2           -- 92
171   | DUP2_X1        -- 93 
172   | DUP2_X2        -- 94
173   | SWAP           -- 95
174   | IADD           -- 96
175   | LADD           -- 97
176   | FADD           -- 98
177   | DADD           -- 99
178   | ISUB           -- 100
179   | LSUB           -- 101
180   | FSUB           -- 102
181   | DSUB           -- 103
182   | IMUL           -- 104
183   | LMUL           -- 105
184   | FMUL           -- 106
185   | DMUL           -- 107
186   | IDIV           -- 108
187   | LDIV           -- 109
188   | FDIV           -- 110
189   | DDIV           -- 111
190   | IREM           -- 112
191   | LREM           -- 113
192   | FREM           -- 114
193   | DREM           -- 115
194   | INEG           -- 116
195   | LNEG           -- 117
196   | FNEG           -- 118
197   | DNEG           -- 119
198   | ISHL           -- 120
199   | LSHL           -- 121
200   | ISHR           -- 122
201   | LSHR           -- 123
202   | IUSHR          -- 124
203   | LUSHR          -- 125
204   | IAND           -- 126
205   | LAND           -- 127
206   | IOR            -- 128
207   | LOR            -- 129
208   | IXOR           -- 130
209   | LXOR           -- 131
210   | IINC Word8 Word8       -- 132
211   | I2L                    -- 133
212   | I2F                    -- 134
213   | I2D                    -- 135
214   | L2I                    -- 136
215   | L2F                    -- 137
216   | L2D                    -- 138
217   | F2I                    -- 139
218   | F2L                    -- 140
219   | F2D                    -- 141
220   | D2I                    -- 142
221   | D2L                    -- 143
222   | D2F                    -- 144
223   | I2B                    -- 145
224   | I2C                    -- 146
225   | I2S                    -- 147
226   | LCMP                   -- 148
227   | FCMP CMP               -- 149, 150
228   | DCMP CMP               -- 151, 152
229   | IF CMP                 -- 153, 154, 155, 156, 157, 158
230   | IF_ICMP CMP Word16     -- 159, 160, 161, 162, 163, 164
231   | IF_ACMP CMP Word16     -- 165, 166
232   | GOTO                   -- 167
233   | JSR Word16             -- 168
234   | RET                    -- 169
235   | TABLESWITCH Word32 Word32 Word32 [Word32]     -- 170
236   | LOOKUPSWITCH Word32 Word32 [(Word32, Word32)] -- 171
237   | IRETURN                -- 172
238   | LRETURN                -- 173
239   | FRETURN                -- 174
240   | DRETURN                -- 175
241   | RETURN                 -- 177
242   | GETSTATIC Word16       -- 178
243   | PUTSTATIC Word16       -- 179
244   | GETFIELD Word16        -- 180
245   | PUTFIELD Word16        -- 181
246   | INVOKEVIRTUAL Word16   -- 182
247   | INVOKESPECIAL Word16   -- 183
248   | INVOKESTATIC Word16    -- 184
249   | INVOKEINTERFACE Word16 Word8 -- 185
250   | NEW Word16             -- 187
251   | NEWARRAY Word8         -- 188, see ArrayType
252   | ANEWARRAY Word16       -- 189
253   | ARRAYLENGTH            -- 190
254   | ATHROW                 -- 191
255   | CHECKCAST Word16       -- 192
256   | INSTANCEOF Word16      -- 193
257   | MONITORENTER           -- 194
258   | MONITOREXIT            -- 195
259   | WIDE Word8 Instruction -- 196
260   | MULTINANEWARRAY Word16 Word8 -- 197
261   | IFNULL Word16          -- 198
262   | IFNONNULL Word16       -- 199
263   | GOTO_W Word32          -- 200
264   | JSR_W Word32           -- 201
265   deriving (Eq, Show)
266
267 data ArrayType =
268     T_BOOLEAN  -- 4
269   | T_CHAR     -- 5
270   | T_FLOAT    -- 6
271   | T_DOUBLE   -- 7
272   | T_BYTE     -- 8
273   | T_SHORT    -- 9
274   | T_INT      -- 10
275   | T_LONG     -- 11
276   deriving (Eq, Show, Enum)
277
278 imm :: Word8 -> (IMM -> Instruction) -> Word8 -> GetState s Instruction
279 imm base constr x = return $ constr $ toEnum $ fromIntegral (x-base)
280
281 putImm :: Word8 -> IMM -> PutState Integer ()
282 putImm base i = putByte $ base + (fromIntegral $ fromEnum i)
283
284 atype2byte :: ArrayType -> Word8
285 atype2byte T_BOOLEAN  = 4
286 atype2byte T_CHAR     = 5
287 atype2byte T_FLOAT    = 6
288 atype2byte T_DOUBLE   = 7
289 atype2byte T_BYTE     = 8
290 atype2byte T_SHORT    = 9
291 atype2byte T_INT      = 10
292 atype2byte T_LONG     = 11
293
294 byte2atype :: Word8 -> GetState s ArrayType
295 byte2atype 4  = return T_BOOLEAN
296 byte2atype 5  = return T_CHAR
297 byte2atype 6  = return T_FLOAT
298 byte2atype 7  = return T_DOUBLE
299 byte2atype 8  = return T_BYTE
300 byte2atype 9  = return T_SHORT
301 byte2atype 10 = return T_INT
302 byte2atype 11 = return T_LONG
303 byte2atype x  = fail $ "Unknown array type byte: " ++ show x
304
305 instance BinaryState Integer ArrayType where
306   get = do
307     x <- getByte
308     byte2atype x
309
310   put t = putByte (atype2byte t)
311
312 put1 :: (BinaryState Integer a) => Word8 -> a -> PutState Integer ()
313 put1 code x = do
314   putByte code
315   put x
316
317 put2 :: (BinaryState Integer a, BinaryState Integer b) => Word8 -> a -> b -> PutState Integer ()
318 put2 code x y = do
319   putByte code
320   put x
321   put y
322
323 instance BinaryState Integer Instruction where
324   put  NOP         = putByte 0
325   put  ACONST_NULL = putByte 1
326   put  ICONST_M1   = putByte 2
327   put  ICONST_0    = putByte 3
328   put  ICONST_1    = putByte 4
329   put  ICONST_2    = putByte 5
330   put  ICONST_3    = putByte 6
331   put  ICONST_4    = putByte 7
332   put  ICONST_5    = putByte 8
333   put  LCONST_0    = putByte 9
334   put  LCONST_1    = putByte 10
335   put  FCONST_0    = putByte 11
336   put  FCONST_1    = putByte 12
337   put  FCONST_2    = putByte 13
338   put  DCONST_0    = putByte 14
339   put  DCONST_1    = putByte 15
340   put (BIPUSH x)   = put1 16 x
341   put (SIPUSH x)   = put1 17 x
342   put (LDC1 x)     = put1 18 x
343   put (LDC2 x)     = put1 19 x
344   put (LDC2W x)    = put1 20 x
345   put (ILOAD x)    = put1 21 x
346   put (LLOAD x)    = put1 22 x
347   put (FLOAD x)    = put1 23 x
348   put (DLOAD x)    = put1 24 x
349   put (ALOAD x)    = put1 25 x
350   put (ILOAD_ i)   = putImm 26 i
351   put (LLOAD_ i)   = putImm 30 i
352   put (FLOAD_ i)   = putImm 34 i
353   put (DLOAD_ i)   = putImm 38 i
354   put (ALOAD_ i)   = putImm 42 i
355   put  IALOAD      = putByte 46
356   put  LALOAD      = putByte 47
357   put  FALOAD      = putByte 48
358   put  DALOAD      = putByte 49
359   put  AALOAD      = putByte 50
360   put  BALOAD      = putByte 51
361   put  CALOAD      = putByte 52
362   put  SALOAD      = putByte 53
363   put (ISTORE x)   = put1  54 x
364   put (LSTORE x)   = put1  55 x
365   put (FSTORE x)   = put1  56 x
366   put (DSTORE x)   = put1  57 x
367   put (ASTORE x)   = put1  58 x
368   put (ISTORE_ i)  = putImm 59 i
369   put (LSTORE_ i)  = putImm 63 i
370   put (FSTORE_ i)  = putImm 67 i
371   put (DSTORE_ i)  = putImm 71 i
372   put (ASTORE_ i)  = putImm 75 i
373   put  IASTORE     = putByte 79
374   put  LASTORE     = putByte 80
375   put  FASTORE     = putByte 81
376   put  DASTORE     = putByte 82
377   put  AASTORE     = putByte 83
378   put  BASTORE     = putByte 84
379   put  CASTORE     = putByte 85
380   put  SASTORE     = putByte 86
381   put  POP         = putByte 87
382   put  POP2        = putByte 88
383   put  DUP         = putByte 89
384   put  DUP_X1      = putByte 90
385   put  DUP_X2      = putByte 91
386   put  DUP2        = putByte 92
387   put  DUP2_X1     = putByte 93 
388   put  DUP2_X2     = putByte 94
389   put  SWAP        = putByte 95
390   put  IADD        = putByte 96
391   put  LADD        = putByte 97
392   put  FADD        = putByte 98
393   put  DADD        = putByte 99
394   put  ISUB        = putByte 100
395   put  LSUB        = putByte 101
396   put  FSUB        = putByte 102
397   put  DSUB        = putByte 103
398   put  IMUL        = putByte 104
399   put  LMUL        = putByte 105
400   put  FMUL        = putByte 106
401   put  DMUL        = putByte 107
402   put  IDIV        = putByte 108
403   put  LDIV        = putByte 109
404   put  FDIV        = putByte 110
405   put  DDIV        = putByte 111
406   put  IREM        = putByte 112
407   put  LREM        = putByte 113
408   put  FREM        = putByte 114
409   put  DREM        = putByte 115
410   put  INEG        = putByte 116
411   put  LNEG        = putByte 117
412   put  FNEG        = putByte 118
413   put  DNEG        = putByte 119
414   put  ISHL        = putByte 120
415   put  LSHL        = putByte 121
416   put  ISHR        = putByte 122
417   put  LSHR        = putByte 123
418   put  IUSHR       = putByte 124
419   put  LUSHR       = putByte 125
420   put  IAND        = putByte 126
421   put  LAND        = putByte 127
422   put  IOR         = putByte 128
423   put  LOR         = putByte 129
424   put  IXOR        = putByte 130
425   put  LXOR        = putByte 131
426   put (IINC x y)      = put2 132 x y
427   put  I2L            = putByte 133
428   put  I2F            = putByte 134
429   put  I2D            = putByte 135
430   put  L2I            = putByte 136
431   put  L2F            = putByte 137
432   put  L2D            = putByte 138
433   put  F2I            = putByte 139
434   put  F2L            = putByte 140
435   put  F2D            = putByte 141
436   put  D2I            = putByte 142
437   put  D2L            = putByte 143
438   put  D2F            = putByte 144
439   put  I2B            = putByte 145
440   put  I2C            = putByte 146
441   put  I2S            = putByte 147
442   put  LCMP           = putByte 148
443   put (FCMP C_LT)     = putByte 149
444   put (FCMP C_GT)     = putByte 150
445   put (FCMP c)        = fail $ "No such instruction: FCMP " ++ show c
446   put (DCMP C_LT)     = putByte 151
447   put (DCMP C_GT)     = putByte 152
448   put (DCMP c)        = fail $ "No such instruction: DCMP " ++ show c
449   put (IF c)          = putByte (fromIntegral $ 153 + fromEnum c)
450   put (IF_ACMP C_EQ x) = put1 165 x
451   put (IF_ACMP C_NE x) = put1 166 x
452   put (IF_ACMP c _)   = fail $ "No such instruction: IF_ACMP " ++ show c
453   put (IF_ICMP c x)   = putByte (fromIntegral $ 159 + fromEnum c) >> put x
454   put  GOTO           = putByte 167
455   put (JSR x)         = put1 168 x
456   put  RET            = putByte 169
457   put (TABLESWITCH def low high offs) = do
458                                    putByte 170
459                                    offset <- getOffset
460                                    let pads = 4 - (offset `mod` 4)
461                                    replicateM (fromIntegral pads) (putByte 0)
462                                    put low
463                                    put high
464                                    forM_ offs put
465   put (LOOKUPSWITCH def n pairs) = do
466                                    putByte 171
467                                    offset <- getOffset
468                                    let pads = 4 - (offset `mod` 4)
469                                    replicateM (fromIntegral pads) (putByte 0)
470                                    put def
471                                    put n
472                                    forM_ pairs put
473   put  IRETURN        = putByte 172
474   put  LRETURN        = putByte 173
475   put  FRETURN        = putByte 174
476   put  DRETURN        = putByte 175
477   put  RETURN         = putByte 177
478   put (GETSTATIC x)   = put1 178 x
479   put (PUTSTATIC x)   = put1 179 x
480   put (GETFIELD x)    = put1 180 x
481   put (PUTFIELD x)    = put1 181 x
482   put (INVOKEVIRTUAL x)     = put1 182 x
483   put (INVOKESPECIAL x)     = put1 183 x
484   put (INVOKESTATIC x)      = put1 184 x
485   put (INVOKEINTERFACE x c) = put2 185 x c >> putByte 0
486   put (NEW x)         = put1 187 x
487   put (NEWARRAY x)    = put1 188 x
488   put (ANEWARRAY x)   = put1 189 x
489   put  ARRAYLENGTH    = putByte 190
490   put  ATHROW         = putByte 191
491   put (CHECKCAST x)   = put1 192 x
492   put (INSTANCEOF x)  = put1 193 x
493   put  MONITORENTER   = putByte 194
494   put  MONITOREXIT    = putByte 195
495   put (WIDE x inst)   = put2 196 x inst
496   put (MULTINANEWARRAY x y) = put2 197 x y
497   put (IFNULL x)      = put1 198 x
498   put (IFNONNULL x)   = put1 199 x
499   put (GOTO_W x)      = put1 200 x
500   put (JSR_W x)       = put1 201 x
501
502   get = do
503     c <- getByte
504     case c of
505       0 -> return NOP
506       1 -> return ACONST_NULL
507       2 -> return ICONST_M1
508       3 -> return ICONST_0
509       4 -> return ICONST_1
510       5 -> return ICONST_2
511       6 -> return ICONST_3
512       7 -> return ICONST_4
513       8 -> return ICONST_5
514       9 -> return LCONST_0
515       10 -> return LCONST_1
516       11 -> return FCONST_0
517       12 -> return FCONST_1
518       13 -> return FCONST_2
519       14 -> return DCONST_0
520       15 -> return DCONST_1
521       16 -> BIPUSH <$> get
522       17 -> SIPUSH <$> get
523       18 -> LDC1 <$> get
524       19 -> LDC2 <$> get
525       20 -> LDC2W <$> get
526       21 -> ILOAD <$> get
527       22 -> LLOAD <$> get
528       23 -> FLOAD <$> get
529       24 -> DLOAD <$> get
530       25 -> ALOAD <$> get
531       46 -> return IALOAD
532       47 -> return LALOAD
533       48 -> return FALOAD
534       49 -> return DALOAD
535       50 -> return AALOAD
536       51 -> return BALOAD
537       52 -> return CALOAD
538       53 -> return SALOAD
539       54 -> ISTORE <$> get
540       55 -> LSTORE <$> get
541       56 -> FSTORE <$> get
542       57 -> DSTORE <$> get
543       58 -> ASTORE <$> get
544       79 -> return IASTORE
545       80 -> return LASTORE
546       81 -> return FASTORE
547       82 -> return DASTORE
548       83 -> return AASTORE
549       84 -> return BASTORE
550       85 -> return CASTORE
551       86 -> return SASTORE
552       87 -> return POP
553       88 -> return POP2
554       89 -> return DUP
555       90 -> return DUP_X1
556       91 -> return DUP_X2
557       92 -> return DUP2
558       93 -> return DUP2_X1 
559       94 -> return DUP2_X2
560       95 -> return SWAP
561       96 -> return IADD
562       97 -> return LADD
563       98 -> return FADD
564       99 -> return DADD
565       100 -> return ISUB
566       101 -> return LSUB
567       102 -> return FSUB
568       103 -> return DSUB
569       104 -> return IMUL
570       105 -> return LMUL
571       106 -> return FMUL
572       107 -> return DMUL
573       108 -> return IDIV
574       109 -> return LDIV
575       110 -> return FDIV
576       111 -> return DDIV
577       112 -> return IREM
578       113 -> return LREM
579       114 -> return FREM
580       115 -> return DREM
581       116 -> return INEG
582       117 -> return LNEG
583       118 -> return FNEG
584       119 -> return DNEG
585       120 -> return ISHL
586       121 -> return LSHL
587       122 -> return ISHR
588       123 -> return LSHR
589       124 -> return IUSHR
590       125 -> return LUSHR
591       126 -> return IAND
592       127 -> return LAND
593       128 -> return IOR
594       129 -> return LOR
595       130 -> return IXOR
596       131 -> return LXOR
597       132 -> IINC <$> get <*> get
598       133 -> return I2L
599       134 -> return I2F
600       135 -> return I2D
601       136 -> return L2I
602       137 -> return L2F
603       138 -> return L2D
604       139 -> return F2I
605       140 -> return F2L
606       141 -> return F2D
607       142 -> return D2I
608       143 -> return D2L
609       144 -> return D2F
610       145 -> return I2B
611       146 -> return I2C
612       147 -> return I2S
613       148 -> return LCMP
614       149 -> return $ FCMP C_LT
615       150 -> return $ FCMP C_GT
616       151 -> return $ DCMP C_LT
617       152 -> return $ DCMP C_GT
618       165 -> IF_ACMP C_EQ <$> get
619       166 -> IF_ACMP C_NE <$> get
620       167 -> return GOTO
621       168 -> JSR <$> get
622       169 -> return RET
623       170 -> do
624              offset <- bytesRead
625              let pads = 4 - (offset `mod` 4)
626              skip (fromIntegral pads)
627              def <- get
628              low <- get
629              high <- get
630              offs <- replicateM (fromIntegral $ high - low + 1) get
631              return $ TABLESWITCH def low high offs
632       171 -> do
633              offset <- bytesRead
634              let pads = 4 - (offset `mod` 4)
635              skip (fromIntegral pads)
636              def <- get
637              n <- get
638              pairs <- replicateM (fromIntegral n) get
639              return $ LOOKUPSWITCH def n pairs
640       172 -> return IRETURN
641       173 -> return LRETURN
642       174 -> return FRETURN
643       175 -> return DRETURN
644       177 -> return RETURN
645       178 -> GETSTATIC <$> get
646       179 -> PUTSTATIC <$> get
647       180 -> GETFIELD <$> get
648       181 -> PUTFIELD <$> get
649       182 -> INVOKEVIRTUAL <$> get
650       183 -> INVOKESPECIAL <$> get
651       184 -> INVOKESTATIC <$> get
652       185 -> (INVOKEINTERFACE <$> get <*> get) <* skip 1
653       187 -> NEW <$> get
654       188 -> NEWARRAY <$> get
655       189 -> ANEWARRAY <$> get
656       190 -> return ARRAYLENGTH
657       191 -> return ATHROW
658       192 -> CHECKCAST <$> get
659       193 -> INSTANCEOF <$> get
660       194 -> return MONITORENTER
661       195 -> return MONITOREXIT
662       196 -> WIDE <$> get <*> get
663       197 -> MULTINANEWARRAY <$> get <*> get
664       198 -> IFNULL <$> get
665       199 -> IFNONNULL <$> get
666       200 -> GOTO_W <$> get
667       201 -> JSR_W <$> get
668       _ | inRange (59, 62) c -> imm 59 ISTORE_ c
669         | inRange (63, 66) c -> imm 63 LSTORE_ c
670         | inRange (67, 70) c -> imm 67 FSTORE_ c
671         | inRange (71, 74) c -> imm 71 DSTORE_ c
672         | inRange (75, 78) c -> imm 75 ASTORE_ c
673         | inRange (26, 29) c -> imm 26 ILOAD_ c
674         | inRange (30, 33) c -> imm 30 LLOAD_ c
675         | inRange (34, 37) c -> imm 34 FLOAD_ c
676         | inRange (38, 41) c -> imm 38 DLOAD_ c
677         | inRange (42, 45) c -> imm 42 ALOAD_ c
678         | inRange (153, 158) c -> return $ IF (toEnum $ fromIntegral $ c-153)
679         | inRange (159, 164) c -> IF_ICMP (toEnum $ fromIntegral $ c-159) <$> get
680         | otherwise -> fail $ "Unknown instruction byte code: " ++ show c
681