|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459 |
- /* ====================================================================
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, i list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, i list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "i product includes software developed by the
- * Apache Software Foundation (https://www.apache.org/)."
- * Alternately, i acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Apache" and "Apache Software Foundation" and
- * "Apache BCEL" must not be used to endorse or promote products
- * derived from i software without prior written permission. For
- * written permission, please contact apache@apache.org.
- *
- * 5. Products derived from i software may not be called "Apache",
- * "Apache BCEL", nor may "Apache" appear in their name, without
- * prior written permission of the Apache Software Foundation.
- *
- * i SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF i SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * i software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- * <https://www.apache.org/>.
- */
- package org.aspectj.apache.bcel.verifier;
-
- import org.aspectj.apache.bcel.Constants;
- import org.aspectj.apache.bcel.generic.FieldInstruction;
- import org.aspectj.apache.bcel.generic.InstVisitor;
- import org.aspectj.apache.bcel.generic.Instruction;
- import org.aspectj.apache.bcel.generic.InstructionBranch;
- import org.aspectj.apache.bcel.generic.InstructionLV;
- import org.aspectj.apache.bcel.generic.InvokeInstruction;
-
- /**
- * Traverse an instruction
- *
- * @author Andy Clement
- */
- public class InstructionWalker implements Constants {
-
- /**
- * Call corresponding visitor method(s). The order is: Call visitor methods of implemented interfaces first, then call methods
- * according to the class hierarchy in descending order, i.e., the most specific visitXXX() call comes last.
- *
- * @param i the instruction to visit
- * @param v Visitor object
- */
- public static void accept(Instruction i, InstVisitor v) {
- switch (i.opcode) {
- case IMPDEP1:
- v.visitIMPDEP1(i);
- break;
- case IMPDEP2:
- v.visitIMPDEP2(i);
- break;
- case MONITORENTER:
- v.visitExceptionThrower(i);
- v.visitStackConsumer(i);
- v.visitMONITORENTER(i);
- break;
- case MONITOREXIT:
- v.visitExceptionThrower(i);
- v.visitStackConsumer(i);
- v.visitMONITOREXIT(i);
- break;
- case LCMP:
- v.visitTypedInstruction(i);
- v.visitStackProducer(i);
- v.visitStackConsumer(i);
- v.visitLCMP(i);
- break;
- case FCMPL:
- v.visitTypedInstruction(i);
- v.visitStackProducer(i);
- v.visitStackConsumer(i);
- v.visitFCMPL(i);
- break;
- case FCMPG:
- v.visitTypedInstruction(i);
- v.visitStackProducer(i);
- v.visitStackConsumer(i);
- v.visitFCMPG(i);
- break;
- case DCMPL:
- v.visitTypedInstruction(i);
- v.visitStackProducer(i);
- v.visitStackConsumer(i);
- v.visitDCMPL(i);
- break;
- case DCMPG:
- v.visitTypedInstruction(i);
- v.visitStackProducer(i);
- v.visitStackConsumer(i);
- v.visitDCMPG(i);
- break;
- case NOP:
- v.visitNOP(i);
- break;
- case BREAKPOINT:
- v.visitBREAKPOINT(i);
- break;
- case SWAP:
- v.visitStackConsumer(i);
- v.visitStackProducer(i);
- v.visitStackInstruction(i);
- v.visitSWAP(i);
- break;
- case POP:
- v.visitStackConsumer(i);
- v.visitPopInstruction(i);
- v.visitStackInstruction(i);
- v.visitPOP(i);
- break;
- case POP2:
- v.visitStackConsumer(i);
- v.visitPopInstruction(i);
- v.visitStackInstruction(i);
- v.visitPOP2(i);
- break;
- case DUP2_X1:
- v.visitStackInstruction(i);
- v.visitDUP2_X1(i);
- break;
- case DUP2_X2:
- v.visitStackInstruction(i);
- v.visitDUP2_X2(i);
- break;
- case DUP2:
- v.visitStackProducer(i);
- v.visitPushInstruction(i);
- v.visitStackInstruction(i);
- v.visitDUP2(i);
- break;
- case DUP_X1:
- v.visitStackInstruction(i);
- v.visitDUP_X1(i);
- break;
- case DUP_X2:
- v.visitStackInstruction(i);
- v.visitDUP_X2(i);
- break;
- case DUP:
- v.visitStackProducer(i);
- v.visitPushInstruction(i);
- v.visitStackInstruction(i);
- v.visitDUP(i);
- break;
- case BASTORE:
- v.visitStackConsumer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitBASTORE(i);
- break;
- case CASTORE:
- v.visitStackConsumer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitCASTORE(i);
- break;
- case SASTORE:
- v.visitStackConsumer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitSASTORE(i);
- break;
- case DASTORE:
- v.visitStackConsumer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitDASTORE(i);
- break;
- case FASTORE:
- v.visitStackConsumer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitFASTORE(i);
- break;
- case LASTORE:
- v.visitStackConsumer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitLASTORE(i);
- break;
- case IASTORE:
- v.visitStackConsumer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitIASTORE(i);
- break;
- case AASTORE:
- v.visitStackConsumer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitAASTORE(i);
- break;
- case SALOAD:
- v.visitStackProducer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitSALOAD(i);
- break;
- case CALOAD:
- v.visitStackProducer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitCALOAD(i);
- break;
- case DALOAD:
- v.visitStackProducer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitDALOAD(i);
- break;
- case FALOAD:
- v.visitStackProducer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitFALOAD(i);
- break;
- case LALOAD:
- v.visitStackProducer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitLALOAD(i);
- break;
- case AALOAD:
- v.visitStackProducer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitAALOAD(i);
- break;
- case ATHROW:
- v.visitUnconditionalBranch(i);
- v.visitExceptionThrower(i);
- v.visitATHROW(i);
- break;
- case ACONST_NULL:
- v.visitStackProducer(i);
- v.visitPushInstruction(i);
- v.visitTypedInstruction(i);
- v.visitACONST_NULL(i);
- break;
- case ICONST_M1:
- case ICONST_0:
- case ICONST_1:
- case ICONST_2:
- case ICONST_3:
- case ICONST_4:
- case ICONST_5:
- v.visitPushInstruction(i);
- v.visitStackProducer(i);
- v.visitTypedInstruction(i);
- v.visitConstantPushInstruction(i);
- v.visitICONST(i);
- break;
- case LCONST_0:
- case LCONST_1:
- v.visitPushInstruction(i);
- v.visitStackProducer(i);
- v.visitTypedInstruction(i);
- v.visitConstantPushInstruction(i);
- v.visitLCONST(i);
- break;
- case FCONST_0:
- case FCONST_1:
- case FCONST_2:
- v.visitPushInstruction(i);
- v.visitStackProducer(i);
- v.visitTypedInstruction(i);
- v.visitConstantPushInstruction(i);
- v.visitFCONST(i);
- break;
- case DCONST_0:
- case DCONST_1:
- v.visitPushInstruction(i);
- v.visitStackProducer(i);
- v.visitTypedInstruction(i);
- v.visitConstantPushInstruction(i);
- v.visitDCONST(i);
- break;
- case BALOAD:
- v.visitStackProducer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitBALOAD(i);
- break;
- case IALOAD:
- v.visitStackProducer(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitArrayInstruction(i);
- v.visitIALOAD(i);
- break;
- case BIPUSH:
- v.visitPushInstruction(i);
- v.visitStackProducer(i);
- v.visitTypedInstruction(i);
- v.visitConstantPushInstruction(i);
- v.visitBIPUSH(i);
- break;
- case SIPUSH:
- v.visitPushInstruction(i);
- v.visitStackProducer(i);
- v.visitTypedInstruction(i);
- v.visitConstantPushInstruction(i);
- v.visitSIPUSH(i);
- break;
- case LDC:
- case LDC_W:
- v.visitStackProducer(i);
- v.visitPushInstruction(i);
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitCPInstruction(i);
- v.visitLDC(i);
- break;
- case LDC2_W:
- v.visitStackProducer(i);
- v.visitPushInstruction(i);
- v.visitTypedInstruction(i);
- v.visitCPInstruction(i);
- v.visitLDC2_W(i);
- break;
- case ARRAYLENGTH:
- v.visitExceptionThrower(i);
- v.visitStackProducer(i);
- v.visitARRAYLENGTH(i);
- break;
- case ASTORE_0:
- v.visitStackConsumer(i);
- v.visitPopInstruction(i);
- v.visitStoreInstruction(i);
- v.visitTypedInstruction(i);
- v.visitLocalVariableInstruction((InstructionLV) i);
- v.visitStoreInstruction(i);
- v.visitASTORE(i);
- break;
- case ALOAD_0:
- v.visitStackConsumer(i);
- v.visitPopInstruction(i);
- v.visitStoreInstruction(i);
- v.visitTypedInstruction(i);
- v.visitLocalVariableInstruction((InstructionLV) i);
- v.visitStoreInstruction(i);
- v.visitALOAD(i);
- break;
- // for store instructions: ISTORE > ASTORE_3 - needs to visit the instruction too
- // v.visitStackConsumer(i);
- // v.visitPopInstruction(i);
- // v.visitStoreInstruction(i);
- // v.visitTypedInstruction(i);
- // v.visitLocalVariableInstruction(i);
- // v.visitStoreInstruction(i);
- // for load instructions: ILOAD > ALOAD_3 - needs to visit the instruction too
- // v.visitStackProducer(i);
- // v.visitPushInstruction(i);
- // v.visitTypedInstruction(i);
- // v.visitLocalVariableInstruction(i);
- // v.visitLoadInstruction(i);
-
- // for conversion instructions: (all 15 of them) - needs to visit conversion instruction too
- // v.visitTypedInstruction(i);
- // v.visitStackProducer(i);
- // v.visitStackConsumer(i);
- // v.visitConversionInstruction(i);
-
- // arithmetic instructions - need to visit the instructions too (iadd etc)
- // v.visitTypedInstruction(i);
- // v.visitStackProducer(i);
- // v.visitStackConsumer(i);
- // v.visitArithmeticInstruction(i);
-
- case INVOKESTATIC:
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitStackConsumer(i);
- v.visitStackProducer(i);
- v.visitLoadClass(i);
- v.visitCPInstruction(i);
- v.visitFieldOrMethod(i);
- v.visitInvokeInstruction((InvokeInstruction) i);
- v.visitINVOKESTATIC((InvokeInstruction) i);
- break;
-
- case GOTO:
- v.visitVariableLengthInstruction(i);
- v.visitUnconditionalBranch(i);
- v.visitBranchInstruction((InstructionBranch) i);
- v.visitGotoInstruction(i);
- v.visitGOTO(i);
- break;
- case PUTSTATIC:
- v.visitExceptionThrower(i);
- v.visitStackConsumer(i);
- v.visitPopInstruction(i);
- v.visitTypedInstruction(i);
- v.visitLoadClass(i);
- v.visitCPInstruction(i);
- v.visitFieldOrMethod(i);
- v.visitFieldInstruction(i);
- v.visitPUTSTATIC((FieldInstruction) i);
- break;
- case RETURN:
- v.visitExceptionThrower(i);
- v.visitTypedInstruction(i);
- v.visitStackConsumer(i);
- v.visitReturnInstruction(i);
- v.visitRETURN(i);
- break;
- default:
- throw new IllegalStateException("visiting not yet implemented for " + i.getName().toUpperCase());
- }
- }
- }
|