Mercurial > hg > Members > kono > jpf-core
comparison src/main/gov/nasa/jpf/jvm/JVMCodeBuilder.java @ 0:61d41facf527
initial v8 import (history reset)
author | Peter Mehlitz <Peter.C.Mehlitz@nasa.gov> |
---|---|
date | Fri, 23 Jan 2015 10:14:01 -0800 |
parents | |
children | 6774e2e08d37 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:61d41facf527 |
---|---|
1 /* | |
2 * Copyright (C) 2014, United States Government, as represented by the | |
3 * Administrator of the National Aeronautics and Space Administration. | |
4 * All rights reserved. | |
5 * | |
6 * The Java Pathfinder core (jpf-core) platform is licensed under the | |
7 * Apache License, Version 2.0 (the "License"); you may not use this file except | |
8 * in compliance with the License. You may obtain a copy of the License at | |
9 * | |
10 * http://www.apache.org/licenses/LICENSE-2.0. | |
11 * | |
12 * Unless required by applicable law or agreed to in writing, software | |
13 * distributed under the License is distributed on an "AS IS" BASIS, | |
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
15 * See the License for the specific language governing permissions and | |
16 * limitations under the License. | |
17 */ | |
18 | |
19 package gov.nasa.jpf.jvm; | |
20 | |
21 import gov.nasa.jpf.JPFException; | |
22 import gov.nasa.jpf.util.Invocation; | |
23 import gov.nasa.jpf.vm.ClassInfo; | |
24 import gov.nasa.jpf.vm.Instruction; | |
25 import gov.nasa.jpf.vm.bytecode.LookupSwitchInstruction; | |
26 import gov.nasa.jpf.vm.MethodInfo; | |
27 import gov.nasa.jpf.vm.NativeMethodInfo; | |
28 import gov.nasa.jpf.vm.bytecode.TableSwitchInstruction; | |
29 | |
30 import java.util.ArrayList; | |
31 import java.util.List; | |
32 | |
33 /** | |
34 * a special JVMByteCodeReader implementation that builds code arrays for | |
35 * MethodInfos, setting index and pc on the fly | |
36 */ | |
37 public class JVMCodeBuilder implements JVMByteCodeReader { | |
38 | |
39 protected JVMInstructionFactory insnFactory; | |
40 | |
41 protected ClassFile cf; | |
42 protected MethodInfo mi; | |
43 | |
44 // have to cache these to set switch entries | |
45 // <2do> these should use interface types to avoid hardwiring our own instruction classes | |
46 protected TableSwitchInstruction tableswitchInsn; | |
47 protected LookupSwitchInstruction lookupswitchInsn; | |
48 | |
49 protected ArrayList<Instruction> code; | |
50 | |
51 protected int pc; // bytecode position within method code | |
52 protected int idx; // instruction index within MethodInfo | |
53 | |
54 // flag to remember wide immediate operand modification | |
55 boolean isWide; | |
56 | |
57 //--- for testing purposes | |
58 protected JVMCodeBuilder (JVMInstructionFactory ifact){ | |
59 this.code = new ArrayList<Instruction>(64); | |
60 this.insnFactory = ifact; | |
61 } | |
62 | |
63 | |
64 | |
65 // this is dangerous - it enables reuse of CodeBuilders, but | |
66 // you better make sure this does not get recursive or is used concurrently | |
67 public void reset (ClassFile classFile, MethodInfo targetMethod){ | |
68 this.cf = classFile; | |
69 this.mi = targetMethod; | |
70 | |
71 pc = 0; | |
72 idx = 0; | |
73 isWide = false; | |
74 | |
75 tableswitchInsn = null; | |
76 lookupswitchInsn = null; | |
77 | |
78 code.clear(); | |
79 } | |
80 | |
81 protected void add(Instruction insn){ | |
82 insn.setMethodInfo(mi); | |
83 insn.setLocation(idx++, pc); | |
84 code.add(insn); | |
85 } | |
86 | |
87 public void installCode(){ | |
88 Instruction[] a = code.toArray( new Instruction[code.size()]); | |
89 mi.setCode(a); | |
90 } | |
91 | |
92 //--- the factory methods | |
93 | |
94 @Override public void aconst_null() { | |
95 add( insnFactory.aconst_null()); | |
96 pc++; | |
97 } | |
98 | |
99 @Override public void aload(int localVarIndex) { | |
100 add( insnFactory.aload(localVarIndex)); | |
101 pc+=2; | |
102 if (isWide){ | |
103 pc++; | |
104 isWide = false; | |
105 } | |
106 } | |
107 | |
108 @Override public void aload_0() { | |
109 add( insnFactory.aload(0)); | |
110 pc++; | |
111 } | |
112 | |
113 @Override public void aload_1() { | |
114 add( insnFactory.aload(1)); | |
115 pc++; | |
116 } | |
117 | |
118 @Override public void aload_2() { | |
119 add( insnFactory.aload(2)); | |
120 pc++; | |
121 } | |
122 | |
123 @Override public void aload_3() { | |
124 add( insnFactory.aload(3)); | |
125 pc++; | |
126 } | |
127 | |
128 @Override public void aaload() { | |
129 add( insnFactory.aaload()); | |
130 pc++; | |
131 } | |
132 | |
133 @Override public void astore(int localVarIndex) { | |
134 add( insnFactory.astore(localVarIndex)); | |
135 pc+=2; | |
136 if (isWide){ | |
137 pc++; | |
138 isWide = false; | |
139 } | |
140 } | |
141 | |
142 @Override public void astore_0() { | |
143 add( insnFactory.astore(0)); | |
144 pc++; | |
145 } | |
146 | |
147 @Override public void astore_1() { | |
148 add( insnFactory.astore(1)); | |
149 pc++; | |
150 } | |
151 | |
152 @Override public void astore_2() { | |
153 add( insnFactory.astore(2)); | |
154 pc++; | |
155 } | |
156 | |
157 @Override public void astore_3() { | |
158 add( insnFactory.astore(3)); | |
159 pc++; | |
160 } | |
161 | |
162 @Override public void aastore() { | |
163 add( insnFactory.aastore()); | |
164 pc++; | |
165 } | |
166 | |
167 @Override public void areturn() { | |
168 add( insnFactory.areturn()); | |
169 pc++; | |
170 } | |
171 | |
172 @Override public void anewarray(int cpClassIndex) { | |
173 String clsName = cf.classNameAt(cpClassIndex); | |
174 add( insnFactory.anewarray(clsName)); | |
175 pc+=3; | |
176 } | |
177 | |
178 @Override public void arraylength() { | |
179 add( insnFactory.arraylength()); | |
180 pc++; | |
181 } | |
182 | |
183 @Override public void athrow() { | |
184 add( insnFactory.athrow()); | |
185 pc++; | |
186 } | |
187 | |
188 @Override public void baload() { | |
189 add( insnFactory.baload()); | |
190 pc++; | |
191 } | |
192 | |
193 @Override public void bastore() { | |
194 add( insnFactory.bastore()); | |
195 pc++; | |
196 } | |
197 | |
198 @Override public void bipush(int b) { | |
199 add( insnFactory.bipush(b)); | |
200 pc+=2; | |
201 } | |
202 | |
203 @Override public void caload() { | |
204 add( insnFactory.caload()); | |
205 pc++; | |
206 } | |
207 | |
208 @Override public void castore() { | |
209 add( insnFactory.castore()); | |
210 pc++; | |
211 } | |
212 | |
213 @Override public void checkcast(int cpClassIndex) { | |
214 String clsName = cf.classNameAt(cpClassIndex); | |
215 add( insnFactory.checkcast(clsName)); | |
216 pc+=3; | |
217 } | |
218 | |
219 @Override public void d2f() { | |
220 add( insnFactory.d2f()); | |
221 pc++; | |
222 } | |
223 | |
224 @Override public void d2i() { | |
225 add( insnFactory.d2i()); | |
226 pc++; | |
227 } | |
228 | |
229 @Override public void d2l() { | |
230 add( insnFactory.d2l()); | |
231 pc++; | |
232 } | |
233 | |
234 @Override public void dadd() { | |
235 add( insnFactory.dadd()); | |
236 pc++; | |
237 } | |
238 | |
239 @Override public void daload() { | |
240 add( insnFactory.daload()); | |
241 pc++; | |
242 } | |
243 | |
244 @Override public void dastore() { | |
245 add( insnFactory.dastore()); | |
246 pc++; | |
247 } | |
248 | |
249 @Override public void dcmpg() { | |
250 add( insnFactory.dcmpg()); | |
251 pc++; | |
252 } | |
253 | |
254 @Override public void dcmpl() { | |
255 add( insnFactory.dcmpl()); | |
256 pc++; | |
257 } | |
258 | |
259 @Override public void dconst_0() { | |
260 add( insnFactory.dconst_0()); | |
261 pc++; | |
262 } | |
263 | |
264 @Override public void dconst_1() { | |
265 add( insnFactory.dconst_1()); | |
266 pc++; | |
267 } | |
268 | |
269 @Override public void ddiv() { | |
270 add( insnFactory.ddiv()); | |
271 pc++; | |
272 } | |
273 | |
274 @Override public void dload(int localVarIndex) { | |
275 add( insnFactory.dload(localVarIndex)); | |
276 pc+=2; | |
277 if (isWide){ | |
278 pc++; | |
279 isWide = false; | |
280 } | |
281 } | |
282 | |
283 @Override public void dload_0() { | |
284 add( insnFactory.dload(0)); | |
285 pc++; | |
286 } | |
287 | |
288 @Override public void dload_1() { | |
289 add( insnFactory.dload(1)); | |
290 pc++; | |
291 } | |
292 | |
293 @Override public void dload_2() { | |
294 add( insnFactory.dload(2)); | |
295 pc++; | |
296 } | |
297 | |
298 @Override public void dload_3() { | |
299 add( insnFactory.dload(3)); | |
300 pc++; | |
301 } | |
302 | |
303 @Override public void dmul() { | |
304 add( insnFactory.dmul()); | |
305 pc++; | |
306 } | |
307 | |
308 @Override public void dneg() { | |
309 add( insnFactory.dneg()); | |
310 pc++; | |
311 } | |
312 | |
313 @Override public void drem() { | |
314 add( insnFactory.drem()); | |
315 pc++; | |
316 } | |
317 | |
318 @Override public void dreturn() { | |
319 add( insnFactory.dreturn()); | |
320 pc++; | |
321 } | |
322 | |
323 @Override public void dstore(int localVarIndex) { | |
324 add( insnFactory.dstore(localVarIndex)); | |
325 pc+=2; | |
326 if (isWide){ | |
327 pc++; | |
328 isWide = false; | |
329 } | |
330 } | |
331 | |
332 @Override public void dstore_0() { | |
333 add( insnFactory.dstore(0)); | |
334 pc++; | |
335 } | |
336 | |
337 @Override public void dstore_1() { | |
338 add( insnFactory.dstore(1)); | |
339 pc++; | |
340 } | |
341 | |
342 @Override public void dstore_2() { | |
343 add( insnFactory.dstore(2)); | |
344 pc++; | |
345 } | |
346 | |
347 @Override public void dstore_3() { | |
348 add( insnFactory.dstore(3)); | |
349 pc++; | |
350 } | |
351 | |
352 @Override public void dsub() { | |
353 add( insnFactory.dsub()); | |
354 pc++; | |
355 } | |
356 | |
357 @Override public void dup() { | |
358 add( insnFactory.dup()); | |
359 pc++; | |
360 } | |
361 | |
362 @Override public void dup_x1() { | |
363 add( insnFactory.dup_x1()); | |
364 pc++; | |
365 } | |
366 | |
367 @Override public void dup_x2() { | |
368 add( insnFactory.dup_x2()); | |
369 pc++; | |
370 } | |
371 | |
372 @Override public void dup2() { | |
373 add( insnFactory.dup2()); | |
374 pc++; | |
375 } | |
376 | |
377 @Override public void dup2_x1() { | |
378 add( insnFactory.dup2_x1()); | |
379 pc++; | |
380 } | |
381 | |
382 @Override public void dup2_x2() { | |
383 add( insnFactory.dup2_x2()); | |
384 pc++; | |
385 } | |
386 | |
387 @Override public void f2d() { | |
388 add( insnFactory.f2d()); | |
389 pc++; | |
390 } | |
391 | |
392 @Override public void f2i() { | |
393 add( insnFactory.f2i()); | |
394 pc++; | |
395 } | |
396 | |
397 @Override public void f2l() { | |
398 add( insnFactory.f2l()); | |
399 pc++; | |
400 } | |
401 | |
402 @Override public void fadd() { | |
403 add( insnFactory.fadd()); | |
404 pc++; | |
405 } | |
406 | |
407 @Override public void faload() { | |
408 add( insnFactory.faload()); | |
409 pc++; | |
410 } | |
411 | |
412 @Override public void fastore() { | |
413 add( insnFactory.fastore()); | |
414 pc++; | |
415 } | |
416 | |
417 @Override public void fcmpg() { | |
418 add( insnFactory.fcmpg()); | |
419 pc++; | |
420 } | |
421 | |
422 @Override public void fcmpl() { | |
423 add( insnFactory.fcmpl()); | |
424 pc++; | |
425 } | |
426 | |
427 @Override public void fconst_0() { | |
428 add( insnFactory.fconst_0()); | |
429 pc++; | |
430 } | |
431 | |
432 @Override public void fconst_1() { | |
433 add( insnFactory.fconst_1()); | |
434 pc++; | |
435 } | |
436 | |
437 @Override public void fconst_2() { | |
438 add( insnFactory.fconst_2()); | |
439 pc++; | |
440 } | |
441 | |
442 @Override public void fdiv() { | |
443 add( insnFactory.fdiv()); | |
444 pc++; | |
445 } | |
446 | |
447 @Override public void fload(int localVarIndex) { | |
448 add( insnFactory.fload(localVarIndex)); | |
449 pc+=2; | |
450 if (isWide){ | |
451 pc++; | |
452 isWide = false; | |
453 } | |
454 } | |
455 | |
456 @Override public void fload_0() { | |
457 add( insnFactory.fload(0)); | |
458 pc++; | |
459 } | |
460 | |
461 @Override public void fload_1() { | |
462 add( insnFactory.fload(1)); | |
463 pc++; | |
464 } | |
465 | |
466 @Override public void fload_2() { | |
467 add( insnFactory.fload(2)); | |
468 pc++; | |
469 } | |
470 | |
471 @Override public void fload_3() { | |
472 add( insnFactory.fload(3)); | |
473 pc++; | |
474 } | |
475 | |
476 @Override public void fmul() { | |
477 add( insnFactory.fmul()); | |
478 pc++; | |
479 } | |
480 | |
481 @Override public void fneg() { | |
482 add( insnFactory.fneg()); | |
483 pc++; | |
484 } | |
485 | |
486 @Override public void frem() { | |
487 add( insnFactory.frem()); | |
488 pc++; | |
489 } | |
490 | |
491 @Override public void freturn() { | |
492 add( insnFactory.freturn()); | |
493 pc++; | |
494 } | |
495 | |
496 @Override public void fstore(int localVarIndex) { | |
497 add( insnFactory.fstore(localVarIndex)); | |
498 pc+=2; | |
499 if (isWide){ | |
500 pc++; | |
501 isWide = false; | |
502 } | |
503 } | |
504 | |
505 @Override public void fstore_0() { | |
506 add( insnFactory.fstore(0)); | |
507 pc++; | |
508 } | |
509 | |
510 @Override public void fstore_1() { | |
511 add( insnFactory.fstore(1)); | |
512 pc++; | |
513 } | |
514 | |
515 @Override public void fstore_2() { | |
516 add( insnFactory.fstore(2)); | |
517 pc++; | |
518 } | |
519 | |
520 @Override public void fstore_3() { | |
521 add( insnFactory.fstore(3)); | |
522 pc++; | |
523 } | |
524 | |
525 @Override public void fsub() { | |
526 add( insnFactory.fsub()); | |
527 pc++; | |
528 } | |
529 | |
530 @Override public void getfield(int cpFieldRefIndex) { | |
531 String fieldName = cf.fieldNameAt(cpFieldRefIndex); | |
532 String clsName = cf.fieldClassNameAt(cpFieldRefIndex); | |
533 String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex); | |
534 | |
535 add( insnFactory.getfield(fieldName, clsName, fieldDescriptor)); | |
536 pc+=3; | |
537 } | |
538 public void getfield(String fieldName, String clsName, String fieldDescriptor){ | |
539 add( insnFactory.getfield(fieldName, clsName, fieldDescriptor)); | |
540 pc+=3; | |
541 } | |
542 | |
543 @Override public void getstatic(int cpFieldRefIndex) { | |
544 String fieldName = cf.fieldNameAt(cpFieldRefIndex); | |
545 String clsName = cf.fieldClassNameAt(cpFieldRefIndex); | |
546 String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex); | |
547 | |
548 add( insnFactory.getstatic(fieldName, clsName, fieldDescriptor)); | |
549 pc+=3; | |
550 } | |
551 public void getstatic(String fieldName, String clsName, String fieldDescriptor){ | |
552 add( insnFactory.getstatic(fieldName, clsName, fieldDescriptor)); | |
553 pc+=3; | |
554 } | |
555 | |
556 @Override public void goto_(int pcOffset) { | |
557 add( insnFactory.goto_(pc + pcOffset)); | |
558 pc+=3; | |
559 } | |
560 | |
561 @Override public void goto_w(int pcOffset) { | |
562 add( insnFactory.goto_w(pc + pcOffset)); | |
563 pc+=5; | |
564 } | |
565 | |
566 @Override public void i2b() { | |
567 add( insnFactory.i2b()); | |
568 pc++; | |
569 } | |
570 | |
571 @Override public void i2c() { | |
572 add( insnFactory.i2c()); | |
573 pc++; | |
574 } | |
575 | |
576 @Override public void i2d() { | |
577 add( insnFactory.i2d()); | |
578 pc++; | |
579 } | |
580 | |
581 @Override public void i2f() { | |
582 add( insnFactory.i2f()); | |
583 pc++; | |
584 } | |
585 | |
586 @Override public void i2l() { | |
587 add( insnFactory.i2l()); | |
588 pc++; | |
589 } | |
590 | |
591 @Override public void i2s() { | |
592 add( insnFactory.i2s()); | |
593 pc++; | |
594 } | |
595 | |
596 @Override public void iadd() { | |
597 add( insnFactory.iadd()); | |
598 pc++; | |
599 } | |
600 | |
601 @Override public void iaload() { | |
602 add( insnFactory.iaload()); | |
603 pc++; | |
604 } | |
605 | |
606 @Override public void iand() { | |
607 add( insnFactory.iand()); | |
608 pc++; | |
609 } | |
610 | |
611 @Override public void iastore() { | |
612 add( insnFactory.iastore()); | |
613 pc++; | |
614 } | |
615 | |
616 @Override public void iconst_m1() { | |
617 add( insnFactory.iconst_m1()); | |
618 pc++; | |
619 } | |
620 | |
621 @Override public void iconst_0() { | |
622 add( insnFactory.iconst_0()); | |
623 pc++; | |
624 } | |
625 | |
626 @Override public void iconst_1() { | |
627 add( insnFactory.iconst_1()); | |
628 pc++; | |
629 } | |
630 | |
631 @Override public void iconst_2() { | |
632 add( insnFactory.iconst_2()); | |
633 pc++; | |
634 } | |
635 | |
636 @Override public void iconst_3() { | |
637 add( insnFactory.iconst_3()); | |
638 pc++; | |
639 } | |
640 | |
641 @Override public void iconst_4() { | |
642 add( insnFactory.iconst_4()); | |
643 pc++; | |
644 } | |
645 | |
646 @Override public void iconst_5() { | |
647 add( insnFactory.iconst_5()); | |
648 pc++; | |
649 } | |
650 | |
651 @Override public void idiv() { | |
652 add( insnFactory.idiv()); | |
653 pc++; | |
654 } | |
655 | |
656 @Override public void if_acmpeq(int pcOffset) { | |
657 add( insnFactory.if_acmpeq(pc + pcOffset)); | |
658 pc+=3; | |
659 } | |
660 | |
661 @Override public void if_acmpne(int pcOffset) { | |
662 add( insnFactory.if_acmpne(pc + pcOffset)); | |
663 pc+=3; | |
664 } | |
665 | |
666 @Override public void if_icmpeq(int pcOffset) { | |
667 add( insnFactory.if_icmpeq(pc + pcOffset)); | |
668 pc+=3; | |
669 } | |
670 | |
671 @Override public void if_icmpne(int pcOffset) { | |
672 add( insnFactory.if_icmpne(pc + pcOffset)); | |
673 pc+=3; | |
674 } | |
675 | |
676 @Override public void if_icmplt(int pcOffset) { | |
677 add( insnFactory.if_icmplt(pc + pcOffset)); | |
678 pc+=3; | |
679 } | |
680 | |
681 @Override public void if_icmpge(int pcOffset) { | |
682 add( insnFactory.if_icmpge(pc + pcOffset)); | |
683 pc+=3; | |
684 } | |
685 | |
686 @Override public void if_icmpgt(int pcOffset) { | |
687 add( insnFactory.if_icmpgt(pc + pcOffset)); | |
688 pc+=3; | |
689 } | |
690 | |
691 @Override public void if_icmple(int pcOffset) { | |
692 add( insnFactory.if_icmple(pc + pcOffset)); | |
693 pc+=3; | |
694 } | |
695 | |
696 @Override public void ifeq(int pcOffset) { | |
697 add( insnFactory.ifeq(pc + pcOffset)); | |
698 pc+=3; | |
699 } | |
700 | |
701 @Override public void ifne(int pcOffset) { | |
702 add( insnFactory.ifne(pc + pcOffset)); | |
703 pc+=3; | |
704 } | |
705 | |
706 @Override public void iflt(int pcOffset) { | |
707 add( insnFactory.iflt(pc + pcOffset)); | |
708 pc+=3; | |
709 } | |
710 | |
711 @Override public void ifge(int pcOffset) { | |
712 add( insnFactory.ifge(pc + pcOffset)); | |
713 pc+=3; | |
714 } | |
715 | |
716 @Override public void ifgt(int pcOffset) { | |
717 add( insnFactory.ifgt(pc + pcOffset)); | |
718 pc+=3; | |
719 } | |
720 | |
721 @Override public void ifle(int pcOffset) { | |
722 add( insnFactory.ifle(pc + pcOffset)); | |
723 pc+=3; | |
724 } | |
725 | |
726 @Override public void ifnonnull(int pcOffset) { | |
727 add( insnFactory.ifnonnull(pc + pcOffset)); | |
728 pc+=3; | |
729 } | |
730 | |
731 @Override public void ifnull(int pcOffset) { | |
732 add( insnFactory.ifnull(pc + pcOffset)); | |
733 pc+=3; | |
734 } | |
735 | |
736 @Override public void iinc(int localVarIndex, int incConstant) { | |
737 add( insnFactory.iinc(localVarIndex, incConstant)); | |
738 pc+=3; | |
739 if (isWide){ | |
740 pc+=2; | |
741 isWide = false; | |
742 } | |
743 } | |
744 | |
745 @Override public void iload(int localVarIndex) { | |
746 add( insnFactory.iload(localVarIndex)); | |
747 pc+=2; | |
748 if (isWide){ | |
749 pc++; | |
750 isWide = false; | |
751 } | |
752 } | |
753 | |
754 @Override public void iload_0() { | |
755 add( insnFactory.iload(0)); | |
756 pc++; | |
757 } | |
758 | |
759 @Override public void iload_1() { | |
760 add( insnFactory.iload(1)); | |
761 pc++; | |
762 } | |
763 | |
764 @Override public void iload_2() { | |
765 add( insnFactory.iload(2)); | |
766 pc++; | |
767 } | |
768 | |
769 @Override public void iload_3() { | |
770 add( insnFactory.iload(3)); | |
771 pc++; | |
772 } | |
773 | |
774 @Override public void imul() { | |
775 add( insnFactory.imul()); | |
776 pc++; | |
777 } | |
778 | |
779 @Override public void ineg() { | |
780 add( insnFactory.ineg()); | |
781 pc++; | |
782 } | |
783 | |
784 @Override public void instanceof_(int cpClassIndex) { | |
785 String clsName = cf.classNameAt(cpClassIndex); | |
786 add( insnFactory.instanceof_(clsName)); | |
787 pc+=3; | |
788 } | |
789 | |
790 @Override public void invokeinterface(int cpInterfaceMethodRefIndex, int count, int zero) { | |
791 String clsName = cf.interfaceMethodClassNameAt(cpInterfaceMethodRefIndex); | |
792 String methodName = cf.interfaceMethodNameAt(cpInterfaceMethodRefIndex); | |
793 String methodSignature = cf.interfaceMethodDescriptorAt(cpInterfaceMethodRefIndex); | |
794 | |
795 add( insnFactory.invokeinterface(clsName, methodName, methodSignature)); | |
796 pc+=5; | |
797 } | |
798 public void invokeinterface(String clsName, String methodName, String methodSignature){ | |
799 add( insnFactory.invokeinterface(clsName, methodName, methodSignature)); | |
800 pc+=5; | |
801 } | |
802 | |
803 @Override | |
804 public void invokedynamic (int cpInvokeDynamicIndex){ | |
805 int bootstrapMethodIndex = cf.bootstrapMethodIndex(cpInvokeDynamicIndex); | |
806 String samMethodName = cf.samMethodNameAt(cpInvokeDynamicIndex); | |
807 String callSiteDescriptor = cf.callSiteDescriptor(cpInvokeDynamicIndex); | |
808 add( insnFactory.invokedynamic(bootstrapMethodIndex, samMethodName, callSiteDescriptor)); | |
809 pc+=5; | |
810 } | |
811 | |
812 @Override public void invokespecial(int cpMethodRefIndex) { | |
813 String clsName = cf.methodClassNameAt(cpMethodRefIndex); | |
814 String methodName = cf.methodNameAt(cpMethodRefIndex); | |
815 String methodSignature = cf.methodDescriptorAt(cpMethodRefIndex); | |
816 | |
817 add( insnFactory.invokespecial(clsName, methodName, methodSignature)); | |
818 pc+=3; | |
819 } | |
820 public void invokespecial(String clsName, String methodName, String methodSignature){ | |
821 add( insnFactory.invokespecial(clsName, methodName, methodSignature)); | |
822 pc+=3; | |
823 } | |
824 | |
825 @Override public void invokestatic(int cpMethodRefIndex) { | |
826 String clsName = cf.methodClassNameAt(cpMethodRefIndex); | |
827 String methodName = cf.methodNameAt(cpMethodRefIndex); | |
828 String methodSignature = cf.methodDescriptorAt(cpMethodRefIndex); | |
829 | |
830 add( insnFactory.invokestatic(clsName, methodName, methodSignature)); | |
831 pc+=3; | |
832 } | |
833 public void invokestatic(String clsName, String methodName, String methodSignature){ | |
834 add( insnFactory.invokestatic(clsName, methodName, methodSignature)); | |
835 pc+=3; | |
836 } | |
837 | |
838 @Override public void invokevirtual(int cpMethodRefIndex) { | |
839 String clsName = cf.methodClassNameAt(cpMethodRefIndex); | |
840 String methodName = cf.methodNameAt(cpMethodRefIndex); | |
841 String methodSignature = cf.methodDescriptorAt(cpMethodRefIndex); | |
842 | |
843 add( insnFactory.invokevirtual(clsName, methodName, methodSignature)); | |
844 pc+=3; | |
845 } | |
846 public void invokevirtual(String clsName, String methodName, String methodSignature){ | |
847 add( insnFactory.invokevirtual(clsName, methodName, methodSignature)); | |
848 pc+=3; | |
849 } | |
850 | |
851 @Override public void ior() { | |
852 add( insnFactory.ior()); | |
853 pc++; | |
854 } | |
855 | |
856 @Override public void irem() { | |
857 add( insnFactory.irem()); | |
858 pc++; | |
859 } | |
860 | |
861 @Override public void ireturn() { | |
862 add( insnFactory.ireturn()); | |
863 pc++; | |
864 } | |
865 | |
866 @Override public void ishl() { | |
867 add( insnFactory.ishl()); | |
868 pc++; | |
869 } | |
870 | |
871 @Override public void ishr() { | |
872 add( insnFactory.ishr()); | |
873 pc++; | |
874 } | |
875 | |
876 @Override public void istore(int localVarIndex) { | |
877 add( insnFactory.istore(localVarIndex)); | |
878 pc+=2; | |
879 if (isWide){ | |
880 pc++; | |
881 isWide = false; | |
882 } | |
883 } | |
884 | |
885 @Override public void istore_0() { | |
886 add( insnFactory.istore(0)); | |
887 pc++; | |
888 } | |
889 | |
890 @Override public void istore_1() { | |
891 add( insnFactory.istore(1)); | |
892 pc++; | |
893 } | |
894 | |
895 @Override public void istore_2() { | |
896 add( insnFactory.istore(2)); | |
897 pc++; | |
898 } | |
899 | |
900 @Override public void istore_3() { | |
901 add( insnFactory.istore(3)); | |
902 pc++; | |
903 } | |
904 | |
905 @Override public void isub() { | |
906 add( insnFactory.isub()); | |
907 pc++; | |
908 } | |
909 | |
910 @Override public void iushr() { | |
911 add( insnFactory.iushr()); | |
912 pc++; | |
913 } | |
914 | |
915 @Override public void ixor() { | |
916 add( insnFactory.ixor()); | |
917 pc++; | |
918 } | |
919 | |
920 @Override public void jsr(int pcOffset) { | |
921 add( insnFactory.jsr(pc + pcOffset)); | |
922 pc+=3; | |
923 } | |
924 | |
925 @Override public void jsr_w(int pcOffset) { | |
926 add( insnFactory.jsr_w(pc + pcOffset)); | |
927 pc+=5; | |
928 } | |
929 | |
930 @Override public void l2d() { | |
931 add( insnFactory.l2d()); | |
932 pc++; | |
933 } | |
934 | |
935 @Override public void l2f() { | |
936 add( insnFactory.l2f()); | |
937 pc++; | |
938 } | |
939 | |
940 @Override public void l2i() { | |
941 add( insnFactory.l2i()); | |
942 pc++; | |
943 } | |
944 | |
945 @Override public void ladd() { | |
946 add( insnFactory.ladd()); | |
947 pc++; | |
948 } | |
949 | |
950 @Override public void laload() { | |
951 add( insnFactory.laload()); | |
952 pc++; | |
953 } | |
954 | |
955 @Override public void land() { | |
956 add( insnFactory.land()); | |
957 pc++; | |
958 } | |
959 | |
960 @Override public void lastore() { | |
961 add( insnFactory.lastore()); | |
962 pc++; | |
963 } | |
964 | |
965 @Override public void lcmp() { | |
966 add( insnFactory.lcmp()); | |
967 pc++; | |
968 } | |
969 | |
970 @Override public void lconst_0() { | |
971 add( insnFactory.lconst_0()); | |
972 pc++; | |
973 } | |
974 | |
975 @Override public void lconst_1() { | |
976 add( insnFactory.lconst_1()); | |
977 pc++; | |
978 } | |
979 | |
980 @Override public void ldc_(int cpIntOrFloatOrStringOrClassIndex) { | |
981 Object v = cf.getCpValue(cpIntOrFloatOrStringOrClassIndex); | |
982 switch (cf.getCpTag(cpIntOrFloatOrStringOrClassIndex)){ | |
983 case ClassFile.CONSTANT_INTEGER: | |
984 add( insnFactory.ldc((Integer)v)); break; | |
985 case ClassFile.CONSTANT_FLOAT: | |
986 add( insnFactory.ldc((Float)v)); break; | |
987 case ClassFile.CONSTANT_STRING: | |
988 add( insnFactory.ldc((String)v, false)); break; | |
989 case ClassFile.CONSTANT_CLASS: | |
990 add( insnFactory.ldc((String)v, true)); break; | |
991 } | |
992 pc+=2; | |
993 } | |
994 | |
995 @Override public void ldc_w_(int cpIntOrFloatOrStringOrClassIndex) { | |
996 Object v = cf.getCpValue(cpIntOrFloatOrStringOrClassIndex); | |
997 switch (cf.getCpTag(cpIntOrFloatOrStringOrClassIndex)){ | |
998 case ClassFile.CONSTANT_INTEGER: | |
999 add( insnFactory.ldc_w((Integer)v)); break; | |
1000 case ClassFile.CONSTANT_FLOAT: | |
1001 add( insnFactory.ldc_w((Float)v)); break; | |
1002 case ClassFile.CONSTANT_STRING: | |
1003 add( insnFactory.ldc_w((String)v, false)); break; | |
1004 case ClassFile.CONSTANT_CLASS: | |
1005 add( insnFactory.ldc_w((String)v, true)); break; | |
1006 } | |
1007 pc+=3; | |
1008 } | |
1009 | |
1010 @Override public void ldc2_w(int cpLongOrDoubleIndex) { | |
1011 Object v = cf.getCpValue(cpLongOrDoubleIndex); | |
1012 if (v instanceof Long){ | |
1013 add( insnFactory.ldc2_w((Long)v)); | |
1014 } else { | |
1015 add( insnFactory.ldc2_w((Double)v)); | |
1016 } | |
1017 pc+=3; | |
1018 } | |
1019 | |
1020 @Override public void ldiv() { | |
1021 add( insnFactory.ldiv()); | |
1022 pc++; | |
1023 } | |
1024 | |
1025 @Override public void lload(int localVarIndex) { | |
1026 add( insnFactory.lload(localVarIndex)); | |
1027 pc+=2; | |
1028 if (isWide){ | |
1029 pc++; | |
1030 isWide = false; | |
1031 } | |
1032 } | |
1033 | |
1034 @Override public void lload_0() { | |
1035 add( insnFactory.lload(0)); | |
1036 pc++; | |
1037 } | |
1038 | |
1039 @Override public void lload_1() { | |
1040 add( insnFactory.lload(1)); | |
1041 pc++; | |
1042 } | |
1043 | |
1044 @Override public void lload_2() { | |
1045 add( insnFactory.lload(2)); | |
1046 pc++; | |
1047 } | |
1048 | |
1049 @Override public void lload_3() { | |
1050 add( insnFactory.lload(3)); | |
1051 pc++; | |
1052 } | |
1053 | |
1054 @Override public void lmul() { | |
1055 add( insnFactory.lmul()); | |
1056 pc++; | |
1057 } | |
1058 | |
1059 @Override public void lneg() { | |
1060 add( insnFactory.lneg()); | |
1061 pc++; | |
1062 } | |
1063 | |
1064 | |
1065 @Override public void lookupswitch(int defaultPcOffset, int nEntries) { | |
1066 Instruction insn = insnFactory.lookupswitch(pc + defaultPcOffset, nEntries); | |
1067 add( insn); | |
1068 | |
1069 lookupswitchInsn = (LookupSwitchInstruction)insn; | |
1070 | |
1071 if (cf != null){ | |
1072 cf.parseLookupSwitchEntries(this, nEntries); | |
1073 } | |
1074 | |
1075 pc = ((pc+4)>>2)<<2; // opcode and padding | |
1076 pc += 8 + nEntries*8; // arguments and lookup table | |
1077 } | |
1078 @Override public void lookupswitchEntry(int index, int match, int pcOffset) { | |
1079 lookupswitchInsn.setTarget(index, match, pc + pcOffset); | |
1080 } | |
1081 | |
1082 @Override public void lor() { | |
1083 add( insnFactory.lor()); | |
1084 pc++; | |
1085 } | |
1086 | |
1087 @Override public void lrem() { | |
1088 add( insnFactory.lrem()); | |
1089 pc++; | |
1090 } | |
1091 | |
1092 @Override public void lreturn() { | |
1093 add( insnFactory.lreturn()); | |
1094 pc++; | |
1095 } | |
1096 | |
1097 @Override public void lshl() { | |
1098 add( insnFactory.lshl()); | |
1099 pc++; | |
1100 } | |
1101 | |
1102 @Override public void lshr() { | |
1103 add( insnFactory.lshr()); | |
1104 pc++; | |
1105 } | |
1106 | |
1107 @Override public void lstore(int localVarIndex) { | |
1108 add( insnFactory.lstore(localVarIndex)); | |
1109 pc+=2; | |
1110 if (isWide){ | |
1111 pc++; | |
1112 isWide = false; | |
1113 } | |
1114 } | |
1115 | |
1116 @Override public void lstore_0() { | |
1117 add( insnFactory.lstore(0)); | |
1118 pc++; | |
1119 } | |
1120 | |
1121 @Override public void lstore_1() { | |
1122 add( insnFactory.lstore(1)); | |
1123 pc++; | |
1124 } | |
1125 | |
1126 @Override public void lstore_2() { | |
1127 add( insnFactory.lstore(2)); | |
1128 pc++; | |
1129 } | |
1130 | |
1131 @Override public void lstore_3() { | |
1132 add( insnFactory.lstore(3)); | |
1133 pc++; | |
1134 } | |
1135 | |
1136 @Override public void lsub() { | |
1137 add( insnFactory.lsub()); | |
1138 pc++; | |
1139 } | |
1140 | |
1141 @Override public void lushr() { | |
1142 add( insnFactory.lushr()); | |
1143 pc++; | |
1144 } | |
1145 | |
1146 @Override public void lxor() { | |
1147 add( insnFactory.lxor()); | |
1148 pc++; | |
1149 } | |
1150 | |
1151 @Override public void monitorenter() { | |
1152 add( insnFactory.monitorenter()); | |
1153 pc++; | |
1154 } | |
1155 | |
1156 @Override public void monitorexit() { | |
1157 add( insnFactory.monitorexit()); | |
1158 pc++; | |
1159 } | |
1160 | |
1161 @Override public void multianewarray(int cpClassIndex, int dimensions) { | |
1162 add( insnFactory.multianewarray(cf.classNameAt(cpClassIndex), dimensions)); | |
1163 pc+=4; | |
1164 } | |
1165 | |
1166 @Override public void new_(int cpClassIndex) { | |
1167 add( insnFactory.new_(cf.classNameAt(cpClassIndex))); | |
1168 pc+=3; | |
1169 } | |
1170 | |
1171 @Override public void newarray(int typeCode) { | |
1172 add( insnFactory.newarray(typeCode)); | |
1173 pc+=2; | |
1174 } | |
1175 | |
1176 @Override public void nop() { | |
1177 add( insnFactory.nop()); | |
1178 pc++; | |
1179 } | |
1180 | |
1181 @Override public void pop() { | |
1182 add( insnFactory.pop()); | |
1183 pc++; | |
1184 } | |
1185 | |
1186 @Override public void pop2() { | |
1187 add( insnFactory.pop2()); | |
1188 pc++; | |
1189 } | |
1190 | |
1191 @Override public void putfield(int cpFieldRefIndex) { | |
1192 String fieldName = cf.fieldNameAt(cpFieldRefIndex); | |
1193 String clsName = cf.fieldClassNameAt(cpFieldRefIndex); | |
1194 String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex); | |
1195 | |
1196 add( insnFactory.putfield(fieldName, clsName, fieldDescriptor)); | |
1197 pc+=3; | |
1198 } | |
1199 public void putfield(String fieldName, String clsName, String fieldDescriptor){ | |
1200 add( insnFactory.putfield(fieldName, clsName, fieldDescriptor)); | |
1201 pc+=3; | |
1202 } | |
1203 | |
1204 | |
1205 @Override public void putstatic(int cpFieldRefIndex) { | |
1206 String fieldName = cf.fieldNameAt(cpFieldRefIndex); | |
1207 String clsName = cf.fieldClassNameAt(cpFieldRefIndex); | |
1208 String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex); | |
1209 | |
1210 add( insnFactory.putstatic(fieldName, clsName, fieldDescriptor)); | |
1211 pc+=3; | |
1212 } | |
1213 public void putstatic(String fieldName, String clsName, String fieldDescriptor){ | |
1214 add( insnFactory.putstatic(fieldName, clsName, fieldDescriptor)); | |
1215 pc+=3; | |
1216 } | |
1217 | |
1218 | |
1219 @Override public void ret(int localVarIndex) { | |
1220 add( insnFactory.ret(localVarIndex)); | |
1221 pc+=2; | |
1222 if (isWide){ | |
1223 pc++; | |
1224 isWide = false; | |
1225 } | |
1226 } | |
1227 | |
1228 @Override public void return_() { | |
1229 add( insnFactory.return_()); | |
1230 pc++; | |
1231 } | |
1232 | |
1233 @Override public void saload() { | |
1234 add( insnFactory.saload()); | |
1235 pc++; | |
1236 } | |
1237 | |
1238 @Override public void sastore() { | |
1239 add( insnFactory.sastore()); | |
1240 pc++; | |
1241 } | |
1242 | |
1243 @Override public void sipush(int val) { | |
1244 add( insnFactory.sipush(val)); | |
1245 pc+=3; | |
1246 } | |
1247 | |
1248 @Override public void swap() { | |
1249 add( insnFactory.swap()); | |
1250 pc++; | |
1251 } | |
1252 | |
1253 @Override public void tableswitch(int defaultPcOffset, int low, int high) { | |
1254 Instruction insn = insnFactory.tableswitch(pc + defaultPcOffset, low, high); | |
1255 add( insn); | |
1256 | |
1257 tableswitchInsn = (TableSwitchInstruction)insn; | |
1258 | |
1259 if (cf != null){ | |
1260 cf.parseTableSwitchEntries(this, low, high); | |
1261 } | |
1262 | |
1263 pc = ((pc+4)>>2)<<2; // opcode and padding | |
1264 pc+=12 + (high-low+1)*4; // the fixed args and jump table | |
1265 } | |
1266 | |
1267 @Override public void tableswitchEntry(int value, int pcOffset) { | |
1268 tableswitchInsn.setTarget(value, pc + pcOffset); | |
1269 } | |
1270 | |
1271 @Override public void wide() { | |
1272 add( insnFactory.wide()); | |
1273 pc++; | |
1274 isWide = true; | |
1275 } | |
1276 | |
1277 @Override public void unknown(int bytecode) { | |
1278 throw new JPFException("unknown bytecode: " + Integer.toHexString(bytecode)); | |
1279 } | |
1280 | |
1281 | |
1282 //--- the JPF specific ones (only used in synthetic methods) | |
1283 public void invokecg(List<Invocation> invokes) { | |
1284 add (insnFactory.invokecg(invokes)); | |
1285 pc++; | |
1286 } | |
1287 | |
1288 public void invokeclinit(ClassInfo ci) { | |
1289 add( insnFactory.invokeclinit(ci)); | |
1290 pc++; | |
1291 } | |
1292 | |
1293 public void directcallreturn(){ | |
1294 add( insnFactory.directcallreturn()); | |
1295 pc++; | |
1296 } | |
1297 | |
1298 public void executenative(NativeMethodInfo mi){ | |
1299 add( insnFactory.executenative(mi)); | |
1300 pc++; | |
1301 } | |
1302 | |
1303 public void nativereturn(){ | |
1304 add( insnFactory.nativereturn()); | |
1305 pc++; | |
1306 } | |
1307 | |
1308 public void runStart (MethodInfo mi){ | |
1309 add( insnFactory.runstart(mi)); | |
1310 pc++; | |
1311 } | |
1312 | |
1313 } |