IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
ClassFile.Method.Instruction.cs
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2015 Jeroen Frijters
3
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
7
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
10 freely, subject to the following restrictions:
11
12 1. The origin of this software must not be misrepresented; you must not
13 claim that you wrote the original software. If you use this software
14 in a product, an acknowledgment in the product documentation would be
15 appreciated but is not required.
16 2. Altered source versions must be plainly marked as such, and must not be
17 misrepresented as being the original software.
18 3. This notice may not be removed or altered from any source distribution.
19
20 Jeroen Frijters
21 jeroen@frijters.net
22
23*/
24
25using System;
26
27namespace IKVM.Runtime
28{
29
30 sealed partial class ClassFile
31 {
32
33 internal sealed partial class Method
34 {
35
36 internal struct Instruction
37 {
38
39 private ushort pc;
40 private NormalizedByteCode normopcode;
41 private int arg1;
42 private short arg2;
43 private SwitchEntry[] switch_entries;
44
46 {
47 internal int value;
48 internal int target;
49 }
50
51 internal void SetHardError(HardError error, int messageId)
52 {
53 normopcode = NormalizedByteCode.__static_error;
54 arg2 = (short)error;
55 arg1 = messageId;
56 }
57
58 internal HardError HardError
59 {
60 get
61 {
62 return (HardError)arg2;
63 }
64 }
65
66 internal int HandlerIndex
67 {
68 get { return (ushort)arg2; }
69 }
70
71 internal int HardErrorMessageId
72 {
73 get
74 {
75 return arg1;
76 }
77 }
78
79 internal void PatchOpCode(NormalizedByteCode bc)
80 {
81 this.normopcode = bc;
82 }
83
84 internal void PatchOpCode(NormalizedByteCode bc, int arg1)
85 {
86 this.normopcode = bc;
87 this.arg1 = arg1;
88 }
89
90 internal void PatchOpCode(NormalizedByteCode bc, int arg1, short arg2)
91 {
92 this.normopcode = bc;
93 this.arg1 = arg1;
94 this.arg2 = arg2;
95 }
96
97 internal void SetPC(int pc)
98 {
99 this.pc = (ushort)pc;
100 }
101
102 internal void SetTargetIndex(int targetIndex)
103 {
104 this.arg1 = targetIndex;
105 }
106
107 internal void SetTermNop(ushort pc)
108 {
109 // TODO what happens if we already have exactly the maximum number of instructions?
110 this.pc = pc;
111 this.normopcode = NormalizedByteCode.__nop;
112 }
113
114 internal void MapSwitchTargets(int[] pcIndexMap)
115 {
116 arg1 = pcIndexMap[arg1 + pc];
117 for (int i = 0; i < switch_entries.Length; i++)
118 {
119 switch_entries[i].target = pcIndexMap[switch_entries[i].target + pc];
120 }
121 }
122
123 internal void Read(IKVM.ByteCode.Decoding.Instruction instruction, ClassFile classFile)
124 {
125 this.pc = (ushort)instruction.Offset;
126
127 try
128 {
129 switch (instruction.OpCode)
130 {
131 case IKVM.ByteCode.OpCode.Nop:
132 break;
133 case IKVM.ByteCode.OpCode.AconstNull:
134 break;
135 case IKVM.ByteCode.OpCode.IconstM1:
136 break;
137 case IKVM.ByteCode.OpCode.Iconst0:
138 break;
139 case IKVM.ByteCode.OpCode.Iconst1:
140 break;
141 case IKVM.ByteCode.OpCode.Iconst2:
142 break;
143 case IKVM.ByteCode.OpCode.Iconst3:
144 break;
145 case IKVM.ByteCode.OpCode.Iconst4:
146 break;
147 case IKVM.ByteCode.OpCode.Iconst5:
148 break;
149 case IKVM.ByteCode.OpCode.Lconst0:
150 break;
151 case IKVM.ByteCode.OpCode.Lconst1:
152 break;
153 case IKVM.ByteCode.OpCode.Fconst0:
154 break;
155 case IKVM.ByteCode.OpCode.Fconst1:
156 break;
157 case IKVM.ByteCode.OpCode.Fconst2:
158 break;
159 case IKVM.ByteCode.OpCode.Dconst0:
160 break;
161 case IKVM.ByteCode.OpCode.Dconst1:
162 break;
163 case IKVM.ByteCode.OpCode.Bipush:
164 var _bipush = instruction.AsBipush();
165 arg1 = _bipush.Value;
166 break;
167 case IKVM.ByteCode.OpCode.Sipush:
168 var _sipush = instruction.AsSipush();
169 arg1 = _sipush.Value;
170 break;
171 case IKVM.ByteCode.OpCode.Ldc:
172 var _ldc = instruction.AsLdc();
173 arg1 = _ldc.Constant.Slot;
174 classFile.MarkLinkRequiredConstantPoolItem(arg1);
175 break;
176 case IKVM.ByteCode.OpCode.LdcW:
177 var _ldcw = instruction.AsLdcW();
178 arg1 = _ldcw.Constant.Slot;
179 classFile.MarkLinkRequiredConstantPoolItem(arg1);
180 break;
181 case IKVM.ByteCode.OpCode.Ldc2W:
182 var _ldc2w = instruction.AsLdc2W();
183 arg1 = _ldc2w.Constant.Slot;
184 classFile.MarkLinkRequiredConstantPoolItem(arg1);
185 break;
186 case IKVM.ByteCode.OpCode.Iload:
187 var _iload = instruction.AsIload();
188 arg1 = _iload.Local;
189 break;
190 case IKVM.ByteCode.OpCode.Lload:
191 var _lload = instruction.AsLload();
192 arg1 = _lload.Local;
193 break;
194 case IKVM.ByteCode.OpCode.Fload:
195 var _fload = instruction.AsFload();
196 arg1 = _fload.Local;
197 break;
198 case IKVM.ByteCode.OpCode.Dload:
199 var _dload = instruction.AsDload();
200 arg1 = _dload.Local;
201 break;
202 case IKVM.ByteCode.OpCode.Aload:
203 var _aload = instruction.AsAload();
204 arg1 = _aload.Local;
205 break;
206 case IKVM.ByteCode.OpCode.Iload0:
207 break;
208 case IKVM.ByteCode.OpCode.Iload1:
209 break;
210 case IKVM.ByteCode.OpCode.Iload2:
211 break;
212 case IKVM.ByteCode.OpCode.Iload3:
213 break;
214 case IKVM.ByteCode.OpCode.Lload0:
215 break;
216 case IKVM.ByteCode.OpCode.Lload1:
217 break;
218 case IKVM.ByteCode.OpCode.Lload2:
219 break;
220 case IKVM.ByteCode.OpCode.Lload3:
221 break;
222 case IKVM.ByteCode.OpCode.Fload0:
223 break;
224 case IKVM.ByteCode.OpCode.Fload1:
225 break;
226 case IKVM.ByteCode.OpCode.Fload2:
227 break;
228 case IKVM.ByteCode.OpCode.Fload3:
229 break;
230 case IKVM.ByteCode.OpCode.Dload0:
231 break;
232 case IKVM.ByteCode.OpCode.Dload1:
233 break;
234 case IKVM.ByteCode.OpCode.Dload2:
235 break;
236 case IKVM.ByteCode.OpCode.Dload3:
237 break;
238 case IKVM.ByteCode.OpCode.Aload0:
239 break;
240 case IKVM.ByteCode.OpCode.Aload1:
241 break;
242 case IKVM.ByteCode.OpCode.Aload2:
243 break;
244 case IKVM.ByteCode.OpCode.Aload3:
245 break;
246 case IKVM.ByteCode.OpCode.Iaload:
247 break;
248 case IKVM.ByteCode.OpCode.Laload:
249 break;
250 case IKVM.ByteCode.OpCode.Faload:
251 break;
252 case IKVM.ByteCode.OpCode.Daload:
253 break;
254 case IKVM.ByteCode.OpCode.Aaload:
255 break;
256 case IKVM.ByteCode.OpCode.Baload:
257 break;
258 case IKVM.ByteCode.OpCode.Caload:
259 break;
260 case IKVM.ByteCode.OpCode.Saload:
261 break;
262 case IKVM.ByteCode.OpCode.Istore:
263 var _istore = instruction.AsIstore();
264 arg1 = _istore.Local;
265 break;
266 case IKVM.ByteCode.OpCode.Lstore:
267 var _lstore = instruction.AsLstore();
268 arg1 = _lstore.Local;
269 break;
270 case IKVM.ByteCode.OpCode.Fstore:
271 var _fstore = instruction.AsFstore();
272 arg1 = _fstore.Local;
273 break;
274 case IKVM.ByteCode.OpCode.Dstore:
275 var _dstore = instruction.AsDstore();
276 arg1 = _dstore.Local;
277 break;
278 case IKVM.ByteCode.OpCode.Astore:
279 var _astore = instruction.AsAstore();
280 arg1 = _astore.Local;
281 break;
282 case IKVM.ByteCode.OpCode.Istore0:
283 break;
284 case IKVM.ByteCode.OpCode.Istore1:
285 break;
286 case IKVM.ByteCode.OpCode.Istore2:
287 break;
288 case IKVM.ByteCode.OpCode.Istore3:
289 break;
290 case IKVM.ByteCode.OpCode.Lstore0:
291 break;
292 case IKVM.ByteCode.OpCode.Lstore1:
293 break;
294 case IKVM.ByteCode.OpCode.Lstore2:
295 break;
296 case IKVM.ByteCode.OpCode.Lstore3:
297 break;
298 case IKVM.ByteCode.OpCode.Fstore0:
299 break;
300 case IKVM.ByteCode.OpCode.Fstore1:
301 break;
302 case IKVM.ByteCode.OpCode.Fstore2:
303 break;
304 case IKVM.ByteCode.OpCode.Fstore3:
305 break;
306 case IKVM.ByteCode.OpCode.Dstore0:
307 break;
308 case IKVM.ByteCode.OpCode.Dstore1:
309 break;
310 case IKVM.ByteCode.OpCode.Dstore2:
311 break;
312 case IKVM.ByteCode.OpCode.Dstore3:
313 break;
314 case IKVM.ByteCode.OpCode.Astore0:
315 break;
316 case IKVM.ByteCode.OpCode.Astore1:
317 break;
318 case IKVM.ByteCode.OpCode.Astore2:
319 break;
320 case IKVM.ByteCode.OpCode.Astore3:
321 break;
322 case IKVM.ByteCode.OpCode.Iastore:
323 break;
324 case IKVM.ByteCode.OpCode.Lastore:
325 break;
326 case IKVM.ByteCode.OpCode.Fastore:
327 break;
328 case IKVM.ByteCode.OpCode.Dastore:
329 break;
330 case IKVM.ByteCode.OpCode.Aastore:
331 break;
332 case IKVM.ByteCode.OpCode.Bastore:
333 break;
334 case IKVM.ByteCode.OpCode.Castore:
335 break;
336 case IKVM.ByteCode.OpCode.Sastore:
337 break;
338 case IKVM.ByteCode.OpCode.Pop:
339 break;
340 case IKVM.ByteCode.OpCode.Pop2:
341 break;
342 case IKVM.ByteCode.OpCode.Dup:
343 break;
344 case IKVM.ByteCode.OpCode.DupX1:
345 break;
346 case IKVM.ByteCode.OpCode.DupX2:
347 break;
348 case IKVM.ByteCode.OpCode.Dup2:
349 break;
350 case IKVM.ByteCode.OpCode.Dup2X1:
351 break;
352 case IKVM.ByteCode.OpCode.Dup2X2:
353 break;
354 case IKVM.ByteCode.OpCode.Swap:
355 break;
356 case IKVM.ByteCode.OpCode.Iadd:
357 break;
358 case IKVM.ByteCode.OpCode.Ladd:
359 break;
360 case IKVM.ByteCode.OpCode.Fadd:
361 break;
362 case IKVM.ByteCode.OpCode.Dadd:
363 break;
364 case IKVM.ByteCode.OpCode.Isub:
365 break;
366 case IKVM.ByteCode.OpCode.Lsub:
367 break;
368 case IKVM.ByteCode.OpCode.Fsub:
369 break;
370 case IKVM.ByteCode.OpCode.Dsub:
371 break;
372 case IKVM.ByteCode.OpCode.Imul:
373 break;
374 case IKVM.ByteCode.OpCode.Lmul:
375 break;
376 case IKVM.ByteCode.OpCode.Fmul:
377 break;
378 case IKVM.ByteCode.OpCode.Dmul:
379 break;
380 case IKVM.ByteCode.OpCode.Idiv:
381 break;
382 case IKVM.ByteCode.OpCode.Ldiv:
383 break;
384 case IKVM.ByteCode.OpCode.Fdiv:
385 break;
386 case IKVM.ByteCode.OpCode.Ddiv:
387 break;
388 case IKVM.ByteCode.OpCode.Irem:
389 break;
390 case IKVM.ByteCode.OpCode.Lrem:
391 break;
392 case IKVM.ByteCode.OpCode.Frem:
393 break;
394 case IKVM.ByteCode.OpCode.Drem:
395 break;
396 case IKVM.ByteCode.OpCode.Ineg:
397 break;
398 case IKVM.ByteCode.OpCode.Lneg:
399 break;
400 case IKVM.ByteCode.OpCode.Fneg:
401 break;
402 case IKVM.ByteCode.OpCode.Dneg:
403 break;
404 case IKVM.ByteCode.OpCode.Ishl:
405 break;
406 case IKVM.ByteCode.OpCode.Lshl:
407 break;
408 case IKVM.ByteCode.OpCode.Ishr:
409 break;
410 case IKVM.ByteCode.OpCode.Lshr:
411 break;
412 case IKVM.ByteCode.OpCode.Iushr:
413 break;
414 case IKVM.ByteCode.OpCode.Lushr:
415 break;
416 case IKVM.ByteCode.OpCode.Iand:
417 break;
418 case IKVM.ByteCode.OpCode.Land:
419 break;
420 case IKVM.ByteCode.OpCode.Ior:
421 break;
422 case IKVM.ByteCode.OpCode.Lor:
423 break;
424 case IKVM.ByteCode.OpCode.Ixor:
425 break;
426 case IKVM.ByteCode.OpCode.Lxor:
427 break;
428 case IKVM.ByteCode.OpCode.Iinc:
429 var _iinc = instruction.AsIinc();
430 arg1 = _iinc.Local;
431 arg2 = _iinc.Value;
432 break;
433 case IKVM.ByteCode.OpCode.I2l:
434 break;
435 case IKVM.ByteCode.OpCode.I2f:
436 break;
437 case IKVM.ByteCode.OpCode.I2d:
438 break;
439 case IKVM.ByteCode.OpCode.L2i:
440 break;
441 case IKVM.ByteCode.OpCode.L2f:
442 break;
443 case IKVM.ByteCode.OpCode.L2d:
444 break;
445 case IKVM.ByteCode.OpCode.F2i:
446 break;
447 case IKVM.ByteCode.OpCode.F2l:
448 break;
449 case IKVM.ByteCode.OpCode.F2d:
450 break;
451 case IKVM.ByteCode.OpCode.D2i:
452 break;
453 case IKVM.ByteCode.OpCode.D2l:
454 break;
455 case IKVM.ByteCode.OpCode.D2f:
456 break;
457 case IKVM.ByteCode.OpCode.I2b:
458 break;
459 case IKVM.ByteCode.OpCode.I2c:
460 break;
461 case IKVM.ByteCode.OpCode.I2s:
462 break;
463 case IKVM.ByteCode.OpCode.Lcmp:
464 break;
465 case IKVM.ByteCode.OpCode.Fcmpl:
466 break;
467 case IKVM.ByteCode.OpCode.Fcmpg:
468 break;
469 case IKVM.ByteCode.OpCode.Dcmpl:
470 break;
471 case IKVM.ByteCode.OpCode.Dcmpg:
472 break;
473 case IKVM.ByteCode.OpCode.Ifeq:
474 var _ifeq = instruction.AsIfeq();
475 arg1 = _ifeq.Target;
476 break;
477 case IKVM.ByteCode.OpCode.Ifne:
478 var _ifne = instruction.AsIfne();
479 arg1 = _ifne.Target;
480 break;
481 case IKVM.ByteCode.OpCode.Iflt:
482 var _iflt = instruction.AsIflt();
483 arg1 = _iflt.Target;
484 break;
485 case IKVM.ByteCode.OpCode.Ifge:
486 var _ifge = instruction.AsIfge();
487 arg1 = _ifge.Target;
488 break;
489 case IKVM.ByteCode.OpCode.Ifgt:
490 var _ifgt = instruction.AsIfgt();
491 arg1 = _ifgt.Target;
492 break;
493 case IKVM.ByteCode.OpCode.Ifle:
494 var _ifle = instruction.AsIfle();
495 arg1 = _ifle.Target;
496 break;
497 case IKVM.ByteCode.OpCode.IfIcmpeq:
498 var _ificmpeq = instruction.AsIfIcmpeq();
499 arg1 = _ificmpeq.Target;
500 break;
501 case IKVM.ByteCode.OpCode.IfIcmpne:
502 var _ificmpne = instruction.AsIfIcmpne();
503 arg1 = _ificmpne.Target;
504 break;
505 case IKVM.ByteCode.OpCode.IfIcmplt:
506 var _ificmplt = instruction.AsIfIcmplt();
507 arg1 = _ificmplt.Target;
508 break;
509 case IKVM.ByteCode.OpCode.IfIcmpge:
510 var _ificmpge = instruction.AsIfIcmpge();
511 arg1 = _ificmpge.Target;
512 break;
513 case IKVM.ByteCode.OpCode.IfIcmpgt:
514 var _ificmpgt = instruction.AsIfIcmpgt();
515 arg1 = _ificmpgt.Target;
516 break;
517 case IKVM.ByteCode.OpCode.IfIcmple:
518 var _ificmple = instruction.AsIfIcmple();
519 arg1 = _ificmple.Target;
520 break;
521 case IKVM.ByteCode.OpCode.IfAcmpeq:
522 var _ifacmpeq = instruction.AsIfAcmpeq();
523 arg1 = _ifacmpeq.Target;
524 break;
525 case IKVM.ByteCode.OpCode.IfAcmpne:
526 var _ifacmpne = instruction.AsIfAcmpne();
527 arg1 = _ifacmpne.Target;
528 break;
529 case IKVM.ByteCode.OpCode.Goto:
530 var _goto = instruction.AsGoto();
531 arg1 = _goto.Target;
532 break;
533 case IKVM.ByteCode.OpCode.Jsr:
534 var _jsr = instruction.AsJsr();
535 arg1 = _jsr.Target;
536 break;
537 case IKVM.ByteCode.OpCode.Ret:
538 var _ret = instruction.AsRet();
539 arg1 = _ret.Local;
540 break;
541 case IKVM.ByteCode.OpCode.Ireturn:
542 break;
543 case IKVM.ByteCode.OpCode.Lreturn:
544 break;
545 case IKVM.ByteCode.OpCode.Freturn:
546 break;
547 case IKVM.ByteCode.OpCode.Dreturn:
548 break;
549 case IKVM.ByteCode.OpCode.Areturn:
550 break;
551 case IKVM.ByteCode.OpCode.Return:
552 break;
553 case IKVM.ByteCode.OpCode.GetStatic:
554 var _getstatic = instruction.AsGetStatic();
555 arg1 = _getstatic.Field.Slot;
556 classFile.MarkLinkRequiredConstantPoolItem(arg1);
557 break;
558 case IKVM.ByteCode.OpCode.PutStatic:
559 var _putstatic = instruction.AsPutStatic();
560 arg1 = _putstatic.Field.Slot;
561 classFile.MarkLinkRequiredConstantPoolItem(arg1);
562 break;
563 case IKVM.ByteCode.OpCode.GetField:
564 var _getfield = instruction.AsGetField();
565 arg1 = _getfield.Field.Slot;
566 classFile.MarkLinkRequiredConstantPoolItem(arg1);
567 break;
568 case IKVM.ByteCode.OpCode.PutField:
569 var _putfield = instruction.AsPutField();
570 arg1 = _putfield.Field.Slot;
571 classFile.MarkLinkRequiredConstantPoolItem(arg1);
572 break;
573 case IKVM.ByteCode.OpCode.InvokeVirtual:
574 var _invokevirtual = instruction.AsInvokeVirtual();
575 arg1 = _invokevirtual.Method.Slot;
576 classFile.MarkLinkRequiredConstantPoolItem(arg1);
577 break;
578 case IKVM.ByteCode.OpCode.InvokeSpecial:
579 var _invokespecial = instruction.AsInvokeSpecial();
580 arg1 = _invokespecial.Method.Slot;
581 classFile.MarkLinkRequiredConstantPoolItem(arg1);
582 break;
583 case IKVM.ByteCode.OpCode.InvokeStatic:
584 var _invokestatic = instruction.AsInvokeStatic();
585 arg1 = _invokestatic.Method.Slot;
586 classFile.MarkLinkRequiredConstantPoolItem(arg1);
587 break;
588 case IKVM.ByteCode.OpCode.InvokeInterface:
589 var _invokeinterface = instruction.AsInvokeInterface();
590 if (_invokeinterface.Zero != 0)
591 throw new ClassFormatError("invokeinterface filler must be zero");
592
593 arg1 = _invokeinterface.Method.Slot;
594 arg2 = _invokeinterface.Count;
595 classFile.MarkLinkRequiredConstantPoolItem(arg1);
596 break;
597 case IKVM.ByteCode.OpCode.InvokeDynamic:
598 var _invokedynamic = instruction.AsInvokeDynamic();
599 if (_invokedynamic.Zero != 0)
600 throw new ClassFormatError("invokedynamic filler must be zero");
601 if (_invokedynamic.Zero2 != 0)
602 throw new ClassFormatError("invokedynamic filler must be zero");
603
604 arg1 = _invokedynamic.Method.Slot;
605 classFile.MarkLinkRequiredConstantPoolItem(arg1);
606 break;
607 case IKVM.ByteCode.OpCode.New:
608 var _new = instruction.AsNew();
609 arg1 = _new.Constant.Slot;
610 classFile.MarkLinkRequiredConstantPoolItem(arg1);
611 break;
612 case IKVM.ByteCode.OpCode.Newarray:
613 var _newarray = instruction.AsNewarray();
614 arg1 = _newarray.Value;
615 break;
616 case IKVM.ByteCode.OpCode.Anewarray:
617 var _anewarray = instruction.AsAnewarray();
618 arg1 = _anewarray.Constant.Slot;
619 classFile.MarkLinkRequiredConstantPoolItem(arg1);
620 break;
621 case IKVM.ByteCode.OpCode.Arraylength:
622 break;
623 case IKVM.ByteCode.OpCode.Athrow:
624 break;
625 case IKVM.ByteCode.OpCode.Checkcast:
626 var _checkcast = instruction.AsCheckcast();
627 arg1 = _checkcast.Type.Slot;
628 classFile.MarkLinkRequiredConstantPoolItem(arg1);
629 break;
630 case IKVM.ByteCode.OpCode.InstanceOf:
631 var _instanceof = instruction.AsInstanceOf();
632 arg1 = _instanceof.Type.Slot;
633 classFile.MarkLinkRequiredConstantPoolItem(arg1);
634 break;
635 case IKVM.ByteCode.OpCode.MonitorEnter:
636 break;
637 case IKVM.ByteCode.OpCode.MonitorExit:
638 break;
639 case IKVM.ByteCode.OpCode.Multianewarray:
640 var _multianewarray = instruction.AsMultianewarray();
641 arg1 = _multianewarray.Type.Slot;
642 classFile.MarkLinkRequiredConstantPoolItem(arg1);
643 arg2 = _multianewarray.Dimensions;
644 break;
645 case IKVM.ByteCode.OpCode.IfNull:
646 var _ifnull = instruction.AsIfNull();
647 arg1 = _ifnull.Target;
648 break;
649 case IKVM.ByteCode.OpCode.IfNonNull:
650 var _ifnonnull = instruction.AsIfNonNull();
651 arg1 = _ifnonnull.Target;
652 break;
653 case IKVM.ByteCode.OpCode.GotoW:
654 var _gotow = instruction.AsGotoW();
655 arg1 = _gotow.Target;
656 break;
657 case IKVM.ByteCode.OpCode.JsrW:
658 var _jsrw = instruction.AsJsrW();
659 arg1 = _jsrw.Target;
660 break;
661 case IKVM.ByteCode.OpCode.LookupSwitch:
662 var _lookupswitch = instruction.AsLookupSwitch();
663 if (_lookupswitch.Cases.Count < 0 || _lookupswitch.Cases.Count > 16384)
664 throw new ClassFormatError("Incorrect lookupswitch");
665
666 arg1 = _lookupswitch.DefaultTarget;
667
668 var _lookupswitchindex = 0;
669 var lookupswitchentries = new SwitchEntry[_lookupswitch.Cases.Count];
670 foreach (var _case in _lookupswitch.Cases)
671 {
672 lookupswitchentries[_lookupswitchindex].value = _case.Key;
673 lookupswitchentries[_lookupswitchindex].target = _case.Target;
674 _lookupswitchindex++;
675 }
676
677 switch_entries = lookupswitchentries;
678 break;
679 case IKVM.ByteCode.OpCode.TableSwitch:
680 var _tableswitch = instruction.AsTableSwitch();
681 if (_tableswitch.Low > _tableswitch.High || _tableswitch.High > 16384L + _tableswitch.Low)
682 throw new ClassFormatError("Incorrect tableswitch");
683
684 arg1 = _tableswitch.DefaultTarget;
685
686 var _tableswitchindex = 0;
687 var tableswitchentries = new SwitchEntry[_tableswitch.Cases.Count];
688 foreach (var _case in _tableswitch.Cases)
689 {
690 tableswitchentries[_tableswitchindex].value = _tableswitch.Low + _tableswitchindex;
691 tableswitchentries[_tableswitchindex].target = _case;
692 _tableswitchindex++;
693 }
694
695 switch_entries = tableswitchentries;
696 break;
697 default:
698 throw new ClassFormatError($"Invalid opcode: {instruction.OpCode}");
699 }
700
701 this.normopcode = ByteCodeMetaData.GetNormalizedByteCode((ByteCode)(int)instruction.OpCode);
702 arg1 = ByteCodeMetaData.GetArg((ByteCode)(int)instruction.OpCode, arg1);
703 }
704 catch (ArgumentOutOfRangeException)
705 {
706 throw new ClassFormatError($"Invalid instruction data: {instruction.OpCode}");
707 }
708 }
709
710 internal int PC => pc;
711
712 internal NormalizedByteCode NormalizedOpCode => normopcode;
713
714 internal int Arg1 => arg1;
715
716 internal int TargetIndex
717 {
718 get => arg1;
719 set => arg1 = value;
720 }
721
722 internal int Arg2 => arg2;
723
724 internal int NormalizedArg1 => arg1;
725
726 internal int DefaultTarget
727 {
728 get => arg1;
729 set => arg1 = value;
730 }
731
732 internal int SwitchEntryCount => switch_entries.Length;
733
734 internal int GetSwitchValue(int i)
735 {
736 return switch_entries[i].value;
737 }
738
739 internal int GetSwitchTargetIndex(int i)
740 {
741 return switch_entries[i].target;
742 }
743
744 internal void SetSwitchTargets(int[] targets)
745 {
746 var newEntries = (SwitchEntry[])switch_entries.Clone();
747 for (int i = 0; i < newEntries.Length; i++)
748 newEntries[i].target = targets[i];
749
750 switch_entries = newEntries;
751 }
752
753 }
754
755 }
756
757 }
758
759}
IKVM.Runtime.ClassFile.Method.Instruction Instruction
Definition compiler.cs:44