KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sun > org > apache > bcel > internal > verifier > structurals > ExecutionVisitor


1 package com.sun.org.apache.bcel.internal.verifier.structurals;
2
3 /* ====================================================================
4  * The Apache Software License, Version 1.1
5  *
6  * Copyright (c) 2001 The Apache Software Foundation. All rights
7  * reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution,
22  * if any, must include the following acknowledgment:
23  * "This product includes software developed by the
24  * Apache Software Foundation (http://www.apache.org/)."
25  * Alternately, this acknowledgment may appear in the software itself,
26  * if and wherever such third-party acknowledgments normally appear.
27  *
28  * 4. The names "Apache" and "Apache Software Foundation" and
29  * "Apache BCEL" must not be used to endorse or promote products
30  * derived from this software without prior written permission. For
31  * written permission, please contact apache@apache.org.
32  *
33  * 5. Products derived from this software may not be called "Apache",
34  * "Apache BCEL", nor may "Apache" appear in their name, without
35  * prior written permission of the Apache Software Foundation.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals on behalf of the Apache Software Foundation. For more
53  * information on the Apache Software Foundation, please see
54  * <http://www.apache.org/>.
55  */

56
57 import com.sun.org.apache.bcel.internal.Constants;
58 import com.sun.org.apache.bcel.internal.Repository;
59 import com.sun.org.apache.bcel.internal.generic.*;
60 import com.sun.org.apache.bcel.internal.classfile.JavaClass;
61 import com.sun.org.apache.bcel.internal.classfile.Constant;
62 import com.sun.org.apache.bcel.internal.classfile.ConstantDouble;
63 import com.sun.org.apache.bcel.internal.classfile.ConstantFloat;
64 import com.sun.org.apache.bcel.internal.classfile.ConstantInteger;
65 import com.sun.org.apache.bcel.internal.classfile.ConstantLong;
66 import com.sun.org.apache.bcel.internal.classfile.ConstantString;
67 import com.sun.org.apache.bcel.internal.verifier.Verifier;
68 import com.sun.org.apache.bcel.internal.verifier.exc.*;
69 import java.util.ArrayList JavaDoc;
70 import java.util.Hashtable JavaDoc;
71
72 /**
73  * This Visitor class may be used for a type-based Java Virtual Machine
74  * simulation.
75  * It does not check for correct types on the OperandStack or in the
76  * LocalVariables; nor does it check their sizes are sufficiently big.
77  * Thus, to use this Visitor for bytecode verifying, you have to make sure
78  * externally that the type constraints of the Java Virtual Machine instructions
79  * are satisfied. An InstConstraintVisitor may be used for this.
80  * Anyway, this Visitor does not mandate it. For example, when you
81  * visitIADD(IADD o), then there are two stack slots popped and one
82  * stack slot containing a Type.INT is pushed (where you could also
83  * pop only one slot if you know there are two Type.INT on top of the
84  * stack). Monitor-specific behaviour is not simulated.
85  *
86  * </P><B>Conventions:</B>
87  *
88  * Type.VOID will never be pushed onto the stack. Type.DOUBLE and Type.LONG
89  * that would normally take up two stack slots (like Double_HIGH and
90  * Double_LOW) are represented by a simple single Type.DOUBLE or Type.LONG
91  * object on the stack here.
92  * If a two-slot type is stored into a local variable, the next variable
93  * is given the type Type.UNKNOWN.
94  *
95  * @version $Id: ExecutionVisitor.java,v 1.1.1.1 2001/10/29 20:00:39 jvanzyl Exp $
96  * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
97  * @see #visitDSTORE(DSTORE o)
98  * @see InstConstraintVisitor
99  */

100 public class ExecutionVisitor extends EmptyVisitor implements Visitor{
101
102     /**
103      * The executionframe we're operating on.
104      */

105     private Frame frame = null;
106
107     /**
108      * The ConstantPoolGen we're working with.
109      * @see #setConstantPoolGen(ConstantPoolGen)
110      */

111     private ConstantPoolGen cpg = null;
112
113     /**
114      * Constructor. Constructs a new instance of this class.
115      */

116     public ExecutionVisitor(){}
117
118     /**
119      * The OperandStack from the current Frame we're operating on.
120      * @see #setFrame(Frame)
121      */

122     private OperandStack stack(){
123         return frame.getStack();
124     }
125
126     /**
127      * The LocalVariables from the current Frame we're operating on.
128      * @see #setFrame(Frame)
129      */

130     private LocalVariables locals(){
131         return frame.getLocals();
132     }
133
134     /**
135      * Sets the ConstantPoolGen needed for symbolic execution.
136      */

137     public void setConstantPoolGen(ConstantPoolGen cpg){
138         this.cpg = cpg;
139     }
140     
141     /**
142      * The only method granting access to the single instance of
143      * the ExecutionVisitor class. Before actively using this
144      * instance, <B>SET THE ConstantPoolGen FIRST</B>.
145      * @see #setConstantPoolGen(ConstantPoolGen)
146      */

147     public void setFrame(Frame f){
148         this.frame = f;
149     }
150
151     ///** Symbolically executes the corresponding Java Virtual Machine instruction. */
152
//public void visitWIDE(WIDE o){
153
// The WIDE instruction is modelled as a flag
154
// of the embedded instructions in BCEL.
155
// Therefore BCEL checks for possible errors
156
// when parsing in the .class file: We don't
157
// have even the possibilty to care for WIDE
158
// here.
159
//}
160

161     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
162     public void visitAALOAD(AALOAD o){
163         stack().pop(); // pop the index int
164
//System.out.print(stack().peek());
165
Type t = stack().pop(); // Pop Array type
166
if (t == Type.NULL){
167             stack().push(Type.NULL);
168         } // Do nothing stackwise --- a NullPointerException is thrown at Run-Time
169
else{
170             ArrayType at = (ArrayType) t;
171             stack().push(at.getElementType());
172         }
173     }
174     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
175     public void visitAASTORE(AASTORE o){
176         stack().pop();
177         stack().pop();
178         stack().pop();
179     }
180     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
181     public void visitACONST_NULL(ACONST_NULL o){
182         stack().push(Type.NULL);
183     }
184     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
185     public void visitALOAD(ALOAD o){
186         stack().push(locals().get(o.getIndex()));
187     }
188     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
189     public void visitANEWARRAY(ANEWARRAY o){
190         stack().pop(); //count
191
stack().push( new ArrayType(o.getType(cpg), 1) );
192     }
193     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
194     public void visitARETURN(ARETURN o){
195         stack().pop();
196     }
197     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
198     public void visitARRAYLENGTH(ARRAYLENGTH o){
199         stack().pop();
200         stack().push(Type.INT);
201     }
202
203     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
204     public void visitASTORE(ASTORE o){
205         locals().set(o.getIndex(), stack().pop());
206         //System.err.println("TODO-DEBUG: set LV '"+o.getIndex()+"' to '"+locals().get(o.getIndex())+"'.");
207
}
208
209     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
210     public void visitATHROW(ATHROW o){
211         Type t = stack().pop();
212         stack().clear();
213         if (t.equals(Type.NULL))
214             stack().push(Type.getType("Ljava/lang/NullPointerException;"));
215         else
216             stack().push(t);
217     }
218
219     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
220     public void visitBALOAD(BALOAD o){
221         stack().pop();
222         stack().pop();
223         stack().push(Type.INT);
224     }
225
226     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
227     public void visitBASTORE(BASTORE o){
228         stack().pop();
229         stack().pop();
230         stack().pop();
231     }
232
233     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
234     public void visitBIPUSH(BIPUSH o){
235         stack().push(Type.INT);
236     }
237
238     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
239     public void visitCALOAD(CALOAD o){
240         stack().pop();
241         stack().pop();
242         stack().push(Type.INT);
243     }
244     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
245     public void visitCASTORE(CASTORE o){
246         stack().pop();
247         stack().pop();
248         stack().pop();
249     }
250     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
251     public void visitCHECKCAST(CHECKCAST o){
252         // It's possibly wrong to do so, but SUN's
253
// ByteCode verifier seems to do (only) this, too.
254
// TODO: One could use a sophisticated analysis here to check
255
// if a type cannot possibly be cated to another and by
256
// so doing predict the ClassCastException at run-time.
257
stack().pop();
258         stack().push(o.getType(cpg));
259     }
260
261     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
262     public void visitD2F(D2F o){
263         stack().pop();
264         stack().push(Type.FLOAT);
265     }
266     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
267     public void visitD2I(D2I o){
268         stack().pop();
269         stack().push(Type.INT);
270     }
271     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
272     public void visitD2L(D2L o){
273         stack().pop();
274         stack().push(Type.LONG);
275     }
276     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
277     public void visitDADD(DADD o){
278         stack().pop();
279         stack().pop();
280         stack().push(Type.DOUBLE);
281     }
282     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
283     public void visitDALOAD(DALOAD o){
284         stack().pop();
285         stack().pop();
286         stack().push(Type.DOUBLE);
287     }
288     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
289     public void visitDASTORE(DASTORE o){
290         stack().pop();
291         stack().pop();
292         stack().pop();
293     }
294     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
295     public void visitDCMPG(DCMPG o){
296         stack().pop();
297         stack().pop();
298         stack().push(Type.INT);
299     }
300     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
301     public void visitDCMPL(DCMPL o){
302         stack().pop();
303         stack().pop();
304         stack().push(Type.INT);
305     }
306     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
307     public void visitDCONST(DCONST o){
308         stack().push(Type.DOUBLE);
309     }
310     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
311     public void visitDDIV(DDIV o){
312         stack().pop();
313         stack().pop();
314         stack().push(Type.DOUBLE);
315     }
316     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
317     public void visitDLOAD(DLOAD o){
318         stack().push(Type.DOUBLE);
319     }
320     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
321     public void visitDMUL(DMUL o){
322         stack().pop();
323         stack().pop();
324         stack().push(Type.DOUBLE);
325     }
326     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
327     public void visitDNEG(DNEG o){
328         stack().pop();
329         stack().push(Type.DOUBLE);
330     }
331     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
332     public void visitDREM(DREM o){
333         stack().pop();
334         stack().pop();
335         stack().push(Type.DOUBLE);
336     }
337     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
338     public void visitDRETURN(DRETURN o){
339         stack().pop();
340     }
341     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
342     public void visitDSTORE(DSTORE o){
343         locals().set(o.getIndex(), stack().pop());
344         locals().set(o.getIndex()+1, Type.UNKNOWN);
345     }
346     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
347     public void visitDSUB(DSUB o){
348         stack().pop();
349         stack().pop();
350         stack().push(Type.DOUBLE);
351     }
352     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
353     public void visitDUP(DUP o){
354         Type t = stack().pop();
355         stack().push(t);
356         stack().push(t);
357     }
358     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
359     public void visitDUP_X1(DUP_X1 o){
360         Type w1 = stack().pop();
361         Type w2 = stack().pop();
362         stack().push(w1);
363         stack().push(w2);
364         stack().push(w1);
365     }
366     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
367     public void visitDUP_X2(DUP_X2 o){
368         Type w1 = stack().pop();
369         Type w2 = stack().pop();
370         if (w2.getSize() == 2){
371             stack().push(w1);
372             stack().push(w2);
373             stack().push(w1);
374         }
375         else{
376             Type w3 = stack().pop();
377             stack().push(w1);
378             stack().push(w3);
379             stack().push(w2);
380             stack().push(w1);
381         }
382     }
383     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
384     public void visitDUP2(DUP2 o){
385         Type t = stack().pop();
386         if (t.getSize() == 2){
387             stack().push(t);
388             stack().push(t);
389         }
390         else{ // t.getSize() is 1
391
Type u = stack().pop();
392             stack().push(u);
393             stack().push(t);
394             stack().push(u);
395             stack().push(t);
396         }
397     }
398     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
399     public void visitDUP2_X1(DUP2_X1 o){
400         Type t = stack().pop();
401         if (t.getSize() == 2){
402             Type u = stack().pop();
403             stack().push(t);
404             stack().push(u);
405             stack().push(t);
406         }
407         else{ //t.getSize() is1
408
Type u = stack().pop();
409             Type v = stack().pop();
410             stack().push(u);
411             stack().push(t);
412             stack().push(v);
413             stack().push(u);
414             stack().push(t);
415         }
416     }
417     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
418     public void visitDUP2_X2(DUP2_X2 o){
419         Type t = stack().pop();
420         if (t.getSize() == 2){
421             Type u = stack().pop();
422             if (u.getSize() == 2){
423                 stack().push(t);
424                 stack().push(u);
425                 stack().push(t);
426             }else{
427                 Type v = stack().pop();
428                 stack().push(t);
429                 stack().push(v);
430                 stack().push(u);
431                 stack().push(t);
432             }
433         }
434         else{ //t.getSize() is 1
435
Type u = stack().pop();
436             Type v = stack().pop();
437             if (v.getSize() == 2){
438                 stack().push(u);
439                 stack().push(t);
440                 stack().push(v);
441                 stack().push(u);
442                 stack().push(t);
443             }else{
444                 Type w = stack().pop();
445                 stack().push(u);
446                 stack().push(t);
447                 stack().push(w);
448                 stack().push(v);
449                 stack().push(u);
450                 stack().push(t);
451             }
452         }
453     }
454     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
455     public void visitF2D(F2D o){
456         stack().pop();
457         stack().push(Type.DOUBLE);
458     }
459     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
460     public void visitF2I(F2I o){
461         stack().pop();
462         stack().push(Type.INT);
463     }
464     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
465     public void visitF2L(F2L o){
466         stack().pop();
467         stack().push(Type.LONG);
468     }
469     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
470     public void visitFADD(FADD o){
471         stack().pop();
472         stack().pop();
473         stack().push(Type.FLOAT);
474     }
475     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
476     public void visitFALOAD(FALOAD o){
477         stack().pop();
478         stack().pop();
479         stack().push(Type.FLOAT);
480     }
481     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
482     public void visitFASTORE(FASTORE o){
483         stack().pop();
484         stack().pop();
485         stack().pop();
486     }
487     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
488     public void visitFCMPG(FCMPG o){
489         stack().pop();
490         stack().pop();
491         stack().push(Type.INT);
492     }
493     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
494     public void visitFCMPL(FCMPL o){
495         stack().pop();
496         stack().pop();
497         stack().push(Type.INT);
498     }
499     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
500     public void visitFCONST(FCONST o){
501         stack().push(Type.FLOAT);
502     }
503     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
504     public void visitFDIV(FDIV o){
505         stack().pop();
506         stack().pop();
507         stack().push(Type.FLOAT);
508     }
509     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
510     public void visitFLOAD(FLOAD o){
511         stack().push(Type.FLOAT);
512     }
513     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
514     public void visitFMUL(FMUL o){
515         stack().pop();
516         stack().pop();
517         stack().push(Type.FLOAT);
518     }
519     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
520     public void visitFNEG(FNEG o){
521         stack().pop();
522         stack().push(Type.FLOAT);
523     }
524     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
525     public void visitFREM(FREM o){
526         stack().pop();
527         stack().pop();
528         stack().push(Type.FLOAT);
529     }
530     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
531     public void visitFRETURN(FRETURN o){
532         stack().pop();
533     }
534     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
535     public void visitFSTORE(FSTORE o){
536         locals().set(o.getIndex(), stack().pop());
537     }
538     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
539     public void visitFSUB(FSUB o){
540         stack().pop();
541         stack().pop();
542         stack().push(Type.FLOAT);
543     }
544     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
545     public void visitGETFIELD(GETFIELD o){
546         stack().pop();
547         Type t = o.getFieldType(cpg);
548         if ( t.equals(Type.BOOLEAN) ||
549                     t.equals(Type.CHAR) ||
550                     t.equals(Type.BYTE) ||
551                     t.equals(Type.SHORT) )
552             t = Type.INT;
553         stack().push(t);
554     }
555     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
556     public void visitGETSTATIC(GETSTATIC o){
557         Type t = o.getFieldType(cpg);
558         if ( t.equals(Type.BOOLEAN) ||
559                     t.equals(Type.CHAR) ||
560                     t.equals(Type.BYTE) ||
561                     t.equals(Type.SHORT) )
562             t = Type.INT;
563         stack().push(t);
564     }
565     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
566     public void visitGOTO(GOTO o){
567         // no stack changes.
568
}
569     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
570     public void visitGOTO_W(GOTO_W o){
571         // no stack changes.
572
}
573     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
574     public void visitI2B(I2B o){
575         stack().pop();
576         stack().push(Type.INT);
577     }
578     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
579     public void visitI2C(I2C o){
580         stack().pop();
581         stack().push(Type.INT);
582     }
583     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
584     public void visitI2D(I2D o){
585         stack().pop();
586         stack().push(Type.DOUBLE);
587     }
588     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
589     public void visitI2F(I2F o){
590         stack().pop();
591         stack().push(Type.FLOAT);
592     }
593     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
594     public void visitI2L(I2L o){
595         stack().pop();
596         stack().push(Type.LONG);
597     }
598     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
599     public void visitI2S(I2S o){
600         stack().pop();
601         stack().push(Type.INT);
602     }
603     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
604     public void visitIADD(IADD o){
605         stack().pop();
606         stack().pop();
607         stack().push(Type.INT);
608     }
609     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
610     public void visitIALOAD(IALOAD o){
611         stack().pop();
612         stack().pop();
613         stack().push(Type.INT);
614     }
615     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
616     public void visitIAND(IAND o){
617         stack().pop();
618         stack().pop();
619         stack().push(Type.INT);
620     }
621     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
622     public void visitIASTORE(IASTORE o){
623         stack().pop();
624         stack().pop();
625         stack().pop();
626     }
627     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
628     public void visitICONST(ICONST o){
629         stack().push(Type.INT);
630     }
631     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
632     public void visitIDIV(IDIV o){
633         stack().pop();
634         stack().pop();
635         stack().push(Type.INT);
636     }
637     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
638     public void visitIF_ACMPEQ(IF_ACMPEQ o){
639         stack().pop();
640         stack().pop();
641     }
642     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
643     public void visitIF_ACMPNE(IF_ACMPNE o){
644         stack().pop();
645         stack().pop();
646     }
647     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
648     public void visitIF_ICMPEQ(IF_ICMPEQ o){
649         stack().pop();
650         stack().pop();
651     }
652     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
653     public void visitIF_ICMPGE(IF_ICMPGE o){
654         stack().pop();
655         stack().pop();
656     }
657     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
658     public void visitIF_ICMPGT(IF_ICMPGT o){
659         stack().pop();
660         stack().pop();
661     }
662     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
663     public void visitIF_ICMPLE(IF_ICMPLE o){
664         stack().pop();
665         stack().pop();
666     }
667     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
668     public void visitIF_ICMPLT(IF_ICMPLT o){
669         stack().pop();
670         stack().pop();
671     }
672     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
673     public void visitIF_ICMPNE(IF_ICMPNE o){
674         stack().pop();
675         stack().pop();
676     }
677     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
678     public void visitIFEQ(IFEQ o){
679         stack().pop();
680     }
681     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
682     public void visitIFGE(IFGE o){
683         stack().pop();
684     }
685     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
686     public void visitIFGT(IFGT o){
687         stack().pop();
688     }
689     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
690     public void visitIFLE(IFLE o){
691         stack().pop();
692     }
693     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
694     public void visitIFLT(IFLT o){
695         stack().pop();
696     }
697     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
698     public void visitIFNE(IFNE o){
699         stack().pop();
700     }
701     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
702     public void visitIFNONNULL(IFNONNULL o){
703         stack().pop();
704     }
705     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
706     public void visitIFNULL(IFNULL o){
707         stack().pop();
708     }
709     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
710     public void visitIINC(IINC o){
711         // stack is not changed.
712
}
713     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
714     public void visitILOAD(ILOAD o){
715         stack().push(Type.INT);
716     }
717     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
718     public void visitIMUL(IMUL o){
719         stack().pop();
720         stack().pop();
721         stack().push(Type.INT);
722     }
723     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
724     public void visitINEG(INEG o){
725         stack().pop();
726         stack().push(Type.INT);
727     }
728     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
729     public void visitINSTANCEOF(INSTANCEOF o){
730         stack().pop();
731         stack().push(Type.INT);
732     }
733     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
734     public void visitINVOKEINTERFACE(INVOKEINTERFACE o){
735         stack().pop(); //objectref
736
for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
737             stack().pop();
738         }
739         // We are sure the invoked method will xRETURN eventually
740
// We simulate xRETURNs functionality here because we
741
// don't really "jump into" and simulate the invoked
742
// method.
743
if (o.getReturnType(cpg) != Type.VOID){
744             Type t = o.getReturnType(cpg);
745             if ( t.equals(Type.BOOLEAN) ||
746                         t.equals(Type.CHAR) ||
747                         t.equals(Type.BYTE) ||
748                         t.equals(Type.SHORT) )
749                 t = Type.INT;
750             stack().push(t);
751         }
752     }
753     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
754     public void visitINVOKESPECIAL(INVOKESPECIAL o){
755         if (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)){
756             UninitializedObjectType t = (UninitializedObjectType) stack().peek(o.getArgumentTypes(cpg).length);
757             if (t == frame._this){
758                 frame._this = null;
759             }
760             stack().initializeObject(t);
761             locals().initializeObject(t);
762         }
763         stack().pop(); //objectref
764
for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
765             stack().pop();
766         }
767         // We are sure the invoked method will xRETURN eventually
768
// We simulate xRETURNs functionality here because we
769
// don't really "jump into" and simulate the invoked
770
// method.
771
if (o.getReturnType(cpg) != Type.VOID){
772             Type t = o.getReturnType(cpg);
773             if ( t.equals(Type.BOOLEAN) ||
774                         t.equals(Type.CHAR) ||
775                         t.equals(Type.BYTE) ||
776                         t.equals(Type.SHORT) )
777                 t = Type.INT;
778             stack().push(t);
779         }
780     }
781     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
782     public void visitINVOKESTATIC(INVOKESTATIC o){
783         for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
784             stack().pop();
785         }
786         // We are sure the invoked method will xRETURN eventually
787
// We simulate xRETURNs functionality here because we
788
// don't really "jump into" and simulate the invoked
789
// method.
790
if (o.getReturnType(cpg) != Type.VOID){
791             Type t = o.getReturnType(cpg);
792             if ( t.equals(Type.BOOLEAN) ||
793                         t.equals(Type.CHAR) ||
794                         t.equals(Type.BYTE) ||
795                         t.equals(Type.SHORT) )
796                 t = Type.INT;
797             stack().push(t);
798         }
799     }
800     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
801     public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){
802         stack().pop(); //objectref
803
for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
804             stack().pop();
805         }
806         // We are sure the invoked method will xRETURN eventually
807
// We simulate xRETURNs functionality here because we
808
// don't really "jump into" and simulate the invoked
809
// method.
810
if (o.getReturnType(cpg) != Type.VOID){
811             Type t = o.getReturnType(cpg);
812             if ( t.equals(Type.BOOLEAN) ||
813                         t.equals(Type.CHAR) ||
814                         t.equals(Type.BYTE) ||
815                         t.equals(Type.SHORT) )
816                 t = Type.INT;
817             stack().push(t);
818         }
819     }
820     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
821     public void visitIOR(IOR o){
822         stack().pop();
823         stack().pop();
824         stack().push(Type.INT);
825     }
826     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
827     public void visitIREM(IREM o){
828         stack().pop();
829         stack().pop();
830         stack().push(Type.INT);
831     }
832     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
833     public void visitIRETURN(IRETURN o){
834         stack().pop();
835     }
836     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
837     public void visitISHL(ISHL o){
838         stack().pop();
839         stack().pop();
840         stack().push(Type.INT);
841     }
842     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
843     public void visitISHR(ISHR o){
844         stack().pop();
845         stack().pop();
846         stack().push(Type.INT);
847     }
848     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
849     public void visitISTORE(ISTORE o){
850         locals().set(o.getIndex(), stack().pop());
851     }
852     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
853     public void visitISUB(ISUB o){
854         stack().pop();
855         stack().pop();
856         stack().push(Type.INT);
857     }
858     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
859     public void visitIUSHR(IUSHR o){
860         stack().pop();
861         stack().pop();
862         stack().push(Type.INT);
863     }
864     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
865     public void visitIXOR(IXOR o){
866         stack().pop();
867         stack().pop();
868         stack().push(Type.INT);
869     }
870
871     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
872     public void visitJSR(JSR o){
873         stack().push(new ReturnaddressType(o.physicalSuccessor()));
874 //System.err.println("TODO-----------:"+o.physicalSuccessor());
875
}
876
877     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
878     public void visitJSR_W(JSR_W o){
879         stack().push(new ReturnaddressType(o.physicalSuccessor()));
880     }
881
882     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
883     public void visitL2D(L2D o){
884         stack().pop();
885         stack().push(Type.DOUBLE);
886     }
887     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
888     public void visitL2F(L2F o){
889         stack().pop();
890         stack().push(Type.FLOAT);
891     }
892     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
893     public void visitL2I(L2I o){
894         stack().pop();
895         stack().push(Type.INT);
896     }
897     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
898     public void visitLADD(LADD o){
899         stack().pop();
900         stack().pop();
901         stack().push(Type.LONG);
902     }
903     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
904     public void visitLALOAD(LALOAD o){
905         stack().pop();
906         stack().pop();
907         stack().push(Type.LONG);
908     }
909     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
910     public void visitLAND(LAND o){
911         stack().pop();
912         stack().pop();
913         stack().push(Type.LONG);
914     }
915     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
916     public void visitLASTORE(LASTORE o){
917         stack().pop();
918         stack().pop();
919         stack().pop();
920     }
921     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
922     public void visitLCMP(LCMP o){
923         stack().pop();
924         stack().pop();
925         stack().push(Type.INT);
926     }
927     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
928     public void visitLCONST(LCONST o){
929         stack().push(Type.LONG);
930     }
931     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
932     public void visitLDC(LDC o){
933         Constant c = cpg.getConstant(o.getIndex());
934         if (c instanceof ConstantInteger){
935             stack().push(Type.INT);
936         }
937         if (c instanceof ConstantFloat){
938             stack().push(Type.FLOAT);
939         }
940         if (c instanceof ConstantString){
941             stack().push(Type.STRING);
942         }
943     }
944     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
945     public void visitLDC_W(LDC_W o){
946         Constant c = cpg.getConstant(o.getIndex());
947         if (c instanceof ConstantInteger){
948             stack().push(Type.INT);
949         }
950         if (c instanceof ConstantFloat){
951             stack().push(Type.FLOAT);
952         }
953         if (c instanceof ConstantString){
954             stack().push(Type.STRING);
955         }
956     }
957     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
958     public void visitLDC2_W(LDC2_W o){
959         Constant c = cpg.getConstant(o.getIndex());
960         if (c instanceof ConstantLong){
961             stack().push(Type.LONG);
962         }
963         if (c instanceof ConstantDouble){
964             stack().push(Type.DOUBLE);
965         }
966     }
967     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
968     public void visitLDIV(LDIV o){
969         stack().pop();
970         stack().pop();
971         stack().push(Type.LONG);
972     }
973     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
974     public void visitLLOAD(LLOAD o){
975         stack().push(locals().get(o.getIndex()));
976     }
977     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
978     public void visitLMUL(LMUL o){
979         stack().pop();
980         stack().pop();
981         stack().push(Type.LONG);
982     }
983     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
984     public void visitLNEG(LNEG o){
985         stack().pop();
986         stack().push(Type.LONG);
987     }
988     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
989     public void visitLOOKUPSWITCH(LOOKUPSWITCH o){
990         stack().pop(); //key
991
}
992     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
993     public void visitLOR(LOR o){
994         stack().pop();
995         stack().pop();
996         stack().push(Type.LONG);
997     }
998     /** Symbolically executes the corresponding Java Virtual Machine instruction. */
999     public void visitLREM(LREM o){
1000        stack().pop();
1001        stack().pop();
1002        stack().push(Type.LONG);
1003    }
1004    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1005    public void visitLRETURN(LRETURN o){
1006        stack().pop();
1007    }
1008    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1009    public void visitLSHL(LSHL o){
1010        stack().pop();
1011        stack().pop();
1012        stack().push(Type.LONG);
1013    }
1014    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1015    public void visitLSHR(LSHR o){
1016        stack().pop();
1017        stack().pop();
1018        stack().push(Type.LONG);
1019    }
1020    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1021    public void visitLSTORE(LSTORE o){
1022        locals().set(o.getIndex(), stack().pop());
1023        locals().set(o.getIndex()+1, Type.UNKNOWN);
1024    }
1025    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1026    public void visitLSUB(LSUB o){
1027        stack().pop();
1028        stack().pop();
1029        stack().push(Type.LONG);
1030    }
1031    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1032    public void visitLUSHR(LUSHR o){
1033        stack().pop();
1034        stack().pop();
1035        stack().push(Type.LONG);
1036    }
1037    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1038    public void visitLXOR(LXOR o){
1039        stack().pop();
1040        stack().pop();
1041        stack().push(Type.LONG);
1042    }
1043    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1044    public void visitMONITORENTER(MONITORENTER o){
1045        stack().pop();
1046    }
1047    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1048    public void visitMONITOREXIT(MONITOREXIT o){
1049        stack().pop();
1050    }
1051    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1052    public void visitMULTIANEWARRAY(MULTIANEWARRAY o){
1053        for (int i=0; i<o.getDimensions(); i++){
1054            stack().pop();
1055        }
1056        stack().push(o.getType(cpg));
1057    }
1058    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1059    public void visitNEW(NEW o){
1060        stack().push(new UninitializedObjectType((ObjectType) (o.getType(cpg))));
1061    }
1062    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1063    public void visitNEWARRAY(NEWARRAY o){
1064        stack().pop();
1065        stack().push(o.getType());
1066    }
1067    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1068    public void visitNOP(NOP o){
1069    }
1070    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1071    public void visitPOP(POP o){
1072        stack().pop();
1073    }
1074    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1075    public void visitPOP2(POP2 o){
1076        Type t = stack().pop();
1077        if (t.getSize() == 1){
1078            stack().pop();
1079        }
1080    }
1081    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1082    public void visitPUTFIELD(PUTFIELD o){
1083        stack().pop();
1084        stack().pop();
1085    }
1086    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1087    public void visitPUTSTATIC(PUTSTATIC o){
1088        stack().pop();
1089    }
1090    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1091    public void visitRET(RET o){
1092        // do nothing, return address
1093
// is in in the local variables.
1094
}
1095    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1096    public void visitRETURN(RETURN o){
1097        // do nothing.
1098
}
1099    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1100    public void visitSALOAD(SALOAD o){
1101        stack().pop();
1102        stack().pop();
1103        stack().push(Type.INT);
1104    }
1105    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1106    public void visitSASTORE(SASTORE o){
1107        stack().pop();
1108        stack().pop();
1109        stack().pop();
1110    }
1111    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1112    public void visitSIPUSH(SIPUSH o){
1113        stack().push(Type.INT);
1114    }
1115    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1116    public void visitSWAP(SWAP o){
1117        Type t = stack().pop();
1118        Type u = stack().pop();
1119        stack().push(t);
1120        stack().push(u);
1121    }
1122    /** Symbolically executes the corresponding Java Virtual Machine instruction. */
1123    public void visitTABLESWITCH(TABLESWITCH o){
1124        stack().pop();
1125    }
1126}
1127
Popular Tags