From 459f8b0371f9b3a967260d1559433cbf9d82c786 Mon Sep 17 00:00:00 2001 From: Shevchik Date: Wed, 8 Jan 2014 08:08:36 +0400 Subject: [PATCH] Generate class using javassist --- build.xml | 1 + libs/javassist.jar | Bin 0 -> 707278 bytes src/com/cnaude/chairs/Chairs.java | 8 +- .../cnaude/chairs/GenVehicleArrowClass.java | 112 +- src/org/apache/bcel/Constants.java | 797 --------- src/org/apache/bcel/ExceptionConstants.java | 86 - src/org/apache/bcel/Repository.java | 263 --- .../apache/bcel/classfile/AccessFlags.java | 212 --- src/org/apache/bcel/classfile/Attribute.java | 297 ---- .../bcel/classfile/AttributeReader.java | 56 - .../bcel/classfile/ClassFormatException.java | 40 - .../apache/bcel/classfile/ClassParser.java | 308 ---- src/org/apache/bcel/classfile/Code.java | 371 ----- .../apache/bcel/classfile/CodeException.java | 220 --- src/org/apache/bcel/classfile/Constant.java | 191 --- src/org/apache/bcel/classfile/ConstantCP.java | 135 -- .../apache/bcel/classfile/ConstantClass.java | 132 -- .../apache/bcel/classfile/ConstantDouble.java | 124 -- .../bcel/classfile/ConstantFieldref.java | 77 - .../apache/bcel/classfile/ConstantFloat.java | 125 -- .../bcel/classfile/ConstantInteger.java | 124 -- .../classfile/ConstantInterfaceMethodref.java | 79 - .../apache/bcel/classfile/ConstantLong.java | 124 -- .../bcel/classfile/ConstantMethodref.java | 77 - .../bcel/classfile/ConstantNameAndType.java | 152 -- .../apache/bcel/classfile/ConstantObject.java | 33 - .../apache/bcel/classfile/ConstantPool.java | 368 ----- .../apache/bcel/classfile/ConstantString.java | 132 -- .../apache/bcel/classfile/ConstantUtf8.java | 121 -- .../apache/bcel/classfile/ConstantValue.java | 168 -- src/org/apache/bcel/classfile/Deprecated.java | 152 -- .../bcel/classfile/DescendingVisitor.java | 356 ---- .../apache/bcel/classfile/EmptyVisitor.java | 161 -- .../apache/bcel/classfile/ExceptionTable.java | 191 --- src/org/apache/bcel/classfile/Field.java | 197 --- .../apache/bcel/classfile/FieldOrMethod.java | 210 --- src/org/apache/bcel/classfile/InnerClass.java | 215 --- .../apache/bcel/classfile/InnerClasses.java | 160 -- src/org/apache/bcel/classfile/JavaClass.java | 881 ---------- src/org/apache/bcel/classfile/LineNumber.java | 144 -- .../bcel/classfile/LineNumberTable.java | 223 --- .../apache/bcel/classfile/LocalVariable.java | 256 --- .../bcel/classfile/LocalVariableTable.java | 208 --- src/org/apache/bcel/classfile/Method.java | 260 --- src/org/apache/bcel/classfile/Node.java | 28 - src/org/apache/bcel/classfile/PMGClass.java | 175 -- src/org/apache/bcel/classfile/Signature.java | 273 ---- src/org/apache/bcel/classfile/SourceFile.java | 155 -- src/org/apache/bcel/classfile/StackMap.java | 162 -- .../apache/bcel/classfile/StackMapEntry.java | 201 --- .../apache/bcel/classfile/StackMapType.java | 160 -- src/org/apache/bcel/classfile/Synthetic.java | 159 -- src/org/apache/bcel/classfile/Unknown.java | 199 --- src/org/apache/bcel/classfile/Utility.java | 1433 ----------------- src/org/apache/bcel/classfile/Visitor.java | 96 -- src/org/apache/bcel/classfile/package.html | 14 - src/org/apache/bcel/generic/AALOAD.java | 60 - src/org/apache/bcel/generic/AASTORE.java | 60 - src/org/apache/bcel/generic/ACONST_NULL.java | 68 - src/org/apache/bcel/generic/ALOAD.java | 70 - src/org/apache/bcel/generic/ANEWARRAY.java | 89 - src/org/apache/bcel/generic/ARETURN.java | 60 - src/org/apache/bcel/generic/ARRAYLENGTH.java | 67 - src/org/apache/bcel/generic/ASTORE.java | 70 - src/org/apache/bcel/generic/ATHROW.java | 67 - .../bcel/generic/AllocationInstruction.java | 26 - .../bcel/generic/ArithmeticInstruction.java | 100 -- .../apache/bcel/generic/ArrayInstruction.java | 87 - src/org/apache/bcel/generic/ArrayType.java | 134 -- src/org/apache/bcel/generic/BALOAD.java | 60 - src/org/apache/bcel/generic/BASTORE.java | 60 - src/org/apache/bcel/generic/BIPUSH.java | 113 -- src/org/apache/bcel/generic/BREAKPOINT.java | 49 - src/org/apache/bcel/generic/BasicType.java | 89 - src/org/apache/bcel/generic/BranchHandle.java | 124 -- .../bcel/generic/BranchInstruction.java | 249 --- src/org/apache/bcel/generic/CALOAD.java | 60 - src/org/apache/bcel/generic/CASTORE.java | 60 - src/org/apache/bcel/generic/CHECKCAST.java | 98 -- .../apache/bcel/generic/CPInstruction.java | 152 -- src/org/apache/bcel/generic/ClassGen.java | 556 ------- .../bcel/generic/ClassGenException.java | 40 - .../apache/bcel/generic/ClassObserver.java | 29 - .../apache/bcel/generic/CodeExceptionGen.java | 198 --- .../bcel/generic/CompoundInstruction.java | 37 - .../apache/bcel/generic/ConstantPoolGen.java | 804 --------- .../bcel/generic/ConstantPushInstruction.java | 34 - .../bcel/generic/ConversionInstruction.java | 82 - src/org/apache/bcel/generic/D2F.java | 60 - src/org/apache/bcel/generic/D2I.java | 60 - src/org/apache/bcel/generic/D2L.java | 60 - src/org/apache/bcel/generic/DADD.java | 62 - src/org/apache/bcel/generic/DALOAD.java | 60 - src/org/apache/bcel/generic/DASTORE.java | 60 - src/org/apache/bcel/generic/DCMPG.java | 67 - src/org/apache/bcel/generic/DCMPL.java | 67 - src/org/apache/bcel/generic/DCONST.java | 88 - src/org/apache/bcel/generic/DDIV.java | 62 - src/org/apache/bcel/generic/DLOAD.java | 70 - src/org/apache/bcel/generic/DMUL.java | 62 - src/org/apache/bcel/generic/DNEG.java | 57 - src/org/apache/bcel/generic/DREM.java | 62 - src/org/apache/bcel/generic/DRETURN.java | 60 - src/org/apache/bcel/generic/DSTORE.java | 70 - src/org/apache/bcel/generic/DSUB.java | 62 - src/org/apache/bcel/generic/DUP.java | 56 - src/org/apache/bcel/generic/DUP2.java | 56 - src/org/apache/bcel/generic/DUP2_X1.java | 54 - src/org/apache/bcel/generic/DUP2_X2.java | 54 - src/org/apache/bcel/generic/DUP_X1.java | 54 - src/org/apache/bcel/generic/DUP_X2.java | 54 - src/org/apache/bcel/generic/EmptyVisitor.java | 746 --------- .../apache/bcel/generic/ExceptionThrower.java | 40 - src/org/apache/bcel/generic/F2D.java | 60 - src/org/apache/bcel/generic/F2I.java | 60 - src/org/apache/bcel/generic/F2L.java | 60 - src/org/apache/bcel/generic/FADD.java | 60 - src/org/apache/bcel/generic/FALOAD.java | 60 - src/org/apache/bcel/generic/FASTORE.java | 60 - src/org/apache/bcel/generic/FCMPG.java | 65 - src/org/apache/bcel/generic/FCMPL.java | 65 - src/org/apache/bcel/generic/FCONST.java | 90 -- src/org/apache/bcel/generic/FDIV.java | 60 - src/org/apache/bcel/generic/FLOAD.java | 70 - src/org/apache/bcel/generic/FMUL.java | 60 - src/org/apache/bcel/generic/FNEG.java | 57 - src/org/apache/bcel/generic/FREM.java | 60 - src/org/apache/bcel/generic/FRETURN.java | 60 - src/org/apache/bcel/generic/FSTORE.java | 70 - src/org/apache/bcel/generic/FSUB.java | 60 - src/org/apache/bcel/generic/FieldGen.java | 356 ---- .../bcel/generic/FieldGenOrMethodGen.java | 130 -- .../apache/bcel/generic/FieldInstruction.java | 89 - .../apache/bcel/generic/FieldObserver.java | 29 - .../apache/bcel/generic/FieldOrMethod.java | 131 -- src/org/apache/bcel/generic/GETFIELD.java | 94 -- src/org/apache/bcel/generic/GETSTATIC.java | 93 -- src/org/apache/bcel/generic/GOTO.java | 98 -- src/org/apache/bcel/generic/GOTO_W.java | 87 - .../apache/bcel/generic/GotoInstruction.java | 43 - src/org/apache/bcel/generic/I2B.java | 60 - src/org/apache/bcel/generic/I2C.java | 60 - src/org/apache/bcel/generic/I2D.java | 60 - src/org/apache/bcel/generic/I2F.java | 60 - src/org/apache/bcel/generic/I2L.java | 60 - src/org/apache/bcel/generic/I2S.java | 57 - src/org/apache/bcel/generic/IADD.java | 60 - src/org/apache/bcel/generic/IALOAD.java | 60 - src/org/apache/bcel/generic/IAND.java | 57 - src/org/apache/bcel/generic/IASTORE.java | 60 - src/org/apache/bcel/generic/ICONST.java | 89 - src/org/apache/bcel/generic/IDIV.java | 69 - src/org/apache/bcel/generic/IFEQ.java | 71 - src/org/apache/bcel/generic/IFGE.java | 71 - src/org/apache/bcel/generic/IFGT.java | 71 - src/org/apache/bcel/generic/IFLE.java | 71 - src/org/apache/bcel/generic/IFLT.java | 71 - src/org/apache/bcel/generic/IFNE.java | 71 - src/org/apache/bcel/generic/IFNONNULL.java | 71 - src/org/apache/bcel/generic/IFNULL.java | 71 - src/org/apache/bcel/generic/IF_ACMPEQ.java | 71 - src/org/apache/bcel/generic/IF_ACMPNE.java | 71 - src/org/apache/bcel/generic/IF_ICMPEQ.java | 71 - src/org/apache/bcel/generic/IF_ICMPGE.java | 71 - src/org/apache/bcel/generic/IF_ICMPGT.java | 71 - src/org/apache/bcel/generic/IF_ICMPLE.java | 71 - src/org/apache/bcel/generic/IF_ICMPLT.java | 71 - src/org/apache/bcel/generic/IF_ICMPNE.java | 71 - src/org/apache/bcel/generic/IINC.java | 165 -- src/org/apache/bcel/generic/ILOAD.java | 70 - src/org/apache/bcel/generic/IMPDEP1.java | 49 - src/org/apache/bcel/generic/IMPDEP2.java | 49 - src/org/apache/bcel/generic/IMUL.java | 60 - src/org/apache/bcel/generic/INEG.java | 57 - src/org/apache/bcel/generic/INSTANCEOF.java | 81 - .../apache/bcel/generic/INVOKEINTERFACE.java | 144 -- .../apache/bcel/generic/INVOKESPECIAL.java | 85 - src/org/apache/bcel/generic/INVOKESTATIC.java | 82 - .../apache/bcel/generic/INVOKEVIRTUAL.java | 84 - src/org/apache/bcel/generic/IOR.java | 57 - src/org/apache/bcel/generic/IREM.java | 69 - src/org/apache/bcel/generic/IRETURN.java | 60 - src/org/apache/bcel/generic/ISHL.java | 57 - src/org/apache/bcel/generic/ISHR.java | 57 - src/org/apache/bcel/generic/ISTORE.java | 70 - src/org/apache/bcel/generic/ISUB.java | 60 - src/org/apache/bcel/generic/IUSHR.java | 57 - src/org/apache/bcel/generic/IXOR.java | 57 - .../apache/bcel/generic/IfInstruction.java | 54 - .../bcel/generic/IndexedInstruction.java | 31 - src/org/apache/bcel/generic/Instruction.java | 301 ---- .../bcel/generic/InstructionComparator.java | 70 - .../bcel/generic/InstructionConstants.java | 290 ---- .../bcel/generic/InstructionFactory.java | 746 --------- .../bcel/generic/InstructionHandle.java | 296 ---- .../apache/bcel/generic/InstructionList.java | 1334 --------------- .../bcel/generic/InstructionListObserver.java | 30 - .../bcel/generic/InstructionTargeter.java | 34 - .../bcel/generic/InvokeInstruction.java | 126 -- src/org/apache/bcel/generic/JSR.java | 94 -- src/org/apache/bcel/generic/JSR_W.java | 87 - .../apache/bcel/generic/JsrInstruction.java | 83 - src/org/apache/bcel/generic/L2D.java | 57 - src/org/apache/bcel/generic/L2F.java | 57 - src/org/apache/bcel/generic/L2I.java | 57 - src/org/apache/bcel/generic/LADD.java | 59 - src/org/apache/bcel/generic/LALOAD.java | 60 - src/org/apache/bcel/generic/LAND.java | 59 - src/org/apache/bcel/generic/LASTORE.java | 60 - src/org/apache/bcel/generic/LCMP.java | 67 - src/org/apache/bcel/generic/LCONST.java | 88 - src/org/apache/bcel/generic/LDC.java | 162 -- src/org/apache/bcel/generic/LDC2_W.java | 93 -- src/org/apache/bcel/generic/LDC_W.java | 61 - src/org/apache/bcel/generic/LDIV.java | 65 - src/org/apache/bcel/generic/LLOAD.java | 64 - src/org/apache/bcel/generic/LMUL.java | 59 - src/org/apache/bcel/generic/LNEG.java | 57 - src/org/apache/bcel/generic/LOOKUPSWITCH.java | 107 -- src/org/apache/bcel/generic/LOR.java | 57 - src/org/apache/bcel/generic/LREM.java | 63 - src/org/apache/bcel/generic/LRETURN.java | 57 - src/org/apache/bcel/generic/LSHL.java | 57 - src/org/apache/bcel/generic/LSHR.java | 57 - src/org/apache/bcel/generic/LSTORE.java | 64 - src/org/apache/bcel/generic/LSUB.java | 59 - src/org/apache/bcel/generic/LUSHR.java | 57 - src/org/apache/bcel/generic/LXOR.java | 57 - .../apache/bcel/generic/LineNumberGen.java | 112 -- src/org/apache/bcel/generic/LoadClass.java | 49 - .../apache/bcel/generic/LoadInstruction.java | 72 - .../apache/bcel/generic/LocalVariableGen.java | 217 --- .../generic/LocalVariableInstruction.java | 212 --- src/org/apache/bcel/generic/MONITORENTER.java | 61 - src/org/apache/bcel/generic/MONITOREXIT.java | 61 - .../apache/bcel/generic/MULTIANEWARRAY.java | 158 -- src/org/apache/bcel/generic/MethodGen.java | 1108 ------------- .../apache/bcel/generic/MethodObserver.java | 29 - src/org/apache/bcel/generic/NEW.java | 86 - src/org/apache/bcel/generic/NEWARRAY.java | 126 -- src/org/apache/bcel/generic/NOP.java | 49 - .../apache/bcel/generic/NamedAndTyped.java | 35 - src/org/apache/bcel/generic/ObjectType.java | 166 -- src/org/apache/bcel/generic/POP.java | 56 - src/org/apache/bcel/generic/POP2.java | 56 - src/org/apache/bcel/generic/PUSH.java | 188 --- src/org/apache/bcel/generic/PUTFIELD.java | 94 -- src/org/apache/bcel/generic/PUTSTATIC.java | 93 -- .../apache/bcel/generic/PopInstruction.java | 29 - .../apache/bcel/generic/PushInstruction.java | 34 - src/org/apache/bcel/generic/RET.java | 148 -- src/org/apache/bcel/generic/RETURN.java | 57 - .../apache/bcel/generic/ReferenceType.java | 385 ----- .../bcel/generic/ReturnInstruction.java | 82 - .../bcel/generic/ReturnaddressType.java | 86 - src/org/apache/bcel/generic/SALOAD.java | 57 - src/org/apache/bcel/generic/SASTORE.java | 57 - src/org/apache/bcel/generic/SIPUSH.java | 110 -- src/org/apache/bcel/generic/SWAP.java | 57 - src/org/apache/bcel/generic/SWITCH.java | 153 -- src/org/apache/bcel/generic/Select.java | 254 --- .../apache/bcel/generic/StackConsumer.java | 31 - .../apache/bcel/generic/StackInstruction.java | 53 - .../apache/bcel/generic/StackProducer.java | 32 - .../apache/bcel/generic/StoreInstruction.java | 72 - src/org/apache/bcel/generic/TABLESWITCH.java | 122 -- .../bcel/generic/TargetLostException.java | 70 - src/org/apache/bcel/generic/Type.java | 340 ---- .../apache/bcel/generic/TypedInstruction.java | 29 - .../bcel/generic/UnconditionalBranch.java | 29 - .../generic/VariableLengthInstruction.java | 33 - src/org/apache/bcel/generic/Visitor.java | 388 ----- src/org/apache/bcel/generic/package.html | 16 - src/org/apache/bcel/package.html | 17 - src/org/apache/bcel/util/BCELComparator.java | 44 - src/org/apache/bcel/util/BCELFactory.java | 336 ---- src/org/apache/bcel/util/BCELifier.java | 276 ---- src/org/apache/bcel/util/ByteSequence.java | 63 - src/org/apache/bcel/util/ClassPath.java | 425 ----- src/org/apache/bcel/util/ClassQueue.java | 52 - src/org/apache/bcel/util/Repository.java | 71 - .../apache/bcel/util/SyntheticRepository.java | 202 --- src/org/apache/bcel/util/package.html | 25 - 283 files changed, 36 insertions(+), 35805 deletions(-) create mode 100644 libs/javassist.jar delete mode 100644 src/org/apache/bcel/Constants.java delete mode 100644 src/org/apache/bcel/ExceptionConstants.java delete mode 100644 src/org/apache/bcel/Repository.java delete mode 100644 src/org/apache/bcel/classfile/AccessFlags.java delete mode 100644 src/org/apache/bcel/classfile/Attribute.java delete mode 100644 src/org/apache/bcel/classfile/AttributeReader.java delete mode 100644 src/org/apache/bcel/classfile/ClassFormatException.java delete mode 100644 src/org/apache/bcel/classfile/ClassParser.java delete mode 100644 src/org/apache/bcel/classfile/Code.java delete mode 100644 src/org/apache/bcel/classfile/CodeException.java delete mode 100644 src/org/apache/bcel/classfile/Constant.java delete mode 100644 src/org/apache/bcel/classfile/ConstantCP.java delete mode 100644 src/org/apache/bcel/classfile/ConstantClass.java delete mode 100644 src/org/apache/bcel/classfile/ConstantDouble.java delete mode 100644 src/org/apache/bcel/classfile/ConstantFieldref.java delete mode 100644 src/org/apache/bcel/classfile/ConstantFloat.java delete mode 100644 src/org/apache/bcel/classfile/ConstantInteger.java delete mode 100644 src/org/apache/bcel/classfile/ConstantInterfaceMethodref.java delete mode 100644 src/org/apache/bcel/classfile/ConstantLong.java delete mode 100644 src/org/apache/bcel/classfile/ConstantMethodref.java delete mode 100644 src/org/apache/bcel/classfile/ConstantNameAndType.java delete mode 100644 src/org/apache/bcel/classfile/ConstantObject.java delete mode 100644 src/org/apache/bcel/classfile/ConstantPool.java delete mode 100644 src/org/apache/bcel/classfile/ConstantString.java delete mode 100644 src/org/apache/bcel/classfile/ConstantUtf8.java delete mode 100644 src/org/apache/bcel/classfile/ConstantValue.java delete mode 100644 src/org/apache/bcel/classfile/Deprecated.java delete mode 100644 src/org/apache/bcel/classfile/DescendingVisitor.java delete mode 100644 src/org/apache/bcel/classfile/EmptyVisitor.java delete mode 100644 src/org/apache/bcel/classfile/ExceptionTable.java delete mode 100644 src/org/apache/bcel/classfile/Field.java delete mode 100644 src/org/apache/bcel/classfile/FieldOrMethod.java delete mode 100644 src/org/apache/bcel/classfile/InnerClass.java delete mode 100644 src/org/apache/bcel/classfile/InnerClasses.java delete mode 100644 src/org/apache/bcel/classfile/JavaClass.java delete mode 100644 src/org/apache/bcel/classfile/LineNumber.java delete mode 100644 src/org/apache/bcel/classfile/LineNumberTable.java delete mode 100644 src/org/apache/bcel/classfile/LocalVariable.java delete mode 100644 src/org/apache/bcel/classfile/LocalVariableTable.java delete mode 100644 src/org/apache/bcel/classfile/Method.java delete mode 100644 src/org/apache/bcel/classfile/Node.java delete mode 100644 src/org/apache/bcel/classfile/PMGClass.java delete mode 100644 src/org/apache/bcel/classfile/Signature.java delete mode 100644 src/org/apache/bcel/classfile/SourceFile.java delete mode 100644 src/org/apache/bcel/classfile/StackMap.java delete mode 100644 src/org/apache/bcel/classfile/StackMapEntry.java delete mode 100644 src/org/apache/bcel/classfile/StackMapType.java delete mode 100644 src/org/apache/bcel/classfile/Synthetic.java delete mode 100644 src/org/apache/bcel/classfile/Unknown.java delete mode 100644 src/org/apache/bcel/classfile/Utility.java delete mode 100644 src/org/apache/bcel/classfile/Visitor.java delete mode 100644 src/org/apache/bcel/classfile/package.html delete mode 100644 src/org/apache/bcel/generic/AALOAD.java delete mode 100644 src/org/apache/bcel/generic/AASTORE.java delete mode 100644 src/org/apache/bcel/generic/ACONST_NULL.java delete mode 100644 src/org/apache/bcel/generic/ALOAD.java delete mode 100644 src/org/apache/bcel/generic/ANEWARRAY.java delete mode 100644 src/org/apache/bcel/generic/ARETURN.java delete mode 100644 src/org/apache/bcel/generic/ARRAYLENGTH.java delete mode 100644 src/org/apache/bcel/generic/ASTORE.java delete mode 100644 src/org/apache/bcel/generic/ATHROW.java delete mode 100644 src/org/apache/bcel/generic/AllocationInstruction.java delete mode 100644 src/org/apache/bcel/generic/ArithmeticInstruction.java delete mode 100644 src/org/apache/bcel/generic/ArrayInstruction.java delete mode 100644 src/org/apache/bcel/generic/ArrayType.java delete mode 100644 src/org/apache/bcel/generic/BALOAD.java delete mode 100644 src/org/apache/bcel/generic/BASTORE.java delete mode 100644 src/org/apache/bcel/generic/BIPUSH.java delete mode 100644 src/org/apache/bcel/generic/BREAKPOINT.java delete mode 100644 src/org/apache/bcel/generic/BasicType.java delete mode 100644 src/org/apache/bcel/generic/BranchHandle.java delete mode 100644 src/org/apache/bcel/generic/BranchInstruction.java delete mode 100644 src/org/apache/bcel/generic/CALOAD.java delete mode 100644 src/org/apache/bcel/generic/CASTORE.java delete mode 100644 src/org/apache/bcel/generic/CHECKCAST.java delete mode 100644 src/org/apache/bcel/generic/CPInstruction.java delete mode 100644 src/org/apache/bcel/generic/ClassGen.java delete mode 100644 src/org/apache/bcel/generic/ClassGenException.java delete mode 100644 src/org/apache/bcel/generic/ClassObserver.java delete mode 100644 src/org/apache/bcel/generic/CodeExceptionGen.java delete mode 100644 src/org/apache/bcel/generic/CompoundInstruction.java delete mode 100644 src/org/apache/bcel/generic/ConstantPoolGen.java delete mode 100644 src/org/apache/bcel/generic/ConstantPushInstruction.java delete mode 100644 src/org/apache/bcel/generic/ConversionInstruction.java delete mode 100644 src/org/apache/bcel/generic/D2F.java delete mode 100644 src/org/apache/bcel/generic/D2I.java delete mode 100644 src/org/apache/bcel/generic/D2L.java delete mode 100644 src/org/apache/bcel/generic/DADD.java delete mode 100644 src/org/apache/bcel/generic/DALOAD.java delete mode 100644 src/org/apache/bcel/generic/DASTORE.java delete mode 100644 src/org/apache/bcel/generic/DCMPG.java delete mode 100644 src/org/apache/bcel/generic/DCMPL.java delete mode 100644 src/org/apache/bcel/generic/DCONST.java delete mode 100644 src/org/apache/bcel/generic/DDIV.java delete mode 100644 src/org/apache/bcel/generic/DLOAD.java delete mode 100644 src/org/apache/bcel/generic/DMUL.java delete mode 100644 src/org/apache/bcel/generic/DNEG.java delete mode 100644 src/org/apache/bcel/generic/DREM.java delete mode 100644 src/org/apache/bcel/generic/DRETURN.java delete mode 100644 src/org/apache/bcel/generic/DSTORE.java delete mode 100644 src/org/apache/bcel/generic/DSUB.java delete mode 100644 src/org/apache/bcel/generic/DUP.java delete mode 100644 src/org/apache/bcel/generic/DUP2.java delete mode 100644 src/org/apache/bcel/generic/DUP2_X1.java delete mode 100644 src/org/apache/bcel/generic/DUP2_X2.java delete mode 100644 src/org/apache/bcel/generic/DUP_X1.java delete mode 100644 src/org/apache/bcel/generic/DUP_X2.java delete mode 100644 src/org/apache/bcel/generic/EmptyVisitor.java delete mode 100644 src/org/apache/bcel/generic/ExceptionThrower.java delete mode 100644 src/org/apache/bcel/generic/F2D.java delete mode 100644 src/org/apache/bcel/generic/F2I.java delete mode 100644 src/org/apache/bcel/generic/F2L.java delete mode 100644 src/org/apache/bcel/generic/FADD.java delete mode 100644 src/org/apache/bcel/generic/FALOAD.java delete mode 100644 src/org/apache/bcel/generic/FASTORE.java delete mode 100644 src/org/apache/bcel/generic/FCMPG.java delete mode 100644 src/org/apache/bcel/generic/FCMPL.java delete mode 100644 src/org/apache/bcel/generic/FCONST.java delete mode 100644 src/org/apache/bcel/generic/FDIV.java delete mode 100644 src/org/apache/bcel/generic/FLOAD.java delete mode 100644 src/org/apache/bcel/generic/FMUL.java delete mode 100644 src/org/apache/bcel/generic/FNEG.java delete mode 100644 src/org/apache/bcel/generic/FREM.java delete mode 100644 src/org/apache/bcel/generic/FRETURN.java delete mode 100644 src/org/apache/bcel/generic/FSTORE.java delete mode 100644 src/org/apache/bcel/generic/FSUB.java delete mode 100644 src/org/apache/bcel/generic/FieldGen.java delete mode 100644 src/org/apache/bcel/generic/FieldGenOrMethodGen.java delete mode 100644 src/org/apache/bcel/generic/FieldInstruction.java delete mode 100644 src/org/apache/bcel/generic/FieldObserver.java delete mode 100644 src/org/apache/bcel/generic/FieldOrMethod.java delete mode 100644 src/org/apache/bcel/generic/GETFIELD.java delete mode 100644 src/org/apache/bcel/generic/GETSTATIC.java delete mode 100644 src/org/apache/bcel/generic/GOTO.java delete mode 100644 src/org/apache/bcel/generic/GOTO_W.java delete mode 100644 src/org/apache/bcel/generic/GotoInstruction.java delete mode 100644 src/org/apache/bcel/generic/I2B.java delete mode 100644 src/org/apache/bcel/generic/I2C.java delete mode 100644 src/org/apache/bcel/generic/I2D.java delete mode 100644 src/org/apache/bcel/generic/I2F.java delete mode 100644 src/org/apache/bcel/generic/I2L.java delete mode 100644 src/org/apache/bcel/generic/I2S.java delete mode 100644 src/org/apache/bcel/generic/IADD.java delete mode 100644 src/org/apache/bcel/generic/IALOAD.java delete mode 100644 src/org/apache/bcel/generic/IAND.java delete mode 100644 src/org/apache/bcel/generic/IASTORE.java delete mode 100644 src/org/apache/bcel/generic/ICONST.java delete mode 100644 src/org/apache/bcel/generic/IDIV.java delete mode 100644 src/org/apache/bcel/generic/IFEQ.java delete mode 100644 src/org/apache/bcel/generic/IFGE.java delete mode 100644 src/org/apache/bcel/generic/IFGT.java delete mode 100644 src/org/apache/bcel/generic/IFLE.java delete mode 100644 src/org/apache/bcel/generic/IFLT.java delete mode 100644 src/org/apache/bcel/generic/IFNE.java delete mode 100644 src/org/apache/bcel/generic/IFNONNULL.java delete mode 100644 src/org/apache/bcel/generic/IFNULL.java delete mode 100644 src/org/apache/bcel/generic/IF_ACMPEQ.java delete mode 100644 src/org/apache/bcel/generic/IF_ACMPNE.java delete mode 100644 src/org/apache/bcel/generic/IF_ICMPEQ.java delete mode 100644 src/org/apache/bcel/generic/IF_ICMPGE.java delete mode 100644 src/org/apache/bcel/generic/IF_ICMPGT.java delete mode 100644 src/org/apache/bcel/generic/IF_ICMPLE.java delete mode 100644 src/org/apache/bcel/generic/IF_ICMPLT.java delete mode 100644 src/org/apache/bcel/generic/IF_ICMPNE.java delete mode 100644 src/org/apache/bcel/generic/IINC.java delete mode 100644 src/org/apache/bcel/generic/ILOAD.java delete mode 100644 src/org/apache/bcel/generic/IMPDEP1.java delete mode 100644 src/org/apache/bcel/generic/IMPDEP2.java delete mode 100644 src/org/apache/bcel/generic/IMUL.java delete mode 100644 src/org/apache/bcel/generic/INEG.java delete mode 100644 src/org/apache/bcel/generic/INSTANCEOF.java delete mode 100644 src/org/apache/bcel/generic/INVOKEINTERFACE.java delete mode 100644 src/org/apache/bcel/generic/INVOKESPECIAL.java delete mode 100644 src/org/apache/bcel/generic/INVOKESTATIC.java delete mode 100644 src/org/apache/bcel/generic/INVOKEVIRTUAL.java delete mode 100644 src/org/apache/bcel/generic/IOR.java delete mode 100644 src/org/apache/bcel/generic/IREM.java delete mode 100644 src/org/apache/bcel/generic/IRETURN.java delete mode 100644 src/org/apache/bcel/generic/ISHL.java delete mode 100644 src/org/apache/bcel/generic/ISHR.java delete mode 100644 src/org/apache/bcel/generic/ISTORE.java delete mode 100644 src/org/apache/bcel/generic/ISUB.java delete mode 100644 src/org/apache/bcel/generic/IUSHR.java delete mode 100644 src/org/apache/bcel/generic/IXOR.java delete mode 100644 src/org/apache/bcel/generic/IfInstruction.java delete mode 100644 src/org/apache/bcel/generic/IndexedInstruction.java delete mode 100644 src/org/apache/bcel/generic/Instruction.java delete mode 100644 src/org/apache/bcel/generic/InstructionComparator.java delete mode 100644 src/org/apache/bcel/generic/InstructionConstants.java delete mode 100644 src/org/apache/bcel/generic/InstructionFactory.java delete mode 100644 src/org/apache/bcel/generic/InstructionHandle.java delete mode 100644 src/org/apache/bcel/generic/InstructionList.java delete mode 100644 src/org/apache/bcel/generic/InstructionListObserver.java delete mode 100644 src/org/apache/bcel/generic/InstructionTargeter.java delete mode 100644 src/org/apache/bcel/generic/InvokeInstruction.java delete mode 100644 src/org/apache/bcel/generic/JSR.java delete mode 100644 src/org/apache/bcel/generic/JSR_W.java delete mode 100644 src/org/apache/bcel/generic/JsrInstruction.java delete mode 100644 src/org/apache/bcel/generic/L2D.java delete mode 100644 src/org/apache/bcel/generic/L2F.java delete mode 100644 src/org/apache/bcel/generic/L2I.java delete mode 100644 src/org/apache/bcel/generic/LADD.java delete mode 100644 src/org/apache/bcel/generic/LALOAD.java delete mode 100644 src/org/apache/bcel/generic/LAND.java delete mode 100644 src/org/apache/bcel/generic/LASTORE.java delete mode 100644 src/org/apache/bcel/generic/LCMP.java delete mode 100644 src/org/apache/bcel/generic/LCONST.java delete mode 100644 src/org/apache/bcel/generic/LDC.java delete mode 100644 src/org/apache/bcel/generic/LDC2_W.java delete mode 100644 src/org/apache/bcel/generic/LDC_W.java delete mode 100644 src/org/apache/bcel/generic/LDIV.java delete mode 100644 src/org/apache/bcel/generic/LLOAD.java delete mode 100644 src/org/apache/bcel/generic/LMUL.java delete mode 100644 src/org/apache/bcel/generic/LNEG.java delete mode 100644 src/org/apache/bcel/generic/LOOKUPSWITCH.java delete mode 100644 src/org/apache/bcel/generic/LOR.java delete mode 100644 src/org/apache/bcel/generic/LREM.java delete mode 100644 src/org/apache/bcel/generic/LRETURN.java delete mode 100644 src/org/apache/bcel/generic/LSHL.java delete mode 100644 src/org/apache/bcel/generic/LSHR.java delete mode 100644 src/org/apache/bcel/generic/LSTORE.java delete mode 100644 src/org/apache/bcel/generic/LSUB.java delete mode 100644 src/org/apache/bcel/generic/LUSHR.java delete mode 100644 src/org/apache/bcel/generic/LXOR.java delete mode 100644 src/org/apache/bcel/generic/LineNumberGen.java delete mode 100644 src/org/apache/bcel/generic/LoadClass.java delete mode 100644 src/org/apache/bcel/generic/LoadInstruction.java delete mode 100644 src/org/apache/bcel/generic/LocalVariableGen.java delete mode 100644 src/org/apache/bcel/generic/LocalVariableInstruction.java delete mode 100644 src/org/apache/bcel/generic/MONITORENTER.java delete mode 100644 src/org/apache/bcel/generic/MONITOREXIT.java delete mode 100644 src/org/apache/bcel/generic/MULTIANEWARRAY.java delete mode 100644 src/org/apache/bcel/generic/MethodGen.java delete mode 100644 src/org/apache/bcel/generic/MethodObserver.java delete mode 100644 src/org/apache/bcel/generic/NEW.java delete mode 100644 src/org/apache/bcel/generic/NEWARRAY.java delete mode 100644 src/org/apache/bcel/generic/NOP.java delete mode 100644 src/org/apache/bcel/generic/NamedAndTyped.java delete mode 100644 src/org/apache/bcel/generic/ObjectType.java delete mode 100644 src/org/apache/bcel/generic/POP.java delete mode 100644 src/org/apache/bcel/generic/POP2.java delete mode 100644 src/org/apache/bcel/generic/PUSH.java delete mode 100644 src/org/apache/bcel/generic/PUTFIELD.java delete mode 100644 src/org/apache/bcel/generic/PUTSTATIC.java delete mode 100644 src/org/apache/bcel/generic/PopInstruction.java delete mode 100644 src/org/apache/bcel/generic/PushInstruction.java delete mode 100644 src/org/apache/bcel/generic/RET.java delete mode 100644 src/org/apache/bcel/generic/RETURN.java delete mode 100644 src/org/apache/bcel/generic/ReferenceType.java delete mode 100644 src/org/apache/bcel/generic/ReturnInstruction.java delete mode 100644 src/org/apache/bcel/generic/ReturnaddressType.java delete mode 100644 src/org/apache/bcel/generic/SALOAD.java delete mode 100644 src/org/apache/bcel/generic/SASTORE.java delete mode 100644 src/org/apache/bcel/generic/SIPUSH.java delete mode 100644 src/org/apache/bcel/generic/SWAP.java delete mode 100644 src/org/apache/bcel/generic/SWITCH.java delete mode 100644 src/org/apache/bcel/generic/Select.java delete mode 100644 src/org/apache/bcel/generic/StackConsumer.java delete mode 100644 src/org/apache/bcel/generic/StackInstruction.java delete mode 100644 src/org/apache/bcel/generic/StackProducer.java delete mode 100644 src/org/apache/bcel/generic/StoreInstruction.java delete mode 100644 src/org/apache/bcel/generic/TABLESWITCH.java delete mode 100644 src/org/apache/bcel/generic/TargetLostException.java delete mode 100644 src/org/apache/bcel/generic/Type.java delete mode 100644 src/org/apache/bcel/generic/TypedInstruction.java delete mode 100644 src/org/apache/bcel/generic/UnconditionalBranch.java delete mode 100644 src/org/apache/bcel/generic/VariableLengthInstruction.java delete mode 100644 src/org/apache/bcel/generic/Visitor.java delete mode 100644 src/org/apache/bcel/generic/package.html delete mode 100644 src/org/apache/bcel/package.html delete mode 100644 src/org/apache/bcel/util/BCELComparator.java delete mode 100644 src/org/apache/bcel/util/BCELFactory.java delete mode 100644 src/org/apache/bcel/util/BCELifier.java delete mode 100644 src/org/apache/bcel/util/ByteSequence.java delete mode 100644 src/org/apache/bcel/util/ClassPath.java delete mode 100644 src/org/apache/bcel/util/ClassQueue.java delete mode 100644 src/org/apache/bcel/util/Repository.java delete mode 100644 src/org/apache/bcel/util/SyntheticRepository.java delete mode 100644 src/org/apache/bcel/util/package.html diff --git a/build.xml b/build.xml index 9d4d0a6..b70de53 100644 --- a/build.xml +++ b/build.xml @@ -11,6 +11,7 @@ + diff --git a/libs/javassist.jar b/libs/javassist.jar new file mode 100644 index 0000000000000000000000000000000000000000..e9840d5e315c777f94ad671172cdc4849f10de4f GIT binary patch literal 707278 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%0DF;_FBtRZ{QK^939;p>#7(~D?23Lvo7fr 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 b=8pVVW9(EFiIhGfeZ-+ySgq5CmPh(OtYEuf literal 0 HcmV?d00001 diff --git a/src/com/cnaude/chairs/Chairs.java b/src/com/cnaude/chairs/Chairs.java index f8ed9a6..be982e4 100644 --- a/src/com/cnaude/chairs/Chairs.java +++ b/src/com/cnaude/chairs/Chairs.java @@ -52,9 +52,12 @@ public class Chairs extends JavaPlugin { return vehiclearrowclass; } + GenVehicleArrowClass genvehiclearrow = new GenVehicleArrowClass(); + @Override public void onEnable() { - log = this.getLogger(); + log = this.getLogger(); + //load vehiclearrowclass try { World world = getServer().getWorlds().get(0); Arrow arrow = world.spawnArrow(new Location(world, 0, 0, 0), new Vector(0, 0, 0), 0, 0); @@ -64,7 +67,7 @@ public class Chairs extends JavaPlugin { getHandle.setAccessible(true); Class entityarrow = getHandle.invoke(arrow).getClass(); Class craftserver = getServer().getClass(); - vehiclearrowclass = new GenVehicleArrowClass(this).genAndLoadClass(arrowclass, entityarrow, craftserver); + vehiclearrowclass = genvehiclearrow.genAndLoadClass(arrowclass, entityarrow, craftserver); arrow.remove(); } catch (Exception e) { e.printStackTrace(); @@ -105,6 +108,7 @@ public class Chairs extends JavaPlugin { chairEffects.cancelPickup(); chairEffects = null; log = null; + genvehiclearrow = null; vehiclearrowclass = null; psitdata = null; } diff --git a/src/com/cnaude/chairs/GenVehicleArrowClass.java b/src/com/cnaude/chairs/GenVehicleArrowClass.java index 421ac89..49c4d98 100644 --- a/src/com/cnaude/chairs/GenVehicleArrowClass.java +++ b/src/com/cnaude/chairs/GenVehicleArrowClass.java @@ -1,94 +1,40 @@ package com.cnaude.chairs; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; +import org.bukkit.Bukkit; +import org.bukkit.entity.Vehicle; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ALOAD; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionFactory; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.InvokeInstruction; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.Type; +import javassist.CannotCompileException; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtNewConstructor; +import javassist.NotFoundException; public class GenVehicleArrowClass { - private File datafolder; - public GenVehicleArrowClass(Chairs plugin) + public Class genAndLoadClass(String arrowclass, Class entityarrow, Class craftserver) throws IOException, ClassNotFoundException, NotFoundException, CannotCompileException { - this.datafolder = plugin.getDataFolder(); - } - - public Class genAndLoadClass(String arrowclass, Class entityarrow, Class craftserver) throws IOException, ClassNotFoundException { - ClassGen cg = new ClassGen( - "VehicleArrow", - arrowclass, - "", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, - new String[]{"org.bukkit.entity.Vehicle"} - ); - ConstantPoolGen cp = cg.getConstantPool(); - InstructionList il = new InstructionList(); - MethodGen mg = new MethodGen( - Constants.ACC_PUBLIC, - Type.VOID, - new Type[] { Type.getType(craftserver), Type.getType(entityarrow) }, - new String[] { "server", "entity" }, - "", - "VehicleArrow", - il, - cp - ); - InstructionFactory factory = new InstructionFactory(cg); - il.append(new ALOAD(0)); - il.append(new ALOAD(1)); - il.append(new ALOAD(2)); - InvokeInstruction ii = factory.createInvoke( - arrowclass, - "", - Type.VOID, - new Type[] {Type.getType(craftserver), Type.getType(entityarrow)}, - Constants.INVOKESPECIAL - ); - il.append(ii); - il.append(InstructionConstants.RETURN); - mg.setMaxStack(); - cg.addMethod(mg.getMethod()); - il.dispose(); - cg.getJavaClass().dump(datafolder+File.separator+"VehicleArrow.class"); - File arrowfile = new File(datafolder+File.separator+"VehicleArrow.class"); - InputStream arrwoinputstrean = new FileInputStream(arrowfile); - File jarfile = new File(datafolder+File.separator+"VehicleArrow.jar"); - jarfile.delete(); - final ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(jarfile)); - ZipEntry entry = new ZipEntry(arrowfile.getName()); - zipout.putNextEntry(entry); - byte[] buffer = new byte[1024]; - int bytesRead; - while ((bytesRead = arrwoinputstrean.read(buffer)) != -1) { - zipout.write(buffer, 0, bytesRead); - } - zipout.closeEntry(); - arrwoinputstrean.close(); - zipout.close(); - URL url = jarfile.toURI().toURL(); - URL[] urls = new URL[]{url}; - URLClassLoader cl = new URLClassLoader(urls); - Class vehiclearrowclass = cl.loadClass("VehicleArrow"); - cl.close(); - arrowfile.delete(); - jarfile.delete(); - return vehiclearrowclass; + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath + ( + new ClassClassPath(Bukkit.class) + ); + CtClass cc = pool.makeClass("com.cnaude.chairs.VehicleArrow"); + cc.setSuperclass(pool.getCtClass(arrowclass)); + cc.setInterfaces + ( + new CtClass[] + { + pool.get(Vehicle.class.getName()) + } + ); + String counstructorsource = "public VehicleArrow("+craftserver.getName()+" server, "+entityarrow.getName()+" entity)\n{\nsuper(server, entity);\n}"; + cc.addConstructor + ( + CtNewConstructor.make(counstructorsource, cc) + ); + return cc.toClass(); } diff --git a/src/org/apache/bcel/Constants.java b/src/org/apache/bcel/Constants.java deleted file mode 100644 index 39d0917..0000000 --- a/src/org/apache/bcel/Constants.java +++ /dev/null @@ -1,797 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel; - -/** - * Constants for the project, mostly defined in the JVM specification. - * - * @version $Id: Constants.java 410087 2006-05-29 12:12:19Z tcurdt $ - * @author M. Dahm - */ -public interface Constants { - /** - * Major and minor version of the code. - */ - public final static short MAJOR_1_1 = 45; - public final static short MINOR_1_1 = 3; - public final static short MAJOR_1_2 = 46; - public final static short MINOR_1_2 = 0; - public final static short MAJOR_1_3 = 47; - public final static short MINOR_1_3 = 0; - public final static short MAJOR_1_4 = 48; - public final static short MINOR_1_4 = 0; - public final static short MAJOR_1_5 = 49; - public final static short MINOR_1_5 = 0; - public final static short MAJOR = MAJOR_1_1; // Defaults - public final static short MINOR = MINOR_1_1; - - /** - * Maximum value for an unsigned short. - */ - public final static int MAX_SHORT = 65535; // 2^16 - 1 - - /** - * Maximum value for an unsigned byte. - */ - public final static int MAX_BYTE = 255; // 2^8 - 1 - - /** - * Access flags for classes, fields and methods. - */ - public final static short ACC_PUBLIC = 0x0001; - public final static short ACC_PRIVATE = 0x0002; - public final static short ACC_PROTECTED = 0x0004; - public final static short ACC_STATIC = 0x0008; - - public final static short ACC_FINAL = 0x0010; - public final static short ACC_SYNCHRONIZED = 0x0020; - public final static short ACC_VOLATILE = 0x0040; - public final static short ACC_BRIDGE = 0x0040; - public final static short ACC_TRANSIENT = 0x0080; - public final static short ACC_VARARGS = 0x0080; - - public final static short ACC_NATIVE = 0x0100; - public final static short ACC_INTERFACE = 0x0200; - public final static short ACC_ABSTRACT = 0x0400; - public final static short ACC_STRICT = 0x0800; - - public final static short ACC_SYNTHETIC = 0x1000; - public final static short ACC_ANNOTATION = 0x2000; - public final static short ACC_ENUM = 0x4000; - - // Applies to classes compiled by new compilers only - public final static short ACC_SUPER = 0x0020; - - public final static short MAX_ACC_FLAG = ACC_ENUM; - - public final static String[] ACCESS_NAMES = { "public", "private", - "protected", "static", "final", "synchronized", "volatile", - "transient", "native", "interface", "abstract", "strictfp", - "synthetic", "annotation", "enum" }; - - /** - * Tags in constant pool to denote type of constant. - */ - public final static byte CONSTANT_Utf8 = 1; - public final static byte CONSTANT_Integer = 3; - public final static byte CONSTANT_Float = 4; - public final static byte CONSTANT_Long = 5; - public final static byte CONSTANT_Double = 6; - public final static byte CONSTANT_Class = 7; - public final static byte CONSTANT_Fieldref = 9; - public final static byte CONSTANT_String = 8; - public final static byte CONSTANT_Methodref = 10; - public final static byte CONSTANT_InterfaceMethodref = 11; - public final static byte CONSTANT_NameAndType = 12; - - public final static String[] CONSTANT_NAMES = { "", "CONSTANT_Utf8", "", - "CONSTANT_Integer", "CONSTANT_Float", "CONSTANT_Long", - "CONSTANT_Double", "CONSTANT_Class", "CONSTANT_String", - "CONSTANT_Fieldref", "CONSTANT_Methodref", - "CONSTANT_InterfaceMethodref", "CONSTANT_NameAndType" }; - - /** - * The name of the static initializer, also called "class - * initialization method" or "interface initialization - * method". This is "<clinit>". - */ - public final static String STATIC_INITIALIZER_NAME = ""; - - /** - * The name of every constructor method in a class, also called - * "instance initialization method". This is - * "<init>". - */ - public final static String CONSTRUCTOR_NAME = ""; - - /** The names of the interfaces implemented by arrays */ - public final static String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = { - "java.lang.Cloneable", "java.io.Serializable" }; - - /** - * Limitations of the Java Virtual Machine. See The Java Virtual Machine - * Specification, Second Edition, page 152, chapter 4.10. - */ - public static final int MAX_CP_ENTRIES = 65535; - public static final int MAX_CODE_SIZE = 65536; // bytes - - /** - * Java VM opcodes. - */ - public static final short NOP = 0; - public static final short ACONST_NULL = 1; - public static final short ICONST_M1 = 2; - public static final short ICONST_0 = 3; - public static final short ICONST_1 = 4; - public static final short ICONST_2 = 5; - public static final short ICONST_3 = 6; - public static final short ICONST_4 = 7; - public static final short ICONST_5 = 8; - public static final short LCONST_0 = 9; - public static final short LCONST_1 = 10; - public static final short FCONST_0 = 11; - public static final short FCONST_1 = 12; - public static final short FCONST_2 = 13; - public static final short DCONST_0 = 14; - public static final short DCONST_1 = 15; - public static final short BIPUSH = 16; - public static final short SIPUSH = 17; - public static final short LDC = 18; - public static final short LDC_W = 19; - public static final short LDC2_W = 20; - public static final short ILOAD = 21; - public static final short LLOAD = 22; - public static final short FLOAD = 23; - public static final short DLOAD = 24; - public static final short ALOAD = 25; - public static final short ILOAD_0 = 26; - public static final short ILOAD_1 = 27; - public static final short ILOAD_2 = 28; - public static final short ILOAD_3 = 29; - public static final short LLOAD_0 = 30; - public static final short LLOAD_1 = 31; - public static final short LLOAD_2 = 32; - public static final short LLOAD_3 = 33; - public static final short FLOAD_0 = 34; - public static final short FLOAD_1 = 35; - public static final short FLOAD_2 = 36; - public static final short FLOAD_3 = 37; - public static final short DLOAD_0 = 38; - public static final short DLOAD_1 = 39; - public static final short DLOAD_2 = 40; - public static final short DLOAD_3 = 41; - public static final short ALOAD_0 = 42; - public static final short ALOAD_1 = 43; - public static final short ALOAD_2 = 44; - public static final short ALOAD_3 = 45; - public static final short IALOAD = 46; - public static final short LALOAD = 47; - public static final short FALOAD = 48; - public static final short DALOAD = 49; - public static final short AALOAD = 50; - public static final short BALOAD = 51; - public static final short CALOAD = 52; - public static final short SALOAD = 53; - public static final short ISTORE = 54; - public static final short LSTORE = 55; - public static final short FSTORE = 56; - public static final short DSTORE = 57; - public static final short ASTORE = 58; - public static final short ISTORE_0 = 59; - public static final short ISTORE_1 = 60; - public static final short ISTORE_2 = 61; - public static final short ISTORE_3 = 62; - public static final short LSTORE_0 = 63; - public static final short LSTORE_1 = 64; - public static final short LSTORE_2 = 65; - public static final short LSTORE_3 = 66; - public static final short FSTORE_0 = 67; - public static final short FSTORE_1 = 68; - public static final short FSTORE_2 = 69; - public static final short FSTORE_3 = 70; - public static final short DSTORE_0 = 71; - public static final short DSTORE_1 = 72; - public static final short DSTORE_2 = 73; - public static final short DSTORE_3 = 74; - public static final short ASTORE_0 = 75; - public static final short ASTORE_1 = 76; - public static final short ASTORE_2 = 77; - public static final short ASTORE_3 = 78; - public static final short IASTORE = 79; - public static final short LASTORE = 80; - public static final short FASTORE = 81; - public static final short DASTORE = 82; - public static final short AASTORE = 83; - public static final short BASTORE = 84; - public static final short CASTORE = 85; - public static final short SASTORE = 86; - public static final short POP = 87; - public static final short POP2 = 88; - public static final short DUP = 89; - public static final short DUP_X1 = 90; - public static final short DUP_X2 = 91; - public static final short DUP2 = 92; - public static final short DUP2_X1 = 93; - public static final short DUP2_X2 = 94; - public static final short SWAP = 95; - public static final short IADD = 96; - public static final short LADD = 97; - public static final short FADD = 98; - public static final short DADD = 99; - public static final short ISUB = 100; - public static final short LSUB = 101; - public static final short FSUB = 102; - public static final short DSUB = 103; - public static final short IMUL = 104; - public static final short LMUL = 105; - public static final short FMUL = 106; - public static final short DMUL = 107; - public static final short IDIV = 108; - public static final short LDIV = 109; - public static final short FDIV = 110; - public static final short DDIV = 111; - public static final short IREM = 112; - public static final short LREM = 113; - public static final short FREM = 114; - public static final short DREM = 115; - public static final short INEG = 116; - public static final short LNEG = 117; - public static final short FNEG = 118; - public static final short DNEG = 119; - public static final short ISHL = 120; - public static final short LSHL = 121; - public static final short ISHR = 122; - public static final short LSHR = 123; - public static final short IUSHR = 124; - public static final short LUSHR = 125; - public static final short IAND = 126; - public static final short LAND = 127; - public static final short IOR = 128; - public static final short LOR = 129; - public static final short IXOR = 130; - public static final short LXOR = 131; - public static final short IINC = 132; - public static final short I2L = 133; - public static final short I2F = 134; - public static final short I2D = 135; - public static final short L2I = 136; - public static final short L2F = 137; - public static final short L2D = 138; - public static final short F2I = 139; - public static final short F2L = 140; - public static final short F2D = 141; - public static final short D2I = 142; - public static final short D2L = 143; - public static final short D2F = 144; - public static final short I2B = 145; - public static final short INT2BYTE = 145; // Old notion - public static final short I2C = 146; - public static final short INT2CHAR = 146; // Old notion - public static final short I2S = 147; - public static final short INT2SHORT = 147; // Old notion - public static final short LCMP = 148; - public static final short FCMPL = 149; - public static final short FCMPG = 150; - public static final short DCMPL = 151; - public static final short DCMPG = 152; - public static final short IFEQ = 153; - public static final short IFNE = 154; - public static final short IFLT = 155; - public static final short IFGE = 156; - public static final short IFGT = 157; - public static final short IFLE = 158; - public static final short IF_ICMPEQ = 159; - public static final short IF_ICMPNE = 160; - public static final short IF_ICMPLT = 161; - public static final short IF_ICMPGE = 162; - public static final short IF_ICMPGT = 163; - public static final short IF_ICMPLE = 164; - public static final short IF_ACMPEQ = 165; - public static final short IF_ACMPNE = 166; - public static final short GOTO = 167; - public static final short JSR = 168; - public static final short RET = 169; - public static final short TABLESWITCH = 170; - public static final short LOOKUPSWITCH = 171; - public static final short IRETURN = 172; - public static final short LRETURN = 173; - public static final short FRETURN = 174; - public static final short DRETURN = 175; - public static final short ARETURN = 176; - public static final short RETURN = 177; - public static final short GETSTATIC = 178; - public static final short PUTSTATIC = 179; - public static final short GETFIELD = 180; - public static final short PUTFIELD = 181; - public static final short INVOKEVIRTUAL = 182; - public static final short INVOKESPECIAL = 183; - public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 - public static final short INVOKESTATIC = 184; - public static final short INVOKEINTERFACE = 185; - public static final short NEW = 187; - public static final short NEWARRAY = 188; - public static final short ANEWARRAY = 189; - public static final short ARRAYLENGTH = 190; - public static final short ATHROW = 191; - public static final short CHECKCAST = 192; - public static final short INSTANCEOF = 193; - public static final short MONITORENTER = 194; - public static final short MONITOREXIT = 195; - public static final short WIDE = 196; - public static final short MULTIANEWARRAY = 197; - public static final short IFNULL = 198; - public static final short IFNONNULL = 199; - public static final short GOTO_W = 200; - public static final short JSR_W = 201; - - /** - * Non-legal opcodes, may be used by JVM internally. - */ - public static final short BREAKPOINT = 202; - public static final short LDC_QUICK = 203; - public static final short LDC_W_QUICK = 204; - public static final short LDC2_W_QUICK = 205; - public static final short GETFIELD_QUICK = 206; - public static final short PUTFIELD_QUICK = 207; - public static final short GETFIELD2_QUICK = 208; - public static final short PUTFIELD2_QUICK = 209; - public static final short GETSTATIC_QUICK = 210; - public static final short PUTSTATIC_QUICK = 211; - public static final short GETSTATIC2_QUICK = 212; - public static final short PUTSTATIC2_QUICK = 213; - public static final short INVOKEVIRTUAL_QUICK = 214; - public static final short INVOKENONVIRTUAL_QUICK = 215; - public static final short INVOKESUPER_QUICK = 216; - public static final short INVOKESTATIC_QUICK = 217; - public static final short INVOKEINTERFACE_QUICK = 218; - public static final short INVOKEVIRTUALOBJECT_QUICK = 219; - public static final short NEW_QUICK = 221; - public static final short ANEWARRAY_QUICK = 222; - public static final short MULTIANEWARRAY_QUICK = 223; - public static final short CHECKCAST_QUICK = 224; - public static final short INSTANCEOF_QUICK = 225; - public static final short INVOKEVIRTUAL_QUICK_W = 226; - public static final short GETFIELD_QUICK_W = 227; - public static final short PUTFIELD_QUICK_W = 228; - public static final short IMPDEP1 = 254; - public static final short IMPDEP2 = 255; - - /** - * For internal purposes only. - */ - public static final short PUSH = 4711; - public static final short SWITCH = 4712; - - /** - * Illegal codes - */ - public static final short UNDEFINED = -1; - public static final short UNPREDICTABLE = -2; - public static final short RESERVED = -3; - public static final String ILLEGAL_OPCODE = ""; - public static final String ILLEGAL_TYPE = ""; - - public static final byte T_BOOLEAN = 4; - public static final byte T_CHAR = 5; - public static final byte T_FLOAT = 6; - public static final byte T_DOUBLE = 7; - public static final byte T_BYTE = 8; - public static final byte T_SHORT = 9; - public static final byte T_INT = 10; - public static final byte T_LONG = 11; - - public static final byte T_VOID = 12; // Non-standard - public static final byte T_ARRAY = 13; - public static final byte T_OBJECT = 14; - public static final byte T_REFERENCE = 14; // Deprecated - public static final byte T_UNKNOWN = 15; - public static final byte T_ADDRESS = 16; - - /** - * The primitive type names corresponding to the T_XX constants, e.g., - * TYPE_NAMES[T_INT] = "int" - */ - public static final String[] TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, - ILLEGAL_TYPE, ILLEGAL_TYPE, "boolean", "char", "float", "double", - "byte", "short", "int", "long", "void", "array", "object", - "unknown" // Non-standard - }; - - /** - * The primitive class names corresponding to the T_XX constants, e.g., - * CLASS_TYPE_NAMES[T_INT] = "java.lang.Integer" - */ - public static final String[] CLASS_TYPE_NAMES = { ILLEGAL_TYPE, - ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "java.lang.Boolean", - "java.lang.Character", "java.lang.Float", "java.lang.Double", - "java.lang.Byte", "java.lang.Short", "java.lang.Integer", - "java.lang.Long", "java.lang.Void", ILLEGAL_TYPE, ILLEGAL_TYPE, - ILLEGAL_TYPE }; - - /** - * The signature characters corresponding to primitive types, e.g., - * SHORT_TYPE_NAMES[T_INT] = "I" - */ - public static final String[] SHORT_TYPE_NAMES = { ILLEGAL_TYPE, - ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "Z", "C", "F", "D", "B", - "S", "I", "J", "V", ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE }; - - /** - * Number of byte code operands, i.e., number of bytes after the tag byte - * itself. - */ - public static final short[] NO_OF_OPERANDS = { 0/* nop */, - 0/* aconst_null */, 0/* iconst_m1 */, 0/* iconst_0 */, 0/* iconst_1 */, - 0/* iconst_2 */, 0/* iconst_3 */, 0/* iconst_4 */, 0/* iconst_5 */, - 0/* lconst_0 */, 0/* lconst_1 */, 0/* fconst_0 */, 0/* fconst_1 */, - 0/* fconst_2 */, 0/* dconst_0 */, 0/* dconst_1 */, 1/* bipush */, - 2/* sipush */, 1/* ldc */, 2/* ldc_w */, 2/* ldc2_w */, - 1/* iload */, 1/* lload */, 1/* fload */, 1/* dload */, 1/* aload */, - 0/* iload_0 */, 0/* iload_1 */, 0/* iload_2 */, 0/* iload_3 */, - 0/* lload_0 */, 0/* lload_1 */, 0/* lload_2 */, 0/* lload_3 */, - 0/* fload_0 */, 0/* fload_1 */, 0/* fload_2 */, 0/* fload_3 */, - 0/* dload_0 */, 0/* dload_1 */, 0/* dload_2 */, 0/* dload_3 */, - 0/* aload_0 */, 0/* aload_1 */, 0/* aload_2 */, 0/* aload_3 */, - 0/* iaload */, 0/* laload */, 0/* faload */, 0/* daload */, - 0/* aaload */, 0/* baload */, 0/* caload */, 0/* saload */, - 1/* istore */, 1/* lstore */, 1/* fstore */, 1/* dstore */, - 1/* astore */, 0/* istore_0 */, 0/* istore_1 */, 0/* istore_2 */, - 0/* istore_3 */, 0/* lstore_0 */, 0/* lstore_1 */, 0/* lstore_2 */, - 0/* lstore_3 */, 0/* fstore_0 */, 0/* fstore_1 */, 0/* fstore_2 */, - 0/* fstore_3 */, 0/* dstore_0 */, 0/* dstore_1 */, 0/* dstore_2 */, - 0/* dstore_3 */, 0/* astore_0 */, 0/* astore_1 */, 0/* astore_2 */, - 0/* astore_3 */, 0/* iastore */, 0/* lastore */, 0/* fastore */, - 0/* dastore */, 0/* aastore */, 0/* bastore */, 0/* castore */, - 0/* sastore */, 0/* pop */, 0/* pop2 */, 0/* dup */, 0/* dup_x1 */, - 0/* dup_x2 */, 0/* dup2 */, 0/* dup2_x1 */, 0/* dup2_x2 */, - 0/* swap */, 0/* iadd */, 0/* ladd */, 0/* fadd */, 0/* dadd */, - 0/* isub */, 0/* lsub */, 0/* fsub */, 0/* dsub */, 0/* imul */, - 0/* lmul */, 0/* fmul */, 0/* dmul */, 0/* idiv */, 0/* ldiv */, - 0/* fdiv */, 0/* ddiv */, 0/* irem */, 0/* lrem */, 0/* frem */, - 0/* drem */, 0/* ineg */, 0/* lneg */, 0/* fneg */, 0/* dneg */, - 0/* ishl */, 0/* lshl */, 0/* ishr */, 0/* lshr */, 0/* iushr */, - 0/* lushr */, 0/* iand */, 0/* land */, 0/* ior */, 0/* lor */, - 0/* ixor */, 0/* lxor */, 2/* iinc */, 0/* i2l */, 0/* i2f */, - 0/* i2d */, 0/* l2i */, 0/* l2f */, 0/* l2d */, 0/* f2i */, - 0/* f2l */, 0/* f2d */, 0/* d2i */, 0/* d2l */, 0/* d2f */, - 0/* i2b */, 0/* i2c */, 0/* i2s */, 0/* lcmp */, 0/* fcmpl */, - 0/* fcmpg */, 0/* dcmpl */, 0/* dcmpg */, 2/* ifeq */, 2/* ifne */, - 2/* iflt */, 2/* ifge */, 2/* ifgt */, 2/* ifle */, 2/* if_icmpeq */, - 2/* if_icmpne */, 2/* if_icmplt */, 2/* if_icmpge */, 2/* if_icmpgt */, - 2/* if_icmple */, 2/* if_acmpeq */, 2/* if_acmpne */, 2/* goto */, - 2/* jsr */, 1/* ret */, UNPREDICTABLE/* tableswitch */, - UNPREDICTABLE/* lookupswitch */, 0/* ireturn */, 0/* lreturn */, - 0/* freturn */, 0/* dreturn */, 0/* areturn */, 0/* return */, - 2/* getstatic */, 2/* putstatic */, 2/* getfield */, 2/* putfield */, - 2/* invokevirtual */, 2/* invokespecial */, 2/* invokestatic */, - 4/* invokeinterface */, UNDEFINED, 2/* new */, 1/* newarray */, - 2/* anewarray */, 0/* arraylength */, 0/* athrow */, - 2/* checkcast */, 2/* instanceof */, 0/* monitorenter */, - 0/* monitorexit */, UNPREDICTABLE/* wide */, 3/* multianewarray */, - 2/* ifnull */, 2/* ifnonnull */, 4/* goto_w */, 4/* jsr_w */, - 0/* breakpoint */, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - RESERVED/* impdep1 */, RESERVED /* impdep2 */ - }; - - /** - * How the byte code operands are to be interpreted. - */ - public static final short[][] TYPE_OF_OPERANDS = { {}/* nop */, - {}/* aconst_null */, {}/* iconst_m1 */, {}/* iconst_0 */, - {}/* iconst_1 */, {}/* iconst_2 */, {}/* iconst_3 */, {}/* iconst_4 */, - {}/* iconst_5 */, {}/* lconst_0 */, {}/* lconst_1 */, {}/* fconst_0 */, - {}/* fconst_1 */, {}/* fconst_2 */, {}/* dconst_0 */, {}/* dconst_1 */, - { T_BYTE }/* bipush */, { T_SHORT }/* sipush */, { T_BYTE }/* ldc */, - { T_SHORT }/* ldc_w */, { T_SHORT }/* ldc2_w */, - { T_BYTE }/* iload */, { T_BYTE }/* lload */, - { T_BYTE }/* fload */, { T_BYTE }/* dload */, - { T_BYTE }/* aload */, {}/* iload_0 */, {}/* iload_1 */, - {}/* iload_2 */, {}/* iload_3 */, {}/* lload_0 */, {}/* lload_1 */, - {}/* lload_2 */, {}/* lload_3 */, {}/* fload_0 */, {}/* fload_1 */, - {}/* fload_2 */, {}/* fload_3 */, {}/* dload_0 */, {}/* dload_1 */, - {}/* dload_2 */, {}/* dload_3 */, {}/* aload_0 */, {}/* aload_1 */, - {}/* aload_2 */, {}/* aload_3 */, {}/* iaload */, {}/* laload */, - {}/* faload */, {}/* daload */, {}/* aaload */, {}/* baload */, - {}/* caload */, {}/* saload */, { T_BYTE }/* istore */, - { T_BYTE }/* lstore */, { T_BYTE }/* fstore */, - { T_BYTE }/* dstore */, { T_BYTE }/* astore */, {}/* istore_0 */, - {}/* istore_1 */, {}/* istore_2 */, {}/* istore_3 */, {}/* lstore_0 */, - {}/* lstore_1 */, {}/* lstore_2 */, {}/* lstore_3 */, {}/* fstore_0 */, - {}/* fstore_1 */, {}/* fstore_2 */, {}/* fstore_3 */, {}/* dstore_0 */, - {}/* dstore_1 */, {}/* dstore_2 */, {}/* dstore_3 */, {}/* astore_0 */, - {}/* astore_1 */, {}/* astore_2 */, {}/* astore_3 */, {}/* iastore */, - {}/* lastore */, {}/* fastore */, {}/* dastore */, {}/* aastore */, - {}/* bastore */, {}/* castore */, {}/* sastore */, {}/* pop */, - {}/* pop2 */, {}/* dup */, {}/* dup_x1 */, {}/* dup_x2 */, {}/* dup2 */, - {}/* dup2_x1 */, {}/* dup2_x2 */, {}/* swap */, {}/* iadd */, {}/* ladd */, - {}/* fadd */, {}/* dadd */, {}/* isub */, {}/* lsub */, {}/* fsub */, - {}/* dsub */, {}/* imul */, {}/* lmul */, {}/* fmul */, {}/* dmul */, - {}/* idiv */, {}/* ldiv */, {}/* fdiv */, {}/* ddiv */, {}/* irem */, - {}/* lrem */, {}/* frem */, {}/* drem */, {}/* ineg */, {}/* lneg */, - {}/* fneg */, {}/* dneg */, {}/* ishl */, {}/* lshl */, {}/* ishr */, - {}/* lshr */, {}/* iushr */, {}/* lushr */, {}/* iand */, {}/* land */, - {}/* ior */, {}/* lor */, {}/* ixor */, {}/* lxor */, - { T_BYTE, T_BYTE }/* iinc */, {}/* i2l */, {}/* i2f */, {}/* i2d */, - {}/* l2i */, {}/* l2f */, {}/* l2d */, {}/* f2i */, {}/* f2l */, - {}/* f2d */, {}/* d2i */, {}/* d2l */, {}/* d2f */, {}/* i2b */, - {}/* i2c */, {}/* i2s */, {}/* lcmp */, {}/* fcmpl */, {}/* fcmpg */, - {}/* dcmpl */, {}/* dcmpg */, { T_SHORT }/* ifeq */, - { T_SHORT }/* ifne */, { T_SHORT }/* iflt */, - { T_SHORT }/* ifge */, { T_SHORT }/* ifgt */, - { T_SHORT }/* ifle */, { T_SHORT }/* if_icmpeq */, - { T_SHORT }/* if_icmpne */, { T_SHORT }/* if_icmplt */, - { T_SHORT }/* if_icmpge */, { T_SHORT }/* if_icmpgt */, - { T_SHORT }/* if_icmple */, { T_SHORT }/* if_acmpeq */, - { T_SHORT }/* if_acmpne */, { T_SHORT }/* goto */, - { T_SHORT }/* jsr */, { T_BYTE }/* ret */, {}/* tableswitch */, - {}/* lookupswitch */, {}/* ireturn */, {}/* lreturn */, {}/* freturn */, - {}/* dreturn */, {}/* areturn */, {}/* return */, - { T_SHORT }/* getstatic */, { T_SHORT }/* putstatic */, - { T_SHORT }/* getfield */, { T_SHORT }/* putfield */, - { T_SHORT }/* invokevirtual */, { T_SHORT }/* invokespecial */, - { T_SHORT }/* invokestatic */, - { T_SHORT, T_BYTE, T_BYTE }/* invokeinterface */, {}, - { T_SHORT }/* new */, { T_BYTE }/* newarray */, - { T_SHORT }/* anewarray */, {}/* arraylength */, {}/* athrow */, - { T_SHORT }/* checkcast */, { T_SHORT }/* instanceof */, - {}/* monitorenter */, {}/* monitorexit */, { T_BYTE }/* wide */, - { T_SHORT, T_BYTE }/* multianewarray */, { T_SHORT }/* ifnull */, - { T_SHORT }/* ifnonnull */, { T_INT }/* goto_w */, - { T_INT }/* jsr_w */, {}/* breakpoint */, {}, {}, {}, {}, {}, {}, - {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, - {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, - {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}/* impdep1 */, {} /* impdep2 */ - }; - - /** - * Names of opcodes. - */ - public static final String[] OPCODE_NAMES = { "nop", "aconst_null", - "iconst_m1", "iconst_0", "iconst_1", "iconst_2", "iconst_3", - "iconst_4", "iconst_5", "lconst_0", "lconst_1", "fconst_0", - "fconst_1", "fconst_2", "dconst_0", "dconst_1", "bipush", "sipush", - "ldc", "ldc_w", "ldc2_w", "iload", "lload", "fload", "dload", - "aload", "iload_0", "iload_1", "iload_2", "iload_3", "lload_0", - "lload_1", "lload_2", "lload_3", "fload_0", "fload_1", "fload_2", - "fload_3", "dload_0", "dload_1", "dload_2", "dload_3", "aload_0", - "aload_1", "aload_2", "aload_3", "iaload", "laload", "faload", - "daload", "aaload", "baload", "caload", "saload", "istore", - "lstore", "fstore", "dstore", "astore", "istore_0", "istore_1", - "istore_2", "istore_3", "lstore_0", "lstore_1", "lstore_2", - "lstore_3", "fstore_0", "fstore_1", "fstore_2", "fstore_3", - "dstore_0", "dstore_1", "dstore_2", "dstore_3", "astore_0", - "astore_1", "astore_2", "astore_3", "iastore", "lastore", - "fastore", "dastore", "aastore", "bastore", "castore", "sastore", - "pop", "pop2", "dup", "dup_x1", "dup_x2", "dup2", "dup2_x1", - "dup2_x2", "swap", "iadd", "ladd", "fadd", "dadd", "isub", "lsub", - "fsub", "dsub", "imul", "lmul", "fmul", "dmul", "idiv", "ldiv", - "fdiv", "ddiv", "irem", "lrem", "frem", "drem", "ineg", "lneg", - "fneg", "dneg", "ishl", "lshl", "ishr", "lshr", "iushr", "lushr", - "iand", "land", "ior", "lor", "ixor", "lxor", "iinc", "i2l", "i2f", - "i2d", "l2i", "l2f", "l2d", "f2i", "f2l", "f2d", "d2i", "d2l", - "d2f", "i2b", "i2c", "i2s", "lcmp", "fcmpl", "fcmpg", "dcmpl", - "dcmpg", "ifeq", "ifne", "iflt", "ifge", "ifgt", "ifle", - "if_icmpeq", "if_icmpne", "if_icmplt", "if_icmpge", "if_icmpgt", - "if_icmple", "if_acmpeq", "if_acmpne", "goto", "jsr", "ret", - "tableswitch", "lookupswitch", "ireturn", "lreturn", "freturn", - "dreturn", "areturn", "return", "getstatic", "putstatic", - "getfield", "putfield", "invokevirtual", "invokespecial", - "invokestatic", "invokeinterface", ILLEGAL_OPCODE, "new", - "newarray", "anewarray", "arraylength", "athrow", "checkcast", - "instanceof", "monitorenter", "monitorexit", "wide", - "multianewarray", "ifnull", "ifnonnull", "goto_w", "jsr_w", - "breakpoint", ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, - "impdep1", "impdep2" }; - - /** - * Number of words consumed on operand stack by instructions. - */ - public static final int[] CONSUME_STACK = { 0/* nop */, 0/* aconst_null */, - 0/* iconst_m1 */, 0/* iconst_0 */, 0/* iconst_1 */, 0/* iconst_2 */, - 0/* iconst_3 */, 0/* iconst_4 */, 0/* iconst_5 */, 0/* lconst_0 */, - 0/* lconst_1 */, 0/* fconst_0 */, 0/* fconst_1 */, 0/* fconst_2 */, - 0/* dconst_0 */, 0/* dconst_1 */, 0/* bipush */, 0/* sipush */, - 0/* ldc */, 0/* ldc_w */, 0/* ldc2_w */, 0/* iload */, 0/* lload */, - 0/* fload */, 0/* dload */, 0/* aload */, 0/* iload_0 */, 0/* iload_1 */, - 0/* iload_2 */, 0/* iload_3 */, 0/* lload_0 */, 0/* lload_1 */, - 0/* lload_2 */, 0/* lload_3 */, 0/* fload_0 */, 0/* fload_1 */, - 0/* fload_2 */, 0/* fload_3 */, 0/* dload_0 */, 0/* dload_1 */, - 0/* dload_2 */, 0/* dload_3 */, 0/* aload_0 */, 0/* aload_1 */, - 0/* aload_2 */, 0/* aload_3 */, 2/* iaload */, 2/* laload */, - 2/* faload */, 2/* daload */, 2/* aaload */, 2/* baload */, - 2/* caload */, 2/* saload */, 1/* istore */, 2/* lstore */, - 1/* fstore */, 2/* dstore */, 1/* astore */, 1/* istore_0 */, - 1/* istore_1 */, 1/* istore_2 */, 1/* istore_3 */, 2/* lstore_0 */, - 2/* lstore_1 */, 2/* lstore_2 */, 2/* lstore_3 */, 1/* fstore_0 */, - 1/* fstore_1 */, 1/* fstore_2 */, 1/* fstore_3 */, 2/* dstore_0 */, - 2/* dstore_1 */, 2/* dstore_2 */, 2/* dstore_3 */, 1/* astore_0 */, - 1/* astore_1 */, 1/* astore_2 */, 1/* astore_3 */, 3/* iastore */, - 4/* lastore */, 3/* fastore */, 4/* dastore */, 3/* aastore */, - 3/* bastore */, 3/* castore */, 3/* sastore */, 1/* pop */, - 2/* pop2 */, 1/* dup */, 2/* dup_x1 */, 3/* dup_x2 */, 2/* dup2 */, - 3/* dup2_x1 */, 4/* dup2_x2 */, 2/* swap */, 2/* iadd */, 4/* ladd */, - 2/* fadd */, 4/* dadd */, 2/* isub */, 4/* lsub */, 2/* fsub */, - 4/* dsub */, 2/* imul */, 4/* lmul */, 2/* fmul */, 4/* dmul */, - 2/* idiv */, 4/* ldiv */, 2/* fdiv */, 4/* ddiv */, 2/* irem */, - 4/* lrem */, 2/* frem */, 4/* drem */, 1/* ineg */, 2/* lneg */, - 1/* fneg */, 2/* dneg */, 2/* ishl */, 3/* lshl */, 2/* ishr */, - 3/* lshr */, 2/* iushr */, 3/* lushr */, 2/* iand */, 4/* land */, - 2/* ior */, 4/* lor */, 2/* ixor */, 4/* lxor */, 0/* iinc */, - 1/* i2l */, 1/* i2f */, 1/* i2d */, 2/* l2i */, 2/* l2f */, - 2/* l2d */, 1/* f2i */, 1/* f2l */, 1/* f2d */, 2/* d2i */, - 2/* d2l */, 2/* d2f */, 1/* i2b */, 1/* i2c */, 1/* i2s */, - 4/* lcmp */, 2/* fcmpl */, 2/* fcmpg */, 4/* dcmpl */, 4/* dcmpg */, - 1/* ifeq */, 1/* ifne */, 1/* iflt */, 1/* ifge */, 1/* ifgt */, - 1/* ifle */, 2/* if_icmpeq */, 2/* if_icmpne */, 2/* if_icmplt */, - 2 /* if_icmpge */, 2/* if_icmpgt */, 2/* if_icmple */, 2/* if_acmpeq */, - 2/* if_acmpne */, 0/* goto */, 0/* jsr */, 0/* ret */, - 1/* tableswitch */, 1/* lookupswitch */, 1/* ireturn */, - 2/* lreturn */, 1/* freturn */, 2/* dreturn */, 1/* areturn */, - 0/* return */, 0/* getstatic */, UNPREDICTABLE/* putstatic */, - 1/* getfield */, UNPREDICTABLE/* putfield */, - UNPREDICTABLE/* invokevirtual */, UNPREDICTABLE/* invokespecial */, - UNPREDICTABLE/* invokestatic */, UNPREDICTABLE/* invokeinterface */, - UNDEFINED, 0/* new */, 1/* newarray */, 1/* anewarray */, - 1/* arraylength */, 1/* athrow */, 1/* checkcast */, - 1/* instanceof */, 1/* monitorenter */, 1/* monitorexit */, - 0/* wide */, UNPREDICTABLE/* multianewarray */, 1/* ifnull */, - 1/* ifnonnull */, 0/* goto_w */, 0/* jsr_w */, 0/* breakpoint */, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNPREDICTABLE/* impdep1 */, - UNPREDICTABLE /* impdep2 */ - }; - - /** - * Number of words produced onto operand stack by instructions. - */ - public static final int[] PRODUCE_STACK = { 0/* nop */, 1/* aconst_null */, - 1/* iconst_m1 */, 1/* iconst_0 */, 1/* iconst_1 */, 1/* iconst_2 */, - 1/* iconst_3 */, 1/* iconst_4 */, 1/* iconst_5 */, 2/* lconst_0 */, - 2/* lconst_1 */, 1/* fconst_0 */, 1/* fconst_1 */, 1/* fconst_2 */, - 2/* dconst_0 */, 2/* dconst_1 */, 1/* bipush */, 1/* sipush */, - 1/* ldc */, 1/* ldc_w */, 2/* ldc2_w */, 1/* iload */, 2/* lload */, - 1/* fload */, 2/* dload */, 1/* aload */, 1/* iload_0 */, 1/* iload_1 */, - 1/* iload_2 */, 1/* iload_3 */, 2/* lload_0 */, 2/* lload_1 */, - 2/* lload_2 */, 2/* lload_3 */, 1/* fload_0 */, 1/* fload_1 */, - 1/* fload_2 */, 1/* fload_3 */, 2/* dload_0 */, 2/* dload_1 */, - 2/* dload_2 */, 2/* dload_3 */, 1/* aload_0 */, 1/* aload_1 */, - 1/* aload_2 */, 1/* aload_3 */, 1/* iaload */, 2/* laload */, - 1/* faload */, 2/* daload */, 1/* aaload */, 1/* baload */, - 1/* caload */, 1/* saload */, 0/* istore */, 0/* lstore */, - 0/* fstore */, 0/* dstore */, 0/* astore */, 0/* istore_0 */, - 0/* istore_1 */, 0/* istore_2 */, 0/* istore_3 */, 0/* lstore_0 */, - 0/* lstore_1 */, 0/* lstore_2 */, 0/* lstore_3 */, 0/* fstore_0 */, - 0/* fstore_1 */, 0/* fstore_2 */, 0/* fstore_3 */, 0/* dstore_0 */, - 0/* dstore_1 */, 0/* dstore_2 */, 0/* dstore_3 */, 0/* astore_0 */, - 0/* astore_1 */, 0/* astore_2 */, 0/* astore_3 */, 0/* iastore */, - 0/* lastore */, 0/* fastore */, 0/* dastore */, 0/* aastore */, - 0/* bastore */, 0/* castore */, 0/* sastore */, 0/* pop */, - 0/* pop2 */, 2/* dup */, 3/* dup_x1 */, 4/* dup_x2 */, 4/* dup2 */, - 5/* dup2_x1 */, 6/* dup2_x2 */, 2/* swap */, 1/* iadd */, 2/* ladd */, - 1/* fadd */, 2/* dadd */, 1/* isub */, 2/* lsub */, 1/* fsub */, - 2/* dsub */, 1/* imul */, 2/* lmul */, 1/* fmul */, 2/* dmul */, - 1/* idiv */, 2/* ldiv */, 1/* fdiv */, 2/* ddiv */, 1/* irem */, - 2/* lrem */, 1/* frem */, 2/* drem */, 1/* ineg */, 2/* lneg */, - 1/* fneg */, 2/* dneg */, 1/* ishl */, 2/* lshl */, 1/* ishr */, - 2/* lshr */, 1/* iushr */, 2/* lushr */, 1/* iand */, 2/* land */, - 1/* ior */, 2/* lor */, 1/* ixor */, 2/* lxor */, 0/* iinc */, - 2/* i2l */, 1/* i2f */, 2/* i2d */, 1/* l2i */, 1/* l2f */, - 2/* l2d */, 1/* f2i */, 2/* f2l */, 2/* f2d */, 1/* d2i */, - 2/* d2l */, 1/* d2f */, 1/* i2b */, 1/* i2c */, 1/* i2s */, - 1/* lcmp */, 1/* fcmpl */, 1/* fcmpg */, 1/* dcmpl */, 1/* dcmpg */, - 0/* ifeq */, 0/* ifne */, 0/* iflt */, 0/* ifge */, 0/* ifgt */, - 0/* ifle */, 0/* if_icmpeq */, 0/* if_icmpne */, 0/* if_icmplt */, - 0/* if_icmpge */, 0/* if_icmpgt */, 0/* if_icmple */, 0/* if_acmpeq */, - 0/* if_acmpne */, 0/* goto */, 1/* jsr */, 0/* ret */, - 0/* tableswitch */, 0/* lookupswitch */, 0/* ireturn */, - 0/* lreturn */, 0/* freturn */, 0/* dreturn */, 0/* areturn */, - 0/* return */, UNPREDICTABLE/* getstatic */, 0/* putstatic */, - UNPREDICTABLE/* getfield */, 0/* putfield */, - UNPREDICTABLE/* invokevirtual */, UNPREDICTABLE/* invokespecial */, - UNPREDICTABLE/* invokestatic */, UNPREDICTABLE/* invokeinterface */, - UNDEFINED, 1/* new */, 1/* newarray */, 1/* anewarray */, - 1/* arraylength */, 1/* athrow */, 1/* checkcast */, - 1/* instanceof */, 0/* monitorenter */, 0/* monitorexit */, - 0/* wide */, 1/* multianewarray */, 0/* ifnull */, - 0/* ifnonnull */, 0/* goto_w */, 1/* jsr_w */, 0/* breakpoint */, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, - UNDEFINED, UNDEFINED, UNDEFINED, UNPREDICTABLE/* impdep1 */, - UNPREDICTABLE /* impdep2 */ - }; - - /** - * Attributes and their corresponding names. - */ - public static final byte ATTR_UNKNOWN = -1; - public static final byte ATTR_SOURCE_FILE = 0; - public static final byte ATTR_CONSTANT_VALUE = 1; - public static final byte ATTR_CODE = 2; - public static final byte ATTR_EXCEPTIONS = 3; - public static final byte ATTR_LINE_NUMBER_TABLE = 4; - public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5; - public static final byte ATTR_INNER_CLASSES = 6; - public static final byte ATTR_SYNTHETIC = 7; - public static final byte ATTR_DEPRECATED = 8; - public static final byte ATTR_PMG = 9; - public static final byte ATTR_SIGNATURE = 10; - public static final byte ATTR_STACK_MAP = 11; - public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = 12; - public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; - public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = 14; - public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = 15; - public static final byte ATTR_ANNOTATION_DEFAULT = 16; - - public static final short KNOWN_ATTRIBUTES = 12;// should be 17 - - public static final String[] ATTRIBUTE_NAMES = { "SourceFile", - "ConstantValue", "Code", "Exceptions", "LineNumberTable", - "LocalVariableTable", "InnerClasses", "Synthetic", "Deprecated", - "PMGClass", "Signature", "StackMap", "RuntimeVisibleAnnotations", - "RuntimeInvisibleAnnotations", - "RuntimeVisibleParameterAnnotations", - "RuntimeInvisibleParameterAnnotations", "AnnotationDefault" }; - - /** - * Constants used in the StackMap attribute. - */ - public static final byte ITEM_Bogus = 0; - public static final byte ITEM_Integer = 1; - public static final byte ITEM_Float = 2; - public static final byte ITEM_Double = 3; - public static final byte ITEM_Long = 4; - public static final byte ITEM_Null = 5; - public static final byte ITEM_InitObject = 6; - public static final byte ITEM_Object = 7; - public static final byte ITEM_NewObject = 8; - - public static final String[] ITEM_NAMES = { "Bogus", "Integer", "Float", - "Double", "Long", "Null", "InitObject", "Object", "NewObject" }; -} diff --git a/src/org/apache/bcel/ExceptionConstants.java b/src/org/apache/bcel/ExceptionConstants.java deleted file mode 100644 index fe8f3ee..0000000 --- a/src/org/apache/bcel/ExceptionConstants.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel; - -/** - * Exception constants. - * - * @version $Id: ExceptionConstants.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author E. Haase - */ -public interface ExceptionConstants { - - /** - * The mother of all exceptions - */ - public static final Class THROWABLE = Throwable.class; - /** - * Super class of any run-time exception - */ - public static final Class RUNTIME_EXCEPTION = RuntimeException.class; - /** - * Super class of any linking exception (aka Linkage Error) - */ - public static final Class LINKING_EXCEPTION = LinkageError.class; - /** - * Linking Exceptions - */ - public static final Class CLASS_CIRCULARITY_ERROR = ClassCircularityError.class; - public static final Class CLASS_FORMAT_ERROR = ClassFormatError.class; - public static final Class EXCEPTION_IN_INITIALIZER_ERROR = ExceptionInInitializerError.class; - public static final Class INCOMPATIBLE_CLASS_CHANGE_ERROR = IncompatibleClassChangeError.class; - public static final Class ABSTRACT_METHOD_ERROR = AbstractMethodError.class; - public static final Class ILLEGAL_ACCESS_ERROR = IllegalAccessError.class; - public static final Class INSTANTIATION_ERROR = InstantiationError.class; - public static final Class NO_SUCH_FIELD_ERROR = NoSuchFieldError.class; - public static final Class NO_SUCH_METHOD_ERROR = NoSuchMethodError.class; - public static final Class NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class; - public static final Class UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class; - public static final Class VERIFY_ERROR = VerifyError.class; - /* UnsupportedClassVersionError is new in JDK 1.2 */ - // public static final Class UnsupportedClassVersionError = - // UnsupportedClassVersionError.class; - /** - * Run-Time Exceptions - */ - public static final Class NULL_POINTER_EXCEPTION = NullPointerException.class; - public static final Class ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = ArrayIndexOutOfBoundsException.class; - public static final Class ARITHMETIC_EXCEPTION = ArithmeticException.class; - public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class; - public static final Class CLASS_CAST_EXCEPTION = ClassCastException.class; - public static final Class ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class; - /** - * Pre-defined exception arrays according to chapters 5.1-5.4 of the Java - * Virtual Machine Specification - */ - public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = { - NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, - ABSTRACT_METHOD_ERROR, EXCEPTION_IN_INITIALIZER_ERROR, - ILLEGAL_ACCESS_ERROR }; // Chapter 5.1 - public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = { - NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR }; // Chapter - // 5.2 - public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter - // 5.3 - // (as - // below) - public static final Class[] EXCS_STRING_RESOLUTION = new Class[0]; - // Chapter 5.4 (no errors but the ones that _always_ could happen! How - // stupid.) - public static final Class[] EXCS_ARRAY_EXCEPTION = { - NULL_POINTER_EXCEPTION, ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION }; -} diff --git a/src/org/apache/bcel/Repository.java b/src/org/apache/bcel/Repository.java deleted file mode 100644 index b06ec8e..0000000 --- a/src/org/apache/bcel/Repository.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel; - -import java.io.IOException; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.util.ClassPath; -import org.apache.bcel.util.SyntheticRepository; - -/** - * The repository maintains informations about class interdependencies, e.g., - * whether a class is a sub-class of another. Delegates actual class loading to - * SyntheticRepository with current class path by default. - * - * @see org.apache.bcel.util.Repository - * @see org.apache.bcel.util.SyntheticRepository - * - * @version $Id: Repository.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class Repository { - - private static org.apache.bcel.util.Repository _repository = SyntheticRepository - .getInstance(); - - /** - * @return currently used repository instance - */ - public static org.apache.bcel.util.Repository getRepository() { - return _repository; - } - - /** - * Set repository instance to be used for class loading - */ - public static void setRepository(org.apache.bcel.util.Repository rep) { - _repository = rep; - } - - /** - * Lookup class somewhere found on your CLASSPATH, or whereever the - * repository instance looks for it. - * - * @return class object for given fully qualified class name - * @throws ClassNotFoundException - * if the class could not be found or parsed correctly - */ - public static JavaClass lookupClass(String class_name) - throws ClassNotFoundException { - return _repository.loadClass(class_name); - } - - /** - * Try to find class source using the internal repository instance. - * - * @see Class - * @return JavaClass object for given runtime class - * @throws ClassNotFoundException - * if the class could not be found or parsed correctly - */ - public static JavaClass lookupClass(Class clazz) - throws ClassNotFoundException { - return _repository.loadClass(clazz); - } - - /** - * @return class file object for given Java class by looking on the system - * class path; returns null if the class file can't be found - */ - public static ClassPath.ClassFile lookupClassFile(String class_name) { - try { - ClassPath path = _repository.getClassPath(); - if (path == null) { - return null; - } - return path.getClassFile(class_name); - } catch (IOException e) { - return null; - } - } - - /** - * Clear the repository. - */ - public static void clearCache() { - _repository.clear(); - } - - /** - * Add clazz to repository if there isn't an equally named class already in - * there. - * - * @return old entry in repository - */ - public static JavaClass addClass(JavaClass clazz) { - JavaClass old = _repository.findClass(clazz.getClassName()); - _repository.storeClass(clazz); - return old; - } - - /** - * Remove class with given (fully qualified) name from repository. - */ - public static void removeClass(String clazz) { - _repository.removeClass(_repository.findClass(clazz)); - } - - /** - * Remove given class from repository. - */ - public static void removeClass(JavaClass clazz) { - _repository.removeClass(clazz); - } - - /** - * @return list of super classes of clazz in ascending order, i.e., Object - * is always the last element - * @throws ClassNotFoundException - * if any of the superclasses can't be found - */ - public static JavaClass[] getSuperClasses(JavaClass clazz) - throws ClassNotFoundException { - return clazz.getSuperClasses(); - } - - /** - * @return list of super classes of clazz in ascending order, i.e., Object - * is always the last element. - * @throws ClassNotFoundException - * if the named class or any of its superclasses can't be found - */ - public static JavaClass[] getSuperClasses(String class_name) - throws ClassNotFoundException { - JavaClass jc = lookupClass(class_name); - return getSuperClasses(jc); - } - - /** - * @return all interfaces implemented by class and its super classes and the - * interfaces that those interfaces extend, and so on. (Some people - * call this a transitive hull). - * @throws ClassNotFoundException - * if any of the class's superclasses or superinterfaces can't - * be found - */ - public static JavaClass[] getInterfaces(JavaClass clazz) - throws ClassNotFoundException { - return clazz.getAllInterfaces(); - } - - /** - * @return all interfaces implemented by class and its super classes and the - * interfaces that extend those interfaces, and so on - * @throws ClassNotFoundException - * if the named class can't be found, or if any of its - * superclasses or superinterfaces can't be found - */ - public static JavaClass[] getInterfaces(String class_name) - throws ClassNotFoundException { - return getInterfaces(lookupClass(class_name)); - } - - /** - * Equivalent to runtime "instanceof" operator. - * - * @return true, if clazz is an instance of super_class - * @throws ClassNotFoundException - * if any superclasses or superinterfaces of clazz can't be - * found - */ - public static boolean instanceOf(JavaClass clazz, JavaClass super_class) - throws ClassNotFoundException { - return clazz.instanceOf(super_class); - } - - /** - * @return true, if clazz is an instance of super_class - * @throws ClassNotFoundException - * if either clazz or super_class can't be found - */ - public static boolean instanceOf(String clazz, String super_class) - throws ClassNotFoundException { - return instanceOf(lookupClass(clazz), lookupClass(super_class)); - } - - /** - * @return true, if clazz is an instance of super_class - * @throws ClassNotFoundException - * if super_class can't be found - */ - public static boolean instanceOf(JavaClass clazz, String super_class) - throws ClassNotFoundException { - return instanceOf(clazz, lookupClass(super_class)); - } - - /** - * @return true, if clazz is an instance of super_class - * @throws ClassNotFoundException - * if clazz can't be found - */ - public static boolean instanceOf(String clazz, JavaClass super_class) - throws ClassNotFoundException { - return instanceOf(lookupClass(clazz), super_class); - } - - /** - * @return true, if clazz is an implementation of interface inter - * @throws ClassNotFoundException - * if any superclasses or superinterfaces of clazz can't be - * found - */ - public static boolean implementationOf(JavaClass clazz, JavaClass inter) - throws ClassNotFoundException { - return clazz.implementationOf(inter); - } - - /** - * @return true, if clazz is an implementation of interface inter - * @throws ClassNotFoundException - * if clazz, inter, or any superclasses or superinterfaces of - * clazz can't be found - */ - public static boolean implementationOf(String clazz, String inter) - throws ClassNotFoundException { - return implementationOf(lookupClass(clazz), lookupClass(inter)); - } - - /** - * @return true, if clazz is an implementation of interface inter - * @throws ClassNotFoundException - * if inter or any superclasses or superinterfaces of clazz - * can't be found - */ - public static boolean implementationOf(JavaClass clazz, String inter) - throws ClassNotFoundException { - return implementationOf(clazz, lookupClass(inter)); - } - - /** - * @return true, if clazz is an implementation of interface inter - * @throws ClassNotFoundException - * if clazz or any superclasses or superinterfaces of clazz - * can't be found - */ - public static boolean implementationOf(String clazz, JavaClass inter) - throws ClassNotFoundException { - return implementationOf(lookupClass(clazz), inter); - } -} diff --git a/src/org/apache/bcel/classfile/AccessFlags.java b/src/org/apache/bcel/classfile/AccessFlags.java deleted file mode 100644 index 006f318..0000000 --- a/src/org/apache/bcel/classfile/AccessFlags.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import org.apache.bcel.Constants; - -/** - * Super class for all objects that have modifiers like private, final, ... I.e. - * classes, fields, and methods. - * - * @version $Id: AccessFlags.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class AccessFlags implements java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected int access_flags; - - public AccessFlags() { - } - - /** - * @param a - * inital access flags - */ - public AccessFlags(int a) { - access_flags = a; - } - - /** - * @return Access flags of the object aka. "modifiers". - */ - public final int getAccessFlags() { - return access_flags; - } - - /** - * @return Access flags of the object aka. "modifiers". - */ - public final int getModifiers() { - return access_flags; - } - - /** - * Set access flags aka "modifiers". - * - * @param access_flags - * Access flags of the object. - */ - public final void setAccessFlags(int access_flags) { - this.access_flags = access_flags; - } - - /** - * Set access flags aka "modifiers". - * - * @param access_flags - * Access flags of the object. - */ - public final void setModifiers(int access_flags) { - setAccessFlags(access_flags); - } - - private final void setFlag(int flag, boolean set) { - if ((access_flags & flag) != 0) { // Flag is set already - if (!set) { - access_flags ^= flag; - } - } else { // Flag not set - if (set) { - access_flags |= flag; - } - } - } - - public final void isPublic(boolean flag) { - setFlag(Constants.ACC_PUBLIC, flag); - } - - public final boolean isPublic() { - return (access_flags & Constants.ACC_PUBLIC) != 0; - } - - public final void isPrivate(boolean flag) { - setFlag(Constants.ACC_PRIVATE, flag); - } - - public final boolean isPrivate() { - return (access_flags & Constants.ACC_PRIVATE) != 0; - } - - public final void isProtected(boolean flag) { - setFlag(Constants.ACC_PROTECTED, flag); - } - - public final boolean isProtected() { - return (access_flags & Constants.ACC_PROTECTED) != 0; - } - - public final void isStatic(boolean flag) { - setFlag(Constants.ACC_STATIC, flag); - } - - public final boolean isStatic() { - return (access_flags & Constants.ACC_STATIC) != 0; - } - - public final void isFinal(boolean flag) { - setFlag(Constants.ACC_FINAL, flag); - } - - public final boolean isFinal() { - return (access_flags & Constants.ACC_FINAL) != 0; - } - - public final void isSynchronized(boolean flag) { - setFlag(Constants.ACC_SYNCHRONIZED, flag); - } - - public final boolean isSynchronized() { - return (access_flags & Constants.ACC_SYNCHRONIZED) != 0; - } - - public final void isVolatile(boolean flag) { - setFlag(Constants.ACC_VOLATILE, flag); - } - - public final boolean isVolatile() { - return (access_flags & Constants.ACC_VOLATILE) != 0; - } - - public final void isTransient(boolean flag) { - setFlag(Constants.ACC_TRANSIENT, flag); - } - - public final boolean isTransient() { - return (access_flags & Constants.ACC_TRANSIENT) != 0; - } - - public final void isNative(boolean flag) { - setFlag(Constants.ACC_NATIVE, flag); - } - - public final boolean isNative() { - return (access_flags & Constants.ACC_NATIVE) != 0; - } - - public final void isInterface(boolean flag) { - setFlag(Constants.ACC_INTERFACE, flag); - } - - public final boolean isInterface() { - return (access_flags & Constants.ACC_INTERFACE) != 0; - } - - public final void isAbstract(boolean flag) { - setFlag(Constants.ACC_ABSTRACT, flag); - } - - public final boolean isAbstract() { - return (access_flags & Constants.ACC_ABSTRACT) != 0; - } - - public final void isStrictfp(boolean flag) { - setFlag(Constants.ACC_STRICT, flag); - } - - public final boolean isStrictfp() { - return (access_flags & Constants.ACC_STRICT) != 0; - } - - public final void isSynthetic(boolean flag) { - setFlag(Constants.ACC_SYNTHETIC, flag); - } - - public final boolean isSynthetic() { - return (access_flags & Constants.ACC_SYNTHETIC) != 0; - } - - public final void isAnnotation(boolean flag) { - setFlag(Constants.ACC_ANNOTATION, flag); - } - - public final boolean isAnnotation() { - return (access_flags & Constants.ACC_ANNOTATION) != 0; - } - - public final void isEnum(boolean flag) { - setFlag(Constants.ACC_ENUM, flag); - } - - public final boolean isEnum() { - return (access_flags & Constants.ACC_ENUM) != 0; - } -} diff --git a/src/org/apache/bcel/classfile/Attribute.java b/src/org/apache/bcel/classfile/Attribute.java deleted file mode 100644 index 5225814..0000000 --- a/src/org/apache/bcel/classfile/Attribute.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -import org.apache.bcel.Constants; - -/** - * Abstract super class for Attribute objects. Currently the - * ConstantValue, SourceFile, Code, - * Exceptiontable, LineNumberTable, - * LocalVariableTable, InnerClasses and Synthetic - * attributes are supported. The Unknown attribute stands for - * non-standard-attributes. - * - * @version $Id: Attribute.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see ConstantValue - * @see SourceFile - * @see Code - * @see Unknown - * @see ExceptionTable - * @see LineNumberTable - * @see LocalVariableTable - * @see InnerClasses - * @see Synthetic - * @see Deprecated - * @see Signature - */ -public abstract class Attribute implements Cloneable, Node, Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected int name_index; // Points to attribute name in constant pool - protected int length; // Content length of attribute field - protected byte tag; // Tag to distiguish subclasses - protected ConstantPool constant_pool; - - protected Attribute(byte tag, int name_index, int length, - ConstantPool constant_pool) { - this.tag = tag; - this.name_index = name_index; - this.length = length; - this.constant_pool = constant_pool; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public abstract void accept(Visitor v); - - /** - * Dump attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - public void dump(DataOutputStream file) throws IOException { - file.writeShort(name_index); - file.writeInt(length); - } - - private static Map readers = new HashMap(); - - /** - * Add an Attribute reader capable of parsing (user-defined) attributes - * named "name". You should not add readers for the standard attributes such - * as "LineNumberTable", because those are handled internally. - * - * @param name - * the name of the attribute as stored in the class file - * @param r - * the reader object - */ - public static void addAttributeReader(String name, AttributeReader r) { - readers.put(name, r); - } - - /** - * Remove attribute reader - * - * @param name - * the name of the attribute as stored in the class file - */ - public static void removeAttributeReader(String name) { - readers.remove(name); - } - - /* - * Class method reads one attribute from the input data stream. This method - * must not be accessible from the outside. It is called by the Field and - * Method constructor methods. - * - * @see Field - * - * @see Method - * - * @param file Input stream - * - * @param constant_pool Array of constants - * - * @return Attribute - * - * @throws IOException - * - * @throws ClassFormatException - */ - public static final Attribute readAttribute(DataInputStream file, - ConstantPool constant_pool) throws IOException, - ClassFormatException { - ConstantUtf8 c; - String name; - int name_index; - int length; - byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute - // Get class name from constant pool via `name_index' indirection - name_index = file.readUnsignedShort(); - c = (ConstantUtf8) constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8); - name = c.getBytes(); - // Length of data in bytes - length = file.readInt(); - // Compare strings to find known attribute - for (byte i = 0; i < Constants.KNOWN_ATTRIBUTES; i++) { - if (name.equals(Constants.ATTRIBUTE_NAMES[i])) { - tag = i; // found! - break; - } - } - // Call proper constructor, depending on `tag' - switch (tag) { - case Constants.ATTR_UNKNOWN: - AttributeReader r = readers.get(name); - if (r != null) { - return r.createAttribute(name_index, length, file, - constant_pool); - } - return new Unknown(name_index, length, file, constant_pool); - case Constants.ATTR_CONSTANT_VALUE: - return new ConstantValue(name_index, length, file, constant_pool); - case Constants.ATTR_SOURCE_FILE: - return new SourceFile(name_index, length, file, constant_pool); - case Constants.ATTR_CODE: - return new Code(name_index, length, file, constant_pool); - case Constants.ATTR_EXCEPTIONS: - return new ExceptionTable(name_index, length, file, constant_pool); - case Constants.ATTR_LINE_NUMBER_TABLE: - return new LineNumberTable(name_index, length, file, constant_pool); - case Constants.ATTR_LOCAL_VARIABLE_TABLE: - return new LocalVariableTable(name_index, length, file, - constant_pool); - case Constants.ATTR_INNER_CLASSES: - return new InnerClasses(name_index, length, file, constant_pool); - case Constants.ATTR_SYNTHETIC: - return new Synthetic(name_index, length, file, constant_pool); - case Constants.ATTR_DEPRECATED: - return new Deprecated(name_index, length, file, constant_pool); - case Constants.ATTR_PMG: - return new PMGClass(name_index, length, file, constant_pool); - case Constants.ATTR_SIGNATURE: - return new Signature(name_index, length, file, constant_pool); - case Constants.ATTR_STACK_MAP: - return new StackMap(name_index, length, file, constant_pool); - // case Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS: - // return new RuntimeVisibleAnnotations(name_index, length, file, - // constant_pool); - // case Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS: - // return new RuntimeInvisibleAnnotations(name_index, length, file, - // constant_pool); - // case Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS: - // return new RuntimeVisibleParameterAnnotations(name_index, length, - // file, constant_pool); - // case Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS: - // return new RuntimeInvisibleParameterAnnotations(name_index, - // length, file, constant_pool); - // case Constants.ATTR_ANNOTATION_DEFAULT: - // return new AnnotationDefault(name_index, length, file, - // constant_pool); - default: // Never reached - throw new IllegalStateException("Ooops! default case reached."); - } - } - - /** - * @return Length of attribute field in bytes. - */ - public final int getLength() { - return length; - } - - /** - * @param length - * length in bytes. - */ - public final void setLength(int length) { - this.length = length; - } - - /** - * @param name_index - * of attribute. - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - /** - * @return Name index in constant pool of attribute name. - */ - public final int getNameIndex() { - return name_index; - } - - /** - * @return Tag of attribute, i.e., its type. Value may not be altered, thus - * there is no setTag() method. - */ - public final byte getTag() { - return tag; - } - - /** - * @return Constant pool used by this object. - * @see ConstantPool - */ - public final ConstantPool getConstantPool() { - return constant_pool; - } - - /** - * @param constant_pool - * Constant pool to be used for this object. - * @see ConstantPool - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } - - /** - * Use copy() if you want to have a deep copy(), i.e., with all references - * copied correctly. - * - * @return shallow copy of this attribute - */ - @Override - public Object clone() { - Object o = null; - try { - o = super.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); // Never occurs - } - return o; - } - - /** - * @return deep copy of this attribute - */ - public abstract Attribute copy(ConstantPool _constant_pool); - - /** - * @return attribute name. - */ - @Override - public String toString() { - return Constants.ATTRIBUTE_NAMES[tag]; - } -} diff --git a/src/org/apache/bcel/classfile/AttributeReader.java b/src/org/apache/bcel/classfile/AttributeReader.java deleted file mode 100644 index 5f0770a..0000000 --- a/src/org/apache/bcel/classfile/AttributeReader.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -/** - * Unknown (non-standard) attributes may be read via user-defined factory - * objects that can be registered with the Attribute.addAttributeReader method. - * These factory objects should implement this interface. - * - * @see Attribute - * @version $Id: AttributeReader.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface AttributeReader { - - /** - * When this attribute reader is added via the static method - * Attribute.addAttributeReader, an attribute name is associated with it. As - * the class file parser parses attributes, it will call various - * AttributeReaders based on the name of the attributes it is constructing. - * - * @param name_index - * An index into the constant pool, indexing a ConstantUtf8 that - * represents the name of the attribute. - * @param length - * The length of the data contained in the attribute. This is - * written into the constant pool and should agree with what the - * factory expects the length to be. - * @param file - * This is the data input stream that the factory needs to read - * its data from. - * @param constant_pool - * This is the constant pool associated with the Attribute that - * we are constructing. - * @return The user-defined AttributeReader should take this data and use it - * to construct an attribute. In the case of errors, a null can be - * returned which will cause the parsing of the class file to fail. - * @see Attribute#addAttributeReader(String, AttributeReader ) - */ - public Attribute createAttribute(int name_index, int length, - java.io.DataInputStream file, ConstantPool constant_pool); -} diff --git a/src/org/apache/bcel/classfile/ClassFormatException.java b/src/org/apache/bcel/classfile/ClassFormatException.java deleted file mode 100644 index ddc3fb6..0000000 --- a/src/org/apache/bcel/classfile/ClassFormatException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -/** - * Thrown when the BCEL attempts to read a class file and determines that the - * file is malformed or otherwise cannot be interpreted as a class file. - * - * @version $Id: ClassFormatException.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ClassFormatException extends RuntimeException { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public ClassFormatException() { - super(); - } - - public ClassFormatException(String s) { - super(s); - } -} diff --git a/src/org/apache/bcel/classfile/ClassParser.java b/src/org/apache/bcel/classfile/ClassParser.java deleted file mode 100644 index eda99ad..0000000 --- a/src/org/apache/bcel/classfile/ClassParser.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import org.apache.bcel.Constants; - -/** - * Wrapper class that parses a given Java .class file. The method parse returns a JavaClass object - * on success. When an I/O error or an inconsistency occurs an appropiate - * exception is propagated back to the caller. - * - * The structure and the names comply, except for a few conveniences, exactly - * with the JVM specification - * 1.0. See this paper for further details about the structure of a bytecode - * file. - * - * @version $Id: ClassParser.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class ClassParser { - - private DataInputStream file; - private boolean fileOwned; - private String file_name; - private String zip_file; - private int class_name_index, superclass_name_index; - private int major, minor; // Compiler version - private int access_flags; // Access rights of parsed class - private int[] interfaces; // Names of implemented interfaces - private ConstantPool constant_pool; // collection of constants - private Field[] fields; // class fields, i.e., its variables - private Method[] methods; // methods defined in the class - private Attribute[] attributes; // attributes defined in the class - private boolean is_zip; // Loaded from zip file - private static final int BUFSIZE = 8192; - - /** - * Parse class from the given stream. - * - * @param file - * Input stream - * @param file_name - * File name - */ - public ClassParser(InputStream file, String file_name) { - this.file_name = file_name; - fileOwned = false; - String clazz = file.getClass().getName(); // Not a very clean solution - // ... - is_zip = clazz.startsWith("java.util.zip.") - || clazz.startsWith("java.util.jar."); - if (file instanceof DataInputStream) { - this.file = (DataInputStream) file; - } else { - this.file = new DataInputStream(new BufferedInputStream(file, - BUFSIZE)); - } - } - - /** - * Parse class from given .class file. - * - * @param file_name - * file name - */ - public ClassParser(String file_name) throws IOException { - is_zip = false; - this.file_name = file_name; - fileOwned = true; - } - - /** - * Parse class from given .class file in a ZIP-archive - * - * @param zip_file - * zip file name - * @param file_name - * file name - */ - public ClassParser(String zip_file, String file_name) { - is_zip = true; - fileOwned = true; - this.zip_file = zip_file; - this.file_name = file_name; - } - - /** - * Parse the given Java class file and return an object that represents the - * contained data, i.e., constants, methods, fields and commands. A - * ClassFormatException is raised, if the file is not a valid - * .class file. (This does not include verification of the byte code as it - * is performed by the java interpreter). - * - * @return Class object representing the parsed class file - * @throws IOException - * @throws ClassFormatException - */ - public JavaClass parse() throws IOException, ClassFormatException { - ZipFile zip = null; - try { - if (fileOwned) { - if (is_zip) { - zip = new ZipFile(zip_file); - ZipEntry entry = zip.getEntry(file_name); - file = new DataInputStream(new BufferedInputStream( - zip.getInputStream(entry), BUFSIZE)); - } else { - file = new DataInputStream(new BufferedInputStream( - new FileInputStream(file_name), BUFSIZE)); - } - } - /****************** Read headers ********************************/ - // Check magic tag of class file - readID(); - // Get compiler version - readVersion(); - /****************** Read constant pool and related **************/ - // Read constant pool entries - readConstantPool(); - // Get class information - readClassInfo(); - // Get interface information, i.e., implemented interfaces - readInterfaces(); - /****************** Read class fields and methods ***************/ - // Read class fields, i.e., the variables of the class - readFields(); - // Read class methods, i.e., the functions in the class - readMethods(); - // Read class attributes - readAttributes(); - // Check for unknown variables - // Unknown[] u = Unknown.getUnknownAttributes(); - // for(int i=0; i < u.length; i++) - // System.err.println("WARNING: " + u[i]); - // Everything should have been read now - // if(file.available() > 0) { - // int bytes = file.available(); - // byte[] buf = new byte[bytes]; - // file.read(buf); - // if(!(is_zip && (buf.length == 1))) { - // System.err.println("WARNING: Trailing garbage at end of " + - // file_name); - // System.err.println(bytes + " extra bytes: " + - // Utility.toHexString(buf)); - // } - // } - } finally { - // Read everything of interest, so close the file - if (fileOwned) { - file.close(); - if (zip != null) { - zip.close(); - } - } - } - // Return the information we have gathered in a new object - return new JavaClass(class_name_index, superclass_name_index, - file_name, major, minor, access_flags, constant_pool, - interfaces, fields, methods, attributes, is_zip ? JavaClass.ZIP - : JavaClass.FILE); - } - - /** - * Read information about the attributes of the class. - * - * @throws IOException - * @throws ClassFormatException - */ - private final void readAttributes() throws IOException, - ClassFormatException { - int attributes_count; - attributes_count = file.readUnsignedShort(); - attributes = new Attribute[attributes_count]; - for (int i = 0; i < attributes_count; i++) { - attributes[i] = Attribute.readAttribute(file, constant_pool); - } - } - - /** - * Read information about the class and its super class. - * - * @throws IOException - * @throws ClassFormatException - */ - private final void readClassInfo() throws IOException, ClassFormatException { - access_flags = file.readUnsignedShort(); - /* - * Interfaces are implicitely abstract, the flag should be set according - * to the JVM specification. - */ - if ((access_flags & Constants.ACC_INTERFACE) != 0) { - access_flags |= Constants.ACC_ABSTRACT; - } - if (((access_flags & Constants.ACC_ABSTRACT) != 0) - && ((access_flags & Constants.ACC_FINAL) != 0)) { - throw new ClassFormatException( - "Class can't be both final and abstract"); - } - class_name_index = file.readUnsignedShort(); - superclass_name_index = file.readUnsignedShort(); - } - - /** - * Read constant pool entries. - * - * @throws IOException - * @throws ClassFormatException - */ - private final void readConstantPool() throws IOException, - ClassFormatException { - constant_pool = new ConstantPool(file); - } - - /** - * Read information about the fields of the class, i.e., its variables. - * - * @throws IOException - * @throws ClassFormatException - */ - private final void readFields() throws IOException, ClassFormatException { - int fields_count; - fields_count = file.readUnsignedShort(); - fields = new Field[fields_count]; - for (int i = 0; i < fields_count; i++) { - fields[i] = new Field(file, constant_pool); - } - } - - /******************** Private utility methods **********************/ - /** - * Check whether the header of the file is ok. Of course, this has to be the - * first action on successive file reads. - * - * @throws IOException - * @throws ClassFormatException - */ - private final void readID() throws IOException, ClassFormatException { - int magic = 0xCAFEBABE; - if (file.readInt() != magic) { - throw new ClassFormatException(file_name - + " is not a Java .class file"); - } - } - - /** - * Read information about the interfaces implemented by this class. - * - * @throws IOException - * @throws ClassFormatException - */ - private final void readInterfaces() throws IOException, - ClassFormatException { - int interfaces_count; - interfaces_count = file.readUnsignedShort(); - interfaces = new int[interfaces_count]; - for (int i = 0; i < interfaces_count; i++) { - interfaces[i] = file.readUnsignedShort(); - } - } - - /** - * Read information about the methods of the class. - * - * @throws IOException - * @throws ClassFormatException - */ - private final void readMethods() throws IOException, ClassFormatException { - int methods_count; - methods_count = file.readUnsignedShort(); - methods = new Method[methods_count]; - for (int i = 0; i < methods_count; i++) { - methods[i] = new Method(file, constant_pool); - } - } - - /** - * Read major and minor version of compiler which created the file. - * - * @throws IOException - * @throws ClassFormatException - */ - private final void readVersion() throws IOException, ClassFormatException { - minor = file.readUnsignedShort(); - major = file.readUnsignedShort(); - } -} diff --git a/src/org/apache/bcel/classfile/Code.java b/src/org/apache/bcel/classfile/Code.java deleted file mode 100644 index 772fb2b..0000000 --- a/src/org/apache/bcel/classfile/Code.java +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class represents a chunk of Java byte code contained in a method. It is - * instantiated by the Attribute.readAttribute() method. A - * Code attribute contains informations about operand stack, local - * variables, byte code and the exceptions handled within this method. - * - * This attribute has attributes itself, namely LineNumberTable which - * is used for debugging purposes and LocalVariableTable which contains - * information about the local variables. - * - * @version $Id: Code.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Attribute - * @see CodeException - * @see LineNumberTable - * @see LocalVariableTable - */ -public final class Code extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int max_stack; // Maximum size of stack used by this method - private int max_locals; // Number of local variables - private int code_length; // Length of code in bytes - private byte[] code; // Actual byte code - private int exception_table_length; - private CodeException[] exception_table; // Table of handled exceptions - private int attributes_count; // Attributes of code: LineNumber - private Attribute[] attributes; // or LocalVariable - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public Code(Code c) { - this(c.getNameIndex(), c.getLength(), c.getMaxStack(), - c.getMaxLocals(), c.getCode(), c.getExceptionTable(), c - .getAttributes(), c.getConstantPool()); - } - - /** - * @param name_index - * Index pointing to the name Code - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - */ - Code(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - // Initialize with some default values which will be overwritten later - this(name_index, length, file.readUnsignedShort(), file - .readUnsignedShort(), (byte[]) null, (CodeException[]) null, - (Attribute[]) null, constant_pool); - code_length = file.readInt(); - code = new byte[code_length]; // Read byte code - file.readFully(code); - /* - * Read exception table that contains all regions where an exception - * handler is active, i.e., a try { ... } catch() block. - */ - exception_table_length = file.readUnsignedShort(); - exception_table = new CodeException[exception_table_length]; - for (int i = 0; i < exception_table_length; i++) { - exception_table[i] = new CodeException(file); - } - /* - * Read all attributes, currently `LineNumberTable' and - * `LocalVariableTable' - */ - attributes_count = file.readUnsignedShort(); - attributes = new Attribute[attributes_count]; - for (int i = 0; i < attributes_count; i++) { - attributes[i] = Attribute.readAttribute(file, constant_pool); - } - /* - * Adjust length, because of setAttributes in this(), s.b. length is - * incorrect, because it didn't take the internal attributes into - * account yet! Very subtle bug, fixed in 3.1.1. - */ - this.length = length; - } - - /** - * @param name_index - * Index pointing to the name Code - * @param length - * Content length in bytes - * @param max_stack - * Maximum size of stack - * @param max_locals - * Number of local variables - * @param code - * Actual byte code - * @param exception_table - * Table of handled exceptions - * @param attributes - * Attributes of code: LineNumber or LocalVariable - * @param constant_pool - * Array of constants - */ - public Code(int name_index, int length, int max_stack, int max_locals, - byte[] code, CodeException[] exception_table, - Attribute[] attributes, ConstantPool constant_pool) { - super(Constants.ATTR_CODE, name_index, length, constant_pool); - this.max_stack = max_stack; - this.max_locals = max_locals; - setCode(code); - setExceptionTable(exception_table); - setAttributes(attributes); // Overwrites length! - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitCode(this); - } - - /** - * Dump code attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(max_stack); - file.writeShort(max_locals); - file.writeInt(code_length); - file.write(code, 0, code_length); - file.writeShort(exception_table_length); - for (int i = 0; i < exception_table_length; i++) { - exception_table[i].dump(file); - } - file.writeShort(attributes_count); - for (int i = 0; i < attributes_count; i++) { - attributes[i].dump(file); - } - } - - /** - * @return Collection of code attributes. - * @see Attribute - */ - public final Attribute[] getAttributes() { - return attributes; - } - - /** - * @return LineNumberTable of Code, if it has one - */ - public LineNumberTable getLineNumberTable() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i] instanceof LineNumberTable) { - return (LineNumberTable) attributes[i]; - } - } - return null; - } - - /** - * @return LocalVariableTable of Code, if it has one - */ - public LocalVariableTable getLocalVariableTable() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i] instanceof LocalVariableTable) { - return (LocalVariableTable) attributes[i]; - } - } - return null; - } - - /** - * @return Actual byte code of the method. - */ - public final byte[] getCode() { - return code; - } - - /** - * @return Table of handled exceptions. - * @see CodeException - */ - public final CodeException[] getExceptionTable() { - return exception_table; - } - - /** - * @return Number of local variables. - */ - public final int getMaxLocals() { - return max_locals; - } - - /** - * @return Maximum size of stack used by this method. - */ - public final int getMaxStack() { - return max_stack; - } - - /** - * @return the internal length of this code attribute (minus the first 6 - * bytes) and excluding all its attributes - */ - private final int getInternalLength() { - return 2 /* max_stack */+ 2 /* max_locals */+ 4 /* code length */ - + code_length /* byte-code */ - + 2 /* exception-table length */ - + 8 * exception_table_length /* exception table */ - + 2 /* attributes count */; - } - - /** - * @return the full size of this code attribute, minus its first 6 bytes, - * including the size of all its contained attributes - */ - private final int calculateLength() { - int len = 0; - for (int i = 0; i < attributes_count; i++) { - len += attributes[i].length + 6 /* attribute header size */; - } - return len + getInternalLength(); - } - - /** - * @param attributes - * the attributes to set for this Code - */ - public final void setAttributes(Attribute[] attributes) { - this.attributes = attributes; - attributes_count = (attributes == null) ? 0 : attributes.length; - length = calculateLength(); // Adjust length - } - - /** - * @param code - * byte code - */ - public final void setCode(byte[] code) { - this.code = code; - code_length = (code == null) ? 0 : code.length; - } - - /** - * @param exception_table - * exception table - */ - public final void setExceptionTable(CodeException[] exception_table) { - this.exception_table = exception_table; - exception_table_length = (exception_table == null) ? 0 - : exception_table.length; - } - - /** - * @param max_locals - * maximum number of local variables - */ - public final void setMaxLocals(int max_locals) { - this.max_locals = max_locals; - } - - /** - * @param max_stack - * maximum stack size - */ - public final void setMaxStack(int max_stack) { - this.max_stack = max_stack; - } - - /** - * @return String representation of code chunk. - */ - public final String toString(boolean verbose) { - StringBuffer buf; - buf = new StringBuffer(100); - buf.append("Code(max_stack = ") - .append(max_stack) - .append(", max_locals = ") - .append(max_locals) - .append(", code_length = ") - .append(code_length) - .append(")\n") - .append(Utility.codeToString(code, constant_pool, 0, -1, - verbose)); - if (exception_table_length > 0) { - buf.append("\nException handler(s) = \n").append( - "From\tTo\tHandler\tType\n"); - for (int i = 0; i < exception_table_length; i++) { - buf.append(exception_table[i].toString(constant_pool, verbose)) - .append("\n"); - } - } - if (attributes_count > 0) { - buf.append("\nAttribute(s) = \n"); - for (int i = 0; i < attributes_count; i++) { - buf.append(attributes[i].toString()).append("\n"); - } - } - return buf.toString(); - } - - /** - * @return String representation of code chunk. - */ - @Override - public final String toString() { - return toString(true); - } - - /** - * @return deep copy of this attribute - * - * @param _constant_pool - * the constant pool to duplicate - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - Code c = (Code) clone(); - if (code != null) { - c.code = new byte[code.length]; - System.arraycopy(code, 0, c.code, 0, code.length); - } - c.constant_pool = _constant_pool; - c.exception_table = new CodeException[exception_table_length]; - for (int i = 0; i < exception_table_length; i++) { - c.exception_table[i] = exception_table[i].copy(); - } - c.attributes = new Attribute[attributes_count]; - for (int i = 0; i < attributes_count; i++) { - c.attributes[i] = attributes[i].copy(_constant_pool); - } - return c; - } -} diff --git a/src/org/apache/bcel/classfile/CodeException.java b/src/org/apache/bcel/classfile/CodeException.java deleted file mode 100644 index c4a5f2f..0000000 --- a/src/org/apache/bcel/classfile/CodeException.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.Serializable; -import org.apache.bcel.Constants; - -/** - * This class represents an entry in the exception table of the Code - * attribute and is used only there. It contains a range in which a particular - * exception handler is active. - * - * @version $Id: CodeException.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Code - */ -public final class CodeException implements Cloneable, Constants, Node, - Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int start_pc; // Range in the code the exception handler is - private int end_pc; // active. start_pc is inclusive, end_pc exclusive - private int handler_pc; /* - * Starting address of exception handler, i.e., an - * offset from start of code. - */ - private int catch_type; /* - * If this is zero the handler catches any - * exception, otherwise it points to the exception - * class which is to be caught. - */ - - /** - * Initialize from another object. - */ - public CodeException(CodeException c) { - this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType()); - } - - /** - * Construct object from file stream. - * - * @param file - * Input stream - * @throws IOException - */ - CodeException(DataInputStream file) throws IOException { - this(file.readUnsignedShort(), file.readUnsignedShort(), file - .readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param start_pc - * Range in the code the exception handler is active, start_pc is - * inclusive while - * @param end_pc - * is exclusive - * @param handler_pc - * Starting address of exception handler, i.e., an offset from - * start of code. - * @param catch_type - * If zero the handler catches any exception, otherwise it points - * to the exception class which is to be caught. - */ - public CodeException(int start_pc, int end_pc, int handler_pc, - int catch_type) { - this.start_pc = start_pc; - this.end_pc = end_pc; - this.handler_pc = handler_pc; - this.catch_type = catch_type; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitCodeException(this); - } - - /** - * Dump code exception to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException { - file.writeShort(start_pc); - file.writeShort(end_pc); - file.writeShort(handler_pc); - file.writeShort(catch_type); - } - - /** - * @return 0, if the handler catches any exception, otherwise it points to - * the exception class which is to be caught. - */ - public final int getCatchType() { - return catch_type; - } - - /** - * @return Exclusive end index of the region where the handler is active. - */ - public final int getEndPC() { - return end_pc; - } - - /** - * @return Starting address of exception handler, relative to the code. - */ - public final int getHandlerPC() { - return handler_pc; - } - - /** - * @return Inclusive start index of the region where the handler is active. - */ - public final int getStartPC() { - return start_pc; - } - - /** - * @param catch_type - * the type of exception that is caught - */ - public final void setCatchType(int catch_type) { - this.catch_type = catch_type; - } - - /** - * @param end_pc - * end of handled block - */ - public final void setEndPC(int end_pc) { - this.end_pc = end_pc; - } - - /** - * @param handler_pc - * where the actual code is - */ - public final void setHandlerPC(int handler_pc) { - this.handler_pc = handler_pc; - } - - /** - * @param start_pc - * start of handled block - */ - public final void setStartPC(int start_pc) { - this.start_pc = start_pc; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - return "CodeException(start_pc = " + start_pc + ", end_pc = " + end_pc - + ", handler_pc = " + handler_pc + ", catch_type = " - + catch_type + ")"; - } - - /** - * @return String representation. - */ - public final String toString(ConstantPool cp, boolean verbose) { - String str; - if (catch_type == 0) { - str = "(0)"; - } else { - str = Utility.compactClassName( - cp.getConstantString(catch_type, CONSTANT_Class), false) - + (verbose ? "(" + catch_type + ")" : ""); - } - return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str; - } - - public final String toString(ConstantPool cp) { - return toString(cp, true); - } - - /** - * @return deep copy of this object - */ - public CodeException copy() { - try { - return (CodeException) clone(); - } catch (CloneNotSupportedException e) { - } - return null; - } -} diff --git a/src/org/apache/bcel/classfile/Constant.java b/src/org/apache/bcel/classfile/Constant.java deleted file mode 100644 index f2343a8..0000000 --- a/src/org/apache/bcel/classfile/Constant.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.Serializable; -import org.apache.bcel.Constants; -import org.apache.bcel.util.BCELComparator; - -/** - * Abstract superclass for classes to represent the different constant types in - * the constant pool of a class file. The classes keep closely to the JVM - * specification. - * - * @version $Id: Constant.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class Constant implements Cloneable, Node, Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private static BCELComparator _cmp = new BCELComparator() { - - @Override - public boolean equals(Object o1, Object o2) { - Constant THIS = (Constant) o1; - Constant THAT = (Constant) o2; - return THIS.toString().equals(THAT.toString()); - } - - @Override - public int hashCode(Object o) { - Constant THIS = (Constant) o; - return THIS.toString().hashCode(); - } - }; - /* - * In fact this tag is redundant since we can distinguish different - * `Constant' objects by their type, i.e., via `instanceof'. In some places - * we will use the tag for switch()es anyway. - * - * First, we want match the specification as closely as possible. Second we - * need the tag as an index to select the corresponding class name from the - * `CONSTANT_NAMES' array. - */ - protected byte tag; - - Constant(byte tag) { - this.tag = tag; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public abstract void accept(Visitor v); - - public abstract void dump(DataOutputStream file) throws IOException; - - /** - * @return Tag of constant, i.e., its type. No setTag() method to avoid - * confusion. - */ - public final byte getTag() { - return tag; - } - - /** - * @return String representation. - */ - @Override - public String toString() { - return Constants.CONSTANT_NAMES[tag] + "[" + tag + "]"; - } - - /** - * @return deep copy of this constant - */ - public Constant copy() { - try { - return (Constant) super.clone(); - } catch (CloneNotSupportedException e) { - } - return null; - } - - @Override - public Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - /** - * Read one constant from the given file, the type depends on a tag byte. - * - * @param file - * Input stream - * @return Constant object - */ - static final Constant readConstant(DataInputStream file) - throws IOException, ClassFormatException { - byte b = file.readByte(); // Read tag byte - switch (b) { - case Constants.CONSTANT_Class: - return new ConstantClass(file); - case Constants.CONSTANT_Fieldref: - return new ConstantFieldref(file); - case Constants.CONSTANT_Methodref: - return new ConstantMethodref(file); - case Constants.CONSTANT_InterfaceMethodref: - return new ConstantInterfaceMethodref(file); - case Constants.CONSTANT_String: - return new ConstantString(file); - case Constants.CONSTANT_Integer: - return new ConstantInteger(file); - case Constants.CONSTANT_Float: - return new ConstantFloat(file); - case Constants.CONSTANT_Long: - return new ConstantLong(file); - case Constants.CONSTANT_Double: - return new ConstantDouble(file); - case Constants.CONSTANT_NameAndType: - return new ConstantNameAndType(file); - case Constants.CONSTANT_Utf8: - return new ConstantUtf8(file); - default: - throw new ClassFormatException( - "Invalid byte tag in constant pool: " + b); - } - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator - * Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. By default two - * Constant objects are said to be equal when the result of toString() is - * equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. By default - * return the hashcode of the result of toString(). - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return _cmp.hashCode(this); - } -} diff --git a/src/org/apache/bcel/classfile/ConstantCP.java b/src/org/apache/bcel/classfile/ConstantCP.java deleted file mode 100644 index cfe7408..0000000 --- a/src/org/apache/bcel/classfile/ConstantCP.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * Abstract super class for Fieldref and Methodref constants. - * - * @version $Id: ConstantCP.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see ConstantFieldref - * @see ConstantMethodref - * @see ConstantInterfaceMethodref - */ -public abstract class ConstantCP extends Constant { - - /** - * - */ - private static final long serialVersionUID = 1L; - /** - * References to the constants containing the class and the field signature - */ - protected int class_index, name_and_type_index; - - /** - * Initialize from another object. - */ - public ConstantCP(ConstantCP c) { - this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex()); - } - - /** - * Initialize instance from file data. - * - * @param tag - * Constant type tag - * @param file - * Input stream - * @throws IOException - */ - ConstantCP(byte tag, DataInputStream file) throws IOException { - this(tag, file.readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param class_index - * Reference to the class containing the field - * @param name_and_type_index - * and the field signature - */ - protected ConstantCP(byte tag, int class_index, int name_and_type_index) { - super(tag); - this.class_index = class_index; - this.name_and_type_index = name_and_type_index; - } - - /** - * Dump constant field reference to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(tag); - file.writeShort(class_index); - file.writeShort(name_and_type_index); - } - - /** - * @return Reference (index) to class this field or method belongs to. - */ - public final int getClassIndex() { - return class_index; - } - - /** - * @return Reference (index) to signature of the field. - */ - public final int getNameAndTypeIndex() { - return name_and_type_index; - } - - /** - * @param class_index - * points to Constant_class - */ - public final void setClassIndex(int class_index) { - this.class_index = class_index; - } - - /** - * @return Class this field belongs to. - */ - public String getClass(ConstantPool cp) { - return cp.constantToString(class_index, Constants.CONSTANT_Class); - } - - /** - * @param name_and_type_index - * points to Constant_NameAndType - */ - public final void setNameAndTypeIndex(int name_and_type_index) { - this.name_and_type_index = name_and_type_index; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - return super.toString() + "(class_index = " + class_index - + ", name_and_type_index = " + name_and_type_index + ")"; - } -} diff --git a/src/org/apache/bcel/classfile/ConstantClass.java b/src/org/apache/bcel/classfile/ConstantClass.java deleted file mode 100644 index 32d47e7..0000000 --- a/src/org/apache/bcel/classfile/ConstantClass.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from the abstract Constant class and - * represents a reference to a (external) class. - * - * @version $Id: ConstantClass.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public final class ConstantClass extends Constant implements ConstantObject { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int name_index; // Identical to ConstantString except for the name - - /** - * Initialize from another object. - */ - public ConstantClass(ConstantClass c) { - this(c.getNameIndex()); - } - - /** - * Initialize instance from file data. - * - * @param file - * Input stream - * @throws IOException - */ - ConstantClass(DataInputStream file) throws IOException { - this(file.readUnsignedShort()); - } - - /** - * @param name_index - * Name index in constant pool. Should refer to a ConstantUtf8. - */ - public ConstantClass(int name_index) { - super(Constants.CONSTANT_Class); - this.name_index = name_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantClass(this); - } - - /** - * Dump constant class to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(tag); - file.writeShort(name_index); - } - - /** - * @return Name index in constant pool of class name. - */ - public final int getNameIndex() { - return name_index; - } - - /** - * @param name_index - * the name index in the constant pool of this Constant Class - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - /** - * @return String object - */ - @Override - public Object getConstantValue(ConstantPool cp) { - Constant c = cp.getConstant(name_index, Constants.CONSTANT_Utf8); - return ((ConstantUtf8) c).getBytes(); - } - - /** - * @return dereferenced string - */ - public String getBytes(ConstantPool cp) { - return (String) getConstantValue(cp); - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - return super.toString() + "(name_index = " + name_index + ")"; - } -} diff --git a/src/org/apache/bcel/classfile/ConstantDouble.java b/src/org/apache/bcel/classfile/ConstantDouble.java deleted file mode 100644 index 7874b49..0000000 --- a/src/org/apache/bcel/classfile/ConstantDouble.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from the abstract Constant class and - * represents a reference to a Double object. - * - * @version $Id: ConstantDouble.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public final class ConstantDouble extends Constant implements ConstantObject { - - /** - * - */ - private static final long serialVersionUID = 1L; - private double bytes; - - /** - * @param bytes - * Data - */ - public ConstantDouble(double bytes) { - super(Constants.CONSTANT_Double); - this.bytes = bytes; - } - - /** - * Initialize from another object. - */ - public ConstantDouble(ConstantDouble c) { - this(c.getBytes()); - } - - /** - * Initialize instance from file data. - * - * @param file - * Input stream - * @throws IOException - */ - ConstantDouble(DataInputStream file) throws IOException { - this(file.readDouble()); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantDouble(this); - } - - /** - * Dump constant double to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(tag); - file.writeDouble(bytes); - } - - /** - * @return data, i.e., 8 bytes. - */ - public final double getBytes() { - return bytes; - } - - /** - * @param bytes - * the raw bytes that represent the double value - */ - public final void setBytes(double bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - return super.toString() + "(bytes = " + bytes + ")"; - } - - /** - * @return Double object - */ - @Override - public Object getConstantValue(ConstantPool cp) { - return new Double(bytes); - } -} diff --git a/src/org/apache/bcel/classfile/ConstantFieldref.java b/src/org/apache/bcel/classfile/ConstantFieldref.java deleted file mode 100644 index 333c080..0000000 --- a/src/org/apache/bcel/classfile/ConstantFieldref.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class represents a constant pool reference to a field. - * - * @version $Id: ConstantFieldref.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class ConstantFieldref extends ConstantCP { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Initialize from another object. - */ - public ConstantFieldref(ConstantFieldref c) { - super(Constants.CONSTANT_Fieldref, c.getClassIndex(), c - .getNameAndTypeIndex()); - } - - /** - * Initialize instance from file data. - * - * @param file - * input stream - * @throws IOException - */ - ConstantFieldref(DataInputStream file) throws IOException { - super(Constants.CONSTANT_Fieldref, file); - } - - /** - * @param class_index - * Reference to the class containing the Field - * @param name_and_type_index - * and the Field signature - */ - public ConstantFieldref(int class_index, int name_and_type_index) { - super(Constants.CONSTANT_Fieldref, class_index, name_and_type_index); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of Fields, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantFieldref(this); - } -} diff --git a/src/org/apache/bcel/classfile/ConstantFloat.java b/src/org/apache/bcel/classfile/ConstantFloat.java deleted file mode 100644 index 0f94c96..0000000 --- a/src/org/apache/bcel/classfile/ConstantFloat.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from the abstract Constant class and - * represents a reference to a float object. - * - * @version $Id: ConstantFloat.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public final class ConstantFloat extends Constant implements ConstantObject { - - /** - * - */ - private static final long serialVersionUID = 1L; - private float bytes; - - /** - * @param bytes - * Data - */ - public ConstantFloat(float bytes) { - super(Constants.CONSTANT_Float); - this.bytes = bytes; - } - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public ConstantFloat(ConstantFloat c) { - this(c.getBytes()); - } - - /** - * Initialize instance from file data. - * - * @param file - * Input stream - * @throws IOException - */ - ConstantFloat(DataInputStream file) throws IOException { - this(file.readFloat()); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantFloat(this); - } - - /** - * Dump constant float to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(tag); - file.writeFloat(bytes); - } - - /** - * @return data, i.e., 4 bytes. - */ - public final float getBytes() { - return bytes; - } - - /** - * @param bytes - * the raw bytes that represent this float - */ - public final void setBytes(float bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - return super.toString() + "(bytes = " + bytes + ")"; - } - - /** - * @return Float object - */ - @Override - public Object getConstantValue(ConstantPool cp) { - return new Float(bytes); - } -} diff --git a/src/org/apache/bcel/classfile/ConstantInteger.java b/src/org/apache/bcel/classfile/ConstantInteger.java deleted file mode 100644 index b24f552..0000000 --- a/src/org/apache/bcel/classfile/ConstantInteger.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from the abstract Constant class and - * represents a reference to an int object. - * - * @version $Id: ConstantInteger.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public final class ConstantInteger extends Constant implements ConstantObject { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int bytes; - - /** - * @param bytes - * Data - */ - public ConstantInteger(int bytes) { - super(Constants.CONSTANT_Integer); - this.bytes = bytes; - } - - /** - * Initialize from another object. - */ - public ConstantInteger(ConstantInteger c) { - this(c.getBytes()); - } - - /** - * Initialize instance from file data. - * - * @param file - * Input stream - * @throws IOException - */ - ConstantInteger(DataInputStream file) throws IOException { - this(file.readInt()); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantInteger(this); - } - - /** - * Dump constant integer to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(tag); - file.writeInt(bytes); - } - - /** - * @return data, i.e., 4 bytes. - */ - public final int getBytes() { - return bytes; - } - - /** - * @param bytes - * the raw bytes that represent this integer - */ - public final void setBytes(int bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - return super.toString() + "(bytes = " + bytes + ")"; - } - - /** - * @return Integer object - */ - @Override - public Object getConstantValue(ConstantPool cp) { - return new Integer(bytes); - } -} diff --git a/src/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/org/apache/bcel/classfile/ConstantInterfaceMethodref.java deleted file mode 100644 index 4d05ed7..0000000 --- a/src/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class represents a constant pool reference to an interface method. - * - * @version $Id: ConstantInterfaceMethodref.java 386056 2006-03-15 11:31:56Z - * tcurdt $ - * @author M. Dahm - */ -public final class ConstantInterfaceMethodref extends ConstantCP { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Initialize from another object. - */ - public ConstantInterfaceMethodref(ConstantInterfaceMethodref c) { - super(Constants.CONSTANT_InterfaceMethodref, c.getClassIndex(), c - .getNameAndTypeIndex()); - } - - /** - * Initialize instance from file data. - * - * @param file - * input stream - * @throws IOException - */ - ConstantInterfaceMethodref(DataInputStream file) throws IOException { - super(Constants.CONSTANT_InterfaceMethodref, file); - } - - /** - * @param class_index - * Reference to the class containing the method - * @param name_and_type_index - * and the method signature - */ - public ConstantInterfaceMethodref(int class_index, int name_and_type_index) { - super(Constants.CONSTANT_InterfaceMethodref, class_index, - name_and_type_index); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantInterfaceMethodref(this); - } -} diff --git a/src/org/apache/bcel/classfile/ConstantLong.java b/src/org/apache/bcel/classfile/ConstantLong.java deleted file mode 100644 index 8a6f0f1..0000000 --- a/src/org/apache/bcel/classfile/ConstantLong.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from the abstract Constant class and - * represents a reference to a long object. - * - * @version $Id: ConstantLong.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public final class ConstantLong extends Constant implements ConstantObject { - - /** - * - */ - private static final long serialVersionUID = 1L; - private long bytes; - - /** - * @param bytes - * Data - */ - public ConstantLong(long bytes) { - super(Constants.CONSTANT_Long); - this.bytes = bytes; - } - - /** - * Initialize from another object. - */ - public ConstantLong(ConstantLong c) { - this(c.getBytes()); - } - - /** - * Initialize instance from file data. - * - * @param file - * Input stream - * @throws IOException - */ - ConstantLong(DataInputStream file) throws IOException { - this(file.readLong()); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantLong(this); - } - - /** - * Dump constant long to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(tag); - file.writeLong(bytes); - } - - /** - * @return data, i.e., 8 bytes. - */ - public final long getBytes() { - return bytes; - } - - /** - * @param bytes - * thr raw bytes that represent this long - */ - public final void setBytes(long bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - return super.toString() + "(bytes = " + bytes + ")"; - } - - /** - * @return Long object - */ - @Override - public Object getConstantValue(ConstantPool cp) { - return new Long(bytes); - } -} diff --git a/src/org/apache/bcel/classfile/ConstantMethodref.java b/src/org/apache/bcel/classfile/ConstantMethodref.java deleted file mode 100644 index ebd001a..0000000 --- a/src/org/apache/bcel/classfile/ConstantMethodref.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class represents a constant pool reference to a method. - * - * @version $Id: ConstantMethodref.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class ConstantMethodref extends ConstantCP { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Initialize from another object. - */ - public ConstantMethodref(ConstantMethodref c) { - super(Constants.CONSTANT_Methodref, c.getClassIndex(), c - .getNameAndTypeIndex()); - } - - /** - * Initialize instance from file data. - * - * @param file - * input stream - * @throws IOException - */ - ConstantMethodref(DataInputStream file) throws IOException { - super(Constants.CONSTANT_Methodref, file); - } - - /** - * @param class_index - * Reference to the class containing the method - * @param name_and_type_index - * and the method signature - */ - public ConstantMethodref(int class_index, int name_and_type_index) { - super(Constants.CONSTANT_Methodref, class_index, name_and_type_index); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantMethodref(this); - } -} diff --git a/src/org/apache/bcel/classfile/ConstantNameAndType.java b/src/org/apache/bcel/classfile/ConstantNameAndType.java deleted file mode 100644 index ea182e5..0000000 --- a/src/org/apache/bcel/classfile/ConstantNameAndType.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from the abstract Constant class and - * represents a reference to the name and signature of a field or method. - * - * @version $Id: ConstantNameAndType.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public final class ConstantNameAndType extends Constant { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int name_index; // Name of field/method - private int signature_index; // and its signature. - - /** - * Initialize from another object. - */ - public ConstantNameAndType(ConstantNameAndType c) { - this(c.getNameIndex(), c.getSignatureIndex()); - } - - /** - * Initialize instance from file data. - * - * @param file - * Input stream - * @throws IOException - */ - ConstantNameAndType(DataInputStream file) throws IOException { - this(file.readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param name_index - * Name of field/method - * @param signature_index - * and its signature - */ - public ConstantNameAndType(int name_index, int signature_index) { - super(Constants.CONSTANT_NameAndType); - this.name_index = name_index; - this.signature_index = signature_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantNameAndType(this); - } - - /** - * Dump name and signature index to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(tag); - file.writeShort(name_index); - file.writeShort(signature_index); - } - - /** - * @return Name index in constant pool of field/method name. - */ - public final int getNameIndex() { - return name_index; - } - - /** - * @return name - */ - public final String getName(ConstantPool cp) { - return cp.constantToString(getNameIndex(), Constants.CONSTANT_Utf8); - } - - /** - * @return Index in constant pool of field/method signature. - */ - public final int getSignatureIndex() { - return signature_index; - } - - /** - * @return signature - */ - public final String getSignature(ConstantPool cp) { - return cp - .constantToString(getSignatureIndex(), Constants.CONSTANT_Utf8); - } - - /** - * @param name_index - * the name index of this constant - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - /** - * @param signature_index - * the signature index in the constant pool of this type - */ - public final void setSignatureIndex(int signature_index) { - this.signature_index = signature_index; - } - - /** - * @return String representation - */ - @Override - public final String toString() { - return super.toString() + "(name_index = " + name_index - + ", signature_index = " + signature_index + ")"; - } -} diff --git a/src/org/apache/bcel/classfile/ConstantObject.java b/src/org/apache/bcel/classfile/ConstantObject.java deleted file mode 100644 index cded347..0000000 --- a/src/org/apache/bcel/classfile/ConstantObject.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -/** - * This interface denotes those constants that have a "natural" value, such as - * ConstantLong, ConstantString, etc.. - * - * @version $Id: ConstantObject.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public interface ConstantObject { - - /** - * @return object representing the constant, e.g., Long for ConstantLong - */ - public abstract Object getConstantValue(ConstantPool cp); -} diff --git a/src/org/apache/bcel/classfile/ConstantPool.java b/src/org/apache/bcel/classfile/ConstantPool.java deleted file mode 100644 index e7cd240..0000000 --- a/src/org/apache/bcel/classfile/ConstantPool.java +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.Serializable; -import org.apache.bcel.Constants; - -/** - * This class represents the constant pool, i.e., a table of constants, of a - * parsed classfile. It may contain null references, due to the JVM - * specification that skips an entry after an 8-byte constant (double, long) - * entry. Those interested in generating constant pools programatically should - * see ConstantPoolGen. - * - * @version $Id: ConstantPool.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @see Constant - * @see org.apache.bcel.generic.ConstantPoolGen - * @author M. Dahm - */ -public class ConstantPool implements Cloneable, Node, Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int constant_pool_count; - private Constant[] constant_pool; - - /** - * @param constant_pool - * Array of constants - */ - public ConstantPool(Constant[] constant_pool) { - setConstantPool(constant_pool); - } - - /** - * Read constants from given file stream. - * - * @param file - * Input stream - * @throws IOException - * @throws ClassFormatException - */ - ConstantPool(DataInputStream file) throws IOException, ClassFormatException { - byte tag; - constant_pool_count = file.readUnsignedShort(); - constant_pool = new Constant[constant_pool_count]; - /* - * constant_pool[0] is unused by the compiler and may be used freely by - * the implementation. - */ - for (int i = 1; i < constant_pool_count; i++) { - constant_pool[i] = Constant.readConstant(file); - /* - * Quote from the JVM specification: "All eight byte constants take - * up two spots in the constant pool. If this is the n'th byte in - * the constant pool, then the next item will be numbered n+2" - * - * Thus we have to increment the index counter. - */ - tag = constant_pool[i].getTag(); - if ((tag == Constants.CONSTANT_Double) - || (tag == Constants.CONSTANT_Long)) { - i++; - } - } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantPool(this); - } - - /** - * Resolve constant to a string representation. - * - * @param c - * Constant to be printed - * @return String representation - */ - public String constantToString(Constant c) throws ClassFormatException { - String str; - int i; - byte tag = c.getTag(); - switch (tag) { - case Constants.CONSTANT_Class: - i = ((ConstantClass) c).getNameIndex(); - c = getConstant(i, Constants.CONSTANT_Utf8); - str = Utility - .compactClassName(((ConstantUtf8) c).getBytes(), false); - break; - case Constants.CONSTANT_String: - i = ((ConstantString) c).getStringIndex(); - c = getConstant(i, Constants.CONSTANT_Utf8); - str = "\"" + escape(((ConstantUtf8) c).getBytes()) + "\""; - break; - case Constants.CONSTANT_Utf8: - str = ((ConstantUtf8) c).getBytes(); - break; - case Constants.CONSTANT_Double: - str = "" + ((ConstantDouble) c).getBytes(); - break; - case Constants.CONSTANT_Float: - str = "" + ((ConstantFloat) c).getBytes(); - break; - case Constants.CONSTANT_Long: - str = "" + ((ConstantLong) c).getBytes(); - break; - case Constants.CONSTANT_Integer: - str = "" + ((ConstantInteger) c).getBytes(); - break; - case Constants.CONSTANT_NameAndType: - str = (constantToString(((ConstantNameAndType) c).getNameIndex(), - Constants.CONSTANT_Utf8) + " " + constantToString( - ((ConstantNameAndType) c).getSignatureIndex(), - Constants.CONSTANT_Utf8)); - break; - case Constants.CONSTANT_InterfaceMethodref: - case Constants.CONSTANT_Methodref: - case Constants.CONSTANT_Fieldref: - str = (constantToString(((ConstantCP) c).getClassIndex(), - Constants.CONSTANT_Class) + "." + constantToString( - ((ConstantCP) c).getNameAndTypeIndex(), - Constants.CONSTANT_NameAndType)); - break; - default: // Never reached - throw new RuntimeException("Unknown constant type " + tag); - } - return str; - } - - private static final String escape(String str) { - int len = str.length(); - StringBuffer buf = new StringBuffer(len + 5); - char[] ch = str.toCharArray(); - for (int i = 0; i < len; i++) { - switch (ch[i]) { - case '\n': - buf.append("\\n"); - break; - case '\r': - buf.append("\\r"); - break; - case '\t': - buf.append("\\t"); - break; - case '\b': - buf.append("\\b"); - break; - case '"': - buf.append("\\\""); - break; - default: - buf.append(ch[i]); - } - } - return buf.toString(); - } - - /** - * Retrieve constant at `index' from constant pool and resolve it to a - * string representation. - * - * @param index - * of constant in constant pool - * @param tag - * expected type - * @return String representation - */ - public String constantToString(int index, byte tag) - throws ClassFormatException { - Constant c = getConstant(index, tag); - return constantToString(c); - } - - /** - * Dump constant pool to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - public void dump(DataOutputStream file) throws IOException { - file.writeShort(constant_pool_count); - for (int i = 1; i < constant_pool_count; i++) { - if (constant_pool[i] != null) { - constant_pool[i].dump(file); - } - } - } - - /** - * Get constant from constant pool. - * - * @param index - * Index in constant pool - * @return Constant value - * @see Constant - */ - public Constant getConstant(int index) { - if (index >= constant_pool.length || index < 0) { - throw new ClassFormatException("Invalid constant pool reference: " - + index + ". Constant pool size is: " - + constant_pool.length); - } - return constant_pool[index]; - } - - /** - * Get constant from constant pool and check whether it has the expected - * type. - * - * @param index - * Index in constant pool - * @param tag - * Tag of expected constant, i.e., its type - * @return Constant value - * @see Constant - * @throws ClassFormatException - */ - public Constant getConstant(int index, byte tag) - throws ClassFormatException { - Constant c; - c = getConstant(index); - if (c == null) { - throw new ClassFormatException("Constant pool at index " + index - + " is null."); - } - if (c.getTag() != tag) { - throw new ClassFormatException("Expected class `" - + Constants.CONSTANT_NAMES[tag] + "' at index " + index - + " and got " + c); - } - return c; - } - - /** - * @return Array of constants. - * @see Constant - */ - public Constant[] getConstantPool() { - return constant_pool; - } - - /** - * Get string from constant pool and bypass the indirection of - * `ConstantClass' and `ConstantString' objects. I.e. these classes have an - * index field that points to another entry of the constant pool of type - * `ConstantUtf8' which contains the real data. - * - * @param index - * Index in constant pool - * @param tag - * Tag of expected constant, either ConstantClass or - * ConstantString - * @return Contents of string reference - * @see ConstantClass - * @see ConstantString - * @throws ClassFormatException - */ - public String getConstantString(int index, byte tag) - throws ClassFormatException { - Constant c; - int i; - c = getConstant(index, tag); - /* - * This switch() is not that elegant, since the two classes have the - * same contents, they just differ in the name of the index field - * variable. But we want to stick to the JVM naming conventions closely - * though we could have solved these more elegantly by using the same - * variable name or by subclassing. - */ - switch (tag) { - case Constants.CONSTANT_Class: - i = ((ConstantClass) c).getNameIndex(); - break; - case Constants.CONSTANT_String: - i = ((ConstantString) c).getStringIndex(); - break; - default: - throw new RuntimeException( - "getConstantString called with illegal tag " + tag); - } - // Finally get the string from the constant pool - c = getConstant(i, Constants.CONSTANT_Utf8); - return ((ConstantUtf8) c).getBytes(); - } - - /** - * @return Length of constant pool. - */ - public int getLength() { - return constant_pool_count; - } - - /** - * @param constant - * Constant to set - */ - public void setConstant(int index, Constant constant) { - constant_pool[index] = constant; - } - - /** - * @param constant_pool - */ - public void setConstantPool(Constant[] constant_pool) { - this.constant_pool = constant_pool; - constant_pool_count = (constant_pool == null) ? 0 - : constant_pool.length; - } - - /** - * @return String representation. - */ - @Override - public String toString() { - StringBuffer buf = new StringBuffer(); - for (int i = 1; i < constant_pool_count; i++) { - buf.append(i).append(")").append(constant_pool[i]).append("\n"); - } - return buf.toString(); - } - - /** - * @return deep copy of this constant pool - */ - public ConstantPool copy() { - ConstantPool c = null; - try { - c = (ConstantPool) clone(); - c.constant_pool = new Constant[constant_pool_count]; - for (int i = 1; i < constant_pool_count; i++) { - if (constant_pool[i] != null) { - c.constant_pool[i] = constant_pool[i].copy(); - } - } - } catch (CloneNotSupportedException e) { - } - return c; - } -} diff --git a/src/org/apache/bcel/classfile/ConstantString.java b/src/org/apache/bcel/classfile/ConstantString.java deleted file mode 100644 index ff38c9e..0000000 --- a/src/org/apache/bcel/classfile/ConstantString.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from the abstract Constant class and - * represents a reference to a String object. - * - * @version $Id: ConstantString.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public final class ConstantString extends Constant implements ConstantObject { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int string_index; // Identical to ConstantClass except for this name - - /** - * Initialize from another object. - */ - public ConstantString(ConstantString c) { - this(c.getStringIndex()); - } - - /** - * Initialize instance from file data. - * - * @param file - * Input stream - * @throws IOException - */ - ConstantString(DataInputStream file) throws IOException { - this(file.readUnsignedShort()); - } - - /** - * @param string_index - * Index of Constant_Utf8 in constant pool - */ - public ConstantString(int string_index) { - super(Constants.CONSTANT_String); - this.string_index = string_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantString(this); - } - - /** - * Dump constant field reference to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(tag); - file.writeShort(string_index); - } - - /** - * @return Index in constant pool of the string (ConstantUtf8). - */ - public final int getStringIndex() { - return string_index; - } - - /** - * @param string_index - * the index into the constant of the string value - */ - public final void setStringIndex(int string_index) { - this.string_index = string_index; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - return super.toString() + "(string_index = " + string_index + ")"; - } - - /** - * @return String object - */ - @Override - public Object getConstantValue(ConstantPool cp) { - Constant c = cp.getConstant(string_index, Constants.CONSTANT_Utf8); - return ((ConstantUtf8) c).getBytes(); - } - - /** - * @return dereferenced string - */ - public String getBytes(ConstantPool cp) { - return (String) getConstantValue(cp); - } -} diff --git a/src/org/apache/bcel/classfile/ConstantUtf8.java b/src/org/apache/bcel/classfile/ConstantUtf8.java deleted file mode 100644 index a4df998..0000000 --- a/src/org/apache/bcel/classfile/ConstantUtf8.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from the abstract Constant class and - * represents a reference to a Utf8 encoded string. - * - * @version $Id: ConstantUtf8.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public final class ConstantUtf8 extends Constant { - - /** - * - */ - private static final long serialVersionUID = 1L; - private String bytes; - - /** - * Initialize from another object. - */ - public ConstantUtf8(ConstantUtf8 c) { - this(c.getBytes()); - } - - /** - * Initialize instance from file data. - * - * @param file - * Input stream - * @throws IOException - */ - ConstantUtf8(DataInputStream file) throws IOException { - super(Constants.CONSTANT_Utf8); - bytes = file.readUTF(); - } - - /** - * @param bytes - * Data - */ - public ConstantUtf8(String bytes) { - super(Constants.CONSTANT_Utf8); - if (bytes == null) { - throw new IllegalArgumentException("bytes must not be null!"); - } - this.bytes = bytes; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantUtf8(this); - } - - /** - * Dump String in Utf8 format to file stream. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(tag); - file.writeUTF(bytes); - } - - /** - * @return Data converted to string. - */ - public final String getBytes() { - return bytes; - } - - /** - * @param bytes - * the raw bytes of this Utf-8 - */ - public final void setBytes(String bytes) { - this.bytes = bytes; - } - - /** - * @return String representation - */ - @Override - public final String toString() { - return super.toString() + "(\"" + Utility.replace(bytes, "\n", "\\n") - + "\")"; - } -} diff --git a/src/org/apache/bcel/classfile/ConstantValue.java b/src/org/apache/bcel/classfile/ConstantValue.java deleted file mode 100644 index dbb41e3..0000000 --- a/src/org/apache/bcel/classfile/ConstantValue.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from Attribute and represents a constant - * value, i.e., a default value for initializing a class field. This class is - * instantiated by the Attribute.readAttribute() method. - * - * @version $Id: ConstantValue.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Attribute - */ -public final class ConstantValue extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int constantvalue_index; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public ConstantValue(ConstantValue c) { - this(c.getNameIndex(), c.getLength(), c.getConstantValueIndex(), c - .getConstantPool()); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Name index in constant pool - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - ConstantValue(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, file.readUnsignedShort(), constant_pool); - } - - /** - * @param name_index - * Name index in constant pool - * @param length - * Content length in bytes - * @param constantvalue_index - * Index in constant pool - * @param constant_pool - * Array of constants - */ - public ConstantValue(int name_index, int length, int constantvalue_index, - ConstantPool constant_pool) { - super(Constants.ATTR_CONSTANT_VALUE, name_index, length, constant_pool); - this.constantvalue_index = constantvalue_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitConstantValue(this); - } - - /** - * Dump constant value attribute to file stream on binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(constantvalue_index); - } - - /** - * @return Index in constant pool of constant value. - */ - public final int getConstantValueIndex() { - return constantvalue_index; - } - - /** - * @param constantvalue_index - * the index info the constant pool of this constant value - */ - public final void setConstantValueIndex(int constantvalue_index) { - this.constantvalue_index = constantvalue_index; - } - - /** - * @return String representation of constant value. - */ - @Override - public final String toString() { - Constant c = constant_pool.getConstant(constantvalue_index); - String buf; - int i; - // Print constant to string depending on its type - switch (c.getTag()) { - case Constants.CONSTANT_Long: - buf = "" + ((ConstantLong) c).getBytes(); - break; - case Constants.CONSTANT_Float: - buf = "" + ((ConstantFloat) c).getBytes(); - break; - case Constants.CONSTANT_Double: - buf = "" + ((ConstantDouble) c).getBytes(); - break; - case Constants.CONSTANT_Integer: - buf = "" + ((ConstantInteger) c).getBytes(); - break; - case Constants.CONSTANT_String: - i = ((ConstantString) c).getStringIndex(); - c = constant_pool.getConstant(i, Constants.CONSTANT_Utf8); - buf = "\"" + Utility.convertString(((ConstantUtf8) c).getBytes()) - + "\""; - break; - default: - throw new IllegalStateException("Type of ConstValue invalid: " + c); - } - return buf; - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - ConstantValue c = (ConstantValue) clone(); - c.constant_pool = _constant_pool; - return c; - } -} diff --git a/src/org/apache/bcel/classfile/Deprecated.java b/src/org/apache/bcel/classfile/Deprecated.java deleted file mode 100644 index 17531cd..0000000 --- a/src/org/apache/bcel/classfile/Deprecated.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from Attribute and denotes that this is a - * deprecated method. It is instantiated from the - * Attribute.readAttribute() method. - * - * @version $Id: Deprecated.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Attribute - */ -public final class Deprecated extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private byte[] bytes; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Deprecated(Deprecated c) { - this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); - } - - /** - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param bytes - * Attribute contents - * @param constant_pool - * Array of constants - */ - public Deprecated(int name_index, int length, byte[] bytes, - ConstantPool constant_pool) { - super(Constants.ATTR_DEPRECATED, name_index, length, constant_pool); - this.bytes = bytes; - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - Deprecated(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, (byte[]) null, constant_pool); - if (length > 0) { - bytes = new byte[length]; - file.readFully(bytes); - System.err.println("Deprecated attribute with length > 0"); - } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitDeprecated(this); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - if (length > 0) { - file.write(bytes, 0, length); - } - } - - /** - * @return data bytes. - */ - public final byte[] getBytes() { - return bytes; - } - - /** - * @param bytes - * the raw bytes that represents this byte array - */ - public final void setBytes(byte[] bytes) { - this.bytes = bytes; - } - - /** - * @return attribute name - */ - @Override - public final String toString() { - return Constants.ATTRIBUTE_NAMES[Constants.ATTR_DEPRECATED]; - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - Deprecated c = (Deprecated) clone(); - if (bytes != null) { - c.bytes = new byte[bytes.length]; - System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); - } - c.constant_pool = _constant_pool; - return c; - } -} diff --git a/src/org/apache/bcel/classfile/DescendingVisitor.java b/src/org/apache/bcel/classfile/DescendingVisitor.java deleted file mode 100644 index cef7cac..0000000 --- a/src/org/apache/bcel/classfile/DescendingVisitor.java +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.util.Stack; - -/** - * Traverses a JavaClass with another Visitor object 'piggy-backed' that is - * applied to all components of a JavaClass object. I.e. this class supplies the - * traversal strategy, other classes can make use of it. - * - * @version $Id: DescendingVisitor.java 388707 2006-03-25 05:40:28Z tcurdt $ - * @author M. Dahm - */ -public class DescendingVisitor implements Visitor { - - private JavaClass clazz; - private Visitor visitor; - private Stack stack = new Stack(); - - /** - * @return container of current entitity, i.e., predecessor during traversal - */ - public Object predecessor() { - return predecessor(0); - } - - /** - * @param level - * nesting level, i.e., 0 returns the direct predecessor - * @return container of current entitity, i.e., predecessor during traversal - */ - public Object predecessor(int level) { - int size = stack.size(); - if ((size < 2) || (level < 0)) { - return null; - } else { - return stack.elementAt(size - (level + 2)); // size - 1 == current - } - } - - /** - * @return current object - */ - public Object current() { - return stack.peek(); - } - - /** - * @param clazz - * Class to traverse - * @param visitor - * visitor object to apply to all components - */ - public DescendingVisitor(JavaClass clazz, Visitor visitor) { - this.clazz = clazz; - this.visitor = visitor; - } - - /** - * Start traversal. - */ - public void visit() { - clazz.accept(this); - } - - @Override - public void visitJavaClass(JavaClass _clazz) { - stack.push(_clazz); - _clazz.accept(visitor); - Field[] fields = _clazz.getFields(); - for (int i = 0; i < fields.length; i++) { - fields[i].accept(this); - } - Method[] methods = _clazz.getMethods(); - for (int i = 0; i < methods.length; i++) { - methods[i].accept(this); - } - Attribute[] attributes = _clazz.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - attributes[i].accept(this); - } - _clazz.getConstantPool().accept(this); - stack.pop(); - } - - @Override - public void visitField(Field field) { - stack.push(field); - field.accept(visitor); - Attribute[] attributes = field.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - attributes[i].accept(this); - } - stack.pop(); - } - - @Override - public void visitConstantValue(ConstantValue cv) { - stack.push(cv); - cv.accept(visitor); - stack.pop(); - } - - @Override - public void visitMethod(Method method) { - stack.push(method); - method.accept(visitor); - Attribute[] attributes = method.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - attributes[i].accept(this); - } - stack.pop(); - } - - @Override - public void visitExceptionTable(ExceptionTable table) { - stack.push(table); - table.accept(visitor); - stack.pop(); - } - - @Override - public void visitCode(Code code) { - stack.push(code); - code.accept(visitor); - CodeException[] table = code.getExceptionTable(); - for (int i = 0; i < table.length; i++) { - table[i].accept(this); - } - Attribute[] attributes = code.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - attributes[i].accept(this); - } - stack.pop(); - } - - @Override - public void visitCodeException(CodeException ce) { - stack.push(ce); - ce.accept(visitor); - stack.pop(); - } - - @Override - public void visitLineNumberTable(LineNumberTable table) { - stack.push(table); - table.accept(visitor); - LineNumber[] numbers = table.getLineNumberTable(); - for (int i = 0; i < numbers.length; i++) { - numbers[i].accept(this); - } - stack.pop(); - } - - @Override - public void visitLineNumber(LineNumber number) { - stack.push(number); - number.accept(visitor); - stack.pop(); - } - - @Override - public void visitLocalVariableTable(LocalVariableTable table) { - stack.push(table); - table.accept(visitor); - LocalVariable[] vars = table.getLocalVariableTable(); - for (int i = 0; i < vars.length; i++) { - vars[i].accept(this); - } - stack.pop(); - } - - @Override - public void visitStackMap(StackMap table) { - stack.push(table); - table.accept(visitor); - StackMapEntry[] vars = table.getStackMap(); - for (int i = 0; i < vars.length; i++) { - vars[i].accept(this); - } - stack.pop(); - } - - @Override - public void visitStackMapEntry(StackMapEntry var) { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - - @Override - public void visitLocalVariable(LocalVariable var) { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantPool(ConstantPool cp) { - stack.push(cp); - cp.accept(visitor); - Constant[] constants = cp.getConstantPool(); - for (int i = 1; i < constants.length; i++) { - if (constants[i] != null) { - constants[i].accept(this); - } - } - stack.pop(); - } - - @Override - public void visitConstantClass(ConstantClass constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantDouble(ConstantDouble constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantFieldref(ConstantFieldref constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantFloat(ConstantFloat constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantInteger(ConstantInteger constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantInterfaceMethodref( - ConstantInterfaceMethodref constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantLong(ConstantLong constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantMethodref(ConstantMethodref constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantNameAndType(ConstantNameAndType constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantString(ConstantString constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitConstantUtf8(ConstantUtf8 constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - @Override - public void visitInnerClasses(InnerClasses ic) { - stack.push(ic); - ic.accept(visitor); - InnerClass[] ics = ic.getInnerClasses(); - for (int i = 0; i < ics.length; i++) { - ics[i].accept(this); - } - stack.pop(); - } - - @Override - public void visitInnerClass(InnerClass inner) { - stack.push(inner); - inner.accept(visitor); - stack.pop(); - } - - @Override - public void visitDeprecated(Deprecated attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - @Override - public void visitSignature(Signature attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - @Override - public void visitSourceFile(SourceFile attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - @Override - public void visitSynthetic(Synthetic attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - @Override - public void visitUnknown(Unknown attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } -} diff --git a/src/org/apache/bcel/classfile/EmptyVisitor.java b/src/org/apache/bcel/classfile/EmptyVisitor.java deleted file mode 100644 index 23e1794..0000000 --- a/src/org/apache/bcel/classfile/EmptyVisitor.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -/** - * Visitor with empty method bodies, can be extended and used in conjunction - * with the DescendingVisitor class, e.g. - * - * By courtesy of David Spencer. - * - * @see DescendingVisitor - * @version $Id: EmptyVisitor.java 388707 2006-03-25 05:40:28Z tcurdt $ - * - */ -public class EmptyVisitor implements Visitor { - - protected EmptyVisitor() { - } - - @Override - public void visitCode(Code obj) { - } - - @Override - public void visitCodeException(CodeException obj) { - } - - @Override - public void visitConstantClass(ConstantClass obj) { - } - - @Override - public void visitConstantDouble(ConstantDouble obj) { - } - - @Override - public void visitConstantFieldref(ConstantFieldref obj) { - } - - @Override - public void visitConstantFloat(ConstantFloat obj) { - } - - @Override - public void visitConstantInteger(ConstantInteger obj) { - } - - @Override - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) { - } - - @Override - public void visitConstantLong(ConstantLong obj) { - } - - @Override - public void visitConstantMethodref(ConstantMethodref obj) { - } - - @Override - public void visitConstantNameAndType(ConstantNameAndType obj) { - } - - @Override - public void visitConstantPool(ConstantPool obj) { - } - - @Override - public void visitConstantString(ConstantString obj) { - } - - @Override - public void visitConstantUtf8(ConstantUtf8 obj) { - } - - @Override - public void visitConstantValue(ConstantValue obj) { - } - - @Override - public void visitDeprecated(Deprecated obj) { - } - - @Override - public void visitExceptionTable(ExceptionTable obj) { - } - - @Override - public void visitField(Field obj) { - } - - @Override - public void visitInnerClass(InnerClass obj) { - } - - @Override - public void visitInnerClasses(InnerClasses obj) { - } - - @Override - public void visitJavaClass(JavaClass obj) { - } - - @Override - public void visitLineNumber(LineNumber obj) { - } - - @Override - public void visitLineNumberTable(LineNumberTable obj) { - } - - @Override - public void visitLocalVariable(LocalVariable obj) { - } - - @Override - public void visitLocalVariableTable(LocalVariableTable obj) { - } - - @Override - public void visitMethod(Method obj) { - } - - @Override - public void visitSignature(Signature obj) { - } - - @Override - public void visitSourceFile(SourceFile obj) { - } - - @Override - public void visitSynthetic(Synthetic obj) { - } - - @Override - public void visitUnknown(Unknown obj) { - } - - @Override - public void visitStackMap(StackMap obj) { - } - - @Override - public void visitStackMapEntry(StackMapEntry obj) { - } -} diff --git a/src/org/apache/bcel/classfile/ExceptionTable.java b/src/org/apache/bcel/classfile/ExceptionTable.java deleted file mode 100644 index 59a08ff..0000000 --- a/src/org/apache/bcel/classfile/ExceptionTable.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class represents the table of exceptions that are thrown by a method. - * This attribute may be used once per method. The name of this class is - * ExceptionTable for historical reasons; The Java Virtual Machine - * Specification, Second Edition defines this attribute using the name - * Exceptions (which is inconsistent with the other classes). - * - * @version $Id: ExceptionTable.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Code - */ -public final class ExceptionTable extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int number_of_exceptions; // Table of indices into - private int[] exception_index_table; // constant pool - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public ExceptionTable(ExceptionTable c) { - this(c.getNameIndex(), c.getLength(), c.getExceptionIndexTable(), c - .getConstantPool()); - } - - /** - * @param name_index - * Index in constant pool - * @param length - * Content length in bytes - * @param exception_index_table - * Table of indices in constant pool - * @param constant_pool - * Array of constants - */ - public ExceptionTable(int name_index, int length, - int[] exception_index_table, ConstantPool constant_pool) { - super(Constants.ATTR_EXCEPTIONS, name_index, length, constant_pool); - setExceptionIndexTable(exception_index_table); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index in constant pool - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - ExceptionTable(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, (int[]) null, constant_pool); - number_of_exceptions = file.readUnsignedShort(); - exception_index_table = new int[number_of_exceptions]; - for (int i = 0; i < number_of_exceptions; i++) { - exception_index_table[i] = file.readUnsignedShort(); - } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionTable(this); - } - - /** - * Dump exceptions attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(number_of_exceptions); - for (int i = 0; i < number_of_exceptions; i++) { - file.writeShort(exception_index_table[i]); - } - } - - /** - * @return Array of indices into constant pool of thrown exceptions. - */ - public final int[] getExceptionIndexTable() { - return exception_index_table; - } - - /** - * @return Length of exception table. - */ - public final int getNumberOfExceptions() { - return number_of_exceptions; - } - - /** - * @return class names of thrown exceptions - */ - public final String[] getExceptionNames() { - String[] names = new String[number_of_exceptions]; - for (int i = 0; i < number_of_exceptions; i++) { - names[i] = constant_pool.getConstantString( - exception_index_table[i], Constants.CONSTANT_Class) - .replace('/', '.'); - } - return names; - } - - /** - * @param exception_index_table - * the list of exception indexes Also redefines - * number_of_exceptions according to table length. - */ - public final void setExceptionIndexTable(int[] exception_index_table) { - this.exception_index_table = exception_index_table; - number_of_exceptions = (exception_index_table == null) ? 0 - : exception_index_table.length; - } - - /** - * @return String representation, i.e., a list of thrown exceptions. - */ - @Override - public final String toString() { - StringBuffer buf = new StringBuffer(""); - String str; - for (int i = 0; i < number_of_exceptions; i++) { - str = constant_pool.getConstantString(exception_index_table[i], - Constants.CONSTANT_Class); - buf.append(Utility.compactClassName(str, false)); - if (i < number_of_exceptions - 1) { - buf.append(", "); - } - } - return buf.toString(); - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - ExceptionTable c = (ExceptionTable) clone(); - if (exception_index_table != null) { - c.exception_index_table = new int[exception_index_table.length]; - System.arraycopy(exception_index_table, 0, c.exception_index_table, - 0, exception_index_table.length); - } - c.constant_pool = _constant_pool; - return c; - } -} diff --git a/src/org/apache/bcel/classfile/Field.java b/src/org/apache/bcel/classfile/Field.java deleted file mode 100644 index 4ed0777..0000000 --- a/src/org/apache/bcel/classfile/Field.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.Type; -import org.apache.bcel.util.BCELComparator; - -/** - * This class represents the field info structure, i.e., the representation for - * a variable in the class. See JVM specification for details. - * - * @version $Id: Field.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class Field extends FieldOrMethod { - - /** - * - */ - private static final long serialVersionUID = 1L; - private static BCELComparator _cmp = new BCELComparator() { - - @Override - public boolean equals(Object o1, Object o2) { - Field THIS = (Field) o1; - Field THAT = (Field) o2; - return THIS.getName().equals(THAT.getName()) - && THIS.getSignature().equals(THAT.getSignature()); - } - - @Override - public int hashCode(Object o) { - Field THIS = (Field) o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); - } - }; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Field(Field c) { - super(c); - } - - /** - * Construct object from file stream. - * - * @param file - * Input stream - */ - Field(DataInputStream file, ConstantPool constant_pool) throws IOException, - ClassFormatException { - super(file, constant_pool); - } - - /** - * @param access_flags - * Access rights of field - * @param name_index - * Points to field name in constant pool - * @param signature_index - * Points to encoded signature - * @param attributes - * Collection of attributes - * @param constant_pool - * Array of constants - */ - public Field(int access_flags, int name_index, int signature_index, - Attribute[] attributes, ConstantPool constant_pool) { - super(access_flags, name_index, signature_index, attributes, - constant_pool); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitField(this); - } - - /** - * @return constant value associated with this field (may be null) - */ - public final ConstantValue getConstantValue() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE) { - return (ConstantValue) attributes[i]; - } - } - return null; - } - - /** - * Return string representation close to declaration format, `public static - * final short MAX = 100', e.g.. - * - * @return String representation of field, including the signature. - */ - @Override - public final String toString() { - String name, signature, access; // Short cuts to constant pool - // Get names from constant pool - access = Utility.accessToString(access_flags); - access = access.equals("") ? "" : (access + " "); - signature = Utility.signatureToString(getSignature()); - name = getName(); - StringBuffer buf = new StringBuffer(64); - buf.append(access).append(signature).append(" ").append(name); - ConstantValue cv = getConstantValue(); - if (cv != null) { - buf.append(" = ").append(cv); - } - for (int i = 0; i < attributes_count; i++) { - Attribute a = attributes[i]; - if (!(a instanceof ConstantValue)) { - buf.append(" [").append(a.toString()).append("]"); - } - } - return buf.toString(); - } - - /** - * @return deep copy of this field - */ - public final Field copy(ConstantPool _constant_pool) { - return (Field) copy_(_constant_pool); - } - - /** - * @return type of field - */ - public Type getType() { - return Type.getReturnType(getSignature()); - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator - * Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. By default two - * Field objects are said to be equal when their names and signatures are - * equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. By default - * return the hashcode of the field's name XOR signature. - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return _cmp.hashCode(this); - } -} diff --git a/src/org/apache/bcel/classfile/FieldOrMethod.java b/src/org/apache/bcel/classfile/FieldOrMethod.java deleted file mode 100644 index 03b0fff..0000000 --- a/src/org/apache/bcel/classfile/FieldOrMethod.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * Abstract super class for fields and methods. - * - * @version $Id: FieldOrMethod.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class FieldOrMethod extends AccessFlags implements Cloneable, - Node { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected int name_index; // Points to field name in constant pool - protected int signature_index; // Points to encoded signature - protected int attributes_count; // No. of attributes - protected Attribute[] attributes; // Collection of attributes - protected ConstantPool constant_pool; - - FieldOrMethod() { - } - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - protected FieldOrMethod(FieldOrMethod c) { - this(c.getAccessFlags(), c.getNameIndex(), c.getSignatureIndex(), c - .getAttributes(), c.getConstantPool()); - } - - /** - * Construct object from file stream. - * - * @param file - * Input stream - * @throws IOException - * @throws ClassFormatException - */ - protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatException { - this(file.readUnsignedShort(), file.readUnsignedShort(), file - .readUnsignedShort(), null, constant_pool); - attributes_count = file.readUnsignedShort(); - attributes = new Attribute[attributes_count]; - for (int i = 0; i < attributes_count; i++) { - attributes[i] = Attribute.readAttribute(file, constant_pool); - } - } - - /** - * @param access_flags - * Access rights of method - * @param name_index - * Points to field name in constant pool - * @param signature_index - * Points to encoded signature - * @param attributes - * Collection of attributes - * @param constant_pool - * Array of constants - */ - protected FieldOrMethod(int access_flags, int name_index, - int signature_index, Attribute[] attributes, - ConstantPool constant_pool) { - this.access_flags = access_flags; - this.name_index = name_index; - this.signature_index = signature_index; - this.constant_pool = constant_pool; - setAttributes(attributes); - } - - /** - * Dump object to file stream on binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException { - file.writeShort(access_flags); - file.writeShort(name_index); - file.writeShort(signature_index); - file.writeShort(attributes_count); - for (int i = 0; i < attributes_count; i++) { - attributes[i].dump(file); - } - } - - /** - * @return Collection of object attributes. - */ - public final Attribute[] getAttributes() { - return attributes; - } - - /** - * @param attributes - * Collection of object attributes. - */ - public final void setAttributes(Attribute[] attributes) { - this.attributes = attributes; - attributes_count = (attributes == null) ? 0 : attributes.length; - } - - /** - * @return Constant pool used by this object. - */ - public final ConstantPool getConstantPool() { - return constant_pool; - } - - /** - * @param constant_pool - * Constant pool to be used for this object. - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } - - /** - * @return Index in constant pool of object's name. - */ - public final int getNameIndex() { - return name_index; - } - - /** - * @param name_index - * Index in constant pool of object's name. - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - /** - * @return Index in constant pool of field signature. - */ - public final int getSignatureIndex() { - return signature_index; - } - - /** - * @param signature_index - * Index in constant pool of field signature. - */ - public final void setSignatureIndex(int signature_index) { - this.signature_index = signature_index; - } - - /** - * @return Name of object, i.e., method name or field name - */ - public final String getName() { - ConstantUtf8 c; - c = (ConstantUtf8) constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return String representation of object's type signature (java style) - */ - public final String getSignature() { - ConstantUtf8 c; - c = (ConstantUtf8) constant_pool.getConstant(signature_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return deep copy of this field - */ - protected FieldOrMethod copy_(ConstantPool _constant_pool) { - try { - FieldOrMethod c = (FieldOrMethod) clone(); - c.constant_pool = _constant_pool; - c.attributes = new Attribute[attributes_count]; - for (int i = 0; i < attributes_count; i++) { - c.attributes[i] = attributes[i].copy(_constant_pool); - } - return c; - } catch (CloneNotSupportedException e) { - return null; - } - } -} diff --git a/src/org/apache/bcel/classfile/InnerClass.java b/src/org/apache/bcel/classfile/InnerClass.java deleted file mode 100644 index 52cbf32..0000000 --- a/src/org/apache/bcel/classfile/InnerClass.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.Serializable; -import org.apache.bcel.Constants; - -/** - * This class represents a inner class attribute, i.e., the class indices of the - * inner and outer classes, the name and the attributes of the inner class. - * - * @version $Id: InnerClass.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see InnerClasses - */ -public final class InnerClass implements Cloneable, Node, Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int inner_class_index; - private int outer_class_index; - private int inner_name_index; - private int inner_access_flags; - - /** - * Initialize from another object. - */ - public InnerClass(InnerClass c) { - this(c.getInnerClassIndex(), c.getOuterClassIndex(), c - .getInnerNameIndex(), c.getInnerAccessFlags()); - } - - /** - * Construct object from file stream. - * - * @param file - * Input stream - * @throws IOException - */ - InnerClass(DataInputStream file) throws IOException { - this(file.readUnsignedShort(), file.readUnsignedShort(), file - .readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param inner_class_index - * Class index in constant pool of inner class - * @param outer_class_index - * Class index in constant pool of outer class - * @param inner_name_index - * Name index in constant pool of inner class - * @param inner_access_flags - * Access flags of inner class - */ - public InnerClass(int inner_class_index, int outer_class_index, - int inner_name_index, int inner_access_flags) { - this.inner_class_index = inner_class_index; - this.outer_class_index = outer_class_index; - this.inner_name_index = inner_name_index; - this.inner_access_flags = inner_access_flags; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitInnerClass(this); - } - - /** - * Dump inner class attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException { - file.writeShort(inner_class_index); - file.writeShort(outer_class_index); - file.writeShort(inner_name_index); - file.writeShort(inner_access_flags); - } - - /** - * @return access flags of inner class. - */ - public final int getInnerAccessFlags() { - return inner_access_flags; - } - - /** - * @return class index of inner class. - */ - public final int getInnerClassIndex() { - return inner_class_index; - } - - /** - * @return name index of inner class. - */ - public final int getInnerNameIndex() { - return inner_name_index; - } - - /** - * @return class index of outer class. - */ - public final int getOuterClassIndex() { - return outer_class_index; - } - - /** - * @param inner_access_flags - * access flags for this inner class - */ - public final void setInnerAccessFlags(int inner_access_flags) { - this.inner_access_flags = inner_access_flags; - } - - /** - * @param inner_class_index - * index into the constant pool for this class - */ - public final void setInnerClassIndex(int inner_class_index) { - this.inner_class_index = inner_class_index; - } - - /** - * @param inner_name_index - * index into the constant pool for this class's name - */ - public final void setInnerNameIndex(int inner_name_index) { - this.inner_name_index = inner_name_index; - } - - /** - * @param outer_class_index - * index into the constant pool for the owning class - */ - public final void setOuterClassIndex(int outer_class_index) { - this.outer_class_index = outer_class_index; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - return "InnerClass(" + inner_class_index + ", " + outer_class_index - + ", " + inner_name_index + ", " + inner_access_flags + ")"; - } - - /** - * @return Resolved string representation - */ - public final String toString(ConstantPool constant_pool) { - String inner_class_name, outer_class_name, inner_name, access; - inner_class_name = constant_pool.getConstantString(inner_class_index, - Constants.CONSTANT_Class); - inner_class_name = Utility.compactClassName(inner_class_name); - if (outer_class_index != 0) { - outer_class_name = constant_pool.getConstantString( - outer_class_index, Constants.CONSTANT_Class); - outer_class_name = Utility.compactClassName(outer_class_name); - } else { - outer_class_name = ""; - } - if (inner_name_index != 0) { - inner_name = ((ConstantUtf8) constant_pool.getConstant( - inner_name_index, Constants.CONSTANT_Utf8)).getBytes(); - } else { - inner_name = ""; - } - access = Utility.accessToString(inner_access_flags, true); - access = access.equals("") ? "" : (access + " "); - return "InnerClass:" + access + inner_class_name + "(\"" - + outer_class_name + "\", \"" + inner_name + "\")"; - } - - /** - * @return deep copy of this object - */ - public InnerClass copy() { - try { - return (InnerClass) clone(); - } catch (CloneNotSupportedException e) { - } - return null; - } -} diff --git a/src/org/apache/bcel/classfile/InnerClasses.java b/src/org/apache/bcel/classfile/InnerClasses.java deleted file mode 100644 index d47e3ed..0000000 --- a/src/org/apache/bcel/classfile/InnerClasses.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from Attribute and denotes that this class is - * an Inner class of another. to the source file of this class. It is - * instantiated from the Attribute.readAttribute() method. - * - * @version $Id: InnerClasses.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Attribute - */ -public final class InnerClasses extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private InnerClass[] inner_classes; - private int number_of_classes; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public InnerClasses(InnerClasses c) { - this(c.getNameIndex(), c.getLength(), c.getInnerClasses(), c - .getConstantPool()); - } - - /** - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param inner_classes - * array of inner classes attributes - * @param constant_pool - * Array of constants - */ - public InnerClasses(int name_index, int length, InnerClass[] inner_classes, - ConstantPool constant_pool) { - super(Constants.ATTR_INNER_CLASSES, name_index, length, constant_pool); - setInnerClasses(inner_classes); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - InnerClasses(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, (InnerClass[]) null, constant_pool); - number_of_classes = file.readUnsignedShort(); - inner_classes = new InnerClass[number_of_classes]; - for (int i = 0; i < number_of_classes; i++) { - inner_classes[i] = new InnerClass(file); - } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitInnerClasses(this); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(number_of_classes); - for (int i = 0; i < number_of_classes; i++) { - inner_classes[i].dump(file); - } - } - - /** - * @return array of inner class "records" - */ - public final InnerClass[] getInnerClasses() { - return inner_classes; - } - - /** - * @param inner_classes - * the array of inner classes - */ - public final void setInnerClasses(InnerClass[] inner_classes) { - this.inner_classes = inner_classes; - number_of_classes = (inner_classes == null) ? 0 : inner_classes.length; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < number_of_classes; i++) { - buf.append(inner_classes[i].toString(constant_pool)).append("\n"); - } - return buf.toString(); - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - InnerClasses c = (InnerClasses) clone(); - c.inner_classes = new InnerClass[number_of_classes]; - for (int i = 0; i < number_of_classes; i++) { - c.inner_classes[i] = inner_classes[i].copy(); - } - c.constant_pool = _constant_pool; - return c; - } -} diff --git a/src/org/apache/bcel/classfile/JavaClass.java b/src/org/apache/bcel/classfile/JavaClass.java deleted file mode 100644 index faf2a08..0000000 --- a/src/org/apache/bcel/classfile/JavaClass.java +++ /dev/null @@ -1,881 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.TreeSet; - -import org.apache.bcel.Constants; -import org.apache.bcel.generic.Type; -import org.apache.bcel.util.BCELComparator; -import org.apache.bcel.util.ClassQueue; -import org.apache.bcel.util.SyntheticRepository; - -/** - * Represents a Java class, i.e., the data structures, constant pool, fields, - * methods and commands contained in a Java .class file. See JVM specification for details. The - * intent of this class is to represent a parsed or otherwise existing class - * file. Those interested in programatically generating classes should see the - * ClassGen class. - * - * @version $Id: JavaClass.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @see org.apache.bcel.generic.ClassGen - * @author M. Dahm - */ -public class JavaClass extends AccessFlags implements Cloneable, Node, - Comparable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private String file_name; - private String package_name; - private String source_file_name = ""; - private int class_name_index; - private int superclass_name_index; - private String class_name; - private String superclass_name; - private int major, minor; // Compiler version - private ConstantPool constant_pool; // Constant pool - private int[] interfaces; // implemented interfaces - private String[] interface_names; - private Field[] fields; // Fields, i.e., variables of class - private Method[] methods; // methods defined in the class - private Attribute[] attributes; // attributes defined in the class - private byte source = HEAP; // Generated in memory - public static final byte HEAP = 1; - public static final byte FILE = 2; - public static final byte ZIP = 3; - static boolean debug = false; // Debugging on/off - static char sep = '/'; // directory separator - private static BCELComparator _cmp = new BCELComparator() { - - @Override - public boolean equals(Object o1, Object o2) { - JavaClass THIS = (JavaClass) o1; - JavaClass THAT = (JavaClass) o2; - return THIS.getClassName().equals(THAT.getClassName()); - } - - @Override - public int hashCode(Object o) { - JavaClass THIS = (JavaClass) o; - return THIS.getClassName().hashCode(); - } - }; - /** - * In cases where we go ahead and create something, use the default - * SyntheticRepository, because we don't know any better. - */ - private transient org.apache.bcel.util.Repository repository = SyntheticRepository - .getInstance(); - - /** - * Constructor gets all contents as arguments. - * - * @param class_name_index - * Index into constant pool referencing a ConstantClass that - * represents this class. - * @param superclass_name_index - * Index into constant pool referencing a ConstantClass that - * represents this class's superclass. - * @param file_name - * File name - * @param major - * Major compiler version - * @param minor - * Minor compiler version - * @param access_flags - * Access rights defined by bit flags - * @param constant_pool - * Array of constants - * @param interfaces - * Implemented interfaces - * @param fields - * Class fields - * @param methods - * Class methods - * @param attributes - * Class attributes - * @param source - * Read from file or generated in memory? - */ - public JavaClass(int class_name_index, int superclass_name_index, - String file_name, int major, int minor, int access_flags, - ConstantPool constant_pool, int[] interfaces, Field[] fields, - Method[] methods, Attribute[] attributes, byte source) { - if (interfaces == null) { - interfaces = new int[0]; - } - if (attributes == null) { - attributes = new Attribute[0]; - } - if (fields == null) { - fields = new Field[0]; - } - if (methods == null) { - methods = new Method[0]; - } - this.class_name_index = class_name_index; - this.superclass_name_index = superclass_name_index; - this.file_name = file_name; - this.major = major; - this.minor = minor; - this.access_flags = access_flags; - this.constant_pool = constant_pool; - this.interfaces = interfaces; - this.fields = fields; - this.methods = methods; - this.attributes = attributes; - this.source = source; - // Get source file name if available - for (int i = 0; i < attributes.length; i++) { - if (attributes[i] instanceof SourceFile) { - source_file_name = ((SourceFile) attributes[i]) - .getSourceFileName(); - break; - } - } - /* - * According to the specification the following entries must be of type - * `ConstantClass' but we check that anyway via the - * `ConstPool.getConstant' method. - */ - class_name = constant_pool.getConstantString(class_name_index, - Constants.CONSTANT_Class); - class_name = Utility.compactClassName(class_name, false); - int index = class_name.lastIndexOf('.'); - if (index < 0) { - package_name = ""; - } else { - package_name = class_name.substring(0, index); - } - if (superclass_name_index > 0) { - // May be zero -> class is java.lang.Object - superclass_name = constant_pool.getConstantString( - superclass_name_index, Constants.CONSTANT_Class); - superclass_name = Utility.compactClassName(superclass_name, false); - } else { - superclass_name = "java.lang.Object"; - } - interface_names = new String[interfaces.length]; - for (int i = 0; i < interfaces.length; i++) { - String str = constant_pool.getConstantString(interfaces[i], - Constants.CONSTANT_Class); - interface_names[i] = Utility.compactClassName(str, false); - } - } - - /** - * Constructor gets all contents as arguments. - * - * @param class_name_index - * Class name - * @param superclass_name_index - * Superclass name - * @param file_name - * File name - * @param major - * Major compiler version - * @param minor - * Minor compiler version - * @param access_flags - * Access rights defined by bit flags - * @param constant_pool - * Array of constants - * @param interfaces - * Implemented interfaces - * @param fields - * Class fields - * @param methods - * Class methods - * @param attributes - * Class attributes - */ - public JavaClass(int class_name_index, int superclass_name_index, - String file_name, int major, int minor, int access_flags, - ConstantPool constant_pool, int[] interfaces, Field[] fields, - Method[] methods, Attribute[] attributes) { - this(class_name_index, superclass_name_index, file_name, major, minor, - access_flags, constant_pool, interfaces, fields, methods, - attributes, HEAP); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitJavaClass(this); - } - - /* - * Print debug information depending on `JavaClass.debug' - */ - static final void Debug(String str) { - if (debug) { - System.out.println(str); - } - } - - /** - * Dump class to a file. - * - * @param file - * Output file - * @throws IOException - */ - public void dump(File file) throws IOException { - String parent = file.getParent(); - if (parent != null) { - File dir = new File(parent); - dir.mkdirs(); - } - DataOutputStream dos = null; - try { - dos = new DataOutputStream(new FileOutputStream(file)); - dump(dos); - } finally { - if (dos != null) { - dos.close(); - } - } - } - - /** - * Dump class to a file named file_name. - * - * @param _file_name - * Output file name - * @exception IOException - */ - public void dump(String _file_name) throws IOException { - dump(new File(_file_name)); - } - - /** - * @return class in binary format - */ - public byte[] getBytes() { - ByteArrayOutputStream s = new ByteArrayOutputStream(); - DataOutputStream ds = new DataOutputStream(s); - try { - dump(ds); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - ds.close(); - } catch (IOException e2) { - e2.printStackTrace(); - } - } - return s.toByteArray(); - } - - /** - * Dump Java class to output stream in binary format. - * - * @param file - * Output stream - * @exception IOException - */ - public void dump(OutputStream file) throws IOException { - dump(new DataOutputStream(file)); - } - - /** - * Dump Java class to output stream in binary format. - * - * @param file - * Output stream - * @exception IOException - */ - public void dump(DataOutputStream file) throws IOException { - file.writeInt(0xcafebabe); - file.writeShort(minor); - file.writeShort(major); - constant_pool.dump(file); - file.writeShort(access_flags); - file.writeShort(class_name_index); - file.writeShort(superclass_name_index); - file.writeShort(interfaces.length); - for (int i = 0; i < interfaces.length; i++) { - file.writeShort(interfaces[i]); - } - file.writeShort(fields.length); - for (int i = 0; i < fields.length; i++) { - fields[i].dump(file); - } - file.writeShort(methods.length); - for (int i = 0; i < methods.length; i++) { - methods[i].dump(file); - } - if (attributes != null) { - file.writeShort(attributes.length); - for (int i = 0; i < attributes.length; i++) { - attributes[i].dump(file); - } - } else { - file.writeShort(0); - } - file.flush(); - } - - /** - * @return Attributes of the class. - */ - public Attribute[] getAttributes() { - return attributes; - } - - /** - * @return Class name. - */ - public String getClassName() { - return class_name; - } - - /** - * @return Package name. - */ - public String getPackageName() { - return package_name; - } - - /** - * @return Class name index. - */ - public int getClassNameIndex() { - return class_name_index; - } - - /** - * @return Constant pool. - */ - public ConstantPool getConstantPool() { - return constant_pool; - } - - /** - * @return Fields, i.e., variables of the class. Like the JVM spec mandates - * for the classfile format, these fields are those specific to this - * class, and not those of the superclass or superinterfaces. - */ - public Field[] getFields() { - return fields; - } - - /** - * @return File name of class, aka SourceFile attribute value - */ - public String getFileName() { - return file_name; - } - - /** - * @return Names of implemented interfaces. - */ - public String[] getInterfaceNames() { - return interface_names; - } - - /** - * @return Indices in constant pool of implemented interfaces. - */ - public int[] getInterfaceIndices() { - return interfaces; - } - - /** - * @return Major number of class file version. - */ - public int getMajor() { - return major; - } - - /** - * @return Methods of the class. - */ - public Method[] getMethods() { - return methods; - } - - /** - * @return A org.apache.bcel.classfile.Method corresponding to - * java.lang.reflect.Method if any - */ - public Method getMethod(java.lang.reflect.Method m) { - for (int i = 0; i < methods.length; i++) { - Method method = methods[i]; - if (m.getName().equals(method.getName()) - && (m.getModifiers() == method.getModifiers()) - && Type.getSignature(m).equals(method.getSignature())) { - return method; - } - } - return null; - } - - /** - * @return Minor number of class file version. - */ - public int getMinor() { - return minor; - } - - /** - * @return sbsolute path to file where this class was read from - */ - public String getSourceFileName() { - return source_file_name; - } - - /** - * @return Superclass name. - */ - public String getSuperclassName() { - return superclass_name; - } - - /** - * @return Class name index. - */ - public int getSuperclassNameIndex() { - return superclass_name_index; - } - - static { - // Debugging ... on/off - debug = Boolean.getBoolean("JavaClass.debug"); - // Get path separator either / or \ usually - String _sep = System.getProperty("file.separator"); - if (_sep != null) { - try { - JavaClass.sep = _sep.charAt(0); - } catch (StringIndexOutOfBoundsException e) { - } // Never reached - } - } - - /** - * @param attributes - * . - */ - public void setAttributes(Attribute[] attributes) { - this.attributes = attributes; - } - - /** - * @param class_name - * . - */ - public void setClassName(String class_name) { - this.class_name = class_name; - } - - /** - * @param class_name_index - * . - */ - public void setClassNameIndex(int class_name_index) { - this.class_name_index = class_name_index; - } - - /** - * @param constant_pool - * . - */ - public void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } - - /** - * @param fields - * . - */ - public void setFields(Field[] fields) { - this.fields = fields; - } - - /** - * Set File name of class, aka SourceFile attribute value - */ - public void setFileName(String file_name) { - this.file_name = file_name; - } - - /** - * @param interface_names - * . - */ - public void setInterfaceNames(String[] interface_names) { - this.interface_names = interface_names; - } - - /** - * @param interfaces - * . - */ - public void setInterfaces(int[] interfaces) { - this.interfaces = interfaces; - } - - /** - * @param major - * . - */ - public void setMajor(int major) { - this.major = major; - } - - /** - * @param methods - * . - */ - public void setMethods(Method[] methods) { - this.methods = methods; - } - - /** - * @param minor - * . - */ - public void setMinor(int minor) { - this.minor = minor; - } - - /** - * Set absolute path to file this class was read from. - */ - public void setSourceFileName(String source_file_name) { - this.source_file_name = source_file_name; - } - - /** - * @param superclass_name - * . - */ - public void setSuperclassName(String superclass_name) { - this.superclass_name = superclass_name; - } - - /** - * @param superclass_name_index - * . - */ - public void setSuperclassNameIndex(int superclass_name_index) { - this.superclass_name_index = superclass_name_index; - } - - /** - * @return String representing class contents. - */ - @Override - public String toString() { - String access = Utility.accessToString(access_flags, true); - access = access.equals("") ? "" : (access + " "); - StringBuffer buf = new StringBuffer(128); - buf.append(access).append(Utility.classOrInterface(access_flags)) - .append(" ").append(class_name).append(" extends ") - .append(Utility.compactClassName(superclass_name, false)) - .append('\n'); - int size = interfaces.length; - if (size > 0) { - buf.append("implements\t\t"); - for (int i = 0; i < size; i++) { - buf.append(interface_names[i]); - if (i < size - 1) { - buf.append(", "); - } - } - buf.append('\n'); - } - buf.append("filename\t\t").append(file_name).append('\n'); - buf.append("compiled from\t\t").append(source_file_name).append('\n'); - buf.append("compiler version\t").append(major).append(".") - .append(minor).append('\n'); - buf.append("access flags\t\t").append(access_flags).append('\n'); - buf.append("constant pool\t\t").append(constant_pool.getLength()) - .append(" entries\n"); - buf.append("ACC_SUPER flag\t\t").append(isSuper()).append("\n"); - if (attributes.length > 0) { - buf.append("\nAttribute(s):\n"); - for (int i = 0; i < attributes.length; i++) { - buf.append(indent(attributes[i])); - } - } - if (fields.length > 0) { - buf.append("\n").append(fields.length).append(" fields:\n"); - for (int i = 0; i < fields.length; i++) { - buf.append("\t").append(fields[i]).append('\n'); - } - } - if (methods.length > 0) { - buf.append("\n").append(methods.length).append(" methods:\n"); - for (int i = 0; i < methods.length; i++) { - buf.append("\t").append(methods[i]).append('\n'); - } - } - return buf.toString(); - } - - private static final String indent(Object obj) { - StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); - StringBuffer buf = new StringBuffer(); - while (tok.hasMoreTokens()) { - buf.append("\t").append(tok.nextToken()).append("\n"); - } - return buf.toString(); - } - - /** - * @return deep copy of this class - */ - public JavaClass copy() { - JavaClass c = null; - try { - c = (JavaClass) clone(); - c.constant_pool = constant_pool.copy(); - c.interfaces = interfaces.clone(); - c.interface_names = interface_names.clone(); - c.fields = new Field[fields.length]; - for (int i = 0; i < fields.length; i++) { - c.fields[i] = fields[i].copy(c.constant_pool); - } - c.methods = new Method[methods.length]; - for (int i = 0; i < methods.length; i++) { - c.methods[i] = methods[i].copy(c.constant_pool); - } - c.attributes = new Attribute[attributes.length]; - for (int i = 0; i < attributes.length; i++) { - c.attributes[i] = attributes[i].copy(c.constant_pool); - } - } catch (CloneNotSupportedException e) { - } - return c; - } - - public final boolean isSuper() { - return (access_flags & Constants.ACC_SUPER) != 0; - } - - public final boolean isClass() { - return (access_flags & Constants.ACC_INTERFACE) == 0; - } - - /** - * @return returns either HEAP (generated), FILE, or ZIP - */ - public final byte getSource() { - return source; - } - - /********************* New repository functionality *********************/ - /** - * Gets the ClassRepository which holds its definition. By default this is - * the same as SyntheticRepository.getInstance(); - */ - public org.apache.bcel.util.Repository getRepository() { - return repository; - } - - /** - * Sets the ClassRepository which loaded the JavaClass. Should be called - * immediately after parsing is done. - */ - public void setRepository(org.apache.bcel.util.Repository repository) { - this.repository = repository; - } - - /** - * Equivalent to runtime "instanceof" operator. - * - * @return true if this JavaClass is derived from the super class - * @throws ClassNotFoundException - * if superclasses or superinterfaces of this object can't be - * found - */ - public final boolean instanceOf(JavaClass super_class) - throws ClassNotFoundException { - if (this.equals(super_class)) { - return true; - } - JavaClass[] super_classes = getSuperClasses(); - for (int i = 0; i < super_classes.length; i++) { - if (super_classes[i].equals(super_class)) { - return true; - } - } - if (super_class.isInterface()) { - return implementationOf(super_class); - } - return false; - } - - /** - * @return true, if this class is an implementation of interface inter - * @throws ClassNotFoundException - * if superclasses or superinterfaces of this class can't be - * found - */ - public boolean implementationOf(JavaClass inter) - throws ClassNotFoundException { - if (!inter.isInterface()) { - throw new IllegalArgumentException(inter.getClassName() - + " is no interface"); - } - if (this.equals(inter)) { - return true; - } - JavaClass[] super_interfaces = getAllInterfaces(); - for (int i = 0; i < super_interfaces.length; i++) { - if (super_interfaces[i].equals(inter)) { - return true; - } - } - return false; - } - - /** - * @return the superclass for this JavaClass object, or null if this is - * java.lang.Object - * @throws ClassNotFoundException - * if the superclass can't be found - */ - public JavaClass getSuperClass() throws ClassNotFoundException { - if ("java.lang.Object".equals(getClassName())) { - return null; - } - return repository.loadClass(getSuperclassName()); - } - - /** - * @return list of super classes of this class in ascending order, i.e., - * java.lang.Object is always the last element - * @throws ClassNotFoundException - * if any of the superclasses can't be found - */ - public JavaClass[] getSuperClasses() throws ClassNotFoundException { - JavaClass clazz = this; - List allSuperClasses = new ArrayList(); - for (clazz = clazz.getSuperClass(); clazz != null; clazz = clazz - .getSuperClass()) { - allSuperClasses.add(clazz); - } - return allSuperClasses.toArray(new JavaClass[allSuperClasses.size()]); - } - - /** - * Get interfaces directly implemented by this JavaClass. - */ - public JavaClass[] getInterfaces() throws ClassNotFoundException { - String[] _interfaces = getInterfaceNames(); - JavaClass[] classes = new JavaClass[_interfaces.length]; - for (int i = 0; i < _interfaces.length; i++) { - classes[i] = repository.loadClass(_interfaces[i]); - } - return classes; - } - - /** - * Get all interfaces implemented by this JavaClass (transitively). - */ - public JavaClass[] getAllInterfaces() throws ClassNotFoundException { - ClassQueue queue = new ClassQueue(); - Set allInterfaces = new TreeSet(); - queue.enqueue(this); - while (!queue.empty()) { - JavaClass clazz = queue.dequeue(); - JavaClass souper = clazz.getSuperClass(); - JavaClass[] _interfaces = clazz.getInterfaces(); - if (clazz.isInterface()) { - allInterfaces.add(clazz); - } else { - if (souper != null) { - queue.enqueue(souper); - } - } - for (int i = 0; i < _interfaces.length; i++) { - queue.enqueue(_interfaces[i]); - } - } - return allInterfaces.toArray(new JavaClass[allInterfaces.size()]); - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator - * Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. By default two - * JavaClass objects are said to be equal when their class names are equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return the natural ordering of two JavaClasses. This ordering is based on - * the class name - */ - @Override - public int compareTo(Object obj) { - return getClassName().compareTo(((JavaClass) obj).getClassName()); - } - - /** - * Return value as defined by given BCELComparator strategy. By default - * return the hashcode of the class name. - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return _cmp.hashCode(this); - } -} diff --git a/src/org/apache/bcel/classfile/LineNumber.java b/src/org/apache/bcel/classfile/LineNumber.java deleted file mode 100644 index e9081b7..0000000 --- a/src/org/apache/bcel/classfile/LineNumber.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.Serializable; - -/** - * This class represents a (PC offset, line number) pair, i.e., a line number in - * the source that corresponds to a relative address in the byte code. This is - * used for debugging purposes. - * - * @version $Id: LineNumber.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see LineNumberTable - */ -public final class LineNumber implements Cloneable, Node, Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int start_pc; // Program Counter (PC) corresponds to line - private int line_number; // number in source file - - /** - * Initialize from another object. - */ - public LineNumber(LineNumber c) { - this(c.getStartPC(), c.getLineNumber()); - } - - /** - * Construct object from file stream. - * - * @param file - * Input stream - * @throws IOException - */ - LineNumber(DataInputStream file) throws IOException { - this(file.readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param start_pc - * Program Counter (PC) corresponds to - * @param line_number - * line number in source file - */ - public LineNumber(int start_pc, int line_number) { - this.start_pc = start_pc; - this.line_number = line_number; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLineNumber(this); - } - - /** - * Dump line number/pc pair to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException { - file.writeShort(start_pc); - file.writeShort(line_number); - } - - /** - * @return Corresponding source line - */ - public final int getLineNumber() { - return line_number; - } - - /** - * @return PC in code - */ - public final int getStartPC() { - return start_pc; - } - - /** - * @param line_number - * the source line number - */ - public final void setLineNumber(int line_number) { - this.line_number = line_number; - } - - /** - * @param start_pc - * the pc for this line number - */ - public final void setStartPC(int start_pc) { - this.start_pc = start_pc; - } - - /** - * @return String representation - */ - @Override - public final String toString() { - return "LineNumber(" + start_pc + ", " + line_number + ")"; - } - - /** - * @return deep copy of this object - */ - public LineNumber copy() { - try { - return (LineNumber) clone(); - } catch (CloneNotSupportedException e) { - } - return null; - } -} diff --git a/src/org/apache/bcel/classfile/LineNumberTable.java b/src/org/apache/bcel/classfile/LineNumberTable.java deleted file mode 100644 index da11faf..0000000 --- a/src/org/apache/bcel/classfile/LineNumberTable.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class represents a table of line numbers for debugging purposes. This - * attribute is used by the Code attribute. It contains pairs of PCs - * and line numbers. - * - * @version $Id: LineNumberTable.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Code - * @see LineNumber - */ -public final class LineNumberTable extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int line_number_table_length; - private LineNumber[] line_number_table; // Table of line/numbers pairs - - /* - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public LineNumberTable(LineNumberTable c) { - this(c.getNameIndex(), c.getLength(), c.getLineNumberTable(), c - .getConstantPool()); - } - - /* - * @param name_index Index of name - * - * @param length Content length in bytes - * - * @param line_number_table Table of line/numbers pairs - * - * @param constant_pool Array of constants - */ - public LineNumberTable(int name_index, int length, - LineNumber[] line_number_table, ConstantPool constant_pool) { - super(Constants.ATTR_LINE_NUMBER_TABLE, name_index, length, - constant_pool); - setLineNumberTable(line_number_table); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index of name - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - LineNumberTable(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, (LineNumber[]) null, constant_pool); - line_number_table_length = (file.readUnsignedShort()); - line_number_table = new LineNumber[line_number_table_length]; - for (int i = 0; i < line_number_table_length; i++) { - line_number_table[i] = new LineNumber(file); - } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLineNumberTable(this); - } - - /** - * Dump line number table attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(line_number_table_length); - for (int i = 0; i < line_number_table_length; i++) { - line_number_table[i].dump(file); - } - } - - /** - * @return Array of (pc offset, line number) pairs. - */ - public final LineNumber[] getLineNumberTable() { - return line_number_table; - } - - /** - * @param line_number_table - * the line number entries for this table - */ - public final void setLineNumberTable(LineNumber[] line_number_table) { - this.line_number_table = line_number_table; - line_number_table_length = (line_number_table == null) ? 0 - : line_number_table.length; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - StringBuffer buf = new StringBuffer(); - StringBuffer line = new StringBuffer(); - String newLine = System.getProperty("line.separator", "\n"); - for (int i = 0; i < line_number_table_length; i++) { - line.append(line_number_table[i].toString()); - if (i < line_number_table_length - 1) { - line.append(", "); - } - if (line.length() > 72) { - line.append(newLine); - buf.append(line.toString()); - line.setLength(0); - } - } - buf.append(line); - return buf.toString(); - } - - /** - * Map byte code positions to source code lines. - * - * @param pos - * byte code offset - * @return corresponding line in source code - */ - public int getSourceLine(int pos) { - int l = 0, r = line_number_table_length - 1; - if (r < 0) { - return -1; - } - int min_index = -1, min = -1; - /* - * Do a binary search since the array is ordered. - */ - do { - int i = (l + r) / 2; - int j = line_number_table[i].getStartPC(); - if (j == pos) { - return line_number_table[i].getLineNumber(); - } else if (pos < j) { - r = i - 1; - } else { - l = i + 1; - } - /* - * If exact match can't be found (which is the most common case) - * return the line number that corresponds to the greatest index - * less than pos. - */ - if (j < pos && j > min) { - min = j; - min_index = i; - } - } while (l <= r); - /* - * It's possible that we did not find any valid entry for the bytecode - * offset we were looking for. - */ - if (min_index < 0) { - return -1; - } - return line_number_table[min_index].getLineNumber(); - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - LineNumberTable c = (LineNumberTable) clone(); - c.line_number_table = new LineNumber[line_number_table_length]; - for (int i = 0; i < line_number_table_length; i++) { - c.line_number_table[i] = line_number_table[i].copy(); - } - c.constant_pool = _constant_pool; - return c; - } - - public final int getTableLength() { - return line_number_table_length; - } -} diff --git a/src/org/apache/bcel/classfile/LocalVariable.java b/src/org/apache/bcel/classfile/LocalVariable.java deleted file mode 100644 index 2f5cb16..0000000 --- a/src/org/apache/bcel/classfile/LocalVariable.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.Serializable; -import org.apache.bcel.Constants; - -/** - * This class represents a local variable within a method. It contains its - * scope, name, signature and index on the method's frame. - * - * @version $Id: LocalVariable.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see LocalVariableTable - */ -public final class LocalVariable implements Constants, Cloneable, Node, - Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int start_pc; // Range in which the variable is valid - private int length; - private int name_index; // Index in constant pool of variable name - private int signature_index; // Index of variable signature - private int index; /* - * Variable is `index'th local variable on this method's - * frame. - */ - private ConstantPool constant_pool; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public LocalVariable(LocalVariable c) { - this(c.getStartPC(), c.getLength(), c.getNameIndex(), c - .getSignatureIndex(), c.getIndex(), c.getConstantPool()); - } - - /** - * Construct object from file stream. - * - * @param file - * Input stream - * @throws IOException - */ - LocalVariable(DataInputStream file, ConstantPool constant_pool) - throws IOException { - this(file.readUnsignedShort(), file.readUnsignedShort(), file - .readUnsignedShort(), file.readUnsignedShort(), file - .readUnsignedShort(), constant_pool); - } - - /** - * @param start_pc - * Range in which the variable - * @param length - * ... is valid - * @param name_index - * Index in constant pool of variable name - * @param signature_index - * Index of variable's signature - * @param index - * Variable is `index'th local variable on the method's frame - * @param constant_pool - * Array of constants - */ - public LocalVariable(int start_pc, int length, int name_index, - int signature_index, int index, ConstantPool constant_pool) { - this.start_pc = start_pc; - this.length = length; - this.name_index = name_index; - this.signature_index = signature_index; - this.index = index; - this.constant_pool = constant_pool; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLocalVariable(this); - } - - /** - * Dump local variable to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException { - file.writeShort(start_pc); - file.writeShort(length); - file.writeShort(name_index); - file.writeShort(signature_index); - file.writeShort(index); - } - - /** - * @return Constant pool used by this object. - */ - public final ConstantPool getConstantPool() { - return constant_pool; - } - - /** - * @return Variable is valid within getStartPC() .. getStartPC()+getLength() - */ - public final int getLength() { - return length; - } - - /** - * @return Variable name. - */ - public final String getName() { - ConstantUtf8 c; - c = (ConstantUtf8) constant_pool.getConstant(name_index, CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return Index in constant pool of variable name. - */ - public final int getNameIndex() { - return name_index; - } - - /** - * @return Signature. - */ - public final String getSignature() { - ConstantUtf8 c; - c = (ConstantUtf8) constant_pool.getConstant(signature_index, - CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return Index in constant pool of variable signature. - */ - public final int getSignatureIndex() { - return signature_index; - } - - /** - * @return index of register where variable is stored - */ - public final int getIndex() { - return index; - } - - /** - * @return Start of range where he variable is valid - */ - public final int getStartPC() { - return start_pc; - } - - /** - * @param constant_pool - * Constant pool to be used for this object. - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } - - /** - * @param length - * the length of this local variable - */ - public final void setLength(int length) { - this.length = length; - } - - /** - * @param name_index - * the index into the constant pool for the name of this variable - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - /** - * @param signature_index - * the index into the constant pool for the signature of this - * variable - */ - public final void setSignatureIndex(int signature_index) { - this.signature_index = signature_index; - } - - /** - * @param index - * the index in the local variable table of this variable - */ - public final void setIndex(int index) { - this.index = index; - } - - /** - * @param start_pc - * Specify range where the local variable is valid. - */ - public final void setStartPC(int start_pc) { - this.start_pc = start_pc; - } - - /** - * @return string representation. - */ - @Override - public final String toString() { - String name = getName(), signature = Utility - .signatureToString(getSignature()); - return "LocalVariable(start_pc = " + start_pc + ", length = " + length - + ", index = " + index + ":" + signature + " " + name + ")"; - } - - /** - * @return deep copy of this object - */ - public LocalVariable copy() { - try { - return (LocalVariable) clone(); - } catch (CloneNotSupportedException e) { - } - return null; - } -} diff --git a/src/org/apache/bcel/classfile/LocalVariableTable.java b/src/org/apache/bcel/classfile/LocalVariableTable.java deleted file mode 100644 index 1211614..0000000 --- a/src/org/apache/bcel/classfile/LocalVariableTable.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class represents colection of local variables in a method. This - * attribute is contained in the Code attribute. - * - * @version $Id: LocalVariableTable.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Code - * @see LocalVariable - */ -public class LocalVariableTable extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int local_variable_table_length; // Table of local - private LocalVariable[] local_variable_table; // variables - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public LocalVariableTable(LocalVariableTable c) { - this(c.getNameIndex(), c.getLength(), c.getLocalVariableTable(), c - .getConstantPool()); - } - - /** - * @param name_index - * Index in constant pool to `LocalVariableTable' - * @param length - * Content length in bytes - * @param local_variable_table - * Table of local variables - * @param constant_pool - * Array of constants - */ - public LocalVariableTable(int name_index, int length, - LocalVariable[] local_variable_table, ConstantPool constant_pool) { - super(Constants.ATTR_LOCAL_VARIABLE_TABLE, name_index, length, - constant_pool); - setLocalVariableTable(local_variable_table); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index in constant pool - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - LocalVariableTable(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, (LocalVariable[]) null, constant_pool); - local_variable_table_length = (file.readUnsignedShort()); - local_variable_table = new LocalVariable[local_variable_table_length]; - for (int i = 0; i < local_variable_table_length; i++) { - local_variable_table[i] = new LocalVariable(file, constant_pool); - } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLocalVariableTable(this); - } - - /** - * Dump local variable table attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(local_variable_table_length); - for (int i = 0; i < local_variable_table_length; i++) { - local_variable_table[i].dump(file); - } - } - - /** - * @return Array of local variables of method. - */ - public final LocalVariable[] getLocalVariableTable() { - return local_variable_table; - } - - /** - * @return first matching variable using index - * - * @param index - * the variable slot - * - * @return the first LocalVariable that matches the slot or null if not - * found - * - */ - public final LocalVariable getLocalVariable(int index) { - for (int i = 0; i < local_variable_table_length; i++) { - if (local_variable_table[i].getIndex() == index) { - return local_variable_table[i]; - } - } - return null; - } - - /** - * @return matching variable using index when variable is used at supplied - * pc - * - * @param index - * the variable slot - * @param pc - * the current pc that this variable is alive - * - * @return the LocalVariable that matches or null if not found - */ - public final LocalVariable getLocalVariable(int index, int pc) { - for (int i = 0; i < local_variable_table_length; i++) { - if (local_variable_table[i].getIndex() == index) { - int start_pc = local_variable_table[i].getStartPC(); - int end_pc = start_pc + local_variable_table[i].getLength(); - if ((pc >= start_pc) && (pc < end_pc)) { - return local_variable_table[i]; - } - } - } - return null; - } - - public final void setLocalVariableTable(LocalVariable[] local_variable_table) { - this.local_variable_table = local_variable_table; - local_variable_table_length = (local_variable_table == null) ? 0 - : local_variable_table.length; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - StringBuffer buf = new StringBuffer(""); - for (int i = 0; i < local_variable_table_length; i++) { - buf.append(local_variable_table[i].toString()); - if (i < local_variable_table_length - 1) { - buf.append('\n'); - } - } - return buf.toString(); - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - LocalVariableTable c = (LocalVariableTable) clone(); - c.local_variable_table = new LocalVariable[local_variable_table_length]; - for (int i = 0; i < local_variable_table_length; i++) { - c.local_variable_table[i] = local_variable_table[i].copy(); - } - c.constant_pool = _constant_pool; - return c; - } - - public final int getTableLength() { - return local_variable_table_length; - } -} diff --git a/src/org/apache/bcel/classfile/Method.java b/src/org/apache/bcel/classfile/Method.java deleted file mode 100644 index 7dfc57b..0000000 --- a/src/org/apache/bcel/classfile/Method.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.Type; -import org.apache.bcel.util.BCELComparator; - -/** - * This class represents the method info structure, i.e., the representation for - * a method in the class. See JVM specification for details. A method has access - * flags, a name, a signature and a number of attributes. - * - * @version $Id: Method.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class Method extends FieldOrMethod { - - /** - * - */ - private static final long serialVersionUID = 1L; - private static BCELComparator _cmp = new BCELComparator() { - - @Override - public boolean equals(Object o1, Object o2) { - Method THIS = (Method) o1; - Method THAT = (Method) o2; - return THIS.getName().equals(THAT.getName()) - && THIS.getSignature().equals(THAT.getSignature()); - } - - @Override - public int hashCode(Object o) { - Method THIS = (Method) o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); - } - }; - - /** - * Empty constructor, all attributes have to be defined via `setXXX' - * methods. Use at your own risk. - */ - public Method() { - } - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Method(Method c) { - super(c); - } - - /** - * Construct object from file stream. - * - * @param file - * Input stream - * @throws IOException - * @throws ClassFormatException - */ - Method(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatException { - super(file, constant_pool); - } - - /** - * @param access_flags - * Access rights of method - * @param name_index - * Points to field name in constant pool - * @param signature_index - * Points to encoded signature - * @param attributes - * Collection of attributes - * @param constant_pool - * Array of constants - */ - public Method(int access_flags, int name_index, int signature_index, - Attribute[] attributes, ConstantPool constant_pool) { - super(access_flags, name_index, signature_index, attributes, - constant_pool); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitMethod(this); - } - - /** - * @return Code attribute of method, if any - */ - public final Code getCode() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i] instanceof Code) { - return (Code) attributes[i]; - } - } - return null; - } - - /** - * @return ExceptionTable attribute of method, if any, i.e., list all - * exceptions the method may throw not exception handlers! - */ - public final ExceptionTable getExceptionTable() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i] instanceof ExceptionTable) { - return (ExceptionTable) attributes[i]; - } - } - return null; - } - - /** - * @return LocalVariableTable of code attribute if any, i.e. the call is - * forwarded to the Code atribute. - */ - public final LocalVariableTable getLocalVariableTable() { - Code code = getCode(); - if (code == null) { - return null; - } - return code.getLocalVariableTable(); - } - - /** - * @return LineNumberTable of code attribute if any, i.e. the call is - * forwarded to the Code atribute. - */ - public final LineNumberTable getLineNumberTable() { - Code code = getCode(); - if (code == null) { - return null; - } - return code.getLineNumberTable(); - } - - /** - * Return string representation close to declaration format, `public static - * void main(String[] args) throws IOException', e.g. - * - * @return String representation of the method. - */ - @Override - public final String toString() { - ConstantUtf8 c; - String name, signature, access; // Short cuts to constant pool - StringBuffer buf; - access = Utility.accessToString(access_flags); - // Get name and signature from constant pool - c = (ConstantUtf8) constant_pool.getConstant(signature_index, - Constants.CONSTANT_Utf8); - signature = c.getBytes(); - c = (ConstantUtf8) constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8); - name = c.getBytes(); - signature = Utility.methodSignatureToString(signature, name, access, - true, getLocalVariableTable()); - buf = new StringBuffer(signature); - for (int i = 0; i < attributes_count; i++) { - Attribute a = attributes[i]; - if (!((a instanceof Code) || (a instanceof ExceptionTable))) { - buf.append(" [").append(a.toString()).append("]"); - } - } - ExceptionTable e = getExceptionTable(); - if (e != null) { - String str = e.toString(); - if (!str.equals("")) { - buf.append("\n\t\tthrows ").append(str); - } - } - return buf.toString(); - } - - /** - * @return deep copy of this method - */ - public final Method copy(ConstantPool _constant_pool) { - return (Method) copy_(_constant_pool); - } - - /** - * @return return type of method - */ - public Type getReturnType() { - return Type.getReturnType(getSignature()); - } - - /** - * @return array of method argument types - */ - public Type[] getArgumentTypes() { - return Type.getArgumentTypes(getSignature()); - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator - * Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. By default two - * method objects are said to be equal when their names and signatures are - * equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. By default - * return the hashcode of the method's name XOR signature. - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return _cmp.hashCode(this); - } -} diff --git a/src/org/apache/bcel/classfile/Node.java b/src/org/apache/bcel/classfile/Node.java deleted file mode 100644 index 0c4f63d..0000000 --- a/src/org/apache/bcel/classfile/Node.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -/** - * Denote class to have an accept method(); - * - * @version $Id: Node.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface Node { - - public void accept(Visitor obj); -} diff --git a/src/org/apache/bcel/classfile/PMGClass.java b/src/org/apache/bcel/classfile/PMGClass.java deleted file mode 100644 index 5fcb92f..0000000 --- a/src/org/apache/bcel/classfile/PMGClass.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from Attribute and represents a reference to a - * PMG attribute. - * - * @version $Id: PMGClass.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Attribute - */ -public final class PMGClass extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int pmg_class_index, pmg_index; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public PMGClass(PMGClass c) { - this(c.getNameIndex(), c.getLength(), c.getPMGIndex(), c - .getPMGClassIndex(), c.getConstantPool()); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - PMGClass(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, file.readUnsignedShort(), file - .readUnsignedShort(), constant_pool); - } - - /** - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param pmg_index - * index in constant pool for source file name - * @param pmg_class_index - * Index in constant pool to CONSTANT_Utf8 - * @param constant_pool - * Array of constants - */ - public PMGClass(int name_index, int length, int pmg_index, - int pmg_class_index, ConstantPool constant_pool) { - super(Constants.ATTR_PMG, name_index, length, constant_pool); - this.pmg_index = pmg_index; - this.pmg_class_index = pmg_class_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - System.err.println("Visiting non-standard PMGClass object"); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(pmg_index); - file.writeShort(pmg_class_index); - } - - /** - * @return Index in constant pool of source file name. - */ - public final int getPMGClassIndex() { - return pmg_class_index; - } - - /** - * @param pmg_class_index - */ - public final void setPMGClassIndex(int pmg_class_index) { - this.pmg_class_index = pmg_class_index; - } - - /** - * @return Index in constant pool of source file name. - */ - public final int getPMGIndex() { - return pmg_index; - } - - /** - * @param pmg_index - */ - public final void setPMGIndex(int pmg_index) { - this.pmg_index = pmg_index; - } - - /** - * @return PMG name. - */ - public final String getPMGName() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(pmg_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return PMG class name. - */ - public final String getPMGClassName() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant( - pmg_class_index, Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return String representation - */ - @Override - public final String toString() { - return "PMGClass(" + getPMGName() + ", " + getPMGClassName() + ")"; - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - return (PMGClass) clone(); - } -} diff --git a/src/org/apache/bcel/classfile/Signature.java b/src/org/apache/bcel/classfile/Signature.java deleted file mode 100644 index 602aff5..0000000 --- a/src/org/apache/bcel/classfile/Signature.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from Attribute and represents a reference to a - * GJ attribute. - * - * @version $Id: Signature.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Attribute - */ -public final class Signature extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int signature_index; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Signature(Signature c) { - this(c.getNameIndex(), c.getLength(), c.getSignatureIndex(), c - .getConstantPool()); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - Signature(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, file.readUnsignedShort(), constant_pool); - } - - /** - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param signature_index - * Index in constant pool to CONSTANT_Utf8 - * @param constant_pool - * Array of constants - */ - public Signature(int name_index, int length, int signature_index, - ConstantPool constant_pool) { - super(Constants.ATTR_SIGNATURE, name_index, length, constant_pool); - this.signature_index = signature_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - // System.err.println("Visiting non-standard Signature object"); - v.visitSignature(this); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(signature_index); - } - - /** - * @return Index in constant pool of source file name. - */ - public final int getSignatureIndex() { - return signature_index; - } - - /** - * @param signature_index - * the index info the constant pool of this signature - */ - public final void setSignatureIndex(int signature_index) { - this.signature_index = signature_index; - } - - /** - * @return GJ signature. - */ - public final String getSignature() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant( - signature_index, Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * Extends ByteArrayInputStream to make 'unreading' chars possible. - */ - private static final class MyByteArrayInputStream extends - ByteArrayInputStream { - - MyByteArrayInputStream(String data) { - super(data.getBytes()); - } - - final String getData() { - return new String(buf); - } - - final void unread() { - if (pos > 0) { - pos--; - } - } - } - - private static boolean identStart(int ch) { - return ch == 'T' || ch == 'L'; - } - - private static final void matchIdent(MyByteArrayInputStream in, - StringBuffer buf) { - int ch; - if ((ch = in.read()) == -1) { - throw new RuntimeException("Illegal signature: " + in.getData() - + " no ident, reaching EOF"); - } - // System.out.println("return from ident:" + (char)ch); - if (!identStart(ch)) { - StringBuffer buf2 = new StringBuffer(); - int count = 1; - while (Character.isJavaIdentifierPart((char) ch)) { - buf2.append((char) ch); - count++; - ch = in.read(); - } - if (ch == ':') { // Ok, formal parameter - in.skip("Ljava/lang/Object".length()); - buf.append(buf2); - ch = in.read(); - in.unread(); - // System.out.println("so far:" + buf2 + ":next:" +(char)ch); - } else { - for (int i = 0; i < count; i++) { - in.unread(); - } - } - return; - } - StringBuffer buf2 = new StringBuffer(); - ch = in.read(); - do { - buf2.append((char) ch); - ch = in.read(); - // System.out.println("within ident:"+ (char)ch); - } while ((ch != -1) - && (Character.isJavaIdentifierPart((char) ch) || (ch == '/'))); - buf.append(buf2.toString().replace('/', '.')); - // System.out.println("regular return ident:"+ (char)ch + ":" + buf2); - if (ch != -1) { - in.unread(); - } - } - - private static final void matchGJIdent(MyByteArrayInputStream in, - StringBuffer buf) { - int ch; - matchIdent(in, buf); - ch = in.read(); - if ((ch == '<') || ch == '(') { // Parameterized or method - // System.out.println("Enter <"); - buf.append((char) ch); - matchGJIdent(in, buf); - while (((ch = in.read()) != '>') && (ch != ')')) { // List of - // parameters - if (ch == -1) { - throw new RuntimeException("Illegal signature: " - + in.getData() + " reaching EOF"); - } - // System.out.println("Still no >"); - buf.append(", "); - in.unread(); - matchGJIdent(in, buf); // Recursive call - } - // System.out.println("Exit >"); - buf.append((char) ch); - } else { - in.unread(); - } - ch = in.read(); - if (identStart(ch)) { - in.unread(); - matchGJIdent(in, buf); - } else if (ch == ')') { - in.unread(); - return; - } else if (ch != ';') { - throw new RuntimeException("Illegal signature: " + in.getData() - + " read " + (char) ch); - } - } - - public static String translate(String s) { - // System.out.println("Sig:" + s); - StringBuffer buf = new StringBuffer(); - matchGJIdent(new MyByteArrayInputStream(s), buf); - return buf.toString(); - } - - public static final boolean isFormalParameterList(String s) { - return s.startsWith("<") && (s.indexOf(':') > 0); - } - - public static final boolean isActualParameterList(String s) { - return s.startsWith("L") && s.endsWith(">;"); - } - - /** - * @return String representation - */ - @Override - public final String toString() { - String s = getSignature(); - return "Signature(" + s + ")"; - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - return (Signature) clone(); - } -} diff --git a/src/org/apache/bcel/classfile/SourceFile.java b/src/org/apache/bcel/classfile/SourceFile.java deleted file mode 100644 index 9f98400..0000000 --- a/src/org/apache/bcel/classfile/SourceFile.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from Attribute and represents a reference to - * the source file of this class. At most one SourceFile attribute should appear - * per classfile. The intention of this class is that it is instantiated from - * the Attribute.readAttribute() method. - * - * @version $Id: SourceFile.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Attribute - */ -public final class SourceFile extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int sourcefile_index; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public SourceFile(SourceFile c) { - this(c.getNameIndex(), c.getLength(), c.getSourceFileIndex(), c - .getConstantPool()); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - SourceFile(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, file.readUnsignedShort(), constant_pool); - } - - /** - * @param name_index - * Index in constant pool to CONSTANT_Utf8, which should - * represent the string "SourceFile". - * @param length - * Content length in bytes, the value should be 2. - * @param constant_pool - * The constant pool that this attribute is associated with. - * @param sourcefile_index - * Index in constant pool to CONSTANT_Utf8. This string will be - * interpreted as the name of the file from which this class was - * compiled. It will not be interpreted as indicating the name of - * the directory contqining the file or an absolute path; this - * information has to be supplied the consumer of this attribute - * - in many cases, the JVM. - */ - public SourceFile(int name_index, int length, int sourcefile_index, - ConstantPool constant_pool) { - super(Constants.ATTR_SOURCE_FILE, name_index, length, constant_pool); - this.sourcefile_index = sourcefile_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitSourceFile(this); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(sourcefile_index); - } - - /** - * @return Index in constant pool of source file name. - */ - public final int getSourceFileIndex() { - return sourcefile_index; - } - - /** - * @param sourcefile_index - */ - public final void setSourceFileIndex(int sourcefile_index) { - this.sourcefile_index = sourcefile_index; - } - - /** - * @return Source file name. - */ - public final String getSourceFileName() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant( - sourcefile_index, Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return String representation - */ - @Override - public final String toString() { - return "SourceFile(" + getSourceFileName() + ")"; - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - return (SourceFile) clone(); - } -} diff --git a/src/org/apache/bcel/classfile/StackMap.java b/src/org/apache/bcel/classfile/StackMap.java deleted file mode 100644 index 0daa12f..0000000 --- a/src/org/apache/bcel/classfile/StackMap.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class represents a stack map attribute used for preverification of Java - * classes for the Java 2 Micro Edition - * (J2ME). This attribute is used by the KVM and contained within the - * Code attribute of a method. See CLDC specification 5.3.1.2 - * - * @version $Id: StackMap.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Code - * @see StackMapEntry - * @see StackMapType - */ -public final class StackMap extends Attribute implements Node { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int map_length; - private StackMapEntry[] map; // Table of stack map entries - - /* - * @param name_index Index of name - * - * @param length Content length in bytes - * - * @param map Table of stack map entries - * - * @param constant_pool Array of constants - */ - public StackMap(int name_index, int length, StackMapEntry[] map, - ConstantPool constant_pool) { - super(Constants.ATTR_STACK_MAP, name_index, length, constant_pool); - setStackMap(map); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index of name - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - StackMap(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, (StackMapEntry[]) null, constant_pool); - map_length = file.readUnsignedShort(); - map = new StackMapEntry[map_length]; - for (int i = 0; i < map_length; i++) { - map[i] = new StackMapEntry(file, constant_pool); - } - } - - /** - * Dump line number table attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(map_length); - for (int i = 0; i < map_length; i++) { - map[i].dump(file); - } - } - - /** - * @return Array of stack map entries - */ - public final StackMapEntry[] getStackMap() { - return map; - } - - /** - * @param map - * Array of stack map entries - */ - public final void setStackMap(StackMapEntry[] map) { - this.map = map; - map_length = (map == null) ? 0 : map.length; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - StringBuffer buf = new StringBuffer("StackMap("); - for (int i = 0; i < map_length; i++) { - buf.append(map[i].toString()); - if (i < map_length - 1) { - buf.append(", "); - } - } - buf.append(')'); - return buf.toString(); - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - StackMap c = (StackMap) clone(); - c.map = new StackMapEntry[map_length]; - for (int i = 0; i < map_length; i++) { - c.map[i] = map[i].copy(); - } - c.constant_pool = _constant_pool; - return c; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackMap(this); - } - - public final int getMapLength() { - return map_length; - } -} diff --git a/src/org/apache/bcel/classfile/StackMapEntry.java b/src/org/apache/bcel/classfile/StackMapEntry.java deleted file mode 100644 index 61df151..0000000 --- a/src/org/apache/bcel/classfile/StackMapEntry.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; - -/** - * This class represents a stack map entry recording the types of local - * variables and the the of stack items at a given byte code offset. See CLDC - * specification 5.3.1.2 - * - * @version $Id: StackMapEntry.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see StackMap - * @see StackMapType - */ -public final class StackMapEntry implements Cloneable { - - private int byte_code_offset; - private int number_of_locals; - private StackMapType[] types_of_locals; - private int number_of_stack_items; - private StackMapType[] types_of_stack_items; - private ConstantPool constant_pool; - - /** - * Construct object from file stream. - * - * @param file - * Input stream - * @throws IOException - */ - StackMapEntry(DataInputStream file, ConstantPool constant_pool) - throws IOException { - this(file.readShort(), file.readShort(), null, -1, null, constant_pool); - types_of_locals = new StackMapType[number_of_locals]; - for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i] = new StackMapType(file, constant_pool); - } - number_of_stack_items = file.readShort(); - types_of_stack_items = new StackMapType[number_of_stack_items]; - for (int i = 0; i < number_of_stack_items; i++) { - types_of_stack_items[i] = new StackMapType(file, constant_pool); - } - } - - public StackMapEntry(int byte_code_offset, int number_of_locals, - StackMapType[] types_of_locals, int number_of_stack_items, - StackMapType[] types_of_stack_items, ConstantPool constant_pool) { - this.byte_code_offset = byte_code_offset; - this.number_of_locals = number_of_locals; - this.types_of_locals = types_of_locals; - this.number_of_stack_items = number_of_stack_items; - this.types_of_stack_items = types_of_stack_items; - this.constant_pool = constant_pool; - } - - /** - * Dump stack map entry - * - * @param file - * Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException { - file.writeShort(byte_code_offset); - file.writeShort(number_of_locals); - for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i].dump(file); - } - file.writeShort(number_of_stack_items); - for (int i = 0; i < number_of_stack_items; i++) { - types_of_stack_items[i].dump(file); - } - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - StringBuffer buf = new StringBuffer(64); - buf.append("(offset=").append(byte_code_offset); - if (number_of_locals > 0) { - buf.append(", locals={"); - for (int i = 0; i < number_of_locals; i++) { - buf.append(types_of_locals[i]); - if (i < number_of_locals - 1) { - buf.append(", "); - } - } - buf.append("}"); - } - if (number_of_stack_items > 0) { - buf.append(", stack items={"); - for (int i = 0; i < number_of_stack_items; i++) { - buf.append(types_of_stack_items[i]); - if (i < number_of_stack_items - 1) { - buf.append(", "); - } - } - buf.append("}"); - } - buf.append(")"); - return buf.toString(); - } - - public void setByteCodeOffset(int b) { - byte_code_offset = b; - } - - public int getByteCodeOffset() { - return byte_code_offset; - } - - public void setNumberOfLocals(int n) { - number_of_locals = n; - } - - public int getNumberOfLocals() { - return number_of_locals; - } - - public void setTypesOfLocals(StackMapType[] t) { - types_of_locals = t; - } - - public StackMapType[] getTypesOfLocals() { - return types_of_locals; - } - - public void setNumberOfStackItems(int n) { - number_of_stack_items = n; - } - - public int getNumberOfStackItems() { - return number_of_stack_items; - } - - public void setTypesOfStackItems(StackMapType[] t) { - types_of_stack_items = t; - } - - public StackMapType[] getTypesOfStackItems() { - return types_of_stack_items; - } - - /** - * @return deep copy of this object - */ - public StackMapEntry copy() { - try { - return (StackMapEntry) clone(); - } catch (CloneNotSupportedException e) { - } - return null; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - public void accept(Visitor v) { - v.visitStackMapEntry(this); - } - - /** - * @return Constant pool used by this object. - */ - public final ConstantPool getConstantPool() { - return constant_pool; - } - - /** - * @param constant_pool - * Constant pool to be used for this object. - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } -} diff --git a/src/org/apache/bcel/classfile/StackMapType.java b/src/org/apache/bcel/classfile/StackMapType.java deleted file mode 100644 index 1276b4f..0000000 --- a/src/org/apache/bcel/classfile/StackMapType.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class represents the type of a local variable or item on stack used in - * the StackMap entries. - * - * @version $Id: StackMapType.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see StackMapEntry - * @see StackMap - * @see Constants - */ -public final class StackMapType implements Cloneable { - - private byte type; - private int index = -1; // Index to CONSTANT_Class or offset - private ConstantPool constant_pool; - - /** - * Construct object from file stream. - * - * @param file - * Input stream - * @throws IOException - */ - StackMapType(DataInputStream file, ConstantPool constant_pool) - throws IOException { - this(file.readByte(), -1, constant_pool); - if (hasIndex()) { - setIndex(file.readShort()); - } - setConstantPool(constant_pool); - } - - /** - * @param type - * type tag as defined in the Constants interface - * @param index - * index to constant pool, or byte code offset - */ - public StackMapType(byte type, int index, ConstantPool constant_pool) { - setType(type); - setIndex(index); - setConstantPool(constant_pool); - } - - public void setType(byte t) { - if ((t < Constants.ITEM_Bogus) || (t > Constants.ITEM_NewObject)) { - throw new RuntimeException("Illegal type for StackMapType: " + t); - } - type = t; - } - - public byte getType() { - return type; - } - - public void setIndex(int t) { - index = t; - } - - /** - * @return index to constant pool if type == ITEM_Object, or offset in byte - * code, if type == ITEM_NewObject, and -1 otherwise - */ - public int getIndex() { - return index; - } - - /** - * Dump type entries to file. - * - * @param file - * Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException { - file.writeByte(type); - if (hasIndex()) { - file.writeShort(getIndex()); - } - } - - /** - * @return true, if type is either ITEM_Object or ITEM_NewObject - */ - public final boolean hasIndex() { - return ((type == Constants.ITEM_Object) || (type == Constants.ITEM_NewObject)); - } - - private String printIndex() { - if (type == Constants.ITEM_Object) { - if (index < 0) { - return ", class="; - } - return ", class=" - + constant_pool.constantToString(index, - Constants.CONSTANT_Class); - } else if (type == Constants.ITEM_NewObject) { - return ", offset=" + index; - } else { - return ""; - } - } - - /** - * @return String representation - */ - @Override - public final String toString() { - return "(type=" + Constants.ITEM_NAMES[type] + printIndex() + ")"; - } - - /** - * @return deep copy of this object - */ - public StackMapType copy() { - try { - return (StackMapType) clone(); - } catch (CloneNotSupportedException e) { - } - return null; - } - - /** - * @return Constant pool used by this object. - */ - public final ConstantPool getConstantPool() { - return constant_pool; - } - - /** - * @param constant_pool - * Constant pool to be used for this object. - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } -} diff --git a/src/org/apache/bcel/classfile/Synthetic.java b/src/org/apache/bcel/classfile/Synthetic.java deleted file mode 100644 index 1f2c784..0000000 --- a/src/org/apache/bcel/classfile/Synthetic.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * This class is derived from Attribute and declares this class as - * `synthetic', i.e., it needs special handling. The JVM specification states "A - * class member that does not appear in the source code must be marked using a - * Synthetic attribute." It may appear in the ClassFile attribute table, a - * field_info table or a method_info table. This class is intended to be - * instantiated from the Attribute.readAttribute() method. - * - * @version $Id: Synthetic.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Attribute - */ -public final class Synthetic extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private byte[] bytes; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public Synthetic(Synthetic c) { - this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); - } - - /** - * @param name_index - * Index in constant pool to CONSTANT_Utf8, which should - * represent the string "Synthetic". - * @param length - * Content length in bytes - should be zero. - * @param bytes - * Attribute contents - * @param constant_pool - * The constant pool this attribute is associated with. - */ - public Synthetic(int name_index, int length, byte[] bytes, - ConstantPool constant_pool) { - super(Constants.ATTR_SYNTHETIC, name_index, length, constant_pool); - this.bytes = bytes; - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index in constant pool to CONSTANT_Utf8 - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - Synthetic(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, (byte[]) null, constant_pool); - if (length > 0) { - bytes = new byte[length]; - file.readFully(bytes); - System.err.println("Synthetic attribute with length > 0"); - } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitSynthetic(this); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - if (length > 0) { - file.write(bytes, 0, length); - } - } - - /** - * @return data bytes. - */ - public final byte[] getBytes() { - return bytes; - } - - /** - * @param bytes - */ - public final void setBytes(byte[] bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - StringBuffer buf = new StringBuffer("Synthetic"); - if (length > 0) { - buf.append(" ").append(Utility.toHexString(bytes)); - } - return buf.toString(); - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - Synthetic c = (Synthetic) clone(); - if (bytes != null) { - c.bytes = new byte[bytes.length]; - System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); - } - c.constant_pool = _constant_pool; - return c; - } -} diff --git a/src/org/apache/bcel/classfile/Unknown.java b/src/org/apache/bcel/classfile/Unknown.java deleted file mode 100644 index d4ce2f4..0000000 --- a/src/org/apache/bcel/classfile/Unknown.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.apache.bcel.Constants; - -/** - * This class represents a reference to an unknown (i.e., application-specific) - * attribute of a class. It is instantiated from the - * Attribute.readAttribute() method. Applications that need to read in - * application-specific attributes should create an AttributeReader implementation and attach - * it via Attribute.addAttributeReader. - * - * - * @version $Id: Unknown.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @see org.apache.bcel.classfile.Attribute - * @see org.apache.bcel.classfile.AttributeReader - * @author M. Dahm - */ -public final class Unknown extends Attribute { - - /** - * - */ - private static final long serialVersionUID = 1L; - private byte[] bytes; - private String name; - private static Map unknown_attributes = new HashMap(); - - /** - * @return array of unknown attributes, but just one for each kind. - */ - static Unknown[] getUnknownAttributes() { - Unknown[] unknowns = new Unknown[unknown_attributes.size()]; - Iterator entries = unknown_attributes.values().iterator(); - for (int i = 0; entries.hasNext(); i++) { - unknowns[i] = entries.next(); - } - unknown_attributes.clear(); - return unknowns; - } - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Unknown(Unknown c) { - this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); - } - - /** - * Create a non-standard attribute. - * - * @param name_index - * Index in constant pool - * @param length - * Content length in bytes - * @param bytes - * Attribute contents - * @param constant_pool - * Array of constants - */ - public Unknown(int name_index, int length, byte[] bytes, - ConstantPool constant_pool) { - super(Constants.ATTR_UNKNOWN, name_index, length, constant_pool); - this.bytes = bytes; - name = ((ConstantUtf8) constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8)).getBytes(); - unknown_attributes.put(name, this); - } - - /** - * Construct object from file stream. - * - * @param name_index - * Index in constant pool - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - * @throws IOException - */ - Unknown(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(name_index, length, (byte[]) null, constant_pool); - if (length > 0) { - bytes = new byte[length]; - file.readFully(bytes); - } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitUnknown(this); - } - - /** - * Dump unknown bytes to file stream. - * - * @param file - * Output file stream - * @throws IOException - */ - @Override - public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - if (length > 0) { - file.write(bytes, 0, length); - } - } - - /** - * @return data bytes. - */ - public final byte[] getBytes() { - return bytes; - } - - /** - * @return name of attribute. - */ - public final String getName() { - return name; - } - - /** - * @param bytes - * the bytes to set - */ - public final void setBytes(byte[] bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - @Override - public final String toString() { - if (length == 0 || bytes == null) { - return "(Unknown attribute " + name + ")"; - } - String hex; - if (length > 10) { - byte[] tmp = new byte[10]; - System.arraycopy(bytes, 0, tmp, 0, 10); - hex = Utility.toHexString(tmp) + "... (truncated)"; - } else { - hex = Utility.toHexString(bytes); - } - return "(Unknown attribute " + name + ": " + hex + ")"; - } - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy(ConstantPool _constant_pool) { - Unknown c = (Unknown) clone(); - if (bytes != null) { - c.bytes = new byte[bytes.length]; - System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); - } - c.constant_pool = _constant_pool; - return c; - } -} diff --git a/src/org/apache/bcel/classfile/Utility.java b/src/org/apache/bcel/classfile/Utility.java deleted file mode 100644 index 86d8c71..0000000 --- a/src/org/apache/bcel/classfile/Utility.java +++ /dev/null @@ -1,1433 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.CharArrayReader; -import java.io.CharArrayWriter; -import java.io.FilterReader; -import java.io.FilterWriter; -import java.io.IOException; -import java.io.PrintStream; -import java.io.PrintWriter; -import java.io.Reader; -import java.io.Writer; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -import org.apache.bcel.Constants; -import org.apache.bcel.util.ByteSequence; - -/** - * Utility functions that do not really belong to any class in particular. - * - * @version $Id: Utility.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class Utility { - - private static int unwrap(ThreadLocal tl) { - return tl.get().intValue(); - } - - private static void wrap(ThreadLocal tl, int value) { - tl.set(new Integer(value)); - } - - private static ThreadLocal consumed_chars = new ThreadLocal() { - - @Override - protected Integer initialValue() { - return new Integer(0); - } - };/* - * How many chars have been consumed during parsing in signatureToString(). - * Read by methodSignatureToString(). Set by side effect,but only - * internally. - */ - private static boolean wide = false; /* - * The `WIDE' instruction is used in the - * byte code to allow 16-bit wide - * indices for local variables. This - * opcode precedes an `ILOAD', e.g.. The - * opcode immediately following takes an - * extra byte which is combined with the - * following byte to form a 16-bit - * value. - */ - - /** - * Convert bit field of flags into string such as `static final'. - * - * @param access_flags - * Access flags - * @return String representation of flags - */ - public static final String accessToString(int access_flags) { - return accessToString(access_flags, false); - } - - /** - * Convert bit field of flags into string such as `static final'. - * - * Special case: Classes compiled with new compilers and with the - * `ACC_SUPER' flag would be said to be "synchronized". This is because SUN - * used the same value for the flags `ACC_SUPER' and `ACC_SYNCHRONIZED'. - * - * @param access_flags - * Access flags - * @param for_class - * access flags are for class qualifiers ? - * @return String representation of flags - */ - public static final String accessToString(int access_flags, - boolean for_class) { - StringBuffer buf = new StringBuffer(); - int p = 0; - for (int i = 0; p < Constants.MAX_ACC_FLAG; i++) { // Loop through known - // flags - p = pow2(i); - if ((access_flags & p) != 0) { - /* - * Special case: Classes compiled with new compilers and with - * the `ACC_SUPER' flag would be said to be "synchronized". This - * is because SUN used the same value for the flags `ACC_SUPER' - * and `ACC_SYNCHRONIZED'. - */ - if (for_class - && ((p == Constants.ACC_SUPER) || (p == Constants.ACC_INTERFACE))) { - continue; - } - buf.append(Constants.ACCESS_NAMES[i]).append(" "); - } - } - return buf.toString().trim(); - } - - /** - * @return "class" or "interface", depending on the ACC_INTERFACE flag - */ - public static final String classOrInterface(int access_flags) { - return ((access_flags & Constants.ACC_INTERFACE) != 0) ? "interface" - : "class"; - } - - /** - * Disassemble a byte array of JVM byte codes starting from code line - * `index' and return the disassembled string representation. Decode only - * `num' opcodes (including their operands), use -1 if you want to decompile - * everything. - * - * @param code - * byte code array - * @param constant_pool - * Array of constants - * @param index - * offset in `code' array - * (number of opcodes, not bytes!) - * @param length - * number of opcodes to decompile, -1 for all - * @param verbose - * be verbose, e.g. print constant pool index - * @return String representation of byte codes - */ - public static final String codeToString(byte[] code, - ConstantPool constant_pool, int index, int length, boolean verbose) { - StringBuffer buf = new StringBuffer(code.length * 20); // Should be - // sufficient - ByteSequence stream = new ByteSequence(code); - try { - for (int i = 0; i < index; i++) { - codeToString(stream, constant_pool, verbose); - } - for (int i = 0; stream.available() > 0; i++) { - if ((length < 0) || (i < length)) { - String indices = fillup(stream.getIndex() + ":", 6, true, - ' '); - buf.append(indices) - .append(codeToString(stream, constant_pool, verbose)) - .append('\n'); - } - } - } catch (IOException e) { - System.out.println(buf.toString()); - e.printStackTrace(); - throw new ClassFormatException("Byte code error: " + e); - } - return buf.toString(); - } - - public static final String codeToString(byte[] code, - ConstantPool constant_pool, int index, int length) { - return codeToString(code, constant_pool, index, length, true); - } - - /** - * Disassemble a stream of byte codes and return the string representation. - * - * @param bytes - * stream of bytes - * @param constant_pool - * Array of constants - * @param verbose - * be verbose, e.g. print constant pool index - * @return String representation of byte code - */ - public static final String codeToString(ByteSequence bytes, - ConstantPool constant_pool, boolean verbose) throws IOException { - short opcode = (short) bytes.readUnsignedByte(); - int default_offset = 0, low, high, npairs; - int index, vindex, constant; - int[] match, jump_table; - int no_pad_bytes = 0, offset; - StringBuffer buf = new StringBuffer(Constants.OPCODE_NAMES[opcode]); - /* - * Special case: Skip (0-3) padding bytes, i.e., the following bytes are - * 4-byte-aligned - */ - if ((opcode == Constants.TABLESWITCH) - || (opcode == Constants.LOOKUPSWITCH)) { - int remainder = bytes.getIndex() % 4; - no_pad_bytes = (remainder == 0) ? 0 : 4 - remainder; - for (int i = 0; i < no_pad_bytes; i++) { - byte b; - if ((b = bytes.readByte()) != 0) { - System.err.println("Warning: Padding byte != 0 in " - + Constants.OPCODE_NAMES[opcode] + ":" + b); - } - } - // Both cases have a field default_offset in common - default_offset = bytes.readInt(); - } - switch (opcode) { - /* - * Table switch has variable length arguments. - */ - case Constants.TABLESWITCH: - low = bytes.readInt(); - high = bytes.readInt(); - offset = bytes.getIndex() - 12 - no_pad_bytes - 1; - default_offset += offset; - buf.append("\tdefault = ").append(default_offset) - .append(", low = ").append(low).append(", high = ") - .append(high).append("("); - jump_table = new int[high - low + 1]; - for (int i = 0; i < jump_table.length; i++) { - jump_table[i] = offset + bytes.readInt(); - buf.append(jump_table[i]); - if (i < jump_table.length - 1) { - buf.append(", "); - } - } - buf.append(")"); - break; - /* - * Lookup switch has variable length arguments. - */ - case Constants.LOOKUPSWITCH: { - npairs = bytes.readInt(); - offset = bytes.getIndex() - 8 - no_pad_bytes - 1; - match = new int[npairs]; - jump_table = new int[npairs]; - default_offset += offset; - buf.append("\tdefault = ").append(default_offset) - .append(", npairs = ").append(npairs).append(" ("); - for (int i = 0; i < npairs; i++) { - match[i] = bytes.readInt(); - jump_table[i] = offset + bytes.readInt(); - buf.append("(").append(match[i]).append(", ") - .append(jump_table[i]).append(")"); - if (i < npairs - 1) { - buf.append(", "); - } - } - buf.append(")"); - } - break; - /* - * Two address bytes + offset from start of byte stream form the jump - * target - */ - case Constants.GOTO: - case Constants.IFEQ: - case Constants.IFGE: - case Constants.IFGT: - case Constants.IFLE: - case Constants.IFLT: - case Constants.JSR: - case Constants.IFNE: - case Constants.IFNONNULL: - case Constants.IFNULL: - case Constants.IF_ACMPEQ: - case Constants.IF_ACMPNE: - case Constants.IF_ICMPEQ: - case Constants.IF_ICMPGE: - case Constants.IF_ICMPGT: - case Constants.IF_ICMPLE: - case Constants.IF_ICMPLT: - case Constants.IF_ICMPNE: - buf.append("\t\t#").append( - (bytes.getIndex() - 1) + bytes.readShort()); - break; - /* - * 32-bit wide jumps - */ - case Constants.GOTO_W: - case Constants.JSR_W: - buf.append("\t\t#").append( - ((bytes.getIndex() - 1) + bytes.readInt())); - break; - /* - * Index byte references local variable (register) - */ - case Constants.ALOAD: - case Constants.ASTORE: - case Constants.DLOAD: - case Constants.DSTORE: - case Constants.FLOAD: - case Constants.FSTORE: - case Constants.ILOAD: - case Constants.ISTORE: - case Constants.LLOAD: - case Constants.LSTORE: - case Constants.RET: - if (wide) { - vindex = bytes.readUnsignedShort(); - wide = false; // Clear flag - } else { - vindex = bytes.readUnsignedByte(); - } - buf.append("\t\t%").append(vindex); - break; - /* - * Remember wide byte which is used to form a 16-bit address in the - * following instruction. Relies on that the method is called again with - * the following opcode. - */ - case Constants.WIDE: - wide = true; - buf.append("\t(wide)"); - break; - /* - * Array of basic type. - */ - case Constants.NEWARRAY: - buf.append("\t\t<").append(Constants.TYPE_NAMES[bytes.readByte()]) - .append(">"); - break; - /* - * Access object/class fields. - */ - case Constants.GETFIELD: - case Constants.GETSTATIC: - case Constants.PUTFIELD: - case Constants.PUTSTATIC: - index = bytes.readUnsignedShort(); - buf.append("\t\t") - .append(constant_pool.constantToString(index, - Constants.CONSTANT_Fieldref)) - .append((verbose ? " (" + index + ")" : "")); - break; - /* - * Operands are references to classes in constant pool - */ - case Constants.NEW: - case Constants.CHECKCAST: - buf.append("\t"); - case Constants.INSTANCEOF: - index = bytes.readUnsignedShort(); - buf.append("\t<") - .append(constant_pool.constantToString(index, - Constants.CONSTANT_Class)).append(">") - .append((verbose ? " (" + index + ")" : "")); - break; - /* - * Operands are references to methods in constant pool - */ - case Constants.INVOKESPECIAL: - case Constants.INVOKESTATIC: - case Constants.INVOKEVIRTUAL: - index = bytes.readUnsignedShort(); - buf.append("\t") - .append(constant_pool.constantToString(index, - Constants.CONSTANT_Methodref)) - .append((verbose ? " (" + index + ")" : "")); - break; - case Constants.INVOKEINTERFACE: - index = bytes.readUnsignedShort(); - int nargs = bytes.readUnsignedByte(); // historical, redundant - buf.append("\t") - .append(constant_pool.constantToString(index, - Constants.CONSTANT_InterfaceMethodref)) - .append(verbose ? " (" + index + ")\t" : "").append(nargs) - .append("\t").append(bytes.readUnsignedByte()); // Last byte - // is a - // reserved - // space - break; - /* - * Operands are references to items in constant pool - */ - case Constants.LDC_W: - case Constants.LDC2_W: - index = bytes.readUnsignedShort(); - buf.append("\t\t") - .append(constant_pool.constantToString(index, constant_pool - .getConstant(index).getTag())) - .append((verbose ? " (" + index + ")" : "")); - break; - case Constants.LDC: - index = bytes.readUnsignedByte(); - buf.append("\t\t") - .append(constant_pool.constantToString(index, constant_pool - .getConstant(index).getTag())) - .append((verbose ? " (" + index + ")" : "")); - break; - /* - * Array of references. - */ - case Constants.ANEWARRAY: - index = bytes.readUnsignedShort(); - buf.append("\t\t<") - .append(compactClassName(constant_pool.getConstantString( - index, Constants.CONSTANT_Class), false)) - .append(">").append((verbose ? " (" + index + ")" : "")); - break; - /* - * Multidimensional array of references. - */ - case Constants.MULTIANEWARRAY: { - index = bytes.readUnsignedShort(); - int dimensions = bytes.readUnsignedByte(); - buf.append("\t<") - .append(compactClassName(constant_pool.getConstantString( - index, Constants.CONSTANT_Class), false)) - .append(">\t").append(dimensions) - .append((verbose ? " (" + index + ")" : "")); - } - break; - /* - * Increment local variable. - */ - case Constants.IINC: - if (wide) { - vindex = bytes.readUnsignedShort(); - constant = bytes.readShort(); - wide = false; - } else { - vindex = bytes.readUnsignedByte(); - constant = bytes.readByte(); - } - buf.append("\t\t%").append(vindex).append("\t").append(constant); - break; - default: - if (Constants.NO_OF_OPERANDS[opcode] > 0) { - for (int i = 0; i < Constants.TYPE_OF_OPERANDS[opcode].length; i++) { - buf.append("\t\t"); - switch (Constants.TYPE_OF_OPERANDS[opcode][i]) { - case Constants.T_BYTE: - buf.append(bytes.readByte()); - break; - case Constants.T_SHORT: - buf.append(bytes.readShort()); - break; - case Constants.T_INT: - buf.append(bytes.readInt()); - break; - default: // Never reached - System.err.println("Unreachable default case reached!"); - System.exit(-1); - } - } - } - } - return buf.toString(); - } - - public static final String codeToString(ByteSequence bytes, - ConstantPool constant_pool) throws IOException { - return codeToString(bytes, constant_pool, true); - } - - /** - * Shorten long class names, java/lang/String becomes - * String. - * - * @param str - * The long class name - * @return Compacted class name - */ - public static final String compactClassName(String str) { - return compactClassName(str, true); - } - - /** - * Shorten long class name str, i.e., chop off the prefix, - * if the class name starts with this string and the flag chopit is - * true. Slashes / are converted to dots .. - * - * @param str - * The long class name - * @param prefix - * The prefix the get rid off - * @param chopit - * Flag that determines whether chopping is executed or not - * @return Compacted class name - */ - public static final String compactClassName(String str, String prefix, - boolean chopit) { - int len = prefix.length(); - str = str.replace('/', '.'); // Is `/' on all systems, even DOS - if (chopit) { - // If string starts with `prefix' and contains no further dots - if (str.startsWith(prefix) - && (str.substring(len).indexOf('.') == -1)) { - str = str.substring(len); - } - } - return str; - } - - /** - * Shorten long class names, java/lang/String becomes - * java.lang.String, e.g.. If chopit is true the - * prefix java.lang is also removed. - * - * @param str - * The long class name - * @param chopit - * Flag that determines whether chopping is executed or not - * @return Compacted class name - */ - public static final String compactClassName(String str, boolean chopit) { - return compactClassName(str, "java.lang.", chopit); - } - - /** - * @return `flag' with bit `i' set to 1 - */ - public static final int setBit(int flag, int i) { - return flag | pow2(i); - } - - /** - * @return `flag' with bit `i' set to 0 - */ - public static final int clearBit(int flag, int i) { - int bit = pow2(i); - return (flag & bit) == 0 ? flag : flag ^ bit; - } - - /** - * @return true, if bit `i' in `flag' is set - */ - public static final boolean isSet(int flag, int i) { - return (flag & pow2(i)) != 0; - } - - /** - * Converts string containing the method return and argument types to a byte - * code method signature. - * - * @param ret - * Return type of method - * @param argv - * Types of method arguments - * @return Byte code representation of method signature - */ - public final static String methodTypeToSignature(String ret, String[] argv) - throws ClassFormatException { - StringBuffer buf = new StringBuffer("("); - String str; - if (argv != null) { - for (int i = 0; i < argv.length; i++) { - str = getSignature(argv[i]); - if (str.endsWith("V")) { - throw new ClassFormatException("Invalid type: " + argv[i]); - } - buf.append(str); - } - } - str = getSignature(ret); - buf.append(")").append(str); - return buf.toString(); - } - - /** - * @param signature - * Method signature - * @return Array of argument types - * @throws ClassFormatException - */ - public static final String[] methodSignatureArgumentTypes(String signature) - throws ClassFormatException { - return methodSignatureArgumentTypes(signature, true); - } - - /** - * @param signature - * Method signature - * @param chopit - * Shorten class names ? - * @return Array of argument types - * @throws ClassFormatException - */ - public static final String[] methodSignatureArgumentTypes(String signature, - boolean chopit) throws ClassFormatException { - List vec = new ArrayList(); - int index; - try { // Read all declarations between for `(' and `)' - if (signature.charAt(0) != '(') { - throw new ClassFormatException("Invalid method signature: " - + signature); - } - index = 1; // current string position - while (signature.charAt(index) != ')') { - vec.add(signatureToString(signature.substring(index), chopit)); - // corrected concurrent private static field acess - index += unwrap(consumed_chars); // update position - } - } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " - + signature); - } - return vec.toArray(new String[vec.size()]); - } - - /** - * @param signature - * Method signature - * @return return type of method - * @throws ClassFormatException - */ - public static final String methodSignatureReturnType(String signature) - throws ClassFormatException { - return methodSignatureReturnType(signature, true); - } - - /** - * @param signature - * Method signature - * @param chopit - * Shorten class names ? - * @return return type of method - * @throws ClassFormatException - */ - public static final String methodSignatureReturnType(String signature, - boolean chopit) throws ClassFormatException { - int index; - String type; - try { - // Read return type after `)' - index = signature.lastIndexOf(')') + 1; - type = signatureToString(signature.substring(index), chopit); - } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " - + signature); - } - return type; - } - - /** - * Converts method signature to string with all class names compacted. - * - * @param signature - * to convert - * @param name - * of method - * @param access - * flags of method - * @return Human readable signature - */ - public static final String methodSignatureToString(String signature, - String name, String access) { - return methodSignatureToString(signature, name, access, true); - } - - public static final String methodSignatureToString(String signature, - String name, String access, boolean chopit) { - return methodSignatureToString(signature, name, access, chopit, null); - } - - /** - * A return type signature represents the return value from a method. It is - * a series of bytes in the following grammar: - * - * ::= | V - * - * The character V indicates that the method returns no value. Otherwise, - * the signature indicates the type of the return value. An argument - * signature represents an argument passed to a method: - * - * ::= - * - * A method signature represents the arguments that the method expects, and - * the value that it returns. ::= () - * ::= * - * - * This method converts such a string into a Java type declaration like - * `void main(String[])' and throws a `ClassFormatException' when the parsed - * type is invalid. - * - * @param signature - * Method signature - * @param name - * Method name - * @param access - * Method access rights - * @return Java type declaration - * @throws ClassFormatException - */ - public static final String methodSignatureToString(String signature, - String name, String access, boolean chopit, LocalVariableTable vars) - throws ClassFormatException { - StringBuffer buf = new StringBuffer("("); - String type; - int index; - int var_index = (access.indexOf("static") >= 0) ? 0 : 1; - try { // Read all declarations between for `(' and `)' - if (signature.charAt(0) != '(') { - throw new ClassFormatException("Invalid method signature: " - + signature); - } - index = 1; // current string position - while (signature.charAt(index) != ')') { - String param_type = signatureToString( - signature.substring(index), chopit); - buf.append(param_type); - if (vars != null) { - LocalVariable l = vars.getLocalVariable(var_index); - if (l != null) { - buf.append(" ").append(l.getName()); - } - } else { - buf.append(" arg").append(var_index); - } - if ("double".equals(param_type) || "long".equals(param_type)) { - var_index += 2; - } else { - var_index++; - } - buf.append(", "); - // corrected concurrent private static field acess - index += unwrap(consumed_chars); // update position - } - index++; // update position - // Read return type after `)' - type = signatureToString(signature.substring(index), chopit); - } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " - + signature); - } - if (buf.length() > 1) { - buf.setLength(buf.length() - 2); - } - buf.append(")"); - return access + ((access.length() > 0) ? " " : "") + // May be an empty - // string - type + " " + name + buf.toString(); - } - - // Guess what this does - private static final int pow2(int n) { - return 1 << n; - } - - /** - * Replace all occurences of old in str with new. - * - * @param str - * String to permute - * @param old - * String to be replaced - * @param new_ - * Replacement string - * @return new String object - */ - public static final String replace(String str, String old, String new_) { - int index, old_index; - StringBuffer buf = new StringBuffer(); - try { - if ((index = str.indexOf(old)) != -1) { // `old' found in str - old_index = 0; // String start offset - // While we have something to replace - while ((index = str.indexOf(old, old_index)) != -1) { - buf.append(str.substring(old_index, index)); // append - // prefix - buf.append(new_); // append replacement - old_index = index + old.length(); // Skip `old'.length chars - } - buf.append(str.substring(old_index)); // append rest of string - str = buf.toString(); - } - } catch (StringIndexOutOfBoundsException e) { // Should not occur - System.err.println(e); - } - return str; - } - - /** - * Converts signature to string with all class names compacted. - * - * @param signature - * to convert - * @return Human readable signature - */ - public static final String signatureToString(String signature) { - return signatureToString(signature, true); - } - - /** - * The field signature represents the value of an argument to a function or - * the value of a variable. It is a series of bytes generated by the - * following grammar: - * - *
-	 *  ::= 
-	 *       ::= ||
-	 *        ::= B|C|D|F|I|J|S|Z
-	 *      ::= L;
-	 *       ::= [
-	 * 
-	 * The meaning of the base types is as follows:
-	 * B byte signed byte
-	 * C char character
-	 * D double double precision IEEE float
-	 * F float single precision IEEE float
-	 * I int integer
-	 * J long long integer
-	 * L; ... an object of the given class
-	 * S short signed short
-	 * Z boolean true or false
-	 * [ ... array
-	 * 
- * - * This method converts this string into a Java type declaration such as - * `String[]' and throws a `ClassFormatException' when the parsed type is - * invalid. - * - * @param signature - * Class signature - * @param chopit - * Flag that determines whether chopping is executed or not - * @return Java type declaration - * @throws ClassFormatException - */ - public static final String signatureToString(String signature, - boolean chopit) { - // corrected concurrent private static field acess - wrap(consumed_chars, 1); // This is the default, read just one char like - // `B' - try { - switch (signature.charAt(0)) { - case 'B': - return "byte"; - case 'C': - return "char"; - case 'D': - return "double"; - case 'F': - return "float"; - case 'I': - return "int"; - case 'J': - return "long"; - case 'L': { // Full class name - int index = signature.indexOf(';'); // Look for closing `;' - if (index < 0) { - throw new ClassFormatException("Invalid signature: " - + signature); - } - // corrected concurrent private static field acess - wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are - // removed - return compactClassName(signature.substring(1, index), chopit); - } - case 'S': - return "short"; - case 'Z': - return "boolean"; - case '[': { // Array declaration - int n; - StringBuffer brackets; - String type; - int consumed_chars; // Shadows global var - brackets = new StringBuffer(); // Accumulate []'s - // Count opening brackets and look for optional size argument - for (n = 0; signature.charAt(n) == '['; n++) { - brackets.append("[]"); - } - consumed_chars = n; // Remember value - // The rest of the string denotes a `' - type = signatureToString(signature.substring(n), chopit); - // corrected concurrent private static field acess - // Utility.consumed_chars += consumed_chars; is replaced by: - int _temp = unwrap(Utility.consumed_chars) + consumed_chars; - wrap(Utility.consumed_chars, _temp); - return type + brackets.toString(); - } - case 'V': - return "void"; - default: - throw new ClassFormatException("Invalid signature: `" - + signature + "'"); - } - } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid signature: " + e + ":" - + signature); - } - } - - /** - * Parse Java type such as "char", or "java.lang.String[]" and return the - * signature in byte code format, e.g. "C" or "[Ljava/lang/String;" - * respectively. - * - * @param type - * Java type - * @return byte code signature - */ - public static String getSignature(String type) { - StringBuffer buf = new StringBuffer(); - char[] chars = type.toCharArray(); - boolean char_found = false, delim = false; - int index = -1; - loop: for (int i = 0; i < chars.length; i++) { - switch (chars[i]) { - case ' ': - case '\t': - case '\n': - case '\r': - case '\f': - if (char_found) { - delim = true; - } - break; - case '[': - if (!char_found) { - throw new RuntimeException("Illegal type: " + type); - } - index = i; - break loop; - default: - char_found = true; - if (!delim) { - buf.append(chars[i]); - } - } - } - int brackets = 0; - if (index > 0) { - brackets = countBrackets(type.substring(index)); - } - type = buf.toString(); - buf.setLength(0); - for (int i = 0; i < brackets; i++) { - buf.append('['); - } - boolean found = false; - for (int i = Constants.T_BOOLEAN; (i <= Constants.T_VOID) && !found; i++) { - if (Constants.TYPE_NAMES[i].equals(type)) { - found = true; - buf.append(Constants.SHORT_TYPE_NAMES[i]); - } - } - if (!found) { - buf.append('L').append(type.replace('.', '/')).append(';'); - } - return buf.toString(); - } - - private static int countBrackets(String brackets) { - char[] chars = brackets.toCharArray(); - int count = 0; - boolean open = false; - for (int i = 0; i < chars.length; i++) { - switch (chars[i]) { - case '[': - if (open) { - throw new RuntimeException("Illegally nested brackets:" - + brackets); - } - open = true; - break; - case ']': - if (!open) { - throw new RuntimeException("Illegally nested brackets:" - + brackets); - } - open = false; - count++; - break; - default: - // Don't care - } - } - if (open) { - throw new RuntimeException("Illegally nested brackets:" + brackets); - } - return count; - } - - /** - * Return type of method signature as a byte value as defined in - * Constants - * - * @param signature - * in format described above - * @return type of method signature - * @see Constants - */ - public static final byte typeOfMethodSignature(String signature) - throws ClassFormatException { - int index; - try { - if (signature.charAt(0) != '(') { - throw new ClassFormatException("Invalid method signature: " - + signature); - } - index = signature.lastIndexOf(')') + 1; - return typeOfSignature(signature.substring(index)); - } catch (StringIndexOutOfBoundsException e) { - throw new ClassFormatException("Invalid method signature: " - + signature); - } - } - - /** - * Return type of signature as a byte value as defined in Constants - * - * @param signature - * in format described above - * @return type of signature - * @see Constants - */ - public static final byte typeOfSignature(String signature) - throws ClassFormatException { - try { - switch (signature.charAt(0)) { - case 'B': - return Constants.T_BYTE; - case 'C': - return Constants.T_CHAR; - case 'D': - return Constants.T_DOUBLE; - case 'F': - return Constants.T_FLOAT; - case 'I': - return Constants.T_INT; - case 'J': - return Constants.T_LONG; - case 'L': - return Constants.T_REFERENCE; - case '[': - return Constants.T_ARRAY; - case 'V': - return Constants.T_VOID; - case 'Z': - return Constants.T_BOOLEAN; - case 'S': - return Constants.T_SHORT; - default: - throw new ClassFormatException("Invalid method signature: " - + signature); - } - } catch (StringIndexOutOfBoundsException e) { - throw new ClassFormatException("Invalid method signature: " - + signature); - } - } - - /** - * Map opcode names to opcode numbers. E.g., return Constants.ALOAD for - * "aload" - */ - public static short searchOpcode(String name) { - name = name.toLowerCase(Locale.ENGLISH); - for (short i = 0; i < Constants.OPCODE_NAMES.length; i++) { - if (Constants.OPCODE_NAMES[i].equals(name)) { - return i; - } - } - return -1; - } - - /** - * Convert (signed) byte to (unsigned) short value, i.e., all negative - * values become positive. - */ - private static final short byteToShort(byte b) { - return (b < 0) ? (short) (256 + b) : (short) b; - } - - /** - * Convert bytes into hexidecimal string - * - * @return bytes as hexidecimal string, e.g. 00 FA 12 ... - */ - public static final String toHexString(byte[] bytes) { - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < bytes.length; i++) { - short b = byteToShort(bytes[i]); - String hex = Integer.toString(b, 0x10); - if (b < 0x10) { - buf.append('0'); - } - buf.append(hex); - if (i < bytes.length - 1) { - buf.append(' '); - } - } - return buf.toString(); - } - - /** - * Return a string for an integer justified left or right and filled up with - * `fill' characters if necessary. - * - * @param i - * integer to format - * @param length - * length of desired string - * @param left_justify - * format left or right - * @param fill - * fill character - * @return formatted int - */ - public static final String format(int i, int length, boolean left_justify, - char fill) { - return fillup(Integer.toString(i), length, left_justify, fill); - } - - /** - * Fillup char with up to length characters with char `fill' and justify it - * left or right. - * - * @param str - * string to format - * @param length - * length of desired string - * @param left_justify - * format left or right - * @param fill - * fill character - * @return formatted string - */ - public static final String fillup(String str, int length, - boolean left_justify, char fill) { - int len = length - str.length(); - char[] buf = new char[(len < 0) ? 0 : len]; - for (int j = 0; j < buf.length; j++) { - buf[j] = fill; - } - if (left_justify) { - return str + new String(buf); - } - return new String(buf) + str; - } - - static final boolean equals(byte[] a, byte[] b) { - int size; - if ((size = a.length) != b.length) { - return false; - } - for (int i = 0; i < size; i++) { - if (a[i] != b[i]) { - return false; - } - } - return true; - } - - public static final void printArray(PrintStream out, Object[] obj) { - out.println(printArray(obj, true)); - } - - public static final void printArray(PrintWriter out, Object[] obj) { - out.println(printArray(obj, true)); - } - - public static final String printArray(Object[] obj) { - return printArray(obj, true); - } - - public static final String printArray(Object[] obj, boolean braces) { - return printArray(obj, braces, false); - } - - public static final String printArray(Object[] obj, boolean braces, - boolean quote) { - if (obj == null) { - return null; - } - StringBuffer buf = new StringBuffer(); - if (braces) { - buf.append('{'); - } - for (int i = 0; i < obj.length; i++) { - if (obj[i] != null) { - buf.append((quote ? "\"" : "")).append(obj[i].toString()) - .append((quote ? "\"" : "")); - } else { - buf.append("null"); - } - if (i < obj.length - 1) { - buf.append(", "); - } - } - if (braces) { - buf.append('}'); - } - return buf.toString(); - } - - /** - * @return true, if character is one of (a, ... z, A, ... Z, 0, ... 9, _) - */ - public static boolean isJavaIdentifierPart(char ch) { - return ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) - || ((ch >= '0') && (ch <= '9')) || (ch == '_'); - } - - /** - * Encode byte array it into Java identifier string, i.e., a string that - * only contains the following characters: (a, ... z, A, ... Z, 0, ... 9, _, - * $). The encoding algorithm itself is not too clever: if the current - * byte's ASCII value already is a valid Java identifier part, leave it as - * it is. Otherwise it writes the escape character($) followed by - *

- *

    - *
  • the ASCII value as a hexadecimal string, if the value is not in the - * range 200..247
  • - *
  • a Java identifier char not used in a lowercase hexadecimal string, if - * the value is in the range 200..247
  • - *
      - *

      - * - *

      - * This operation inflates the original byte array by roughly 40-50% - *

      - * - * @param bytes - * the byte array to convert - * @param compress - * use gzip to minimize string - */ - public static String encode(byte[] bytes, boolean compress) - throws IOException { - if (compress) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - GZIPOutputStream gos = new GZIPOutputStream(baos); - gos.write(bytes, 0, bytes.length); - gos.close(); - baos.close(); - bytes = baos.toByteArray(); - } - CharArrayWriter caw = new CharArrayWriter(); - JavaWriter jw = new JavaWriter(caw); - for (int i = 0; i < bytes.length; i++) { - int in = bytes[i] & 0x000000ff; // Normalize to unsigned - jw.write(in); - } - jw.close(); - return caw.toString(); - } - - /** - * Decode a string back to a byte array. - * - * @param s - * the string to convert - * @param uncompress - * use gzip to uncompress the stream of bytes - */ - public static byte[] decode(String s, boolean uncompress) - throws IOException { - char[] chars = s.toCharArray(); - CharArrayReader car = new CharArrayReader(chars); - JavaReader jr = new JavaReader(car); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - int ch; - while ((ch = jr.read()) >= 0) { - bos.write(ch); - } - bos.close(); - car.close(); - jr.close(); - byte[] bytes = bos.toByteArray(); - if (uncompress) { - GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream( - bytes)); - byte[] tmp = new byte[bytes.length * 3]; // Rough estimate - int count = 0; - int b; - while ((b = gis.read()) >= 0) { - tmp[count++] = (byte) b; - } - bytes = new byte[count]; - System.arraycopy(tmp, 0, bytes, 0, count); - } - return bytes; - } - - // A-Z, g-z, _, $ - private static final int FREE_CHARS = 48; - static int[] CHAR_MAP = new int[FREE_CHARS]; - static int[] MAP_CHAR = new int[256]; // Reverse map - private static final char ESCAPE_CHAR = '$'; - static { - int j = 0; - for (int i = 'A'; i <= 'Z'; i++) { - CHAR_MAP[j] = i; - MAP_CHAR[i] = j; - j++; - } - for (int i = 'g'; i <= 'z'; i++) { - CHAR_MAP[j] = i; - MAP_CHAR[i] = j; - j++; - } - CHAR_MAP[j] = '$'; - MAP_CHAR['$'] = j; - j++; - CHAR_MAP[j] = '_'; - MAP_CHAR['_'] = j; - } - - /** - * Decode characters into bytes. Used by decode() - */ - private static class JavaReader extends FilterReader { - - public JavaReader(Reader in) { - super(in); - } - - @Override - public int read() throws IOException { - int b = in.read(); - if (b != ESCAPE_CHAR) { - return b; - } - int i = in.read(); - if (i < 0) { - return -1; - } - if (((i >= '0') && (i <= '9')) || ((i >= 'a') && (i <= 'f'))) { // Normal - // escape - int j = in.read(); - if (j < 0) { - return -1; - } - char[] tmp = { (char) i, (char) j }; - int s = Integer.parseInt(new String(tmp), 16); - return s; - } - return MAP_CHAR[i]; - } - - @Override - public int read(char[] cbuf, int off, int len) throws IOException { - for (int i = 0; i < len; i++) { - cbuf[off + i] = (char) read(); - } - return len; - } - } - - /** - * Encode bytes into valid java identifier characters. Used by encode() - */ - private static class JavaWriter extends FilterWriter { - - public JavaWriter(Writer out) { - super(out); - } - - @Override - public void write(int b) throws IOException { - if (isJavaIdentifierPart((char) b) && (b != ESCAPE_CHAR)) { - out.write(b); - } else { - out.write(ESCAPE_CHAR); // Escape character - // Special escape - if (b >= 0 && b < FREE_CHARS) { - out.write(CHAR_MAP[b]); - } else { // Normal escape - char[] tmp = Integer.toHexString(b).toCharArray(); - if (tmp.length == 1) { - out.write('0'); - out.write(tmp[0]); - } else { - out.write(tmp[0]); - out.write(tmp[1]); - } - } - } - } - - @Override - public void write(char[] cbuf, int off, int len) throws IOException { - for (int i = 0; i < len; i++) { - write(cbuf[off + i]); - } - } - - @Override - public void write(String str, int off, int len) throws IOException { - write(str.toCharArray(), off, len); - } - } - - /** - * Escape all occurences of newline chars '\n', quotes \", etc. - */ - public static final String convertString(String label) { - char[] ch = label.toCharArray(); - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < ch.length; i++) { - switch (ch[i]) { - case '\n': - buf.append("\\n"); - break; - case '\r': - buf.append("\\r"); - break; - case '\"': - buf.append("\\\""); - break; - case '\'': - buf.append("\\'"); - break; - case '\\': - buf.append("\\\\"); - break; - default: - buf.append(ch[i]); - break; - } - } - return buf.toString(); - } -} diff --git a/src/org/apache/bcel/classfile/Visitor.java b/src/org/apache/bcel/classfile/Visitor.java deleted file mode 100644 index cdf0e74..0000000 --- a/src/org/apache/bcel/classfile/Visitor.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -/** - * Interface to make use of the Visitor pattern programming style. I.e. a class - * that implements this interface can traverse the contents of a Java class just - * by calling the `accept' method which all classes have. - * - * @version $Id: Visitor.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface Visitor { - - // public void visitAnnotation(Annotations obj); - // public void visitParameterAnnotation(ParameterAnnotations obj); - // public void visitAnnotationEntry(AnnotationEntry obj); - // public void visitAnnotationDefault(AnnotationDefault obj); - public void visitCode(Code obj); - - public void visitCodeException(CodeException obj); - - public void visitConstantClass(ConstantClass obj); - - public void visitConstantDouble(ConstantDouble obj); - - public void visitConstantFieldref(ConstantFieldref obj); - - public void visitConstantFloat(ConstantFloat obj); - - public void visitConstantInteger(ConstantInteger obj); - - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj); - - public void visitConstantLong(ConstantLong obj); - - public void visitConstantMethodref(ConstantMethodref obj); - - public void visitConstantNameAndType(ConstantNameAndType obj); - - public void visitConstantPool(ConstantPool obj); - - public void visitConstantString(ConstantString obj); - - public void visitConstantUtf8(ConstantUtf8 obj); - - public void visitConstantValue(ConstantValue obj); - - public void visitDeprecated(Deprecated obj); - - public void visitExceptionTable(ExceptionTable obj); - - public void visitField(Field obj); - - public void visitInnerClass(InnerClass obj); - - public void visitInnerClasses(InnerClasses obj); - - public void visitJavaClass(JavaClass obj); - - public void visitLineNumber(LineNumber obj); - - public void visitLineNumberTable(LineNumberTable obj); - - public void visitLocalVariable(LocalVariable obj); - - public void visitLocalVariableTable(LocalVariableTable obj); - - public void visitMethod(Method obj); - - public void visitSignature(Signature obj); - - public void visitSourceFile(SourceFile obj); - - public void visitSynthetic(Synthetic obj); - - public void visitUnknown(Unknown obj); - - public void visitStackMap(StackMap obj); - - public void visitStackMapEntry(StackMapEntry obj); -} diff --git a/src/org/apache/bcel/classfile/package.html b/src/org/apache/bcel/classfile/package.html deleted file mode 100644 index 472c399..0000000 --- a/src/org/apache/bcel/classfile/package.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - -

      -This package contains the classes that describe the structure of a -Java class file and a class file parser. -

      - - diff --git a/src/org/apache/bcel/generic/AALOAD.java b/src/org/apache/bcel/generic/AALOAD.java deleted file mode 100644 index b8ecd6c..0000000 --- a/src/org/apache/bcel/generic/AALOAD.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * AALOAD - Load reference from array - * - *
      - * Stack: ..., arrayref, index -> value
      - * 
      - * - * @version $Id: AALOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class AALOAD extends ArrayInstruction implements StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Load reference from array - */ - public AALOAD() { - super(org.apache.bcel.Constants.AALOAD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitAALOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/AASTORE.java b/src/org/apache/bcel/generic/AASTORE.java deleted file mode 100644 index 8bc1792..0000000 --- a/src/org/apache/bcel/generic/AASTORE.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * AASTORE - Store into reference array - * - *
      - * Stack: ..., arrayref, index, value -> ...
      - * 
      - * - * @version $Id: AASTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class AASTORE extends ArrayInstruction implements StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Store into reference array - */ - public AASTORE() { - super(org.apache.bcel.Constants.AASTORE); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitAASTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/ACONST_NULL.java b/src/org/apache/bcel/generic/ACONST_NULL.java deleted file mode 100644 index d996cf0..0000000 --- a/src/org/apache/bcel/generic/ACONST_NULL.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ACONST_NULL - Push null reference - * - *
      - * Stack: ... -> ..., null
      - * 
      - * - * @version $Id: ACONST_NULL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ACONST_NULL extends Instruction implements PushInstruction, - TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Push null reference - */ - public ACONST_NULL() { - super(org.apache.bcel.Constants.ACONST_NULL, (short) 1); - } - - /** - * @return Type.NULL - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.NULL; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitTypedInstruction(this); - v.visitACONST_NULL(this); - } -} diff --git a/src/org/apache/bcel/generic/ALOAD.java b/src/org/apache/bcel/generic/ALOAD.java deleted file mode 100644 index 7abea0e..0000000 --- a/src/org/apache/bcel/generic/ALOAD.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ALOAD - Load reference from local variable - * - *
      - * Stack: ... -> ..., objectref
      - * 
      - * - * @version $Id: ALOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ALOAD extends LoadInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ALOAD() { - super(org.apache.bcel.Constants.ALOAD, - org.apache.bcel.Constants.ALOAD_0); - } - - /** - * Load reference from local variable - * - * @param n - * index of local variable - */ - public ALOAD(int n) { - super(org.apache.bcel.Constants.ALOAD, - org.apache.bcel.Constants.ALOAD_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitALOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/ANEWARRAY.java b/src/org/apache/bcel/generic/ANEWARRAY.java deleted file mode 100644 index f7e4953..0000000 --- a/src/org/apache/bcel/generic/ANEWARRAY.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.ExceptionConstants; - -/** - * ANEWARRAY - Create new array of references - * - *
      - * Stack: ..., count -> ..., arrayref
      - * 
      - * - * @version $Id: ANEWARRAY.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ANEWARRAY extends CPInstruction implements LoadClass, - AllocationInstruction, ExceptionThrower, StackConsumer, StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ANEWARRAY() { - } - - public ANEWARRAY(int index) { - super(org.apache.bcel.Constants.ANEWARRAY, index); - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy( - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, - 0, - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; - return cs; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitAllocationInstruction(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitANEWARRAY(this); - } - - @Override - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - Type t = getType(cpg); - if (t instanceof ArrayType) { - t = ((ArrayType) t).getBasicType(); - } - return (t instanceof ObjectType) ? (ObjectType) t : null; - } -} diff --git a/src/org/apache/bcel/generic/ARETURN.java b/src/org/apache/bcel/generic/ARETURN.java deleted file mode 100644 index dc47ddc..0000000 --- a/src/org/apache/bcel/generic/ARETURN.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ARETURN - Return reference from method - * - *
      - * Stack: ..., objectref -> <empty>
      - * 
      - * - * @version $Id: ARETURN.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ARETURN extends ReturnInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Return reference from method - */ - public ARETURN() { - super(org.apache.bcel.Constants.ARETURN); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitARETURN(this); - } -} diff --git a/src/org/apache/bcel/generic/ARRAYLENGTH.java b/src/org/apache/bcel/generic/ARRAYLENGTH.java deleted file mode 100644 index 819f252..0000000 --- a/src/org/apache/bcel/generic/ARRAYLENGTH.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ARRAYLENGTH - Get length of array - * - *
      - * Stack: ..., arrayref -> ..., length
      - * 
      - * - * @version $Id: ARRAYLENGTH.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ARRAYLENGTH extends Instruction implements ExceptionThrower, - StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Get length of array - */ - public ARRAYLENGTH() { - super(org.apache.bcel.Constants.ARRAYLENGTH, (short) 1); - } - - /** - * @return exceptions this instruction may cause - */ - @Override - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION }; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitARRAYLENGTH(this); - } -} diff --git a/src/org/apache/bcel/generic/ASTORE.java b/src/org/apache/bcel/generic/ASTORE.java deleted file mode 100644 index 47e8f1a..0000000 --- a/src/org/apache/bcel/generic/ASTORE.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ASTORE - Store reference into local variable - * - *
      - * Stack ..., objectref -> ...
      - * 
      - * - * @version $Id: ASTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ASTORE extends StoreInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ASTORE() { - super(org.apache.bcel.Constants.ASTORE, - org.apache.bcel.Constants.ASTORE_0); - } - - /** - * Store reference into local variable - * - * @param n - * index of local variable - */ - public ASTORE(int n) { - super(org.apache.bcel.Constants.ASTORE, - org.apache.bcel.Constants.ASTORE_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitASTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/ATHROW.java b/src/org/apache/bcel/generic/ATHROW.java deleted file mode 100644 index b5563b3..0000000 --- a/src/org/apache/bcel/generic/ATHROW.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ATHROW - Throw exception - * - *
      - * Stack: ..., objectref -> objectref
      - * 
      - * - * @version $Id: ATHROW.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ATHROW extends Instruction implements UnconditionalBranch, - ExceptionThrower { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Throw exception - */ - public ATHROW() { - super(org.apache.bcel.Constants.ATHROW, (short) 1); - } - - /** - * @return exceptions this instruction may cause - */ - @Override - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.THROWABLE }; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitUnconditionalBranch(this); - v.visitExceptionThrower(this); - v.visitATHROW(this); - } -} diff --git a/src/org/apache/bcel/generic/AllocationInstruction.java b/src/org/apache/bcel/generic/AllocationInstruction.java deleted file mode 100644 index a30ab52..0000000 --- a/src/org/apache/bcel/generic/AllocationInstruction.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denote family of instructions that allocates space in the heap. - * - * @version $Id: AllocationInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface AllocationInstruction { -} diff --git a/src/org/apache/bcel/generic/ArithmeticInstruction.java b/src/org/apache/bcel/generic/ArithmeticInstruction.java deleted file mode 100644 index f60c295..0000000 --- a/src/org/apache/bcel/generic/ArithmeticInstruction.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; - -/** - * Super class for the family of arithmetic instructions. - * - * @version $Id: ArithmeticInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class ArithmeticInstruction extends Instruction implements - TypedInstruction, StackProducer, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ArithmeticInstruction() { - } - - /** - * @param opcode - * of instruction - */ - protected ArithmeticInstruction(short opcode) { - super(opcode, (short) 1); - } - - /** - * @return type associated with the instruction - */ - @Override - public Type getType(ConstantPoolGen cp) { - switch (opcode) { - case Constants.DADD: - case Constants.DDIV: - case Constants.DMUL: - case Constants.DNEG: - case Constants.DREM: - case Constants.DSUB: - return Type.DOUBLE; - case Constants.FADD: - case Constants.FDIV: - case Constants.FMUL: - case Constants.FNEG: - case Constants.FREM: - case Constants.FSUB: - return Type.FLOAT; - case Constants.IADD: - case Constants.IAND: - case Constants.IDIV: - case Constants.IMUL: - case Constants.INEG: - case Constants.IOR: - case Constants.IREM: - case Constants.ISHL: - case Constants.ISHR: - case Constants.ISUB: - case Constants.IUSHR: - case Constants.IXOR: - return Type.INT; - case Constants.LADD: - case Constants.LAND: - case Constants.LDIV: - case Constants.LMUL: - case Constants.LNEG: - case Constants.LOR: - case Constants.LREM: - case Constants.LSHL: - case Constants.LSHR: - case Constants.LSUB: - case Constants.LUSHR: - case Constants.LXOR: - return Type.LONG; - default: // Never reached - throw new ClassGenException("Unknown type " + opcode); - } - } -} diff --git a/src/org/apache/bcel/generic/ArrayInstruction.java b/src/org/apache/bcel/generic/ArrayInstruction.java deleted file mode 100644 index 883c7aa..0000000 --- a/src/org/apache/bcel/generic/ArrayInstruction.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Super class for instructions dealing with array access such as IALOAD. - * - * @version $Id: ArrayInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class ArrayInstruction extends Instruction implements - ExceptionThrower, TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ArrayInstruction() { - } - - /** - * @param opcode - * of instruction - */ - protected ArrayInstruction(short opcode) { - super(opcode, (short) 1); - } - - @Override - public Class[] getExceptions() { - return org.apache.bcel.ExceptionConstants.EXCS_ARRAY_EXCEPTION; - } - - /** - * @return type associated with the instruction - */ - @Override - public Type getType(ConstantPoolGen cp) { - switch (opcode) { - case org.apache.bcel.Constants.IALOAD: - case org.apache.bcel.Constants.IASTORE: - return Type.INT; - case org.apache.bcel.Constants.CALOAD: - case org.apache.bcel.Constants.CASTORE: - return Type.CHAR; - case org.apache.bcel.Constants.BALOAD: - case org.apache.bcel.Constants.BASTORE: - return Type.BYTE; - case org.apache.bcel.Constants.SALOAD: - case org.apache.bcel.Constants.SASTORE: - return Type.SHORT; - case org.apache.bcel.Constants.LALOAD: - case org.apache.bcel.Constants.LASTORE: - return Type.LONG; - case org.apache.bcel.Constants.DALOAD: - case org.apache.bcel.Constants.DASTORE: - return Type.DOUBLE; - case org.apache.bcel.Constants.FALOAD: - case org.apache.bcel.Constants.FASTORE: - return Type.FLOAT; - case org.apache.bcel.Constants.AALOAD: - case org.apache.bcel.Constants.AASTORE: - return Type.OBJECT; - default: - throw new ClassGenException("Oops: unknown case in switch" + opcode); - } - } -} diff --git a/src/org/apache/bcel/generic/ArrayType.java b/src/org/apache/bcel/generic/ArrayType.java deleted file mode 100644 index fda1bc0..0000000 --- a/src/org/apache/bcel/generic/ArrayType.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; - -/** - * Denotes array type, such as int[][] - * - * @version $Id: ArrayType.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class ArrayType extends ReferenceType { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int dimensions; - private Type basic_type; - - /** - * Convenience constructor for array type, e.g. int[] - * - * @param type - * array type, e.g. T_INT - */ - public ArrayType(byte type, int dimensions) { - this(BasicType.getType(type), dimensions); - } - - /** - * Convenience constructor for reference array type, e.g. Object[] - * - * @param class_name - * complete name of class (java.lang.String, e.g.) - */ - public ArrayType(String class_name, int dimensions) { - this(new ObjectType(class_name), dimensions); - } - - /** - * Constructor for array of given type - * - * @param type - * type of array (may be an array itself) - */ - public ArrayType(Type type, int dimensions) { - super(Constants.T_ARRAY, ""); - if ((dimensions < 1) || (dimensions > Constants.MAX_BYTE)) { - throw new ClassGenException("Invalid number of dimensions: " - + dimensions); - } - switch (type.getType()) { - case Constants.T_ARRAY: - ArrayType array = (ArrayType) type; - this.dimensions = dimensions + array.dimensions; - basic_type = array.basic_type; - break; - case Constants.T_VOID: - throw new ClassGenException("Invalid type: void[]"); - default: // Basic type or reference - this.dimensions = dimensions; - basic_type = type; - break; - } - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < this.dimensions; i++) { - buf.append('['); - } - buf.append(basic_type.getSignature()); - signature = buf.toString(); - } - - /** - * @return basic type of array, i.e., for int[][][] the basic type is int - */ - public Type getBasicType() { - return basic_type; - } - - /** - * @return element type of array, i.e., for int[][][] the element type is - * int[][] - */ - public Type getElementType() { - if (dimensions == 1) { - return basic_type; - } - return new ArrayType(basic_type, dimensions - 1); - } - - /** - * @return number of dimensions of array - */ - public int getDimensions() { - return dimensions; - } - - /** - * @return a hash code value for the object. - */ - @Override - public int hashCode() { - return basic_type.hashCode() ^ dimensions; - } - - /** - * @return true if both type objects refer to the same array type. - */ - @Override - public boolean equals(Object _type) { - if (_type instanceof ArrayType) { - ArrayType array = (ArrayType) _type; - return (array.dimensions == dimensions) - && array.basic_type.equals(basic_type); - } - return false; - } -} diff --git a/src/org/apache/bcel/generic/BALOAD.java b/src/org/apache/bcel/generic/BALOAD.java deleted file mode 100644 index 9f6d6fe..0000000 --- a/src/org/apache/bcel/generic/BALOAD.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * BALOAD - Load byte or boolean from array - * - *
      - * Stack: ..., arrayref, index -> ..., value
      - * 
      - * - * @version $Id: BALOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class BALOAD extends ArrayInstruction implements StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Load byte or boolean from array - */ - public BALOAD() { - super(org.apache.bcel.Constants.BALOAD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitBALOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/BASTORE.java b/src/org/apache/bcel/generic/BASTORE.java deleted file mode 100644 index cb0aefc..0000000 --- a/src/org/apache/bcel/generic/BASTORE.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * BASTORE - Store into byte or boolean array - * - *
      - * Stack: ..., arrayref, index, value -> ...
      - * 
      - * - * @version $Id: BASTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class BASTORE extends ArrayInstruction implements StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Store byte or boolean into array - */ - public BASTORE() { - super(org.apache.bcel.Constants.BASTORE); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitBASTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/BIPUSH.java b/src/org/apache/bcel/generic/BIPUSH.java deleted file mode 100644 index b1412e9..0000000 --- a/src/org/apache/bcel/generic/BIPUSH.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * BIPUSH - Push byte on stack - * - *
      - * Stack: ... -> ..., value
      - * 
      - * - * @version $Id: BIPUSH.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class BIPUSH extends Instruction implements ConstantPushInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - private byte b; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - BIPUSH() { - } - - /** - * Push byte on stack - */ - public BIPUSH(byte b) { - super(org.apache.bcel.Constants.BIPUSH, (short) 2); - this.b = b; - } - - /** - * Dump instruction as byte code to stream out. - */ - @Override - public void dump(DataOutputStream out) throws IOException { - super.dump(out); - out.writeByte(b); - } - - /** - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - return super.toString(verbose) + " " + b; - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - length = 2; - b = bytes.readByte(); - } - - @Override - public Number getValue() { - return new Integer(b); - } - - /** - * @return Type.BYTE - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.BYTE; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitBIPUSH(this); - } -} diff --git a/src/org/apache/bcel/generic/BREAKPOINT.java b/src/org/apache/bcel/generic/BREAKPOINT.java deleted file mode 100644 index 74e7308..0000000 --- a/src/org/apache/bcel/generic/BREAKPOINT.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * BREAKPOINT, JVM dependent, ignored by default - * - * @version $Id: BREAKPOINT.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class BREAKPOINT extends Instruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public BREAKPOINT() { - super(org.apache.bcel.Constants.BREAKPOINT, (short) 1); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitBREAKPOINT(this); - } -} diff --git a/src/org/apache/bcel/generic/BasicType.java b/src/org/apache/bcel/generic/BasicType.java deleted file mode 100644 index 715039d..0000000 --- a/src/org/apache/bcel/generic/BasicType.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; - -/** - * Denotes basic type such as int. - * - * @version $Id: BasicType.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class BasicType extends Type { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Constructor for basic types such as int, long, `void' - * - * @param type - * one of T_INT, T_BOOLEAN, ..., T_VOID - * @see org.apache.bcel.Constants - */ - BasicType(byte type) { - super(type, Constants.SHORT_TYPE_NAMES[type]); - if ((type < Constants.T_BOOLEAN) || (type > Constants.T_VOID)) { - throw new ClassGenException("Invalid type: " + type); - } - } - - public static final BasicType getType(byte type) { - switch (type) { - case Constants.T_VOID: - return VOID; - case Constants.T_BOOLEAN: - return BOOLEAN; - case Constants.T_BYTE: - return BYTE; - case Constants.T_SHORT: - return SHORT; - case Constants.T_CHAR: - return CHAR; - case Constants.T_INT: - return INT; - case Constants.T_LONG: - return LONG; - case Constants.T_DOUBLE: - return DOUBLE; - case Constants.T_FLOAT: - return FLOAT; - default: - throw new ClassGenException("Invalid type: " + type); - } - } - - /** - * @return a hash code value for the object. - */ - @Override - public int hashCode() { - return type; - } - - /** - * @return true if both type objects refer to the same type - */ - @Override - public boolean equals(Object _type) { - return (_type instanceof BasicType) ? ((BasicType) _type).type == this.type - : false; - } -} diff --git a/src/org/apache/bcel/generic/BranchHandle.java b/src/org/apache/bcel/generic/BranchHandle.java deleted file mode 100644 index bb946d6..0000000 --- a/src/org/apache/bcel/generic/BranchHandle.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * BranchHandle is returned by specialized InstructionList.append() whenever a - * BranchInstruction is appended. This is useful when the target of this - * instruction is not known at time of creation and must be set later via - * setTarget(). - * - * @see InstructionHandle - * @see Instruction - * @see InstructionList - * @version $Id: BranchHandle.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class BranchHandle extends InstructionHandle { - - /** - * - */ - private static final long serialVersionUID = 1L; - private BranchInstruction bi; // An alias in fact, but saves lots of casts - - private BranchHandle(BranchInstruction i) { - super(i); - bi = i; - } - - /** - * Factory methods. - */ - private static BranchHandle bh_list = null; // List of reusable handles - - static final BranchHandle getBranchHandle(BranchInstruction i) { - if (bh_list == null) { - return new BranchHandle(i); - } - BranchHandle bh = bh_list; - bh_list = (BranchHandle) bh.next; - bh.setInstruction(i); - return bh; - } - - /** - * Handle adds itself to the list of resuable handles. - */ - @Override - protected void addHandle() { - next = bh_list; - bh_list = this; - } - - /* - * Override InstructionHandle methods: delegate to branch instruction. - * Through this overriding all access to the private i_position field should - * be prevented. - */ - @Override - public int getPosition() { - return bi.position; - } - - @Override - void setPosition(int pos) { - i_position = bi.position = pos; - } - - @Override - protected int updatePosition(int offset, int max_offset) { - int x = bi.updatePosition(offset, max_offset); - i_position = bi.position; - return x; - } - - /** - * Pass new target to instruction. - */ - public void setTarget(InstructionHandle ih) { - bi.setTarget(ih); - } - - /** - * Update target of instruction. - */ - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - bi.updateTarget(old_ih, new_ih); - } - - /** - * @return target of instruction. - */ - public InstructionHandle getTarget() { - return bi.getTarget(); - } - - /** - * Set new contents. Old instruction is disposed and may not be used - * anymore. - */ - @Override - public void setInstruction(Instruction i) { - super.setInstruction(i); - if (!(i instanceof BranchInstruction)) { - throw new ClassGenException("Assigning " + i - + " to branch handle which is not a branch instruction"); - } - bi = (BranchInstruction) i; - } -} diff --git a/src/org/apache/bcel/generic/BranchInstruction.java b/src/org/apache/bcel/generic/BranchInstruction.java deleted file mode 100644 index 2864a05..0000000 --- a/src/org/apache/bcel/generic/BranchInstruction.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * Abstract super class for branching instructions like GOTO, IFEQ, etc.. Branch - * instructions may have a variable length, namely GOTO, JSR, LOOKUPSWITCH and - * TABLESWITCH. - * - * @see InstructionList - * @version $Id: BranchInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class BranchInstruction extends Instruction implements - InstructionTargeter { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected int index; // Branch target relative to this instruction - protected InstructionHandle target; // Target object in instruction list - protected int position; // Byte code offset - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - BranchInstruction() { - } - - /** - * Common super constructor - * - * @param opcode - * Instruction opcode - * @param target - * instruction to branch to - */ - protected BranchInstruction(short opcode, InstructionHandle target) { - super(opcode, (short) 3); - setTarget(target); - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - index = getTargetOffset(); - if (Math.abs(index) >= 32767) { - throw new ClassGenException( - "Branch target offset too large for short"); - } - out.writeShort(index); // May be negative, i.e., point backwards - } - - /** - * @param _target - * branch target - * @return the offset to `target' relative to this instruction - */ - protected int getTargetOffset(InstructionHandle _target) { - if (_target == null) { - throw new ClassGenException("Target of " + super.toString(true) - + " is invalid null handle"); - } - int t = _target.getPosition(); - if (t < 0) { - throw new ClassGenException( - "Invalid branch target position offset for " - + super.toString(true) + ":" + t + ":" + _target); - } - return t - position; - } - - /** - * @return the offset to this instruction's target - */ - protected int getTargetOffset() { - return getTargetOffset(target); - } - - /** - * Called by InstructionList.setPositions when setting the position for - * every instruction. In the presence of variable length instructions - * `setPositions' performs multiple passes over the instruction list to - * calculate the correct (byte) positions and offsets by calling this - * function. - * - * @param offset - * additional offset caused by preceding (variable length) - * instructions - * @param max_offset - * the maximum offset that may be caused by these instructions - * @return additional offset caused by possible change of this instruction's - * length - */ - protected int updatePosition(int offset, int max_offset) { - position += offset; - return 0; - } - - /** - * Long output format: - * - * <position in byte code> <name of opcode> "["<opcode - * number>"]" "("<length of instruction>")" "<"<target - * instruction>">" "@"<branch target offset> - * - * @param verbose - * long/short format switch - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - String s = super.toString(verbose); - String t = "null"; - if (verbose) { - if (target != null) { - if (target.getInstruction() == this) { - t = ""; - } else if (target.getInstruction() == null) { - t = ""; - } else { - t = target.getInstruction().toString(false); // Avoid - // circles - } - } - } else { - if (target != null) { - index = getTargetOffset(); - t = "" + (index + position); - } - } - return s + " -> " + t; - } - - /** - * Read needed data (e.g. index) from file. Conversion to a - * InstructionHandle is done in InstructionList(byte[]). - * - * @param bytes - * input stream - * @param wide - * wide prefix? - * @see InstructionList - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - length = 3; - index = bytes.readShort(); - } - - /** - * @return target offset in byte code - */ - public final int getIndex() { - return index; - } - - /** - * @return target of branch instruction - */ - public InstructionHandle getTarget() { - return target; - } - - /** - * Set branch target - * - * @param target - * branch target - */ - public void setTarget(InstructionHandle target) { - notifyTarget(this.target, target, this); - this.target = target; - } - - /** - * Used by BranchInstruction, LocalVariableGen, CodeExceptionGen - */ - static final void notifyTarget(InstructionHandle old_ih, - InstructionHandle new_ih, InstructionTargeter t) { - if (old_ih != null) { - old_ih.removeTargeter(t); - } - if (new_ih != null) { - new_ih.addTargeter(t); - } - } - - /** - * @param old_ih - * old target - * @param new_ih - * new target - */ - @Override - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - if (target == old_ih) { - setTarget(new_ih); - } else { - throw new ClassGenException("Not targeting " + old_ih + ", but " - + target); - } - } - - /** - * @return true, if ih is target of this instruction - */ - @Override - public boolean containsTarget(InstructionHandle ih) { - return (target == ih); - } - - /** - * Inform target that it's not targeted anymore. - */ - @Override - void dispose() { - setTarget(null); - index = -1; - position = -1; - } -} diff --git a/src/org/apache/bcel/generic/CALOAD.java b/src/org/apache/bcel/generic/CALOAD.java deleted file mode 100644 index 50839af..0000000 --- a/src/org/apache/bcel/generic/CALOAD.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * CALOAD - Load char from array - * - *
      - * Stack: ..., arrayref, index -> ..., value
      - * 
      - * - * @version $Id: CALOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class CALOAD extends ArrayInstruction implements StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Load char from array - */ - public CALOAD() { - super(org.apache.bcel.Constants.CALOAD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitCALOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/CASTORE.java b/src/org/apache/bcel/generic/CASTORE.java deleted file mode 100644 index 77d1c34..0000000 --- a/src/org/apache/bcel/generic/CASTORE.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * CASTORE - Store into char array - * - *
      - * Stack: ..., arrayref, index, value -> ...
      - * 
      - * - * @version $Id: CASTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class CASTORE extends ArrayInstruction implements StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Store char into array - */ - public CASTORE() { - super(org.apache.bcel.Constants.CASTORE); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitCASTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/CHECKCAST.java b/src/org/apache/bcel/generic/CHECKCAST.java deleted file mode 100644 index 08882b1..0000000 --- a/src/org/apache/bcel/generic/CHECKCAST.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.ExceptionConstants; - -/** - * CHECKCAST - Check whether object is of given type - * - *
      - * Stack: ..., objectref -> ..., objectref
      - * 
      - * - * @version $Id: CHECKCAST.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class CHECKCAST extends CPInstruction implements LoadClass, - ExceptionThrower, StackProducer, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - CHECKCAST() { - } - - /** - * Check whether object is of given type - * - * @param index - * index to class in constant pool - */ - public CHECKCAST(int index) { - super(org.apache.bcel.Constants.CHECKCAST, index); - } - - /** - * @return exceptions this instruction may cause - */ - @Override - public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy( - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, - 0, - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.CLASS_CAST_EXCEPTION; - return cs; - } - - @Override - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - Type t = getType(cpg); - if (t instanceof ArrayType) { - t = ((ArrayType) t).getBasicType(); - } - return (t instanceof ObjectType) ? (ObjectType) t : null; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitCHECKCAST(this); - } -} diff --git a/src/org/apache/bcel/generic/CPInstruction.java b/src/org/apache/bcel/generic/CPInstruction.java deleted file mode 100644 index 6efe659..0000000 --- a/src/org/apache/bcel/generic/CPInstruction.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.util.ByteSequence; - -/** - * Abstract super class for instructions that use an index into the constant - * pool such as LDC, INVOKEVIRTUAL, etc. - * - * @see ConstantPoolGen - * @see LDC - * @see INVOKEVIRTUAL - * - * @version $Id: CPInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class CPInstruction extends Instruction implements - TypedInstruction, IndexedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected int index; // index to constant pool - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - CPInstruction() { - } - - /** - * @param index - * to constant pool - */ - protected CPInstruction(short opcode, int index) { - super(opcode, (short) 3); - setIndex(index); - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - out.writeShort(index); - } - - /** - * Long output format: - * - * <name of opcode> "["<opcode number>"]" "("<length of - * instruction>")" "<"< constant pool index>">" - * - * @param verbose - * long/short format switch - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - return super.toString(verbose) + " " + index; - } - - /** - * @return mnemonic for instruction with symbolic references resolved - */ - @Override - public String toString(ConstantPool cp) { - Constant c = cp.getConstant(index); - String str = cp.constantToString(c); - if (c instanceof ConstantClass) { - str = str.replace('.', '/'); - } - return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + str; - } - - /** - * Read needed data (i.e., index) from file. - * - * @param bytes - * input stream - * @param wide - * wide prefix? - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - setIndex(bytes.readUnsignedShort()); - length = 3; - } - - /** - * @return index in constant pool referred by this instruction. - */ - @Override - public final int getIndex() { - return index; - } - - /** - * Set the index to constant pool. - * - * @param index - * in constant pool. - */ - @Override - public void setIndex(int index) { - if (index < 0) { - throw new ClassGenException("Negative index value: " + index); - } - this.index = index; - } - - /** - * @return type related with this instruction. - */ - @Override - public Type getType(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - String name = cp.getConstantString(index, - org.apache.bcel.Constants.CONSTANT_Class); - if (!name.startsWith("[")) { - name = "L" + name + ";"; - } - return Type.getType(name); - } -} diff --git a/src/org/apache/bcel/generic/ClassGen.java b/src/org/apache/bcel/generic/ClassGen.java deleted file mode 100644 index c9d3d14..0000000 --- a/src/org/apache/bcel/generic/ClassGen.java +++ /dev/null @@ -1,556 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.AccessFlags; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.SourceFile; -import org.apache.bcel.util.BCELComparator; - -/** - * Template class for building up a java class. May be initialized with an - * existing java class (file). - * - * @see JavaClass - * @version $Id: ClassGen.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ClassGen extends AccessFlags implements Cloneable { - - /** - * - */ - private static final long serialVersionUID = 1L; - /* - * Corresponds to the fields found in a JavaClass object. - */ - private String class_name, super_class_name, file_name; - private int class_name_index = -1, superclass_name_index = -1; - private int major = Constants.MAJOR_1_1, minor = Constants.MINOR_1_1; - private ConstantPoolGen cp; // Template for building up constant pool - // ArrayLists instead of arrays to gather fields, methods, etc. - private List field_vec = new ArrayList(); - private List method_vec = new ArrayList(); - private List attribute_vec = new ArrayList(); - private List interface_vec = new ArrayList(); - private static BCELComparator _cmp = new BCELComparator() { - - @Override - public boolean equals(Object o1, Object o2) { - ClassGen THIS = (ClassGen) o1; - ClassGen THAT = (ClassGen) o2; - return THIS.getClassName().equals(THAT.getClassName()); - } - - @Override - public int hashCode(Object o) { - ClassGen THIS = (ClassGen) o; - return THIS.getClassName().hashCode(); - } - }; - - /** - * Convenience constructor to set up some important values initially. - * - * @param class_name - * fully qualified class name - * @param super_class_name - * fully qualified superclass name - * @param file_name - * source file name - * @param access_flags - * access qualifiers - * @param interfaces - * implemented interfaces - * @param cp - * constant pool to use - */ - public ClassGen(String class_name, String super_class_name, - String file_name, int access_flags, String[] interfaces, - ConstantPoolGen cp) { - this.class_name = class_name; - this.super_class_name = super_class_name; - this.file_name = file_name; - this.access_flags = access_flags; - this.cp = cp; - // Put everything needed by default into the constant pool and the - // vectors - if (file_name != null) { - addAttribute(new SourceFile(cp.addUtf8("SourceFile"), 2, - cp.addUtf8(file_name), cp.getConstantPool())); - } - class_name_index = cp.addClass(class_name); - superclass_name_index = cp.addClass(super_class_name); - if (interfaces != null) { - for (int i = 0; i < interfaces.length; i++) { - addInterface(interfaces[i]); - } - } - } - - /** - * Convenience constructor to set up some important values initially. - * - * @param class_name - * fully qualified class name - * @param super_class_name - * fully qualified superclass name - * @param file_name - * source file name - * @param access_flags - * access qualifiers - * @param interfaces - * implemented interfaces - */ - public ClassGen(String class_name, String super_class_name, - String file_name, int access_flags, String[] interfaces) { - this(class_name, super_class_name, file_name, access_flags, interfaces, - new ConstantPoolGen()); - } - - /** - * Initialize with existing class. - * - * @param clazz - * JavaClass object (e.g. read from file) - */ - public ClassGen(JavaClass clazz) { - class_name_index = clazz.getClassNameIndex(); - superclass_name_index = clazz.getSuperclassNameIndex(); - class_name = clazz.getClassName(); - super_class_name = clazz.getSuperclassName(); - file_name = clazz.getSourceFileName(); - access_flags = clazz.getAccessFlags(); - cp = new ConstantPoolGen(clazz.getConstantPool()); - major = clazz.getMajor(); - minor = clazz.getMinor(); - Attribute[] attributes = clazz.getAttributes(); - Method[] methods = clazz.getMethods(); - Field[] fields = clazz.getFields(); - String[] interfaces = clazz.getInterfaceNames(); - for (int i = 0; i < interfaces.length; i++) { - addInterface(interfaces[i]); - } - for (int i = 0; i < attributes.length; i++) { - addAttribute(attributes[i]); - } - for (int i = 0; i < methods.length; i++) { - addMethod(methods[i]); - } - for (int i = 0; i < fields.length; i++) { - addField(fields[i]); - } - } - - /** - * @return the (finally) built up Java class object. - */ - public JavaClass getJavaClass() { - int[] interfaces = getInterfaces(); - Field[] fields = getFields(); - Method[] methods = getMethods(); - Attribute[] attributes = getAttributes(); - // Must be last since the above calls may still add something to it - ConstantPool _cp = this.cp.getFinalConstantPool(); - return new JavaClass(class_name_index, superclass_name_index, - file_name, major, minor, access_flags, _cp, interfaces, fields, - methods, attributes); - } - - /** - * Add an interface to this class, i.e., this class has to implement it. - * - * @param name - * interface to implement (fully qualified class name) - */ - public void addInterface(String name) { - interface_vec.add(name); - } - - /** - * Remove an interface from this class. - * - * @param name - * interface to remove (fully qualified name) - */ - public void removeInterface(String name) { - interface_vec.remove(name); - } - - /** - * @return major version number of class file - */ - public int getMajor() { - return major; - } - - /** - * Set major version number of class file, default value is 45 (JDK 1.1) - * - * @param major - * major version number - */ - public void setMajor(int major) { - this.major = major; - } - - /** - * Set minor version number of class file, default value is 3 (JDK 1.1) - * - * @param minor - * minor version number - */ - public void setMinor(int minor) { - this.minor = minor; - } - - /** - * @return minor version number of class file - */ - public int getMinor() { - return minor; - } - - /** - * Add an attribute to this class. - * - * @param a - * attribute to add - */ - public void addAttribute(Attribute a) { - attribute_vec.add(a); - } - - /** - * Add a method to this class. - * - * @param m - * method to add - */ - public void addMethod(Method m) { - method_vec.add(m); - } - - /** - * Convenience method. - * - * Add an empty constructor to this class that does nothing but calling - * super(). - * - * @param access_flags - * rights for constructor - */ - public void addEmptyConstructor(int access_flags) { - InstructionList il = new InstructionList(); - il.append(InstructionConstants.THIS); // Push `this' - il.append(new INVOKESPECIAL(cp.addMethodref(super_class_name, "", - "()V"))); - il.append(InstructionConstants.RETURN); - MethodGen mg = new MethodGen(access_flags, Type.VOID, Type.NO_ARGS, - null, "", class_name, il, cp); - mg.setMaxStack(1); - addMethod(mg.getMethod()); - } - - /** - * Add a field to this class. - * - * @param f - * field to add - */ - public void addField(Field f) { - field_vec.add(f); - } - - public boolean containsField(Field f) { - return field_vec.contains(f); - } - - /** - * @return field object with given name, or null - */ - public Field containsField(String name) { - for (Iterator e = field_vec.iterator(); e.hasNext();) { - Field f = e.next(); - if (f.getName().equals(name)) { - return f; - } - } - return null; - } - - /** - * @return method object with given name and signature, or null - */ - public Method containsMethod(String name, String signature) { - for (Iterator e = method_vec.iterator(); e.hasNext();) { - Method m = e.next(); - if (m.getName().equals(name) && m.getSignature().equals(signature)) { - return m; - } - } - return null; - } - - /** - * Remove an attribute from this class. - * - * @param a - * attribute to remove - */ - public void removeAttribute(Attribute a) { - attribute_vec.remove(a); - } - - /** - * Remove a method from this class. - * - * @param m - * method to remove - */ - public void removeMethod(Method m) { - method_vec.remove(m); - } - - /** - * Replace given method with new one. If the old one does not exist add the - * new_ method to the class anyway. - */ - public void replaceMethod(Method old, Method new_) { - if (new_ == null) { - throw new ClassGenException("Replacement method must not be null"); - } - int i = method_vec.indexOf(old); - if (i < 0) { - method_vec.add(new_); - } else { - method_vec.set(i, new_); - } - } - - /** - * Replace given field with new one. If the old one does not exist add the - * new_ field to the class anyway. - */ - public void replaceField(Field old, Field new_) { - if (new_ == null) { - throw new ClassGenException("Replacement method must not be null"); - } - int i = field_vec.indexOf(old); - if (i < 0) { - field_vec.add(new_); - } else { - field_vec.set(i, new_); - } - } - - /** - * Remove a field to this class. - * - * @param f - * field to remove - */ - public void removeField(Field f) { - field_vec.remove(f); - } - - public String getClassName() { - return class_name; - } - - public String getSuperclassName() { - return super_class_name; - } - - public String getFileName() { - return file_name; - } - - public void setClassName(String name) { - class_name = name.replace('/', '.'); - class_name_index = cp.addClass(name); - } - - public void setSuperclassName(String name) { - super_class_name = name.replace('/', '.'); - superclass_name_index = cp.addClass(name); - } - - public Method[] getMethods() { - return method_vec.toArray(new Method[method_vec.size()]); - } - - public void setMethods(Method[] methods) { - method_vec.clear(); - for (int m = 0; m < methods.length; m++) { - addMethod(methods[m]); - } - } - - public void setMethodAt(Method method, int pos) { - method_vec.set(pos, method); - } - - public Method getMethodAt(int pos) { - return method_vec.get(pos); - } - - public String[] getInterfaceNames() { - int size = interface_vec.size(); - String[] interfaces = new String[size]; - interface_vec.toArray(interfaces); - return interfaces; - } - - public int[] getInterfaces() { - int size = interface_vec.size(); - int[] interfaces = new int[size]; - for (int i = 0; i < size; i++) { - interfaces[i] = cp.addClass(interface_vec.get(i)); - } - return interfaces; - } - - public Field[] getFields() { - return field_vec.toArray(new Field[field_vec.size()]); - } - - public Attribute[] getAttributes() { - return attribute_vec.toArray(new Attribute[attribute_vec.size()]); - } - - public ConstantPoolGen getConstantPool() { - return cp; - } - - public void setConstantPool(ConstantPoolGen constant_pool) { - cp = constant_pool; - } - - public void setClassNameIndex(int class_name_index) { - this.class_name_index = class_name_index; - class_name = cp.getConstantPool() - .getConstantString(class_name_index, Constants.CONSTANT_Class) - .replace('/', '.'); - } - - public void setSuperclassNameIndex(int superclass_name_index) { - this.superclass_name_index = superclass_name_index; - super_class_name = cp - .getConstantPool() - .getConstantString(superclass_name_index, - Constants.CONSTANT_Class).replace('/', '.'); - } - - public int getSuperclassNameIndex() { - return superclass_name_index; - } - - public int getClassNameIndex() { - return class_name_index; - } - - private ArrayList observers; - - /** - * Add observer for this object. - */ - public void addObserver(ClassObserver o) { - if (observers == null) { - observers = new ArrayList(); - } - observers.add(o); - } - - /** - * Remove observer for this object. - */ - public void removeObserver(ClassObserver o) { - if (observers != null) { - observers.remove(o); - } - } - - /** - * Call notify() method on all observers. This method is not called - * automatically whenever the state has changed, but has to be called by the - * user after he has finished editing the object. - */ - public void update() { - if (observers != null) { - for (Iterator e = observers.iterator(); e.hasNext();) { - e.next().notify(this); - } - } - } - - @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; - } - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator - * Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. By default two - * ClassGen objects are said to be equal when their class names are equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. By default - * return the hashcode of the class name. - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return _cmp.hashCode(this); - } -} diff --git a/src/org/apache/bcel/generic/ClassGenException.java b/src/org/apache/bcel/generic/ClassGenException.java deleted file mode 100644 index 8848b1b..0000000 --- a/src/org/apache/bcel/generic/ClassGenException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Thrown on internal errors. Extends RuntimeException so it hasn't to be - * declared in the throws clause every time. - * - * @version $Id: ClassGenException.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ClassGenException extends RuntimeException { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public ClassGenException() { - super(); - } - - public ClassGenException(String s) { - super(s); - } -} diff --git a/src/org/apache/bcel/generic/ClassObserver.java b/src/org/apache/bcel/generic/ClassObserver.java deleted file mode 100644 index ce63df1..0000000 --- a/src/org/apache/bcel/generic/ClassObserver.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Implement this interface if you're interested in changes to a ClassGen object - * and register yourself with addObserver(). - * - * @version $Id: ClassObserver.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface ClassObserver { - - public void notify(ClassGen clazz); -} diff --git a/src/org/apache/bcel/generic/CodeExceptionGen.java b/src/org/apache/bcel/generic/CodeExceptionGen.java deleted file mode 100644 index 5ccfba0..0000000 --- a/src/org/apache/bcel/generic/CodeExceptionGen.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.classfile.CodeException; - -/** - * This class represents an exception handler, i.e., specifies the region where - * a handler is active and an instruction where the actual handling is done. - * pool as parameters. Opposed to the JVM specification the end of the handled - * region is set to be inclusive, i.e. all instructions between start and end - * are protected including the start and end instructions (handles) themselves. - * The end of the region is automatically mapped to be exclusive when calling - * getCodeException(), i.e., there is no difference semantically. - * - * @version $Id: CodeExceptionGen.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see MethodGen - * @see CodeException - * @see InstructionHandle - */ -public final class CodeExceptionGen implements InstructionTargeter, Cloneable, - java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private InstructionHandle start_pc; - private InstructionHandle end_pc; - private InstructionHandle handler_pc; - private ObjectType catch_type; - - /** - * Add an exception handler, i.e., specify region where a handler is active - * and an instruction where the actual handling is done. - * - * @param start_pc - * Start of handled region (inclusive) - * @param end_pc - * End of handled region (inclusive) - * @param handler_pc - * Where handling is done - * @param catch_type - * which exception is handled, null for ANY - */ - public CodeExceptionGen(InstructionHandle start_pc, - InstructionHandle end_pc, InstructionHandle handler_pc, - ObjectType catch_type) { - setStartPC(start_pc); - setEndPC(end_pc); - setHandlerPC(handler_pc); - this.catch_type = catch_type; - } - - /** - * Get CodeException object.
      - * - * This relies on that the instruction list has already been dumped to byte - * code or or that the `setPositions' methods has been called for the - * instruction list. - * - * @param cp - * constant pool - */ - public CodeException getCodeException(ConstantPoolGen cp) { - return new CodeException(start_pc.getPosition(), end_pc.getPosition() - + end_pc.getInstruction().getLength(), - handler_pc.getPosition(), (catch_type == null) ? 0 - : cp.addClass(catch_type)); - } - - /* - * Set start of handler - * - * @param start_pc Start of handled region (inclusive) - */ - public void setStartPC(InstructionHandle start_pc) { - BranchInstruction.notifyTarget(this.start_pc, start_pc, this); - this.start_pc = start_pc; - } - - /* - * Set end of handler - * - * @param end_pc End of handled region (inclusive) - */ - public void setEndPC(InstructionHandle end_pc) { - BranchInstruction.notifyTarget(this.end_pc, end_pc, this); - this.end_pc = end_pc; - } - - /* - * Set handler code - * - * @param handler_pc Start of handler - */ - public void setHandlerPC(InstructionHandle handler_pc) { - BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this); - this.handler_pc = handler_pc; - } - - /** - * @param old_ih - * old target, either start or end - * @param new_ih - * new target - */ - @Override - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - boolean targeted = false; - if (start_pc == old_ih) { - targeted = true; - setStartPC(new_ih); - } - if (end_pc == old_ih) { - targeted = true; - setEndPC(new_ih); - } - if (handler_pc == old_ih) { - targeted = true; - setHandlerPC(new_ih); - } - if (!targeted) { - throw new ClassGenException("Not targeting " + old_ih + ", but {" - + start_pc + ", " + end_pc + ", " + handler_pc + "}"); - } - } - - /** - * @return true, if ih is target of this handler - */ - @Override - public boolean containsTarget(InstructionHandle ih) { - return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih); - } - - /** Sets the type of the Exception to catch. Set 'null' for ANY. */ - public void setCatchType(ObjectType catch_type) { - this.catch_type = catch_type; - } - - /** Gets the type of the Exception to catch, 'null' for ANY. */ - public ObjectType getCatchType() { - return catch_type; - } - - /** - * @return start of handled region (inclusive) - */ - public InstructionHandle getStartPC() { - return start_pc; - } - - /** - * @return end of handled region (inclusive) - */ - public InstructionHandle getEndPC() { - return end_pc; - } - - /** - * @return start of handler - */ - public InstructionHandle getHandlerPC() { - return handler_pc; - } - - @Override - public String toString() { - return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " - + handler_pc + ")"; - } - - @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; - } - } -} diff --git a/src/org/apache/bcel/generic/CompoundInstruction.java b/src/org/apache/bcel/generic/CompoundInstruction.java deleted file mode 100644 index 2ad6f3a..0000000 --- a/src/org/apache/bcel/generic/CompoundInstruction.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Wrapper class for `compound' operations, virtual instructions that don't - * exist as byte code, but give a useful meaning. For example, the (virtual) - * PUSH instruction takes an arbitray argument and produces the appropiate code - * at dump time (ICONST, LDC, BIPUSH, ...). Also you can use the SWITCH - * instruction as a useful template for either LOOKUPSWITCH or TABLESWITCH. - * - * The interface provides the possibilty for the user to write `templates' or - * `macros' for such reuseable code patterns. - * - * @version $Id: CompoundInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see PUSH - * @see SWITCH - */ -public interface CompoundInstruction { - - public InstructionList getInstructionList(); -} diff --git a/src/org/apache/bcel/generic/ConstantPoolGen.java b/src/org/apache/bcel/generic/ConstantPoolGen.java deleted file mode 100644 index 96fe39b..0000000 --- a/src/org/apache/bcel/generic/ConstantPoolGen.java +++ /dev/null @@ -1,804 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantCP; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.ConstantUtf8; - -/** - * This class is used to build up a constant pool. The user adds constants via - * `addXXX' methods, `addString', `addClass', etc.. These methods return an - * index into the constant pool. Finally, `getFinalConstantPool()' returns the - * constant pool built up. Intermediate versions of the constant pool can be - * obtained with `getConstantPool()'. A constant pool has capacity for - * Constants.MAX_SHORT entries. Note that the first (0) is used by the JVM and - * that Double and Long constants need two slots. - * - * @version $Id: ConstantPoolGen.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constant - */ -public class ConstantPoolGen implements java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected int size = 1024; // Inital size, sufficient in most cases - protected Constant[] constants = new Constant[size]; - protected int index = 1; // First entry (0) used by JVM - private static final String METHODREF_DELIM = ":"; - private static final String IMETHODREF_DELIM = "#"; - private static final String FIELDREF_DELIM = "&"; - private static final String NAT_DELIM = "%"; - - private static class Index implements java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - int index; - - Index(int i) { - index = i; - } - } - - /** - * Initialize with given array of constants. - * - * @param cs - * array of given constants, new ones will be appended - */ - public ConstantPoolGen(Constant[] cs) { - if (cs.length > size) { - size = cs.length; - constants = new Constant[size]; - } - System.arraycopy(cs, 0, constants, 0, cs.length); - if (cs.length > 0) { - index = cs.length; - } - for (int i = 1; i < index; i++) { - Constant c = constants[i]; - if (c instanceof ConstantString) { - ConstantString s = (ConstantString) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[s.getStringIndex()]; - String key = u8.getBytes(); - if (!string_table.containsKey(key)) { - string_table.put(key, new Index(i)); - } - } else if (c instanceof ConstantClass) { - ConstantClass s = (ConstantClass) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[s.getNameIndex()]; - String key = u8.getBytes(); - if (!class_table.containsKey(key)) { - class_table.put(key, new Index(i)); - } - } else if (c instanceof ConstantNameAndType) { - ConstantNameAndType n = (ConstantNameAndType) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; - ConstantUtf8 u8_2 = (ConstantUtf8) constants[n - .getSignatureIndex()]; - String key = u8.getBytes() + NAT_DELIM + u8_2.getBytes(); - if (!n_a_t_table.containsKey(key)) { - n_a_t_table.put(key, new Index(i)); - } - } else if (c instanceof ConstantUtf8) { - ConstantUtf8 u = (ConstantUtf8) c; - String key = u.getBytes(); - if (!utf8_table.containsKey(key)) { - utf8_table.put(key, new Index(i)); - } - } else if (c instanceof ConstantCP) { - ConstantCP m = (ConstantCP) c; - ConstantClass clazz = (ConstantClass) constants[m - .getClassIndex()]; - ConstantNameAndType n = (ConstantNameAndType) constants[m - .getNameAndTypeIndex()]; - ConstantUtf8 u8 = (ConstantUtf8) constants[clazz.getNameIndex()]; - String class_name = u8.getBytes().replace('/', '.'); - u8 = (ConstantUtf8) constants[n.getNameIndex()]; - String method_name = u8.getBytes(); - u8 = (ConstantUtf8) constants[n.getSignatureIndex()]; - String signature = u8.getBytes(); - String delim = METHODREF_DELIM; - if (c instanceof ConstantInterfaceMethodref) { - delim = IMETHODREF_DELIM; - } else if (c instanceof ConstantFieldref) { - delim = FIELDREF_DELIM; - } - String key = class_name + delim + method_name + delim - + signature; - if (!cp_table.containsKey(key)) { - cp_table.put(key, new Index(i)); - } - } - } - } - - /** - * Initialize with given constant pool. - */ - public ConstantPoolGen(ConstantPool cp) { - this(cp.getConstantPool()); - } - - /** - * Create empty constant pool. - */ - public ConstantPoolGen() { - } - - /** - * Resize internal array of constants. - */ - protected void adjustSize() { - if (index + 3 >= size) { - Constant[] cs = constants; - size *= 2; - constants = new Constant[size]; - System.arraycopy(cs, 0, constants, 0, index); - } - } - - private Map string_table = new HashMap(); - - /** - * Look for ConstantString in ConstantPool containing String `str'. - * - * @param str - * String to search for - * @return index on success, -1 otherwise - */ - public int lookupString(String str) { - Index index = string_table.get(str); - return (index != null) ? index.index : -1; - } - - /** - * Add a new String constant to the ConstantPool, if it is not already in - * there. - * - * @param str - * String to add - * @return index of entry - */ - public int addString(String str) { - int ret; - if ((ret = lookupString(str)) != -1) { - return ret; // Already in CP - } - int utf8 = addUtf8(str); - adjustSize(); - ConstantString s = new ConstantString(utf8); - ret = index; - constants[index++] = s; - if (!string_table.containsKey(str)) { - string_table.put(str, new Index(ret)); - } - return ret; - } - - private Map class_table = new HashMap(); - - /** - * Look for ConstantClass in ConstantPool named `str'. - * - * @param str - * String to search for - * @return index on success, -1 otherwise - */ - public int lookupClass(String str) { - Index index = class_table.get(str.replace('.', '/')); - return (index != null) ? index.index : -1; - } - - private int addClass_(String clazz) { - int ret; - if ((ret = lookupClass(clazz)) != -1) { - return ret; // Already in CP - } - adjustSize(); - ConstantClass c = new ConstantClass(addUtf8(clazz)); - ret = index; - constants[index++] = c; - if (!class_table.containsKey(clazz)) { - class_table.put(clazz, new Index(ret)); - } - return ret; - } - - /** - * Add a new Class reference to the ConstantPool, if it is not already in - * there. - * - * @param str - * Class to add - * @return index of entry - */ - public int addClass(String str) { - return addClass_(str.replace('.', '/')); - } - - /** - * Add a new Class reference to the ConstantPool for a given type. - * - * @param type - * Class to add - * @return index of entry - */ - public int addClass(ObjectType type) { - return addClass(type.getClassName()); - } - - /** - * Add a reference to an array class (e.g. String[][]) as needed by - * MULTIANEWARRAY instruction, e.g. to the ConstantPool. - * - * @param type - * type of array class - * @return index of entry - */ - public int addArrayClass(ArrayType type) { - return addClass_(type.getSignature()); - } - - /** - * Look for ConstantInteger in ConstantPool. - * - * @param n - * integer number to look for - * @return index on success, -1 otherwise - */ - public int lookupInteger(int n) { - for (int i = 1; i < index; i++) { - if (constants[i] instanceof ConstantInteger) { - ConstantInteger c = (ConstantInteger) constants[i]; - if (c.getBytes() == n) { - return i; - } - } - } - return -1; - } - - /** - * Add a new Integer constant to the ConstantPool, if it is not already in - * there. - * - * @param n - * integer number to add - * @return index of entry - */ - public int addInteger(int n) { - int ret; - if ((ret = lookupInteger(n)) != -1) { - return ret; // Already in CP - } - adjustSize(); - ret = index; - constants[index++] = new ConstantInteger(n); - return ret; - } - - /** - * Look for ConstantFloat in ConstantPool. - * - * @param n - * Float number to look for - * @return index on success, -1 otherwise - */ - public int lookupFloat(float n) { - int bits = Float.floatToIntBits(n); - for (int i = 1; i < index; i++) { - if (constants[i] instanceof ConstantFloat) { - ConstantFloat c = (ConstantFloat) constants[i]; - if (Float.floatToIntBits(c.getBytes()) == bits) { - return i; - } - } - } - return -1; - } - - /** - * Add a new Float constant to the ConstantPool, if it is not already in - * there. - * - * @param n - * Float number to add - * @return index of entry - */ - public int addFloat(float n) { - int ret; - if ((ret = lookupFloat(n)) != -1) { - return ret; // Already in CP - } - adjustSize(); - ret = index; - constants[index++] = new ConstantFloat(n); - return ret; - } - - private Map utf8_table = new HashMap(); - - /** - * Look for ConstantUtf8 in ConstantPool. - * - * @param n - * Utf8 string to look for - * @return index on success, -1 otherwise - */ - public int lookupUtf8(String n) { - Index index = utf8_table.get(n); - return (index != null) ? index.index : -1; - } - - /** - * Add a new Utf8 constant to the ConstantPool, if it is not already in - * there. - * - * @param n - * Utf8 string to add - * @return index of entry - */ - public int addUtf8(String n) { - int ret; - if ((ret = lookupUtf8(n)) != -1) { - return ret; // Already in CP - } - adjustSize(); - ret = index; - constants[index++] = new ConstantUtf8(n); - if (!utf8_table.containsKey(n)) { - utf8_table.put(n, new Index(ret)); - } - return ret; - } - - /** - * Look for ConstantLong in ConstantPool. - * - * @param n - * Long number to look for - * @return index on success, -1 otherwise - */ - public int lookupLong(long n) { - for (int i = 1; i < index; i++) { - if (constants[i] instanceof ConstantLong) { - ConstantLong c = (ConstantLong) constants[i]; - if (c.getBytes() == n) { - return i; - } - } - } - return -1; - } - - /** - * Add a new long constant to the ConstantPool, if it is not already in - * there. - * - * @param n - * Long number to add - * @return index of entry - */ - public int addLong(long n) { - int ret; - if ((ret = lookupLong(n)) != -1) { - return ret; // Already in CP - } - adjustSize(); - ret = index; - constants[index] = new ConstantLong(n); - index += 2; // Wastes one entry according to spec - return ret; - } - - /** - * Look for ConstantDouble in ConstantPool. - * - * @param n - * Double number to look for - * @return index on success, -1 otherwise - */ - public int lookupDouble(double n) { - long bits = Double.doubleToLongBits(n); - for (int i = 1; i < index; i++) { - if (constants[i] instanceof ConstantDouble) { - ConstantDouble c = (ConstantDouble) constants[i]; - if (Double.doubleToLongBits(c.getBytes()) == bits) { - return i; - } - } - } - return -1; - } - - /** - * Add a new double constant to the ConstantPool, if it is not already in - * there. - * - * @param n - * Double number to add - * @return index of entry - */ - public int addDouble(double n) { - int ret; - if ((ret = lookupDouble(n)) != -1) { - return ret; // Already in CP - } - adjustSize(); - ret = index; - constants[index] = new ConstantDouble(n); - index += 2; // Wastes one entry according to spec - return ret; - } - - private Map n_a_t_table = new HashMap(); - - /** - * Look for ConstantNameAndType in ConstantPool. - * - * @param name - * of variable/method - * @param signature - * of variable/method - * @return index on success, -1 otherwise - */ - public int lookupNameAndType(String name, String signature) { - Index _index = n_a_t_table.get(name + NAT_DELIM + signature); - return (_index != null) ? _index.index : -1; - } - - /** - * Add a new NameAndType constant to the ConstantPool if it is not already - * in there. - * - * @param name - * Name string to add - * @param signature - * signature string to add - * @return index of entry - */ - public int addNameAndType(String name, String signature) { - int ret; - int name_index, signature_index; - if ((ret = lookupNameAndType(name, signature)) != -1) { - return ret; // Already in CP - } - adjustSize(); - name_index = addUtf8(name); - signature_index = addUtf8(signature); - ret = index; - constants[index++] = new ConstantNameAndType(name_index, - signature_index); - String key = name + NAT_DELIM + signature; - if (!n_a_t_table.containsKey(key)) { - n_a_t_table.put(key, new Index(ret)); - } - return ret; - } - - private Map cp_table = new HashMap(); - - /** - * Look for ConstantMethodref in ConstantPool. - * - * @param class_name - * Where to find method - * @param method_name - * Guess what - * @param signature - * return and argument types - * @return index on success, -1 otherwise - */ - public int lookupMethodref(String class_name, String method_name, - String signature) { - Index index = cp_table.get(class_name + METHODREF_DELIM + method_name - + METHODREF_DELIM + signature); - return (index != null) ? index.index : -1; - } - - public int lookupMethodref(MethodGen method) { - return lookupMethodref(method.getClassName(), method.getName(), - method.getSignature()); - } - - /** - * Add a new Methodref constant to the ConstantPool, if it is not already in - * there. - * - * @param class_name - * class name string to add - * @param method_name - * method name string to add - * @param signature - * method signature string to add - * @return index of entry - */ - public int addMethodref(String class_name, String method_name, - String signature) { - int ret, class_index, name_and_type_index; - if ((ret = lookupMethodref(class_name, method_name, signature)) != -1) { - return ret; // Already in CP - } - adjustSize(); - name_and_type_index = addNameAndType(method_name, signature); - class_index = addClass(class_name); - ret = index; - constants[index++] = new ConstantMethodref(class_index, - name_and_type_index); - String key = class_name + METHODREF_DELIM + method_name - + METHODREF_DELIM + signature; - if (!cp_table.containsKey(key)) { - cp_table.put(key, new Index(ret)); - } - return ret; - } - - public int addMethodref(MethodGen method) { - return addMethodref(method.getClassName(), method.getName(), - method.getSignature()); - } - - /** - * Look for ConstantInterfaceMethodref in ConstantPool. - * - * @param class_name - * Where to find method - * @param method_name - * Guess what - * @param signature - * return and argument types - * @return index on success, -1 otherwise - */ - public int lookupInterfaceMethodref(String class_name, String method_name, - String signature) { - Index index = cp_table.get(class_name + IMETHODREF_DELIM + method_name - + IMETHODREF_DELIM + signature); - return (index != null) ? index.index : -1; - } - - public int lookupInterfaceMethodref(MethodGen method) { - return lookupInterfaceMethodref(method.getClassName(), - method.getName(), method.getSignature()); - } - - /** - * Add a new InterfaceMethodref constant to the ConstantPool, if it is not - * already in there. - * - * @param class_name - * class name string to add - * @param method_name - * method name string to add - * @param signature - * signature string to add - * @return index of entry - */ - public int addInterfaceMethodref(String class_name, String method_name, - String signature) { - int ret, class_index, name_and_type_index; - if ((ret = lookupInterfaceMethodref(class_name, method_name, signature)) != -1) { - return ret; // Already in CP - } - adjustSize(); - class_index = addClass(class_name); - name_and_type_index = addNameAndType(method_name, signature); - ret = index; - constants[index++] = new ConstantInterfaceMethodref(class_index, - name_and_type_index); - String key = class_name + IMETHODREF_DELIM + method_name - + IMETHODREF_DELIM + signature; - if (!cp_table.containsKey(key)) { - cp_table.put(key, new Index(ret)); - } - return ret; - } - - public int addInterfaceMethodref(MethodGen method) { - return addInterfaceMethodref(method.getClassName(), method.getName(), - method.getSignature()); - } - - /** - * Look for ConstantFieldref in ConstantPool. - * - * @param class_name - * Where to find method - * @param field_name - * Guess what - * @param signature - * return and argument types - * @return index on success, -1 otherwise - */ - public int lookupFieldref(String class_name, String field_name, - String signature) { - Index index = cp_table.get(class_name + FIELDREF_DELIM + field_name - + FIELDREF_DELIM + signature); - return (index != null) ? index.index : -1; - } - - /** - * Add a new Fieldref constant to the ConstantPool, if it is not already in - * there. - * - * @param class_name - * class name string to add - * @param field_name - * field name string to add - * @param signature - * signature string to add - * @return index of entry - */ - public int addFieldref(String class_name, String field_name, - String signature) { - int ret; - int class_index, name_and_type_index; - if ((ret = lookupFieldref(class_name, field_name, signature)) != -1) { - return ret; // Already in CP - } - adjustSize(); - class_index = addClass(class_name); - name_and_type_index = addNameAndType(field_name, signature); - ret = index; - constants[index++] = new ConstantFieldref(class_index, - name_and_type_index); - String key = class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM - + signature; - if (!cp_table.containsKey(key)) { - cp_table.put(key, new Index(ret)); - } - return ret; - } - - /** - * @param i - * index in constant pool - * @return constant pool entry at index i - */ - public Constant getConstant(int i) { - return constants[i]; - } - - /** - * Use with care! - * - * @param i - * index in constant pool - * @param c - * new constant pool entry at index i - */ - public void setConstant(int i, Constant c) { - constants[i] = c; - } - - /** - * @return intermediate constant pool - */ - public ConstantPool getConstantPool() { - return new ConstantPool(constants); - } - - /** - * @return current size of constant pool - */ - public int getSize() { - return index; - } - - /** - * @return constant pool with proper length - */ - public ConstantPool getFinalConstantPool() { - Constant[] cs = new Constant[index]; - System.arraycopy(constants, 0, cs, 0, index); - return new ConstantPool(cs); - } - - /** - * @return String representation. - */ - @Override - public String toString() { - StringBuffer buf = new StringBuffer(); - for (int i = 1; i < index; i++) { - buf.append(i).append(")").append(constants[i]).append("\n"); - } - return buf.toString(); - } - - /** - * Import constant from another ConstantPool and return new index. - */ - public int addConstant(Constant c, ConstantPoolGen cp) { - Constant[] constants = cp.getConstantPool().getConstantPool(); - switch (c.getTag()) { - case Constants.CONSTANT_String: { - ConstantString s = (ConstantString) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[s.getStringIndex()]; - return addString(u8.getBytes()); - } - case Constants.CONSTANT_Class: { - ConstantClass s = (ConstantClass) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[s.getNameIndex()]; - return addClass(u8.getBytes()); - } - case Constants.CONSTANT_NameAndType: { - ConstantNameAndType n = (ConstantNameAndType) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; - ConstantUtf8 u8_2 = (ConstantUtf8) constants[n.getSignatureIndex()]; - return addNameAndType(u8.getBytes(), u8_2.getBytes()); - } - case Constants.CONSTANT_Utf8: - return addUtf8(((ConstantUtf8) c).getBytes()); - case Constants.CONSTANT_Double: - return addDouble(((ConstantDouble) c).getBytes()); - case Constants.CONSTANT_Float: - return addFloat(((ConstantFloat) c).getBytes()); - case Constants.CONSTANT_Long: - return addLong(((ConstantLong) c).getBytes()); - case Constants.CONSTANT_Integer: - return addInteger(((ConstantInteger) c).getBytes()); - case Constants.CONSTANT_InterfaceMethodref: - case Constants.CONSTANT_Methodref: - case Constants.CONSTANT_Fieldref: { - ConstantCP m = (ConstantCP) c; - ConstantClass clazz = (ConstantClass) constants[m.getClassIndex()]; - ConstantNameAndType n = (ConstantNameAndType) constants[m - .getNameAndTypeIndex()]; - ConstantUtf8 u8 = (ConstantUtf8) constants[clazz.getNameIndex()]; - String class_name = u8.getBytes().replace('/', '.'); - u8 = (ConstantUtf8) constants[n.getNameIndex()]; - String name = u8.getBytes(); - u8 = (ConstantUtf8) constants[n.getSignatureIndex()]; - String signature = u8.getBytes(); - switch (c.getTag()) { - case Constants.CONSTANT_InterfaceMethodref: - return addInterfaceMethodref(class_name, name, signature); - case Constants.CONSTANT_Methodref: - return addMethodref(class_name, name, signature); - case Constants.CONSTANT_Fieldref: - return addFieldref(class_name, name, signature); - default: // Never reached - throw new RuntimeException("Unknown constant type " + c); - } - } - default: // Never reached - throw new RuntimeException("Unknown constant type " + c); - } - } -} diff --git a/src/org/apache/bcel/generic/ConstantPushInstruction.java b/src/org/apache/bcel/generic/ConstantPushInstruction.java deleted file mode 100644 index 7fcfea8..0000000 --- a/src/org/apache/bcel/generic/ConstantPushInstruction.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denotes a push instruction that produces a literal on the stack such as - * SIPUSH, BIPUSH, ICONST, etc. - * - * @version $Id: ConstantPushInstruction.java 386056 2006-03-15 11:31:56Z tcurdt - * $ - * @author M. Dahm - * - * @see ICONST - * @see SIPUSH - */ -public interface ConstantPushInstruction extends PushInstruction, - TypedInstruction { - - public Number getValue(); -} diff --git a/src/org/apache/bcel/generic/ConversionInstruction.java b/src/org/apache/bcel/generic/ConversionInstruction.java deleted file mode 100644 index 1cc400a..0000000 --- a/src/org/apache/bcel/generic/ConversionInstruction.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; - -/** - * Super class for the x2y family of instructions. - * - * @version $Id: ConversionInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class ConversionInstruction extends Instruction implements - TypedInstruction, StackProducer, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ConversionInstruction() { - } - - /** - * @param opcode - * opcode of instruction - */ - protected ConversionInstruction(short opcode) { - super(opcode, (short) 1); - } - - /** - * @return type associated with the instruction - */ - @Override - public Type getType(ConstantPoolGen cp) { - switch (opcode) { - case Constants.D2I: - case Constants.F2I: - case Constants.L2I: - return Type.INT; - case Constants.D2F: - case Constants.I2F: - case Constants.L2F: - return Type.FLOAT; - case Constants.D2L: - case Constants.F2L: - case Constants.I2L: - return Type.LONG; - case Constants.F2D: - case Constants.I2D: - case Constants.L2D: - return Type.DOUBLE; - case Constants.I2B: - return Type.BYTE; - case Constants.I2C: - return Type.CHAR; - case Constants.I2S: - return Type.SHORT; - default: // Never reached - throw new ClassGenException("Unknown type " + opcode); - } - } -} diff --git a/src/org/apache/bcel/generic/D2F.java b/src/org/apache/bcel/generic/D2F.java deleted file mode 100644 index 8f733cb..0000000 --- a/src/org/apache/bcel/generic/D2F.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * D2F - Convert double to float - * - *
      - * Stack: ..., value.word1, value.word2 -> ..., result
      - * 
      - * - * @version $Id: D2F.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class D2F extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert double to float - */ - public D2F() { - super(org.apache.bcel.Constants.D2F); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitD2F(this); - } -} diff --git a/src/org/apache/bcel/generic/D2I.java b/src/org/apache/bcel/generic/D2I.java deleted file mode 100644 index d18b4c4..0000000 --- a/src/org/apache/bcel/generic/D2I.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * D2I - Convert double to int - * - *
      - * Stack: ..., value.word1, value.word2 -> ..., result
      - * 
      - * - * @version $Id: D2I.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class D2I extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert double to int - */ - public D2I() { - super(org.apache.bcel.Constants.D2I); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitD2I(this); - } -} diff --git a/src/org/apache/bcel/generic/D2L.java b/src/org/apache/bcel/generic/D2L.java deleted file mode 100644 index 39b653b..0000000 --- a/src/org/apache/bcel/generic/D2L.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * D2L - Convert double to long - * - *
      - * Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: D2L.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class D2L extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert double to long - */ - public D2L() { - super(org.apache.bcel.Constants.D2L); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitD2L(this); - } -} diff --git a/src/org/apache/bcel/generic/DADD.java b/src/org/apache/bcel/generic/DADD.java deleted file mode 100644 index 28b0625..0000000 --- a/src/org/apache/bcel/generic/DADD.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DADD - Add doubles - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result1.word2 - * - * @version $Id: DADD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DADD extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Add doubles - */ - public DADD() { - super(org.apache.bcel.Constants.DADD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDADD(this); - } -} diff --git a/src/org/apache/bcel/generic/DALOAD.java b/src/org/apache/bcel/generic/DALOAD.java deleted file mode 100644 index 1f91fd7..0000000 --- a/src/org/apache/bcel/generic/DALOAD.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DALOAD - Load double from array - * - *
      - * Stack: ..., arrayref, index -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: DALOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DALOAD extends ArrayInstruction implements StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Load double from array - */ - public DALOAD() { - super(org.apache.bcel.Constants.DALOAD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitDALOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/DASTORE.java b/src/org/apache/bcel/generic/DASTORE.java deleted file mode 100644 index 18b4166..0000000 --- a/src/org/apache/bcel/generic/DASTORE.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DASTORE - Store into double array - * - *
      - * Stack: ..., arrayref, index, value.word1, value.word2 -> ...
      - * 
      - * - * @version $Id: DASTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DASTORE extends ArrayInstruction implements StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Store double into array - */ - public DASTORE() { - super(org.apache.bcel.Constants.DASTORE); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitDASTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/DCMPG.java b/src/org/apache/bcel/generic/DCMPG.java deleted file mode 100644 index ab68ced..0000000 --- a/src/org/apache/bcel/generic/DCMPG.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DCMPG - Compare doubles: value1 > value2 - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result - * - * @version $Id: DCMPG.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DCMPG extends Instruction implements TypedInstruction, - StackProducer, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DCMPG() { - super(org.apache.bcel.Constants.DCMPG, (short) 1); - } - - /** - * @return Type.DOUBLE - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.DOUBLE; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitDCMPG(this); - } -} diff --git a/src/org/apache/bcel/generic/DCMPL.java b/src/org/apache/bcel/generic/DCMPL.java deleted file mode 100644 index f3d98fd..0000000 --- a/src/org/apache/bcel/generic/DCMPL.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DCMPL - Compare doubles: value1 < value2 - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result - * - * @version $Id: DCMPL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DCMPL extends Instruction implements TypedInstruction, - StackProducer, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DCMPL() { - super(org.apache.bcel.Constants.DCMPL, (short) 1); - } - - /** - * @return Type.DOUBLE - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.DOUBLE; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitDCMPL(this); - } -} diff --git a/src/org/apache/bcel/generic/DCONST.java b/src/org/apache/bcel/generic/DCONST.java deleted file mode 100644 index 6fa8ad8..0000000 --- a/src/org/apache/bcel/generic/DCONST.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DCONST - Push 0.0 or 1.0, other values cause an exception - * - *
      - * Stack: ... -> ...,
      - * 
      - * - * @version $Id: DCONST.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DCONST extends Instruction implements ConstantPushInstruction, - TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - private double value; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - DCONST() { - } - - public DCONST(double f) { - super(org.apache.bcel.Constants.DCONST_0, (short) 1); - if (f == 0.0) { - opcode = org.apache.bcel.Constants.DCONST_0; - } else if (f == 1.0) { - opcode = org.apache.bcel.Constants.DCONST_1; - } else { - throw new ClassGenException( - "DCONST can be used only for 0.0 and 1.0: " + f); - } - value = f; - } - - @Override - public Number getValue() { - return new Double(value); - } - - /** - * @return Type.DOUBLE - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.DOUBLE; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitDCONST(this); - } -} diff --git a/src/org/apache/bcel/generic/DDIV.java b/src/org/apache/bcel/generic/DDIV.java deleted file mode 100644 index 8df2367..0000000 --- a/src/org/apache/bcel/generic/DDIV.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DDIV - Divide doubles - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result.word2 - * - * @version $Id: DDIV.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DDIV extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Divide doubles - */ - public DDIV() { - super(org.apache.bcel.Constants.DDIV); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDDIV(this); - } -} diff --git a/src/org/apache/bcel/generic/DLOAD.java b/src/org/apache/bcel/generic/DLOAD.java deleted file mode 100644 index c7a6cbb..0000000 --- a/src/org/apache/bcel/generic/DLOAD.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DLOAD - Load double from local variable - * - *
      - * Stack ... -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: DLOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DLOAD extends LoadInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - DLOAD() { - super(org.apache.bcel.Constants.DLOAD, - org.apache.bcel.Constants.DLOAD_0); - } - - /** - * Load double from local variable - * - * @param n - * index of local variable - */ - public DLOAD(int n) { - super(org.apache.bcel.Constants.DLOAD, - org.apache.bcel.Constants.DLOAD_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitDLOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/DMUL.java b/src/org/apache/bcel/generic/DMUL.java deleted file mode 100644 index 130f5df..0000000 --- a/src/org/apache/bcel/generic/DMUL.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DMUL - Multiply doubles - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result.word2 - * - * @version $Id: DMUL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DMUL extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Multiply doubles - */ - public DMUL() { - super(org.apache.bcel.Constants.DMUL); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDMUL(this); - } -} diff --git a/src/org/apache/bcel/generic/DNEG.java b/src/org/apache/bcel/generic/DNEG.java deleted file mode 100644 index 8046d70..0000000 --- a/src/org/apache/bcel/generic/DNEG.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DNEG - Negate double - * - *
      - * Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: DNEG.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DNEG extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DNEG() { - super(org.apache.bcel.Constants.DNEG); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDNEG(this); - } -} diff --git a/src/org/apache/bcel/generic/DREM.java b/src/org/apache/bcel/generic/DREM.java deleted file mode 100644 index 84599f0..0000000 --- a/src/org/apache/bcel/generic/DREM.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DREM - Remainder of doubles - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result.word2 - * - * @version $Id: DREM.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DREM extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Remainder of doubles - */ - public DREM() { - super(org.apache.bcel.Constants.DREM); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDREM(this); - } -} diff --git a/src/org/apache/bcel/generic/DRETURN.java b/src/org/apache/bcel/generic/DRETURN.java deleted file mode 100644 index 1bf6d16..0000000 --- a/src/org/apache/bcel/generic/DRETURN.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DRETURN - Return double from method - * - *
      - * Stack: ..., value.word1, value.word2 -> <empty>
      - * 
      - * - * @version $Id: DRETURN.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DRETURN extends ReturnInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Return double from method - */ - public DRETURN() { - super(org.apache.bcel.Constants.DRETURN); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitDRETURN(this); - } -} diff --git a/src/org/apache/bcel/generic/DSTORE.java b/src/org/apache/bcel/generic/DSTORE.java deleted file mode 100644 index 1040e06..0000000 --- a/src/org/apache/bcel/generic/DSTORE.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DSTORE - Store double into local variable - * - *
      - * Stack: ..., value.word1, value.word2 -> ...
      - * 
      - * - * @version $Id: DSTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DSTORE extends StoreInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - DSTORE() { - super(org.apache.bcel.Constants.DSTORE, - org.apache.bcel.Constants.DSTORE_0); - } - - /** - * Store double into local variable - * - * @param n - * index of local variable - */ - public DSTORE(int n) { - super(org.apache.bcel.Constants.DSTORE, - org.apache.bcel.Constants.DSTORE_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitDSTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/DSUB.java b/src/org/apache/bcel/generic/DSUB.java deleted file mode 100644 index 63a6f7b..0000000 --- a/src/org/apache/bcel/generic/DSUB.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DSUB - Substract doubles - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result.word2 - * - * @version $Id: DSUB.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DSUB extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Substract doubles - */ - public DSUB() { - super(org.apache.bcel.Constants.DSUB); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDSUB(this); - } -} diff --git a/src/org/apache/bcel/generic/DUP.java b/src/org/apache/bcel/generic/DUP.java deleted file mode 100644 index 7726a0a..0000000 --- a/src/org/apache/bcel/generic/DUP.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DUP - Duplicate top operand stack word - * - *
      - * Stack: ..., word -> ..., word, word
      - * 
      - * - * @version $Id: DUP.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DUP extends StackInstruction implements PushInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DUP() { - super(org.apache.bcel.Constants.DUP); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitStackInstruction(this); - v.visitDUP(this); - } -} diff --git a/src/org/apache/bcel/generic/DUP2.java b/src/org/apache/bcel/generic/DUP2.java deleted file mode 100644 index e33c39f..0000000 --- a/src/org/apache/bcel/generic/DUP2.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DUP2 - Duplicate two top operand stack words - * - *
      - * Stack: ..., word2, word1 -> ..., word2, word1, word2, word1
      - * 
      - * - * @version $Id: DUP2.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DUP2 extends StackInstruction implements PushInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DUP2() { - super(org.apache.bcel.Constants.DUP2); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitStackInstruction(this); - v.visitDUP2(this); - } -} diff --git a/src/org/apache/bcel/generic/DUP2_X1.java b/src/org/apache/bcel/generic/DUP2_X1.java deleted file mode 100644 index b35b991..0000000 --- a/src/org/apache/bcel/generic/DUP2_X1.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DUP2_X1 - Duplicate two top operand stack words and put three down - * - *
      - * Stack: ..., word3, word2, word1 -> ..., word2, word1, word3, word2, word1
      - * 
      - * - * @version $Id: DUP2_X1.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DUP2_X1 extends StackInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DUP2_X1() { - super(org.apache.bcel.Constants.DUP2_X1); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackInstruction(this); - v.visitDUP2_X1(this); - } -} diff --git a/src/org/apache/bcel/generic/DUP2_X2.java b/src/org/apache/bcel/generic/DUP2_X2.java deleted file mode 100644 index f4bd487..0000000 --- a/src/org/apache/bcel/generic/DUP2_X2.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DUP2_X2 - Duplicate two top operand stack words and put four down - * - *
      - * Stack: ..., word4, word3, word2, word1 -> ..., word2, word1, word4, word3, word2, word1
      - * 
      - * - * @version $Id: DUP2_X2.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DUP2_X2 extends StackInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DUP2_X2() { - super(org.apache.bcel.Constants.DUP2_X2); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackInstruction(this); - v.visitDUP2_X2(this); - } -} diff --git a/src/org/apache/bcel/generic/DUP_X1.java b/src/org/apache/bcel/generic/DUP_X1.java deleted file mode 100644 index 22a20da..0000000 --- a/src/org/apache/bcel/generic/DUP_X1.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DUP_X1 - Duplicate top operand stack word and put two down - * - *
      - * Stack: ..., word2, word1 -> ..., word1, word2, word1
      - * 
      - * - * @version $Id: DUP_X1.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DUP_X1 extends StackInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DUP_X1() { - super(org.apache.bcel.Constants.DUP_X1); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackInstruction(this); - v.visitDUP_X1(this); - } -} diff --git a/src/org/apache/bcel/generic/DUP_X2.java b/src/org/apache/bcel/generic/DUP_X2.java deleted file mode 100644 index 0b94197..0000000 --- a/src/org/apache/bcel/generic/DUP_X2.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * DUP_X2 - Duplicate top operand stack word and put three down - * - *
      - * Stack: ..., word3, word2, word1 -> ..., word1, word3, word2, word1
      - * 
      - * - * @version $Id: DUP_X2.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class DUP_X2 extends StackInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DUP_X2() { - super(org.apache.bcel.Constants.DUP_X2); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackInstruction(this); - v.visitDUP_X2(this); - } -} diff --git a/src/org/apache/bcel/generic/EmptyVisitor.java b/src/org/apache/bcel/generic/EmptyVisitor.java deleted file mode 100644 index b56c77b..0000000 --- a/src/org/apache/bcel/generic/EmptyVisitor.java +++ /dev/null @@ -1,746 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Supplies empty method bodies to be overridden by subclasses. - * - * @version $Id: EmptyVisitor.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class EmptyVisitor implements Visitor { - - @Override - public void visitStackInstruction(StackInstruction obj) { - } - - @Override - public void visitLocalVariableInstruction(LocalVariableInstruction obj) { - } - - @Override - public void visitBranchInstruction(BranchInstruction obj) { - } - - @Override - public void visitLoadClass(LoadClass obj) { - } - - @Override - public void visitFieldInstruction(FieldInstruction obj) { - } - - @Override - public void visitIfInstruction(IfInstruction obj) { - } - - @Override - public void visitConversionInstruction(ConversionInstruction obj) { - } - - @Override - public void visitPopInstruction(PopInstruction obj) { - } - - @Override - public void visitJsrInstruction(JsrInstruction obj) { - } - - @Override - public void visitGotoInstruction(GotoInstruction obj) { - } - - @Override - public void visitStoreInstruction(StoreInstruction obj) { - } - - @Override - public void visitTypedInstruction(TypedInstruction obj) { - } - - @Override - public void visitSelect(Select obj) { - } - - @Override - public void visitUnconditionalBranch(UnconditionalBranch obj) { - } - - @Override - public void visitPushInstruction(PushInstruction obj) { - } - - @Override - public void visitArithmeticInstruction(ArithmeticInstruction obj) { - } - - @Override - public void visitCPInstruction(CPInstruction obj) { - } - - @Override - public void visitInvokeInstruction(InvokeInstruction obj) { - } - - @Override - public void visitArrayInstruction(ArrayInstruction obj) { - } - - @Override - public void visitAllocationInstruction(AllocationInstruction obj) { - } - - @Override - public void visitReturnInstruction(ReturnInstruction obj) { - } - - @Override - public void visitFieldOrMethod(FieldOrMethod obj) { - } - - @Override - public void visitConstantPushInstruction(ConstantPushInstruction obj) { - } - - @Override - public void visitExceptionThrower(ExceptionThrower obj) { - } - - @Override - public void visitLoadInstruction(LoadInstruction obj) { - } - - @Override - public void visitVariableLengthInstruction(VariableLengthInstruction obj) { - } - - @Override - public void visitStackProducer(StackProducer obj) { - } - - @Override - public void visitStackConsumer(StackConsumer obj) { - } - - @Override - public void visitACONST_NULL(ACONST_NULL obj) { - } - - @Override - public void visitGETSTATIC(GETSTATIC obj) { - } - - @Override - public void visitIF_ICMPLT(IF_ICMPLT obj) { - } - - @Override - public void visitMONITOREXIT(MONITOREXIT obj) { - } - - @Override - public void visitIFLT(IFLT obj) { - } - - @Override - public void visitLSTORE(LSTORE obj) { - } - - @Override - public void visitPOP2(POP2 obj) { - } - - @Override - public void visitBASTORE(BASTORE obj) { - } - - @Override - public void visitISTORE(ISTORE obj) { - } - - @Override - public void visitCHECKCAST(CHECKCAST obj) { - } - - @Override - public void visitFCMPG(FCMPG obj) { - } - - @Override - public void visitI2F(I2F obj) { - } - - @Override - public void visitATHROW(ATHROW obj) { - } - - @Override - public void visitDCMPL(DCMPL obj) { - } - - @Override - public void visitARRAYLENGTH(ARRAYLENGTH obj) { - } - - @Override - public void visitDUP(DUP obj) { - } - - @Override - public void visitINVOKESTATIC(INVOKESTATIC obj) { - } - - @Override - public void visitLCONST(LCONST obj) { - } - - @Override - public void visitDREM(DREM obj) { - } - - @Override - public void visitIFGE(IFGE obj) { - } - - @Override - public void visitCALOAD(CALOAD obj) { - } - - @Override - public void visitLASTORE(LASTORE obj) { - } - - @Override - public void visitI2D(I2D obj) { - } - - @Override - public void visitDADD(DADD obj) { - } - - @Override - public void visitINVOKESPECIAL(INVOKESPECIAL obj) { - } - - @Override - public void visitIAND(IAND obj) { - } - - @Override - public void visitPUTFIELD(PUTFIELD obj) { - } - - @Override - public void visitILOAD(ILOAD obj) { - } - - @Override - public void visitDLOAD(DLOAD obj) { - } - - @Override - public void visitDCONST(DCONST obj) { - } - - @Override - public void visitNEW(NEW obj) { - } - - @Override - public void visitIFNULL(IFNULL obj) { - } - - @Override - public void visitLSUB(LSUB obj) { - } - - @Override - public void visitL2I(L2I obj) { - } - - @Override - public void visitISHR(ISHR obj) { - } - - @Override - public void visitTABLESWITCH(TABLESWITCH obj) { - } - - @Override - public void visitIINC(IINC obj) { - } - - @Override - public void visitDRETURN(DRETURN obj) { - } - - @Override - public void visitFSTORE(FSTORE obj) { - } - - @Override - public void visitDASTORE(DASTORE obj) { - } - - @Override - public void visitIALOAD(IALOAD obj) { - } - - @Override - public void visitDDIV(DDIV obj) { - } - - @Override - public void visitIF_ICMPGE(IF_ICMPGE obj) { - } - - @Override - public void visitLAND(LAND obj) { - } - - @Override - public void visitIDIV(IDIV obj) { - } - - @Override - public void visitLOR(LOR obj) { - } - - @Override - public void visitCASTORE(CASTORE obj) { - } - - @Override - public void visitFREM(FREM obj) { - } - - @Override - public void visitLDC(LDC obj) { - } - - @Override - public void visitBIPUSH(BIPUSH obj) { - } - - @Override - public void visitDSTORE(DSTORE obj) { - } - - @Override - public void visitF2L(F2L obj) { - } - - @Override - public void visitFMUL(FMUL obj) { - } - - @Override - public void visitLLOAD(LLOAD obj) { - } - - @Override - public void visitJSR(JSR obj) { - } - - @Override - public void visitFSUB(FSUB obj) { - } - - @Override - public void visitSASTORE(SASTORE obj) { - } - - @Override - public void visitALOAD(ALOAD obj) { - } - - @Override - public void visitDUP2_X2(DUP2_X2 obj) { - } - - @Override - public void visitRETURN(RETURN obj) { - } - - @Override - public void visitDALOAD(DALOAD obj) { - } - - @Override - public void visitSIPUSH(SIPUSH obj) { - } - - @Override - public void visitDSUB(DSUB obj) { - } - - @Override - public void visitL2F(L2F obj) { - } - - @Override - public void visitIF_ICMPGT(IF_ICMPGT obj) { - } - - @Override - public void visitF2D(F2D obj) { - } - - @Override - public void visitI2L(I2L obj) { - } - - @Override - public void visitIF_ACMPNE(IF_ACMPNE obj) { - } - - @Override - public void visitPOP(POP obj) { - } - - @Override - public void visitI2S(I2S obj) { - } - - @Override - public void visitIFEQ(IFEQ obj) { - } - - @Override - public void visitSWAP(SWAP obj) { - } - - @Override - public void visitIOR(IOR obj) { - } - - @Override - public void visitIREM(IREM obj) { - } - - @Override - public void visitIASTORE(IASTORE obj) { - } - - @Override - public void visitNEWARRAY(NEWARRAY obj) { - } - - @Override - public void visitINVOKEINTERFACE(INVOKEINTERFACE obj) { - } - - @Override - public void visitINEG(INEG obj) { - } - - @Override - public void visitLCMP(LCMP obj) { - } - - @Override - public void visitJSR_W(JSR_W obj) { - } - - @Override - public void visitMULTIANEWARRAY(MULTIANEWARRAY obj) { - } - - @Override - public void visitDUP_X2(DUP_X2 obj) { - } - - @Override - public void visitSALOAD(SALOAD obj) { - } - - @Override - public void visitIFNONNULL(IFNONNULL obj) { - } - - @Override - public void visitDMUL(DMUL obj) { - } - - @Override - public void visitIFNE(IFNE obj) { - } - - @Override - public void visitIF_ICMPLE(IF_ICMPLE obj) { - } - - @Override - public void visitLDC2_W(LDC2_W obj) { - } - - @Override - public void visitGETFIELD(GETFIELD obj) { - } - - @Override - public void visitLADD(LADD obj) { - } - - @Override - public void visitNOP(NOP obj) { - } - - @Override - public void visitFALOAD(FALOAD obj) { - } - - @Override - public void visitINSTANCEOF(INSTANCEOF obj) { - } - - @Override - public void visitIFLE(IFLE obj) { - } - - @Override - public void visitLXOR(LXOR obj) { - } - - @Override - public void visitLRETURN(LRETURN obj) { - } - - @Override - public void visitFCONST(FCONST obj) { - } - - @Override - public void visitIUSHR(IUSHR obj) { - } - - @Override - public void visitBALOAD(BALOAD obj) { - } - - @Override - public void visitDUP2(DUP2 obj) { - } - - @Override - public void visitIF_ACMPEQ(IF_ACMPEQ obj) { - } - - @Override - public void visitIMPDEP1(IMPDEP1 obj) { - } - - @Override - public void visitMONITORENTER(MONITORENTER obj) { - } - - @Override - public void visitLSHL(LSHL obj) { - } - - @Override - public void visitDCMPG(DCMPG obj) { - } - - @Override - public void visitD2L(D2L obj) { - } - - @Override - public void visitIMPDEP2(IMPDEP2 obj) { - } - - @Override - public void visitL2D(L2D obj) { - } - - @Override - public void visitRET(RET obj) { - } - - @Override - public void visitIFGT(IFGT obj) { - } - - @Override - public void visitIXOR(IXOR obj) { - } - - @Override - public void visitINVOKEVIRTUAL(INVOKEVIRTUAL obj) { - } - - @Override - public void visitFASTORE(FASTORE obj) { - } - - @Override - public void visitIRETURN(IRETURN obj) { - } - - @Override - public void visitIF_ICMPNE(IF_ICMPNE obj) { - } - - @Override - public void visitFLOAD(FLOAD obj) { - } - - @Override - public void visitLDIV(LDIV obj) { - } - - @Override - public void visitPUTSTATIC(PUTSTATIC obj) { - } - - @Override - public void visitAALOAD(AALOAD obj) { - } - - @Override - public void visitD2I(D2I obj) { - } - - @Override - public void visitIF_ICMPEQ(IF_ICMPEQ obj) { - } - - @Override - public void visitAASTORE(AASTORE obj) { - } - - @Override - public void visitARETURN(ARETURN obj) { - } - - @Override - public void visitDUP2_X1(DUP2_X1 obj) { - } - - @Override - public void visitFNEG(FNEG obj) { - } - - @Override - public void visitGOTO_W(GOTO_W obj) { - } - - @Override - public void visitD2F(D2F obj) { - } - - @Override - public void visitGOTO(GOTO obj) { - } - - @Override - public void visitISUB(ISUB obj) { - } - - @Override - public void visitF2I(F2I obj) { - } - - @Override - public void visitDNEG(DNEG obj) { - } - - @Override - public void visitICONST(ICONST obj) { - } - - @Override - public void visitFDIV(FDIV obj) { - } - - @Override - public void visitI2B(I2B obj) { - } - - @Override - public void visitLNEG(LNEG obj) { - } - - @Override - public void visitLREM(LREM obj) { - } - - @Override - public void visitIMUL(IMUL obj) { - } - - @Override - public void visitIADD(IADD obj) { - } - - @Override - public void visitLSHR(LSHR obj) { - } - - @Override - public void visitLOOKUPSWITCH(LOOKUPSWITCH obj) { - } - - @Override - public void visitDUP_X1(DUP_X1 obj) { - } - - @Override - public void visitFCMPL(FCMPL obj) { - } - - @Override - public void visitI2C(I2C obj) { - } - - @Override - public void visitLMUL(LMUL obj) { - } - - @Override - public void visitLUSHR(LUSHR obj) { - } - - @Override - public void visitISHL(ISHL obj) { - } - - @Override - public void visitLALOAD(LALOAD obj) { - } - - @Override - public void visitASTORE(ASTORE obj) { - } - - @Override - public void visitANEWARRAY(ANEWARRAY obj) { - } - - @Override - public void visitFRETURN(FRETURN obj) { - } - - @Override - public void visitFADD(FADD obj) { - } - - @Override - public void visitBREAKPOINT(BREAKPOINT obj) { - } -} diff --git a/src/org/apache/bcel/generic/ExceptionThrower.java b/src/org/apache/bcel/generic/ExceptionThrower.java deleted file mode 100644 index 706e2c8..0000000 --- a/src/org/apache/bcel/generic/ExceptionThrower.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denote an instruction that may throw a run-time or a linking exception (or - * both) during execution. This is not quite the truth as such; because all - * instructions may throw an java.lang.VirtualMachineError. These exceptions are - * omitted. - * - * The Lava Language Specification specifies exactly which RUN-TIME and - * which LINKING exceptions each instruction may throw which is reflected - * by the implementers. Due to the structure of the JVM specification, it may be - * possible that an Instruction implementing this interface returns a Class[] of - * size 0. - * - * Please note that we speak of an "exception" here when we mean any "Throwable" - * object; so this term is equally used for "Exception" and "Error" objects. - * - * @version $Id: ExceptionThrower.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author Enver Haase - */ -public interface ExceptionThrower { - - public java.lang.Class[] getExceptions(); -} diff --git a/src/org/apache/bcel/generic/F2D.java b/src/org/apache/bcel/generic/F2D.java deleted file mode 100644 index a924f43..0000000 --- a/src/org/apache/bcel/generic/F2D.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * F2D - Convert float to double - * - *
      - * Stack: ..., value -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: F2D.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class F2D extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert float to double - */ - public F2D() { - super(org.apache.bcel.Constants.F2D); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitF2D(this); - } -} diff --git a/src/org/apache/bcel/generic/F2I.java b/src/org/apache/bcel/generic/F2I.java deleted file mode 100644 index 31126f0..0000000 --- a/src/org/apache/bcel/generic/F2I.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * F2I - Convert float to int - * - *
      - * Stack: ..., value -> ..., result
      - * 
      - * - * @version $Id: F2I.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class F2I extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert float to int - */ - public F2I() { - super(org.apache.bcel.Constants.F2I); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitF2I(this); - } -} diff --git a/src/org/apache/bcel/generic/F2L.java b/src/org/apache/bcel/generic/F2L.java deleted file mode 100644 index a0bd284..0000000 --- a/src/org/apache/bcel/generic/F2L.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * F2L - Convert float to long - * - *
      - * Stack: ..., value -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: F2L.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class F2L extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert float to long - */ - public F2L() { - super(org.apache.bcel.Constants.F2L); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitF2L(this); - } -} diff --git a/src/org/apache/bcel/generic/FADD.java b/src/org/apache/bcel/generic/FADD.java deleted file mode 100644 index e08e360..0000000 --- a/src/org/apache/bcel/generic/FADD.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FADD - Add floats - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: FADD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FADD extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Add floats - */ - public FADD() { - super(org.apache.bcel.Constants.FADD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFADD(this); - } -} diff --git a/src/org/apache/bcel/generic/FALOAD.java b/src/org/apache/bcel/generic/FALOAD.java deleted file mode 100644 index c718f6a..0000000 --- a/src/org/apache/bcel/generic/FALOAD.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FALOAD - Load float from array - * - *
      - * Stack: ..., arrayref, index -> ..., value
      - * 
      - * - * @version $Id: FALOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FALOAD extends ArrayInstruction implements StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Load float from array - */ - public FALOAD() { - super(org.apache.bcel.Constants.FALOAD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitFALOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/FASTORE.java b/src/org/apache/bcel/generic/FASTORE.java deleted file mode 100644 index 4e8e13e..0000000 --- a/src/org/apache/bcel/generic/FASTORE.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FASTORE - Store into float array - * - *
      - * Stack: ..., arrayref, index, value -> ...
      - * 
      - * - * @version $Id: FASTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FASTORE extends ArrayInstruction implements StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Store float into array - */ - public FASTORE() { - super(org.apache.bcel.Constants.FASTORE); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitFASTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/FCMPG.java b/src/org/apache/bcel/generic/FCMPG.java deleted file mode 100644 index da9504c..0000000 --- a/src/org/apache/bcel/generic/FCMPG.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FCMPG - Compare floats: value1 > value2 - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: FCMPG.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FCMPG extends Instruction implements TypedInstruction, - StackProducer, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public FCMPG() { - super(org.apache.bcel.Constants.FCMPG, (short) 1); - } - - /** - * @return Type.FLOAT - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.FLOAT; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitFCMPG(this); - } -} diff --git a/src/org/apache/bcel/generic/FCMPL.java b/src/org/apache/bcel/generic/FCMPL.java deleted file mode 100644 index 5ca6078..0000000 --- a/src/org/apache/bcel/generic/FCMPL.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FCMPL - Compare floats: value1 < value2 - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: FCMPL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FCMPL extends Instruction implements TypedInstruction, - StackProducer, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public FCMPL() { - super(org.apache.bcel.Constants.FCMPL, (short) 1); - } - - /** - * @return Type.FLOAT - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.FLOAT; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitFCMPL(this); - } -} diff --git a/src/org/apache/bcel/generic/FCONST.java b/src/org/apache/bcel/generic/FCONST.java deleted file mode 100644 index 3f0c2dd..0000000 --- a/src/org/apache/bcel/generic/FCONST.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FCONST - Push 0.0, 1.0 or 2.0, other values cause an exception - * - *
      - * Stack: ... -> ...,
      - * 
      - * - * @version $Id: FCONST.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FCONST extends Instruction implements ConstantPushInstruction, - TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - private float value; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FCONST() { - } - - public FCONST(float f) { - super(org.apache.bcel.Constants.FCONST_0, (short) 1); - if (f == 0.0) { - opcode = org.apache.bcel.Constants.FCONST_0; - } else if (f == 1.0) { - opcode = org.apache.bcel.Constants.FCONST_1; - } else if (f == 2.0) { - opcode = org.apache.bcel.Constants.FCONST_2; - } else { - throw new ClassGenException( - "FCONST can be used only for 0.0, 1.0 and 2.0: " + f); - } - value = f; - } - - @Override - public Number getValue() { - return new Float(value); - } - - /** - * @return Type.FLOAT - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.FLOAT; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitFCONST(this); - } -} diff --git a/src/org/apache/bcel/generic/FDIV.java b/src/org/apache/bcel/generic/FDIV.java deleted file mode 100644 index 5d8a840..0000000 --- a/src/org/apache/bcel/generic/FDIV.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FDIV - Divide floats - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: FDIV.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FDIV extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Divide floats - */ - public FDIV() { - super(org.apache.bcel.Constants.FDIV); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFDIV(this); - } -} diff --git a/src/org/apache/bcel/generic/FLOAD.java b/src/org/apache/bcel/generic/FLOAD.java deleted file mode 100644 index 5781361..0000000 --- a/src/org/apache/bcel/generic/FLOAD.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FLOAD - Load float from local variable - * - *
      - * Stack ... -> ..., result
      - * 
      - * - * @version $Id: FLOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FLOAD extends LoadInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FLOAD() { - super(org.apache.bcel.Constants.FLOAD, - org.apache.bcel.Constants.FLOAD_0); - } - - /** - * Load float from local variable - * - * @param n - * index of local variable - */ - public FLOAD(int n) { - super(org.apache.bcel.Constants.FLOAD, - org.apache.bcel.Constants.FLOAD_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitFLOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/FMUL.java b/src/org/apache/bcel/generic/FMUL.java deleted file mode 100644 index 90c21b0..0000000 --- a/src/org/apache/bcel/generic/FMUL.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FMUL - Multiply floats - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: FMUL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FMUL extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Multiply floats - */ - public FMUL() { - super(org.apache.bcel.Constants.FMUL); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFMUL(this); - } -} diff --git a/src/org/apache/bcel/generic/FNEG.java b/src/org/apache/bcel/generic/FNEG.java deleted file mode 100644 index fe31946..0000000 --- a/src/org/apache/bcel/generic/FNEG.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FNEG - Negate float - * - *
      - * Stack: ..., value -> ..., result
      - * 
      - * - * @version $Id: FNEG.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FNEG extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public FNEG() { - super(org.apache.bcel.Constants.FNEG); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFNEG(this); - } -} diff --git a/src/org/apache/bcel/generic/FREM.java b/src/org/apache/bcel/generic/FREM.java deleted file mode 100644 index 4ded950..0000000 --- a/src/org/apache/bcel/generic/FREM.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FREM - Remainder of floats - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: FREM.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FREM extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Remainder of floats - */ - public FREM() { - super(org.apache.bcel.Constants.FREM); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFREM(this); - } -} diff --git a/src/org/apache/bcel/generic/FRETURN.java b/src/org/apache/bcel/generic/FRETURN.java deleted file mode 100644 index 0946b65..0000000 --- a/src/org/apache/bcel/generic/FRETURN.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FRETURN - Return float from method - * - *
      - * Stack: ..., value -> <empty>
      - * 
      - * - * @version $Id: FRETURN.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FRETURN extends ReturnInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Return float from method - */ - public FRETURN() { - super(org.apache.bcel.Constants.FRETURN); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitFRETURN(this); - } -} diff --git a/src/org/apache/bcel/generic/FSTORE.java b/src/org/apache/bcel/generic/FSTORE.java deleted file mode 100644 index fe0b2b7..0000000 --- a/src/org/apache/bcel/generic/FSTORE.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FSTORE - Store float into local variable - * - *
      - * Stack: ..., value -> ...
      - * 
      - * - * @version $Id: FSTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FSTORE extends StoreInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FSTORE() { - super(org.apache.bcel.Constants.FSTORE, - org.apache.bcel.Constants.FSTORE_0); - } - - /** - * Store float into local variable - * - * @param n - * index of local variable - */ - public FSTORE(int n) { - super(org.apache.bcel.Constants.FSTORE, - org.apache.bcel.Constants.FSTORE_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitFSTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/FSUB.java b/src/org/apache/bcel/generic/FSUB.java deleted file mode 100644 index 7aab799..0000000 --- a/src/org/apache/bcel/generic/FSUB.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * FSUB - Substract floats - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: FSUB.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class FSUB extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Substract floats - */ - public FSUB() { - super(org.apache.bcel.Constants.FSUB); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFSUB(this); - } -} diff --git a/src/org/apache/bcel/generic/FieldGen.java b/src/org/apache/bcel/generic/FieldGen.java deleted file mode 100644 index 71658e2..0000000 --- a/src/org/apache/bcel/generic/FieldGen.java +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantObject; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.util.BCELComparator; - -/** - * Template class for building up a field. The only extraordinary thing one can - * do is to add a constant value attribute to a field (which must of course be - * compatible with to the declared type). - * - * @version $Id: FieldGen.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Field - */ -public class FieldGen extends FieldGenOrMethodGen { - - /** - * - */ - private static final long serialVersionUID = 1L; - private Object value = null; - private static BCELComparator _cmp = new BCELComparator() { - - @Override - public boolean equals(Object o1, Object o2) { - FieldGen THIS = (FieldGen) o1; - FieldGen THAT = (FieldGen) o2; - return THIS.getName().equals(THAT.getName()) - && THIS.getSignature().equals(THAT.getSignature()); - } - - @Override - public int hashCode(Object o) { - FieldGen THIS = (FieldGen) o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); - } - }; - - /** - * Declare a field. If it is static (isStatic() == true) and has a basic - * type like int or String it may have an initial value associated with it - * as defined by setInitValue(). - * - * @param access_flags - * access qualifiers - * @param type - * field type - * @param name - * field name - * @param cp - * constant pool - */ - public FieldGen(int access_flags, Type type, String name, ConstantPoolGen cp) { - setAccessFlags(access_flags); - setType(type); - setName(name); - setConstantPool(cp); - } - - /** - * Instantiate from existing field. - * - * @param field - * Field object - * @param cp - * constant pool (must contain the same entries as the field's - * constant pool) - */ - public FieldGen(Field field, ConstantPoolGen cp) { - this(field.getAccessFlags(), Type.getType(field.getSignature()), field - .getName(), cp); - Attribute[] attrs = field.getAttributes(); - for (int i = 0; i < attrs.length; i++) { - if (attrs[i] instanceof ConstantValue) { - setValue(((ConstantValue) attrs[i]).getConstantValueIndex()); - } else { - addAttribute(attrs[i]); - } - } - } - - private void setValue(int index) { - ConstantPool cp = this.cp.getConstantPool(); - Constant c = cp.getConstant(index); - value = ((ConstantObject) c).getConstantValue(cp); - } - - /** - * Set (optional) initial value of field, otherwise it will be set to - * null/0/false by the JVM automatically. - */ - public void setInitValue(String str) { - checkType(new ObjectType("java.lang.String")); - if (str != null) { - value = str; - } - } - - public void setInitValue(long l) { - checkType(Type.LONG); - if (l != 0L) { - value = new Long(l); - } - } - - public void setInitValue(int i) { - checkType(Type.INT); - if (i != 0) { - value = new Integer(i); - } - } - - public void setInitValue(short s) { - checkType(Type.SHORT); - if (s != 0) { - value = new Integer(s); - } - } - - public void setInitValue(char c) { - checkType(Type.CHAR); - if (c != 0) { - value = new Integer(c); - } - } - - public void setInitValue(byte b) { - checkType(Type.BYTE); - if (b != 0) { - value = new Integer(b); - } - } - - public void setInitValue(boolean b) { - checkType(Type.BOOLEAN); - if (b) { - value = new Integer(1); - } - } - - public void setInitValue(float f) { - checkType(Type.FLOAT); - if (f != 0.0) { - value = new Float(f); - } - } - - public void setInitValue(double d) { - checkType(Type.DOUBLE); - if (d != 0.0) { - value = new Double(d); - } - } - - /** - * Remove any initial value. - */ - public void cancelInitValue() { - value = null; - } - - private void checkType(Type atype) { - if (type == null) { - throw new ClassGenException( - "You haven't defined the type of the field yet"); - } - if (!isFinal()) { - throw new ClassGenException( - "Only final fields may have an initial value!"); - } - if (!type.equals(atype)) { - throw new ClassGenException("Types are not compatible: " + type - + " vs. " + atype); - } - } - - /** - * Get field object after having set up all necessary values. - */ - public Field getField() { - String signature = getSignature(); - int name_index = cp.addUtf8(name); - int signature_index = cp.addUtf8(signature); - if (value != null) { - checkType(type); - int index = addConstant(); - addAttribute(new ConstantValue(cp.addUtf8("ConstantValue"), 2, - index, cp.getConstantPool())); - } - return new Field(access_flags, name_index, signature_index, - getAttributes(), cp.getConstantPool()); - } - - private int addConstant() { - switch (type.getType()) { - case Constants.T_INT: - case Constants.T_CHAR: - case Constants.T_BYTE: - case Constants.T_BOOLEAN: - case Constants.T_SHORT: - return cp.addInteger(((Integer) value).intValue()); - case Constants.T_FLOAT: - return cp.addFloat(((Float) value).floatValue()); - case Constants.T_DOUBLE: - return cp.addDouble(((Double) value).doubleValue()); - case Constants.T_LONG: - return cp.addLong(((Long) value).longValue()); - case Constants.T_REFERENCE: - return cp.addString(((String) value)); - default: - throw new RuntimeException("Oops: Unhandled : " + type.getType()); - } - } - - @Override - public String getSignature() { - return type.getSignature(); - } - - private List observers; - - /** - * Add observer for this object. - */ - public void addObserver(FieldObserver o) { - if (observers == null) { - observers = new ArrayList(); - } - observers.add(o); - } - - /** - * Remove observer for this object. - */ - public void removeObserver(FieldObserver o) { - if (observers != null) { - observers.remove(o); - } - } - - /** - * Call notify() method on all observers. This method is not called - * automatically whenever the state has changed, but has to be called by the - * user after he has finished editing the object. - */ - public void update() { - if (observers != null) { - for (Iterator e = observers.iterator(); e.hasNext();) { - e.next().notify(this); - } - } - } - - public String getInitValue() { - if (value != null) { - return value.toString(); - } else { - return null; - } - } - - /** - * Return string representation close to declaration format, `public static - * final short MAX = 100', e.g.. - * - * @return String representation of field - */ - @Override - public final String toString() { - String name, signature, access; // Short cuts to constant pool - access = Utility.accessToString(access_flags); - access = access.equals("") ? "" : (access + " "); - signature = type.toString(); - name = getName(); - StringBuffer buf = new StringBuffer(32); - buf.append(access).append(signature).append(" ").append(name); - String value = getInitValue(); - if (value != null) { - buf.append(" = ").append(value); - } - return buf.toString(); - } - - /** - * @return deep copy of this field - */ - public FieldGen copy(ConstantPoolGen cp) { - FieldGen fg = (FieldGen) clone(); - fg.setConstantPool(cp); - return fg; - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator - * Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. By default two - * FieldGen objects are said to be equal when their names and signatures are - * equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. By default - * return the hashcode of the field's name XOR signature. - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return _cmp.hashCode(this); - } -} diff --git a/src/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/org/apache/bcel/generic/FieldGenOrMethodGen.java deleted file mode 100644 index 172d0a6..0000000 --- a/src/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.util.ArrayList; -import java.util.List; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.AccessFlags; -import org.apache.bcel.classfile.Attribute; - -/** - * Super class for FieldGen and MethodGen objects, since they have some methods - * in common! - * - * @version $Id: FieldGenOrMethodGen.java 410087 2006-05-29 12:12:19Z tcurdt $ - * @author M. Dahm - */ -public abstract class FieldGenOrMethodGen extends AccessFlags implements - NamedAndTyped, Cloneable { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected String name; - protected Type type; - protected ConstantPoolGen cp; - private List attribute_vec = new ArrayList(); - - protected FieldGenOrMethodGen() { - } - - @Override - public void setType(Type type) { - if (type.getType() == Constants.T_ADDRESS) { - throw new IllegalArgumentException("Type can not be " + type); - } - this.type = type; - } - - @Override - public Type getType() { - return type; - } - - /** - * @return name of method/field. - */ - @Override - public String getName() { - return name; - } - - @Override - public void setName(String name) { - this.name = name; - } - - public ConstantPoolGen getConstantPool() { - return cp; - } - - public void setConstantPool(ConstantPoolGen cp) { - this.cp = cp; - } - - /** - * Add an attribute to this method. Currently, the JVM knows about the - * `Code', `ConstantValue', `Synthetic' and `Exceptions' attributes. Other - * attributes will be ignored by the JVM but do no harm. - * - * @param a - * attribute to be added - */ - public void addAttribute(Attribute a) { - attribute_vec.add(a); - } - - /** - * Remove an attribute. - */ - public void removeAttribute(Attribute a) { - attribute_vec.remove(a); - } - - /** - * Remove all attributes. - */ - public void removeAttributes() { - attribute_vec.clear(); - } - - /** - * @return all attributes of this method. - */ - public Attribute[] getAttributes() { - Attribute[] attributes = new Attribute[attribute_vec.size()]; - attribute_vec.toArray(attributes); - return attributes; - } - - /** - * @return signature of method/field. - */ - public abstract String getSignature(); - - @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; - } - } -} diff --git a/src/org/apache/bcel/generic/FieldInstruction.java b/src/org/apache/bcel/generic/FieldInstruction.java deleted file mode 100644 index 936be24..0000000 --- a/src/org/apache/bcel/generic/FieldInstruction.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.classfile.ConstantPool; - -/** - * Super class for the GET/PUTxxx family of instructions. - * - * @version $Id: FieldInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class FieldInstruction extends FieldOrMethod implements - TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FieldInstruction() { - } - - /** - * @param index - * to constant pool - */ - protected FieldInstruction(short opcode, int index) { - super(opcode, index); - } - - /** - * @return mnemonic for instruction with symbolic references resolved - */ - @Override - public String toString(ConstantPool cp) { - return org.apache.bcel.Constants.OPCODE_NAMES[opcode] - + " " - + cp.constantToString(index, - org.apache.bcel.Constants.CONSTANT_Fieldref); - } - - /** - * @return size of field (1 or 2) - */ - protected int getFieldSize(ConstantPoolGen cpg) { - return getType(cpg).getSize(); - } - - /** - * @return return type of referenced field - */ - @Override - public Type getType(ConstantPoolGen cpg) { - return getFieldType(cpg); - } - - /** - * @return type of field - */ - public Type getFieldType(ConstantPoolGen cpg) { - return Type.getType(getSignature(cpg)); - } - - /** - * @return name of referenced field. - */ - public String getFieldName(ConstantPoolGen cpg) { - return getName(cpg); - } -} diff --git a/src/org/apache/bcel/generic/FieldObserver.java b/src/org/apache/bcel/generic/FieldObserver.java deleted file mode 100644 index 9ec13b4..0000000 --- a/src/org/apache/bcel/generic/FieldObserver.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Imnplement this interface if you're interested in changes to a FieldGen - * object and register yourself with addObserver(). - * - * @version $Id: FieldObserver.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface FieldObserver { - - public void notify(FieldGen field); -} diff --git a/src/org/apache/bcel/generic/FieldOrMethod.java b/src/org/apache/bcel/generic/FieldOrMethod.java deleted file mode 100644 index 9599221..0000000 --- a/src/org/apache/bcel/generic/FieldOrMethod.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.classfile.ConstantCP; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; - -/** - * Super class for InvokeInstruction and FieldInstruction, since they have some - * methods in common! - * - * @version $Id: FieldOrMethod.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class FieldOrMethod extends CPInstruction implements LoadClass { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FieldOrMethod() { - } - - /** - * @param index - * to constant pool - */ - protected FieldOrMethod(short opcode, int index) { - super(opcode, index); - } - - /** - * @return signature of referenced method/field. - */ - public String getSignature(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); - ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr - .getNameAndTypeIndex()); - return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())) - .getBytes(); - } - - /** - * @return name of referenced method/field. - */ - public String getName(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); - ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr - .getNameAndTypeIndex()); - return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); - } - - /** - * @return name of the referenced class/interface - */ - public String getClassName(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); - String className = cp.getConstantString(cmr.getClassIndex(), - org.apache.bcel.Constants.CONSTANT_Class); - if (className.startsWith("[")) { - // Turn array classes into java.lang.Object. - return "java.lang.Object"; - } - return className.replace('/', '.'); - } - - /** - * @return type of the referenced class/interface - * @deprecated If the instruction references an array class, the ObjectType - * returned will be invalid. Use getReferenceType() instead. - */ - @Deprecated - public ObjectType getClassType(ConstantPoolGen cpg) { - return new ObjectType(getClassName(cpg)); - } - - /** - * Return the reference type representing the class, interface, or array - * class referenced by the instruction. - * - * @param cpg - * the ConstantPoolGen used to create the instruction - * @return an ObjectType (if the referenced class type is a class or - * interface), or an ArrayType (if the referenced class type is an - * array class) - */ - public ReferenceType getReferenceType(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); - String className = cp.getConstantString(cmr.getClassIndex(), - org.apache.bcel.Constants.CONSTANT_Class); - if (className.startsWith("[")) { - return (ArrayType) Type.getType(className); - } else { - className = className.replace('/', '.'); - return new ObjectType(className); - } - } - - /** - * @return type of the referenced class/interface - */ - @Override - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - return getClassType(cpg); - } -} diff --git a/src/org/apache/bcel/generic/GETFIELD.java b/src/org/apache/bcel/generic/GETFIELD.java deleted file mode 100644 index d72d012..0000000 --- a/src/org/apache/bcel/generic/GETFIELD.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; - -/** - * GETFIELD - Fetch field from object - * - *
      - * Stack: ..., objectref -> ..., value
      - * 
      - * - * OR - * - *
      - * Stack: ..., objectref -> ..., value.word1, value.word2
      - * 
      - * - * @version $Id: GETFIELD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class GETFIELD extends FieldInstruction implements ExceptionThrower, - StackConsumer, StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GETFIELD() { - } - - public GETFIELD(int index) { - super(Constants.GETFIELD, index); - } - - @Override - public int produceStack(ConstantPoolGen cpg) { - return getFieldSize(cpg); - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, - 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitFieldInstruction(this); - v.visitGETFIELD(this); - } -} diff --git a/src/org/apache/bcel/generic/GETSTATIC.java b/src/org/apache/bcel/generic/GETSTATIC.java deleted file mode 100644 index 61c2975..0000000 --- a/src/org/apache/bcel/generic/GETSTATIC.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; - -/** - * GETSTATIC - Fetch static field from class - * - *
      - * Stack: ..., -> ..., value
      - * 
      - * - * OR - * - *
      - * Stack: ..., -> ..., value.word1, value.word2
      - * 
      - * - * @version $Id: GETSTATIC.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class GETSTATIC extends FieldInstruction implements PushInstruction, - ExceptionThrower { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GETSTATIC() { - } - - public GETSTATIC(int index) { - super(Constants.GETSTATIC, index); - } - - @Override - public int produceStack(ConstantPoolGen cpg) { - return getFieldSize(cpg); - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, - 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - return cs; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitFieldInstruction(this); - v.visitGETSTATIC(this); - } -} diff --git a/src/org/apache/bcel/generic/GOTO.java b/src/org/apache/bcel/generic/GOTO.java deleted file mode 100644 index 9dc4d7d..0000000 --- a/src/org/apache/bcel/generic/GOTO.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; - -/** - * GOTO - Branch always (to relative offset, not absolute address) - * - * @version $Id: GOTO.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class GOTO extends GotoInstruction implements VariableLengthInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GOTO() { - } - - public GOTO(InstructionHandle target) { - super(org.apache.bcel.Constants.GOTO, target); - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - index = getTargetOffset(); - if (opcode == org.apache.bcel.Constants.GOTO) { - super.dump(out); - } else { // GOTO_W - index = getTargetOffset(); - out.writeByte(opcode); - out.writeInt(index); - } - } - - /** - * Called in pass 2 of InstructionList.setPositions() in order to update the - * branch target, that may shift due to variable length instructions. - */ - @Override - protected int updatePosition(int offset, int max_offset) { - int i = getTargetOffset(); // Depending on old position value - position += offset; // Position may be shifted by preceding expansions - if (Math.abs(i) >= (32767 - max_offset)) { // to large for short - // (estimate) - opcode = org.apache.bcel.Constants.GOTO_W; - length = 5; - return 2; // 5 - 3 - } - return 0; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitVariableLengthInstruction(this); - v.visitUnconditionalBranch(this); - v.visitBranchInstruction(this); - v.visitGotoInstruction(this); - v.visitGOTO(this); - } -} diff --git a/src/org/apache/bcel/generic/GOTO_W.java b/src/org/apache/bcel/generic/GOTO_W.java deleted file mode 100644 index 228d95e..0000000 --- a/src/org/apache/bcel/generic/GOTO_W.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * GOTO_W - Branch always (to relative offset, not absolute address) - * - * @version $Id: GOTO_W.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class GOTO_W extends GotoInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GOTO_W() { - } - - public GOTO_W(InstructionHandle target) { - super(org.apache.bcel.Constants.GOTO_W, target); - length = 5; - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - index = getTargetOffset(); - out.writeByte(opcode); - out.writeInt(index); - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - index = bytes.readInt(); - length = 5; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitUnconditionalBranch(this); - v.visitBranchInstruction(this); - v.visitGotoInstruction(this); - v.visitGOTO_W(this); - } -} diff --git a/src/org/apache/bcel/generic/GotoInstruction.java b/src/org/apache/bcel/generic/GotoInstruction.java deleted file mode 100644 index b0ceb55..0000000 --- a/src/org/apache/bcel/generic/GotoInstruction.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Super class for GOTO - * - * @version $Id: GotoInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class GotoInstruction extends BranchInstruction implements - UnconditionalBranch { - - /** - * - */ - private static final long serialVersionUID = 1L; - - GotoInstruction(short opcode, InstructionHandle target) { - super(opcode, target); - } - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GotoInstruction() { - } -} diff --git a/src/org/apache/bcel/generic/I2B.java b/src/org/apache/bcel/generic/I2B.java deleted file mode 100644 index 1f609d4..0000000 --- a/src/org/apache/bcel/generic/I2B.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * I2B - Convert int to byte - * - *
      - * Stack: ..., value -> ..., result
      - * 
      - * - * @version $Id: I2B.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class I2B extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert int to byte - */ - public I2B() { - super(org.apache.bcel.Constants.I2B); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2B(this); - } -} diff --git a/src/org/apache/bcel/generic/I2C.java b/src/org/apache/bcel/generic/I2C.java deleted file mode 100644 index 87c7ee2..0000000 --- a/src/org/apache/bcel/generic/I2C.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * I2C - Convert int to char - * - *
      - * Stack: ..., value -> ..., result
      - * 
      - * - * @version $Id: I2C.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class I2C extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert int to char - */ - public I2C() { - super(org.apache.bcel.Constants.I2C); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2C(this); - } -} diff --git a/src/org/apache/bcel/generic/I2D.java b/src/org/apache/bcel/generic/I2D.java deleted file mode 100644 index 434685d..0000000 --- a/src/org/apache/bcel/generic/I2D.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * I2D - Convert int to double - * - *
      - * Stack: ..., value -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: I2D.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class I2D extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert int to double - */ - public I2D() { - super(org.apache.bcel.Constants.I2D); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2D(this); - } -} diff --git a/src/org/apache/bcel/generic/I2F.java b/src/org/apache/bcel/generic/I2F.java deleted file mode 100644 index e4ffa33..0000000 --- a/src/org/apache/bcel/generic/I2F.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * I2F - Convert int to float - * - *
      - * Stack: ..., value -> ..., result
      - * 
      - * - * @version $Id: I2F.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class I2F extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert int to float - */ - public I2F() { - super(org.apache.bcel.Constants.I2F); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2F(this); - } -} diff --git a/src/org/apache/bcel/generic/I2L.java b/src/org/apache/bcel/generic/I2L.java deleted file mode 100644 index f63e22d..0000000 --- a/src/org/apache/bcel/generic/I2L.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * I2L - Convert int to long - * - *
      - * Stack: ..., value -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: I2L.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class I2L extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Convert int to long - */ - public I2L() { - super(org.apache.bcel.Constants.I2L); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2L(this); - } -} diff --git a/src/org/apache/bcel/generic/I2S.java b/src/org/apache/bcel/generic/I2S.java deleted file mode 100644 index 492d3ef..0000000 --- a/src/org/apache/bcel/generic/I2S.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * I2S - Convert int to short - * - *
      - * Stack: ..., value -> ..., result
      - * 
      - * - * @version $Id: I2S.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class I2S extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public I2S() { - super(org.apache.bcel.Constants.I2S); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2S(this); - } -} diff --git a/src/org/apache/bcel/generic/IADD.java b/src/org/apache/bcel/generic/IADD.java deleted file mode 100644 index ad8bbcf..0000000 --- a/src/org/apache/bcel/generic/IADD.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IADD - Add ints - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: IADD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IADD extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Add ints - */ - public IADD() { - super(org.apache.bcel.Constants.IADD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIADD(this); - } -} diff --git a/src/org/apache/bcel/generic/IALOAD.java b/src/org/apache/bcel/generic/IALOAD.java deleted file mode 100644 index 1e43cf9..0000000 --- a/src/org/apache/bcel/generic/IALOAD.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IALOAD - Load int from array - * - *
      - * Stack: ..., arrayref, index -> ..., value
      - * 
      - * - * @version $Id: IALOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IALOAD extends ArrayInstruction implements StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Load int from array - */ - public IALOAD() { - super(org.apache.bcel.Constants.IALOAD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitIALOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/IAND.java b/src/org/apache/bcel/generic/IAND.java deleted file mode 100644 index 85ab840..0000000 --- a/src/org/apache/bcel/generic/IAND.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IAND - Bitwise AND int - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: IAND.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IAND extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public IAND() { - super(org.apache.bcel.Constants.IAND); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIAND(this); - } -} diff --git a/src/org/apache/bcel/generic/IASTORE.java b/src/org/apache/bcel/generic/IASTORE.java deleted file mode 100644 index 0a159db..0000000 --- a/src/org/apache/bcel/generic/IASTORE.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IASTORE - Store into int array - * - *
      - * Stack: ..., arrayref, index, value -> ...
      - * 
      - * - * @version $Id: IASTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IASTORE extends ArrayInstruction implements StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Store into int array - */ - public IASTORE() { - super(org.apache.bcel.Constants.IASTORE); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitIASTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/ICONST.java b/src/org/apache/bcel/generic/ICONST.java deleted file mode 100644 index 6eab6d5..0000000 --- a/src/org/apache/bcel/generic/ICONST.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ICONST - Push value between -1, ..., 5, other values cause an exception - * - *
      - * Stack: ... -> ...,
      - * 
      - * - * @version $Id: ICONST.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ICONST extends Instruction implements ConstantPushInstruction, - TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int value; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ICONST() { - } - - public ICONST(int i) { - super(org.apache.bcel.Constants.ICONST_0, (short) 1); - if ((i >= -1) && (i <= 5)) { - opcode = (short) (org.apache.bcel.Constants.ICONST_0 + i); // Even - // works - // for i - // == -1 - } else { - throw new ClassGenException( - "ICONST can be used only for value between -1 and 5: " + i); - } - value = i; - } - - @Override - public Number getValue() { - return new Integer(value); - } - - /** - * @return Type.INT - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.INT; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitICONST(this); - } -} diff --git a/src/org/apache/bcel/generic/IDIV.java b/src/org/apache/bcel/generic/IDIV.java deleted file mode 100644 index db8cfeb..0000000 --- a/src/org/apache/bcel/generic/IDIV.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IDIV - Divide ints - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: IDIV.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IDIV extends ArithmeticInstruction implements ExceptionThrower { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Divide ints - */ - public IDIV() { - super(org.apache.bcel.Constants.IDIV); - } - - /** - * @return exceptions this instruction may cause - */ - @Override - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIDIV(this); - } -} diff --git a/src/org/apache/bcel/generic/IFEQ.java b/src/org/apache/bcel/generic/IFEQ.java deleted file mode 100644 index 90f05a0..0000000 --- a/src/org/apache/bcel/generic/IFEQ.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IFEQ - Branch if int comparison with zero succeeds - * - *
      - * Stack: ..., value -> ...
      - * 
      - * - * @version $Id: IFEQ.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IFEQ extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFEQ() { - } - - public IFEQ(InstructionHandle target) { - super(org.apache.bcel.Constants.IFEQ, target); - } - - /** - * @return negation of instruction, e.g. IFEQ.negate() == IFNE - */ - @Override - public IfInstruction negate() { - return new IFNE(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFEQ(this); - } -} diff --git a/src/org/apache/bcel/generic/IFGE.java b/src/org/apache/bcel/generic/IFGE.java deleted file mode 100644 index 93a4314..0000000 --- a/src/org/apache/bcel/generic/IFGE.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IFGE - Branch if int comparison with zero succeeds - * - *
      - * Stack: ..., value -> ...
      - * 
      - * - * @version $Id: IFGE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IFGE extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFGE() { - } - - public IFGE(InstructionHandle target) { - super(org.apache.bcel.Constants.IFGE, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IFLT(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFGE(this); - } -} diff --git a/src/org/apache/bcel/generic/IFGT.java b/src/org/apache/bcel/generic/IFGT.java deleted file mode 100644 index 1b74414..0000000 --- a/src/org/apache/bcel/generic/IFGT.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IFGT - Branch if int comparison with zero succeeds - * - *
      - * Stack: ..., value -> ...
      - * 
      - * - * @version $Id: IFGT.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IFGT extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFGT() { - } - - public IFGT(InstructionHandle target) { - super(org.apache.bcel.Constants.IFGT, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IFLE(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFGT(this); - } -} diff --git a/src/org/apache/bcel/generic/IFLE.java b/src/org/apache/bcel/generic/IFLE.java deleted file mode 100644 index 61326d6..0000000 --- a/src/org/apache/bcel/generic/IFLE.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IFLE - Branch if int comparison with zero succeeds - * - *
      - * Stack: ..., value -> ...
      - * 
      - * - * @version $Id: IFLE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IFLE extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFLE() { - } - - public IFLE(InstructionHandle target) { - super(org.apache.bcel.Constants.IFLE, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IFGT(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFLE(this); - } -} diff --git a/src/org/apache/bcel/generic/IFLT.java b/src/org/apache/bcel/generic/IFLT.java deleted file mode 100644 index 62c323c..0000000 --- a/src/org/apache/bcel/generic/IFLT.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IFLT - Branch if int comparison with zero succeeds - * - *
      - * Stack: ..., value -> ...
      - * 
      - * - * @version $Id: IFLT.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IFLT extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFLT() { - } - - public IFLT(InstructionHandle target) { - super(org.apache.bcel.Constants.IFLT, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IFGE(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFLT(this); - } -} diff --git a/src/org/apache/bcel/generic/IFNE.java b/src/org/apache/bcel/generic/IFNE.java deleted file mode 100644 index b76f955..0000000 --- a/src/org/apache/bcel/generic/IFNE.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IFNE - Branch if int comparison with zero succeeds - * - *
      - * Stack: ..., value -> ...
      - * 
      - * - * @version $Id: IFNE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IFNE extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFNE() { - } - - public IFNE(InstructionHandle target) { - super(org.apache.bcel.Constants.IFNE, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IFEQ(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFNE(this); - } -} diff --git a/src/org/apache/bcel/generic/IFNONNULL.java b/src/org/apache/bcel/generic/IFNONNULL.java deleted file mode 100644 index 8513726..0000000 --- a/src/org/apache/bcel/generic/IFNONNULL.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IFNONNULL - Branch if reference is not null - * - *
      - * Stack: ..., reference -> ...
      - * 
      - * - * @version $Id: IFNONNULL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IFNONNULL extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFNONNULL() { - } - - public IFNONNULL(InstructionHandle target) { - super(org.apache.bcel.Constants.IFNONNULL, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IFNULL(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFNONNULL(this); - } -} diff --git a/src/org/apache/bcel/generic/IFNULL.java b/src/org/apache/bcel/generic/IFNULL.java deleted file mode 100644 index 4936f2c..0000000 --- a/src/org/apache/bcel/generic/IFNULL.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IFNULL - Branch if reference is not null - * - *
      - * Stack: ..., reference -> ...
      - * 
      - * - * @version $Id: IFNULL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IFNULL extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFNULL() { - } - - public IFNULL(InstructionHandle target) { - super(org.apache.bcel.Constants.IFNULL, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IFNONNULL(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFNULL(this); - } -} diff --git a/src/org/apache/bcel/generic/IF_ACMPEQ.java b/src/org/apache/bcel/generic/IF_ACMPEQ.java deleted file mode 100644 index ac61b05..0000000 --- a/src/org/apache/bcel/generic/IF_ACMPEQ.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IF_ACMPEQ - Branch if reference comparison succeeds - * - *
      - * Stack: ..., value1, value2 -> ...
      - * 
      - * - * @version $Id: IF_ACMPEQ.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IF_ACMPEQ extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ACMPEQ() { - } - - public IF_ACMPEQ(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ACMPEQ, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IF_ACMPNE(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ACMPEQ(this); - } -} diff --git a/src/org/apache/bcel/generic/IF_ACMPNE.java b/src/org/apache/bcel/generic/IF_ACMPNE.java deleted file mode 100644 index ddb4a4d..0000000 --- a/src/org/apache/bcel/generic/IF_ACMPNE.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IF_ACMPNE - Branch if reference comparison doesn't succeed - * - *
      - * Stack: ..., value1, value2 -> ...
      - * 
      - * - * @version $Id: IF_ACMPNE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IF_ACMPNE extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ACMPNE() { - } - - public IF_ACMPNE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ACMPNE, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IF_ACMPEQ(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ACMPNE(this); - } -} diff --git a/src/org/apache/bcel/generic/IF_ICMPEQ.java b/src/org/apache/bcel/generic/IF_ICMPEQ.java deleted file mode 100644 index d7dfb4d..0000000 --- a/src/org/apache/bcel/generic/IF_ICMPEQ.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IF_ICMPEQ - Branch if int comparison succeeds - * - *
      - * Stack: ..., value1, value2 -> ...
      - * 
      - * - * @version $Id: IF_ICMPEQ.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IF_ICMPEQ extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPEQ() { - } - - public IF_ICMPEQ(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPEQ, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IF_ICMPNE(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPEQ(this); - } -} diff --git a/src/org/apache/bcel/generic/IF_ICMPGE.java b/src/org/apache/bcel/generic/IF_ICMPGE.java deleted file mode 100644 index 7d30e01..0000000 --- a/src/org/apache/bcel/generic/IF_ICMPGE.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IF_ICMPGE - Branch if int comparison succeeds - * - *
      - * Stack: ..., value1, value2 -> ...
      - * 
      - * - * @version $Id: IF_ICMPGE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IF_ICMPGE extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPGE() { - } - - public IF_ICMPGE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPGE, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IF_ICMPLT(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPGE(this); - } -} diff --git a/src/org/apache/bcel/generic/IF_ICMPGT.java b/src/org/apache/bcel/generic/IF_ICMPGT.java deleted file mode 100644 index cc907ad..0000000 --- a/src/org/apache/bcel/generic/IF_ICMPGT.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IF_ICMPGT - Branch if int comparison succeeds - * - *
      - * Stack: ..., value1, value2 -> ...
      - * 
      - * - * @version $Id: IF_ICMPGT.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IF_ICMPGT extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPGT() { - } - - public IF_ICMPGT(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPGT, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IF_ICMPLE(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPGT(this); - } -} diff --git a/src/org/apache/bcel/generic/IF_ICMPLE.java b/src/org/apache/bcel/generic/IF_ICMPLE.java deleted file mode 100644 index 0e30a5f..0000000 --- a/src/org/apache/bcel/generic/IF_ICMPLE.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IF_ICMPLE - Branch if int comparison succeeds - * - *
      - * Stack: ..., value1, value2 -> ...
      - * 
      - * - * @version $Id: IF_ICMPLE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IF_ICMPLE extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPLE() { - } - - public IF_ICMPLE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPLE, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IF_ICMPGT(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPLE(this); - } -} diff --git a/src/org/apache/bcel/generic/IF_ICMPLT.java b/src/org/apache/bcel/generic/IF_ICMPLT.java deleted file mode 100644 index 9ebabcd..0000000 --- a/src/org/apache/bcel/generic/IF_ICMPLT.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IF_ICMPLT - Branch if int comparison succeeds - * - *
      - * Stack: ..., value1, value2 -> ...
      - * 
      - * - * @version $Id: IF_ICMPLT.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IF_ICMPLT extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPLT() { - } - - public IF_ICMPLT(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPLT, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IF_ICMPGE(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPLT(this); - } -} diff --git a/src/org/apache/bcel/generic/IF_ICMPNE.java b/src/org/apache/bcel/generic/IF_ICMPNE.java deleted file mode 100644 index ca67f6c..0000000 --- a/src/org/apache/bcel/generic/IF_ICMPNE.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IF_ICMPNE - Branch if int comparison doesn't succeed - * - *
      - * Stack: ..., value1, value2 -> ...
      - * 
      - * - * @version $Id: IF_ICMPNE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IF_ICMPNE extends IfInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPNE() { - } - - public IF_ICMPNE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPNE, target); - } - - /** - * @return negation of instruction - */ - @Override - public IfInstruction negate() { - return new IF_ICMPEQ(target); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPNE(this); - } -} diff --git a/src/org/apache/bcel/generic/IINC.java b/src/org/apache/bcel/generic/IINC.java deleted file mode 100644 index ecd01d4..0000000 --- a/src/org/apache/bcel/generic/IINC.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * IINC - Increment local variable by constant - * - * @version $Id: IINC.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IINC extends LocalVariableInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - private boolean wide; - private int c; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IINC() { - } - - /** - * @param n - * index of local variable - * @param c - * increment factor - */ - public IINC(int n, int c) { - super(); // Default behaviour of LocalVariableInstruction causes error - this.opcode = org.apache.bcel.Constants.IINC; - this.length = (short) 3; - setIndex(n); // May set wide as side effect - setIncrement(c); - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - if (wide) { - out.writeByte(org.apache.bcel.Constants.WIDE); - } - out.writeByte(opcode); - if (wide) { - out.writeShort(n); - out.writeShort(c); - } else { - out.writeByte(n); - out.writeByte(c); - } - } - - private final void setWide() { - wide = (n > org.apache.bcel.Constants.MAX_BYTE) - || (Math.abs(c) > Byte.MAX_VALUE); - if (wide) { - length = 6; // wide byte included - } else { - length = 3; - } - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - this.wide = wide; - if (wide) { - length = 6; - n = bytes.readUnsignedShort(); - c = bytes.readShort(); - } else { - length = 3; - n = bytes.readUnsignedByte(); - c = bytes.readByte(); - } - } - - /** - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - return super.toString(verbose) + " " + c; - } - - /** - * Set index of local variable. - */ - @Override - public final void setIndex(int n) { - if (n < 0) { - throw new ClassGenException("Negative index value: " + n); - } - this.n = n; - setWide(); - } - - /** - * @return increment factor - */ - public final int getIncrement() { - return c; - } - - /** - * Set increment factor. - */ - public final void setIncrement(int c) { - this.c = c; - setWide(); - } - - /** - * @return int type - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.INT; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLocalVariableInstruction(this); - v.visitIINC(this); - } -} diff --git a/src/org/apache/bcel/generic/ILOAD.java b/src/org/apache/bcel/generic/ILOAD.java deleted file mode 100644 index bdcacca..0000000 --- a/src/org/apache/bcel/generic/ILOAD.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ILOAD - Load int from local variable onto stack - * - *
      - * Stack: ... -> ..., result
      - * 
      - * - * @version $Id: ILOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ILOAD extends LoadInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ILOAD() { - super(org.apache.bcel.Constants.ILOAD, - org.apache.bcel.Constants.ILOAD_0); - } - - /** - * Load int from local variable - * - * @param n - * index of local variable - */ - public ILOAD(int n) { - super(org.apache.bcel.Constants.ILOAD, - org.apache.bcel.Constants.ILOAD_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitILOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/IMPDEP1.java b/src/org/apache/bcel/generic/IMPDEP1.java deleted file mode 100644 index cfc560b..0000000 --- a/src/org/apache/bcel/generic/IMPDEP1.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IMPDEP1 - Implementation dependent - * - * @version $Id: IMPDEP1.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IMPDEP1 extends Instruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public IMPDEP1() { - super(org.apache.bcel.Constants.IMPDEP1, (short) 1); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitIMPDEP1(this); - } -} diff --git a/src/org/apache/bcel/generic/IMPDEP2.java b/src/org/apache/bcel/generic/IMPDEP2.java deleted file mode 100644 index cd57b29..0000000 --- a/src/org/apache/bcel/generic/IMPDEP2.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IMPDEP2 - Implementation dependent - * - * @version $Id: IMPDEP2.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IMPDEP2 extends Instruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public IMPDEP2() { - super(org.apache.bcel.Constants.IMPDEP2, (short) 1); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitIMPDEP2(this); - } -} diff --git a/src/org/apache/bcel/generic/IMUL.java b/src/org/apache/bcel/generic/IMUL.java deleted file mode 100644 index b944b5b..0000000 --- a/src/org/apache/bcel/generic/IMUL.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IMUL - Multiply ints - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: IMUL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IMUL extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Multiply ints - */ - public IMUL() { - super(org.apache.bcel.Constants.IMUL); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIMUL(this); - } -} diff --git a/src/org/apache/bcel/generic/INEG.java b/src/org/apache/bcel/generic/INEG.java deleted file mode 100644 index db25323..0000000 --- a/src/org/apache/bcel/generic/INEG.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * INEG - Negate int - * - *
      - * Stack: ..., value -> ..., result
      - * 
      - * - * @version $Id: INEG.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class INEG extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public INEG() { - super(org.apache.bcel.Constants.INEG); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitINEG(this); - } -} diff --git a/src/org/apache/bcel/generic/INSTANCEOF.java b/src/org/apache/bcel/generic/INSTANCEOF.java deleted file mode 100644 index db79830..0000000 --- a/src/org/apache/bcel/generic/INSTANCEOF.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * INSTANCEOF - Determine if object is of given type - * - *
      - * Stack: ..., objectref -> ..., result
      - * 
      - * - * @version $Id: INSTANCEOF.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class INSTANCEOF extends CPInstruction implements LoadClass, - ExceptionThrower, StackProducer, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INSTANCEOF() { - } - - public INSTANCEOF(int index) { - super(org.apache.bcel.Constants.INSTANCEOF, index); - } - - @Override - public Class[] getExceptions() { - return org.apache.bcel.ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION; - } - - @Override - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - Type t = getType(cpg); - if (t instanceof ArrayType) { - t = ((ArrayType) t).getBasicType(); - } - return (t instanceof ObjectType) ? (ObjectType) t : null; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitINSTANCEOF(this); - } -} diff --git a/src/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/org/apache/bcel/generic/INVOKEINTERFACE.java deleted file mode 100644 index 4af8f41..0000000 --- a/src/org/apache/bcel/generic/INVOKEINTERFACE.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.util.ByteSequence; - -/** - * INVOKEINTERFACE - Invoke interface method - * - *
      - * Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
      - * 
      - * - * @version $Id: INVOKEINTERFACE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class INVOKEINTERFACE extends InvokeInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int nargs; // Number of arguments on stack (number of stack slots), - // called "count" in vmspec2 - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INVOKEINTERFACE() { - } - - public INVOKEINTERFACE(int index, int nargs) { - super(Constants.INVOKEINTERFACE, index); - length = 5; - if (nargs < 1) { - throw new ClassGenException("Number of arguments must be > 0 " - + nargs); - } - this.nargs = nargs; - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - out.writeShort(index); - out.writeByte(nargs); - out.writeByte(0); - } - - /** - * The count argument according to the Java Language Specification, - * Second Edition. - */ - public int getCount() { - return nargs; - } - - /** - * Read needed data (i.e., index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - super.initFromFile(bytes, wide); - length = 5; - nargs = bytes.readUnsignedByte(); - bytes.readByte(); // Skip 0 byte - } - - /** - * @return mnemonic for instruction with symbolic references resolved - */ - @Override - public String toString(ConstantPool cp) { - return super.toString(cp) + " " + nargs; - } - - @Override - public int consumeStack(ConstantPoolGen cpg) { // nargs is given in - // byte-code - return nargs; // nargs includes this reference - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION, - 0, cs, 0, - ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 3] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 1] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - return cs; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitInvokeInstruction(this); - v.visitINVOKEINTERFACE(this); - } -} diff --git a/src/org/apache/bcel/generic/INVOKESPECIAL.java b/src/org/apache/bcel/generic/INVOKESPECIAL.java deleted file mode 100644 index 3b9bfc5..0000000 --- a/src/org/apache/bcel/generic/INVOKESPECIAL.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; - -/** - * INVOKESPECIAL - Invoke instance method; special handling for superclass, - * private and instance initialization method invocations - * - *
      - * Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
      - * 
      - * - * @version $Id: INVOKESPECIAL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class INVOKESPECIAL extends InvokeInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INVOKESPECIAL() { - } - - public INVOKESPECIAL(int index) { - super(Constants.INVOKESPECIAL, index); - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, - 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitInvokeInstruction(this); - v.visitINVOKESPECIAL(this); - } -} diff --git a/src/org/apache/bcel/generic/INVOKESTATIC.java b/src/org/apache/bcel/generic/INVOKESTATIC.java deleted file mode 100644 index 72409d4..0000000 --- a/src/org/apache/bcel/generic/INVOKESTATIC.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; - -/** - * INVOKESTATIC - Invoke a class (static) method - * - *
      - * Stack: ..., [arg1, [arg2 ...]] -> ...
      - * 
      - * - * @version $Id: INVOKESTATIC.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class INVOKESTATIC extends InvokeInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INVOKESTATIC() { - } - - public INVOKESTATIC(int index) { - super(Constants.INVOKESTATIC, index); - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, - 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - return cs; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitInvokeInstruction(this); - v.visitINVOKESTATIC(this); - } -} diff --git a/src/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/org/apache/bcel/generic/INVOKEVIRTUAL.java deleted file mode 100644 index fd4fbee..0000000 --- a/src/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; - -/** - * INVOKEVIRTUAL - Invoke instance method; dispatch based on class - * - *
      - * Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
      - * 
      - * - * @version $Id: INVOKEVIRTUAL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class INVOKEVIRTUAL extends InvokeInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INVOKEVIRTUAL() { - } - - public INVOKEVIRTUAL(int index) { - super(Constants.INVOKEVIRTUAL, index); - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, - 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitInvokeInstruction(this); - v.visitINVOKEVIRTUAL(this); - } -} diff --git a/src/org/apache/bcel/generic/IOR.java b/src/org/apache/bcel/generic/IOR.java deleted file mode 100644 index 21547eb..0000000 --- a/src/org/apache/bcel/generic/IOR.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IOR - Bitwise OR int - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: IOR.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IOR extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public IOR() { - super(org.apache.bcel.Constants.IOR); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIOR(this); - } -} diff --git a/src/org/apache/bcel/generic/IREM.java b/src/org/apache/bcel/generic/IREM.java deleted file mode 100644 index 4977625..0000000 --- a/src/org/apache/bcel/generic/IREM.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IREM - Remainder of int - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: IREM.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IREM extends ArithmeticInstruction implements ExceptionThrower { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Remainder of ints - */ - public IREM() { - super(org.apache.bcel.Constants.IREM); - } - - /** - * @return exceptions this instruction may cause - */ - @Override - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIREM(this); - } -} diff --git a/src/org/apache/bcel/generic/IRETURN.java b/src/org/apache/bcel/generic/IRETURN.java deleted file mode 100644 index 767b4be..0000000 --- a/src/org/apache/bcel/generic/IRETURN.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IRETURN - Return int from method - * - *
      - * Stack: ..., value -> <empty>
      - * 
      - * - * @version $Id: IRETURN.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IRETURN extends ReturnInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Return int from method - */ - public IRETURN() { - super(org.apache.bcel.Constants.IRETURN); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitIRETURN(this); - } -} diff --git a/src/org/apache/bcel/generic/ISHL.java b/src/org/apache/bcel/generic/ISHL.java deleted file mode 100644 index 05244cf..0000000 --- a/src/org/apache/bcel/generic/ISHL.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ISHL - Arithmetic shift left int - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: ISHL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ISHL extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public ISHL() { - super(org.apache.bcel.Constants.ISHL); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitISHL(this); - } -} diff --git a/src/org/apache/bcel/generic/ISHR.java b/src/org/apache/bcel/generic/ISHR.java deleted file mode 100644 index 03f3178..0000000 --- a/src/org/apache/bcel/generic/ISHR.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ISHR - Arithmetic shift right int - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: ISHR.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ISHR extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public ISHR() { - super(org.apache.bcel.Constants.ISHR); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitISHR(this); - } -} diff --git a/src/org/apache/bcel/generic/ISTORE.java b/src/org/apache/bcel/generic/ISTORE.java deleted file mode 100644 index 3f80b96..0000000 --- a/src/org/apache/bcel/generic/ISTORE.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ISTORE - Store int from stack into local variable - * - *
      - * Stack: ..., value -> ...
      - * 
      - * - * @version $Id: ISTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ISTORE extends StoreInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ISTORE() { - super(org.apache.bcel.Constants.ISTORE, - org.apache.bcel.Constants.ISTORE_0); - } - - /** - * Store int into local variable - * - * @param n - * index of local variable - */ - public ISTORE(int n) { - super(org.apache.bcel.Constants.ISTORE, - org.apache.bcel.Constants.ISTORE_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitISTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/ISUB.java b/src/org/apache/bcel/generic/ISUB.java deleted file mode 100644 index a303f30..0000000 --- a/src/org/apache/bcel/generic/ISUB.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * ISUB - Substract ints - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: ISUB.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ISUB extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Substract ints - */ - public ISUB() { - super(org.apache.bcel.Constants.ISUB); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitISUB(this); - } -} diff --git a/src/org/apache/bcel/generic/IUSHR.java b/src/org/apache/bcel/generic/IUSHR.java deleted file mode 100644 index 36bc1ec..0000000 --- a/src/org/apache/bcel/generic/IUSHR.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IUSHR - Logical shift right int - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: IUSHR.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IUSHR extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public IUSHR() { - super(org.apache.bcel.Constants.IUSHR); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIUSHR(this); - } -} diff --git a/src/org/apache/bcel/generic/IXOR.java b/src/org/apache/bcel/generic/IXOR.java deleted file mode 100644 index 9338502..0000000 --- a/src/org/apache/bcel/generic/IXOR.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * IXOR - Bitwise XOR int - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: IXOR.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class IXOR extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public IXOR() { - super(org.apache.bcel.Constants.IXOR); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIXOR(this); - } -} diff --git a/src/org/apache/bcel/generic/IfInstruction.java b/src/org/apache/bcel/generic/IfInstruction.java deleted file mode 100644 index c443b9c..0000000 --- a/src/org/apache/bcel/generic/IfInstruction.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Super class for the IFxxx family of instructions. - * - * @version $Id: IfInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class IfInstruction extends BranchInstruction implements - StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IfInstruction() { - } - - /** - * @param opcode - * opcode of instruction - * @param target - * Target instruction to branch to - */ - protected IfInstruction(short opcode, InstructionHandle target) { - super(opcode, target); - } - - /** - * @return negation of instruction, e.g. IFEQ.negate() == IFNE - */ - public abstract IfInstruction negate(); -} diff --git a/src/org/apache/bcel/generic/IndexedInstruction.java b/src/org/apache/bcel/generic/IndexedInstruction.java deleted file mode 100644 index 25bf990..0000000 --- a/src/org/apache/bcel/generic/IndexedInstruction.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denote entity that refers to an index, e.g. local variable instructions, RET, - * CPInstruction, etc. - * - * @version $Id: IndexedInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface IndexedInstruction { - - public int getIndex(); - - public void setIndex(int index); -} diff --git a/src/org/apache/bcel/generic/Instruction.java b/src/org/apache/bcel/generic/Instruction.java deleted file mode 100644 index 0704729..0000000 --- a/src/org/apache/bcel/generic/Instruction.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.Serializable; -import java.util.Locale; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.util.ByteSequence; - -/** - * Abstract super class for all Java byte codes. - * - * @version $Id: Instruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class Instruction implements Cloneable, Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected short length = 1; // Length of instruction in bytes - protected short opcode = -1; // Opcode number - private static InstructionComparator cmp = InstructionComparator.DEFAULT; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - Instruction() { - } - - public Instruction(short opcode, short length) { - this.length = length; - this.opcode = opcode; - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); // Common for all instructions - } - - /** - * @return name of instruction, i.e., opcode name - */ - public String getName() { - return Constants.OPCODE_NAMES[opcode]; - } - - /** - * Long output format: - * - * <name of opcode> "["<opcode number>"]" "("<length of - * instruction>")" - * - * @param verbose - * long/short format switch - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - if (verbose) { - return getName() + "[" + opcode + "](" + length + ")"; - } else { - return getName(); - } - } - - /** - * @return mnemonic for instruction in verbose format - */ - @Override - public String toString() { - return toString(true); - } - - /** - * @return mnemonic for instruction with sumbolic references resolved - */ - public String toString(ConstantPool cp) { - return toString(false); - } - - /** - * Use with caution, since `BranchInstruction's have a `target' reference - * which is not copied correctly (only basic types are). This also applies - * for `Select' instructions with their multiple branch targets. - * - * @see BranchInstruction - * @return (shallow) copy of an instruction - */ - public Instruction copy() { - Instruction i = null; - // "Constant" instruction, no need to duplicate - if (InstructionConstants.INSTRUCTIONS[this.getOpcode()] != null) { - i = this; - } else { - try { - i = (Instruction) clone(); - } catch (CloneNotSupportedException e) { - System.err.println(e); - } - } - return i; - } - - /** - * Read needed data (e.g. index) from file. - * - * @param bytes - * byte sequence to read from - * @param wide - * "wide" instruction flag - */ - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - } - - /** - * Read an instruction from (byte code) input stream and return the - * appropiate object. - * - * @param bytes - * input stream bytes - * @return instruction object being read - */ - public static final Instruction readInstruction(ByteSequence bytes) - throws IOException { - boolean wide = false; - short opcode = (short) bytes.readUnsignedByte(); - Instruction obj = null; - if (opcode == Constants.WIDE) { // Read next opcode after wide byte - wide = true; - opcode = (short) bytes.readUnsignedByte(); - } - if (InstructionConstants.INSTRUCTIONS[opcode] != null) { - return InstructionConstants.INSTRUCTIONS[opcode]; // Used predefined - // immutable - // object, if - // available - } - /* - * Find appropiate class, instantiate an (empty) instruction object and - * initialize it by hand. - */ - Class clazz; - try { - clazz = Class.forName(className(opcode)); - } catch (ClassNotFoundException cnfe) { - // If a class by that name does not exist, the opcode is illegal. - // Note that IMPDEP1, IMPDEP2, BREAKPOINT are also illegal in a - // sense. - throw new ClassGenException("Illegal opcode detected."); - } - try { - obj = (Instruction) clazz.newInstance(); - if (wide - && !((obj instanceof LocalVariableInstruction) - || (obj instanceof IINC) || (obj instanceof RET))) { - throw new Exception("Illegal opcode after wide: " + opcode); - } - obj.setOpcode(opcode); - obj.initFromFile(bytes, wide); // Do further initializations, if any - // Byte code offset set in InstructionList - } catch (Exception e) { - throw new ClassGenException(e.toString()); - } - return obj; - } - - private static final String className(short opcode) { - String name = Constants.OPCODE_NAMES[opcode] - .toUpperCase(Locale.ENGLISH); - /* - * ICONST_0, etc. will be shortened to ICONST, etc., since ICONST_0 and - * the like are not implemented (directly). - */ - try { - int len = name.length(); - char ch1 = name.charAt(len - 2), ch2 = name.charAt(len - 1); - if ((ch1 == '_') && (ch2 >= '0') && (ch2 <= '5')) { - name = name.substring(0, len - 2); - } - if (name.equals("ICONST_M1")) { - name = "ICONST"; - } - } catch (StringIndexOutOfBoundsException e) { - System.err.println(e); - } - return "org.apache.bcel.generic." + name; - } - - /** - * This method also gives right results for instructions whose effect on the - * stack depends on the constant pool entry they reference. - * - * @return Number of words consumed from stack by this instruction, or - * Constants.UNPREDICTABLE, if this can not be computed statically - */ - public int consumeStack(ConstantPoolGen cpg) { - return Constants.CONSUME_STACK[opcode]; - } - - /** - * This method also gives right results for instructions whose effect on the - * stack depends on the constant pool entry they reference. - * - * @return Number of words produced onto stack by this instruction, or - * Constants.UNPREDICTABLE, if this can not be computed statically - */ - public int produceStack(ConstantPoolGen cpg) { - return Constants.PRODUCE_STACK[opcode]; - } - - /** - * @return this instructions opcode - */ - public short getOpcode() { - return opcode; - } - - /** - * @return length (in bytes) of instruction - */ - public int getLength() { - return length; - } - - /** - * Needed in readInstruction. - */ - private void setOpcode(short opcode) { - this.opcode = opcode; - } - - /** - * Some instructions may be reused, so don't do anything by default. - */ - void dispose() { - } - - /** - * 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 v - * Visitor object - */ - public abstract void accept(Visitor v); - - /** - * Get Comparator object used in the equals() method to determine equality - * of instructions. - * - * @return currently used comparator for equals() - */ - public static InstructionComparator getComparator() { - return cmp; - } - - /** - * Set comparator to be used for equals(). - */ - public static void setComparator(InstructionComparator c) { - cmp = c; - } - - /** - * Check for equality, delegated to comparator - * - * @return true if that is an Instruction and has the same opcode - */ - @Override - public boolean equals(Object that) { - return (that instanceof Instruction) ? cmp.equals(this, - (Instruction) that) : false; - } -} diff --git a/src/org/apache/bcel/generic/InstructionComparator.java b/src/org/apache/bcel/generic/InstructionComparator.java deleted file mode 100644 index 7717631..0000000 --- a/src/org/apache/bcel/generic/InstructionComparator.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Equality of instructions isn't clearly to be defined. You might wish, for - * example, to compare whether instructions have the same meaning. E.g., whether - * two INVOKEVIRTUALs describe the same call.
      - * The DEFAULT comparator however, considers two instructions to be equal if - * they have same opcode and point to the same indexes (if any) in the constant - * pool or the same local variable index. Branch instructions must have the same - * target. - * - * @see Instruction - * @version $Id: InstructionComparator.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface InstructionComparator { - - public static final InstructionComparator DEFAULT = new InstructionComparator() { - - @Override - public boolean equals(Instruction i1, Instruction i2) { - if (i1.opcode == i2.opcode) { - if (i1 instanceof Select) { - InstructionHandle[] t1 = ((Select) i1).getTargets(); - InstructionHandle[] t2 = ((Select) i2).getTargets(); - if (t1.length == t2.length) { - for (int i = 0; i < t1.length; i++) { - if (t1[i] != t2[i]) { - return false; - } - } - return true; - } - } else if (i1 instanceof BranchInstruction) { - return ((BranchInstruction) i1).target == ((BranchInstruction) i2).target; - } else if (i1 instanceof ConstantPushInstruction) { - return ((ConstantPushInstruction) i1).getValue().equals( - ((ConstantPushInstruction) i2).getValue()); - } else if (i1 instanceof IndexedInstruction) { - return ((IndexedInstruction) i1).getIndex() == ((IndexedInstruction) i2) - .getIndex(); - } else if (i1 instanceof NEWARRAY) { - return ((NEWARRAY) i1).getTypecode() == ((NEWARRAY) i2) - .getTypecode(); - } else { - return true; - } - } - return false; - } - }; - - public boolean equals(Instruction i1, Instruction i2); -} diff --git a/src/org/apache/bcel/generic/InstructionConstants.java b/src/org/apache/bcel/generic/InstructionConstants.java deleted file mode 100644 index 4d78841..0000000 --- a/src/org/apache/bcel/generic/InstructionConstants.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; - -/** - * This interface contains shareable instruction objects. - * - * In order to save memory you can use some instructions multiply, since they - * have an immutable state and are directly derived from Instruction. I.e. they - * have no instance fields that could be changed. Since some of these - * instructions like ICONST_0 occur very frequently this can save a lot of time - * and space. This feature is an adaptation of the FlyWeight design pattern, we - * just use an array instead of a factory. - * - * The Instructions can also accessed directly under their names, so it's - * possible to write il.append(Instruction.ICONST_0); - * - * @version $Id: InstructionConstants.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface InstructionConstants { - - /** - * Predefined instruction objects - */ - public static final Instruction NOP = new NOP(); - public static final Instruction ACONST_NULL = new ACONST_NULL(); - public static final Instruction ICONST_M1 = new ICONST(-1); - public static final Instruction ICONST_0 = new ICONST(0); - public static final Instruction ICONST_1 = new ICONST(1); - public static final Instruction ICONST_2 = new ICONST(2); - public static final Instruction ICONST_3 = new ICONST(3); - public static final Instruction ICONST_4 = new ICONST(4); - public static final Instruction ICONST_5 = new ICONST(5); - public static final Instruction LCONST_0 = new LCONST(0); - public static final Instruction LCONST_1 = new LCONST(1); - public static final Instruction FCONST_0 = new FCONST(0); - public static final Instruction FCONST_1 = new FCONST(1); - public static final Instruction FCONST_2 = new FCONST(2); - public static final Instruction DCONST_0 = new DCONST(0); - public static final Instruction DCONST_1 = new DCONST(1); - public static final ArrayInstruction IALOAD = new IALOAD(); - public static final ArrayInstruction LALOAD = new LALOAD(); - public static final ArrayInstruction FALOAD = new FALOAD(); - public static final ArrayInstruction DALOAD = new DALOAD(); - public static final ArrayInstruction AALOAD = new AALOAD(); - public static final ArrayInstruction BALOAD = new BALOAD(); - public static final ArrayInstruction CALOAD = new CALOAD(); - public static final ArrayInstruction SALOAD = new SALOAD(); - public static final ArrayInstruction IASTORE = new IASTORE(); - public static final ArrayInstruction LASTORE = new LASTORE(); - public static final ArrayInstruction FASTORE = new FASTORE(); - public static final ArrayInstruction DASTORE = new DASTORE(); - public static final ArrayInstruction AASTORE = new AASTORE(); - public static final ArrayInstruction BASTORE = new BASTORE(); - public static final ArrayInstruction CASTORE = new CASTORE(); - public static final ArrayInstruction SASTORE = new SASTORE(); - public static final StackInstruction POP = new POP(); - public static final StackInstruction POP2 = new POP2(); - public static final StackInstruction DUP = new DUP(); - public static final StackInstruction DUP_X1 = new DUP_X1(); - public static final StackInstruction DUP_X2 = new DUP_X2(); - public static final StackInstruction DUP2 = new DUP2(); - public static final StackInstruction DUP2_X1 = new DUP2_X1(); - public static final StackInstruction DUP2_X2 = new DUP2_X2(); - public static final StackInstruction SWAP = new SWAP(); - public static final ArithmeticInstruction IADD = new IADD(); - public static final ArithmeticInstruction LADD = new LADD(); - public static final ArithmeticInstruction FADD = new FADD(); - public static final ArithmeticInstruction DADD = new DADD(); - public static final ArithmeticInstruction ISUB = new ISUB(); - public static final ArithmeticInstruction LSUB = new LSUB(); - public static final ArithmeticInstruction FSUB = new FSUB(); - public static final ArithmeticInstruction DSUB = new DSUB(); - public static final ArithmeticInstruction IMUL = new IMUL(); - public static final ArithmeticInstruction LMUL = new LMUL(); - public static final ArithmeticInstruction FMUL = new FMUL(); - public static final ArithmeticInstruction DMUL = new DMUL(); - public static final ArithmeticInstruction IDIV = new IDIV(); - public static final ArithmeticInstruction LDIV = new LDIV(); - public static final ArithmeticInstruction FDIV = new FDIV(); - public static final ArithmeticInstruction DDIV = new DDIV(); - public static final ArithmeticInstruction IREM = new IREM(); - public static final ArithmeticInstruction LREM = new LREM(); - public static final ArithmeticInstruction FREM = new FREM(); - public static final ArithmeticInstruction DREM = new DREM(); - public static final ArithmeticInstruction INEG = new INEG(); - public static final ArithmeticInstruction LNEG = new LNEG(); - public static final ArithmeticInstruction FNEG = new FNEG(); - public static final ArithmeticInstruction DNEG = new DNEG(); - public static final ArithmeticInstruction ISHL = new ISHL(); - public static final ArithmeticInstruction LSHL = new LSHL(); - public static final ArithmeticInstruction ISHR = new ISHR(); - public static final ArithmeticInstruction LSHR = new LSHR(); - public static final ArithmeticInstruction IUSHR = new IUSHR(); - public static final ArithmeticInstruction LUSHR = new LUSHR(); - public static final ArithmeticInstruction IAND = new IAND(); - public static final ArithmeticInstruction LAND = new LAND(); - public static final ArithmeticInstruction IOR = new IOR(); - public static final ArithmeticInstruction LOR = new LOR(); - public static final ArithmeticInstruction IXOR = new IXOR(); - public static final ArithmeticInstruction LXOR = new LXOR(); - public static final ConversionInstruction I2L = new I2L(); - public static final ConversionInstruction I2F = new I2F(); - public static final ConversionInstruction I2D = new I2D(); - public static final ConversionInstruction L2I = new L2I(); - public static final ConversionInstruction L2F = new L2F(); - public static final ConversionInstruction L2D = new L2D(); - public static final ConversionInstruction F2I = new F2I(); - public static final ConversionInstruction F2L = new F2L(); - public static final ConversionInstruction F2D = new F2D(); - public static final ConversionInstruction D2I = new D2I(); - public static final ConversionInstruction D2L = new D2L(); - public static final ConversionInstruction D2F = new D2F(); - public static final ConversionInstruction I2B = new I2B(); - public static final ConversionInstruction I2C = new I2C(); - public static final ConversionInstruction I2S = new I2S(); - public static final Instruction LCMP = new LCMP(); - public static final Instruction FCMPL = new FCMPL(); - public static final Instruction FCMPG = new FCMPG(); - public static final Instruction DCMPL = new DCMPL(); - public static final Instruction DCMPG = new DCMPG(); - public static final ReturnInstruction IRETURN = new IRETURN(); - public static final ReturnInstruction LRETURN = new LRETURN(); - public static final ReturnInstruction FRETURN = new FRETURN(); - public static final ReturnInstruction DRETURN = new DRETURN(); - public static final ReturnInstruction ARETURN = new ARETURN(); - public static final ReturnInstruction RETURN = new RETURN(); - public static final Instruction ARRAYLENGTH = new ARRAYLENGTH(); - public static final Instruction ATHROW = new ATHROW(); - public static final Instruction MONITORENTER = new MONITORENTER(); - public static final Instruction MONITOREXIT = new MONITOREXIT(); - /** - * You can use these constants in multiple places safely, if you can - * guarantee that you will never alter their internal values, e.g. call - * setIndex(). - */ - public static final LocalVariableInstruction THIS = new ALOAD(0); - public static final LocalVariableInstruction ALOAD_0 = THIS; - public static final LocalVariableInstruction ALOAD_1 = new ALOAD(1); - public static final LocalVariableInstruction ALOAD_2 = new ALOAD(2); - public static final LocalVariableInstruction ILOAD_0 = new ILOAD(0); - public static final LocalVariableInstruction ILOAD_1 = new ILOAD(1); - public static final LocalVariableInstruction ILOAD_2 = new ILOAD(2); - public static final LocalVariableInstruction ASTORE_0 = new ASTORE(0); - public static final LocalVariableInstruction ASTORE_1 = new ASTORE(1); - public static final LocalVariableInstruction ASTORE_2 = new ASTORE(2); - public static final LocalVariableInstruction ISTORE_0 = new ISTORE(0); - public static final LocalVariableInstruction ISTORE_1 = new ISTORE(1); - public static final LocalVariableInstruction ISTORE_2 = new ISTORE(2); - /** - * Get object via its opcode, for immutable instructions like branch - * instructions entries are set to null. - */ - public static final Instruction[] INSTRUCTIONS = new Instruction[256]; - /** - * Interfaces may have no static initializers, so we simulate this with an - * inner class. - */ - static final Clinit bla = new Clinit(); - - static class Clinit { - - Clinit() { - INSTRUCTIONS[Constants.NOP] = NOP; - INSTRUCTIONS[Constants.ACONST_NULL] = ACONST_NULL; - INSTRUCTIONS[Constants.ICONST_M1] = ICONST_M1; - INSTRUCTIONS[Constants.ICONST_0] = ICONST_0; - INSTRUCTIONS[Constants.ICONST_1] = ICONST_1; - INSTRUCTIONS[Constants.ICONST_2] = ICONST_2; - INSTRUCTIONS[Constants.ICONST_3] = ICONST_3; - INSTRUCTIONS[Constants.ICONST_4] = ICONST_4; - INSTRUCTIONS[Constants.ICONST_5] = ICONST_5; - INSTRUCTIONS[Constants.LCONST_0] = LCONST_0; - INSTRUCTIONS[Constants.LCONST_1] = LCONST_1; - INSTRUCTIONS[Constants.FCONST_0] = FCONST_0; - INSTRUCTIONS[Constants.FCONST_1] = FCONST_1; - INSTRUCTIONS[Constants.FCONST_2] = FCONST_2; - INSTRUCTIONS[Constants.DCONST_0] = DCONST_0; - INSTRUCTIONS[Constants.DCONST_1] = DCONST_1; - INSTRUCTIONS[Constants.IALOAD] = IALOAD; - INSTRUCTIONS[Constants.LALOAD] = LALOAD; - INSTRUCTIONS[Constants.FALOAD] = FALOAD; - INSTRUCTIONS[Constants.DALOAD] = DALOAD; - INSTRUCTIONS[Constants.AALOAD] = AALOAD; - INSTRUCTIONS[Constants.BALOAD] = BALOAD; - INSTRUCTIONS[Constants.CALOAD] = CALOAD; - INSTRUCTIONS[Constants.SALOAD] = SALOAD; - INSTRUCTIONS[Constants.IASTORE] = IASTORE; - INSTRUCTIONS[Constants.LASTORE] = LASTORE; - INSTRUCTIONS[Constants.FASTORE] = FASTORE; - INSTRUCTIONS[Constants.DASTORE] = DASTORE; - INSTRUCTIONS[Constants.AASTORE] = AASTORE; - INSTRUCTIONS[Constants.BASTORE] = BASTORE; - INSTRUCTIONS[Constants.CASTORE] = CASTORE; - INSTRUCTIONS[Constants.SASTORE] = SASTORE; - INSTRUCTIONS[Constants.POP] = POP; - INSTRUCTIONS[Constants.POP2] = POP2; - INSTRUCTIONS[Constants.DUP] = DUP; - INSTRUCTIONS[Constants.DUP_X1] = DUP_X1; - INSTRUCTIONS[Constants.DUP_X2] = DUP_X2; - INSTRUCTIONS[Constants.DUP2] = DUP2; - INSTRUCTIONS[Constants.DUP2_X1] = DUP2_X1; - INSTRUCTIONS[Constants.DUP2_X2] = DUP2_X2; - INSTRUCTIONS[Constants.SWAP] = SWAP; - INSTRUCTIONS[Constants.IADD] = IADD; - INSTRUCTIONS[Constants.LADD] = LADD; - INSTRUCTIONS[Constants.FADD] = FADD; - INSTRUCTIONS[Constants.DADD] = DADD; - INSTRUCTIONS[Constants.ISUB] = ISUB; - INSTRUCTIONS[Constants.LSUB] = LSUB; - INSTRUCTIONS[Constants.FSUB] = FSUB; - INSTRUCTIONS[Constants.DSUB] = DSUB; - INSTRUCTIONS[Constants.IMUL] = IMUL; - INSTRUCTIONS[Constants.LMUL] = LMUL; - INSTRUCTIONS[Constants.FMUL] = FMUL; - INSTRUCTIONS[Constants.DMUL] = DMUL; - INSTRUCTIONS[Constants.IDIV] = IDIV; - INSTRUCTIONS[Constants.LDIV] = LDIV; - INSTRUCTIONS[Constants.FDIV] = FDIV; - INSTRUCTIONS[Constants.DDIV] = DDIV; - INSTRUCTIONS[Constants.IREM] = IREM; - INSTRUCTIONS[Constants.LREM] = LREM; - INSTRUCTIONS[Constants.FREM] = FREM; - INSTRUCTIONS[Constants.DREM] = DREM; - INSTRUCTIONS[Constants.INEG] = INEG; - INSTRUCTIONS[Constants.LNEG] = LNEG; - INSTRUCTIONS[Constants.FNEG] = FNEG; - INSTRUCTIONS[Constants.DNEG] = DNEG; - INSTRUCTIONS[Constants.ISHL] = ISHL; - INSTRUCTIONS[Constants.LSHL] = LSHL; - INSTRUCTIONS[Constants.ISHR] = ISHR; - INSTRUCTIONS[Constants.LSHR] = LSHR; - INSTRUCTIONS[Constants.IUSHR] = IUSHR; - INSTRUCTIONS[Constants.LUSHR] = LUSHR; - INSTRUCTIONS[Constants.IAND] = IAND; - INSTRUCTIONS[Constants.LAND] = LAND; - INSTRUCTIONS[Constants.IOR] = IOR; - INSTRUCTIONS[Constants.LOR] = LOR; - INSTRUCTIONS[Constants.IXOR] = IXOR; - INSTRUCTIONS[Constants.LXOR] = LXOR; - INSTRUCTIONS[Constants.I2L] = I2L; - INSTRUCTIONS[Constants.I2F] = I2F; - INSTRUCTIONS[Constants.I2D] = I2D; - INSTRUCTIONS[Constants.L2I] = L2I; - INSTRUCTIONS[Constants.L2F] = L2F; - INSTRUCTIONS[Constants.L2D] = L2D; - INSTRUCTIONS[Constants.F2I] = F2I; - INSTRUCTIONS[Constants.F2L] = F2L; - INSTRUCTIONS[Constants.F2D] = F2D; - INSTRUCTIONS[Constants.D2I] = D2I; - INSTRUCTIONS[Constants.D2L] = D2L; - INSTRUCTIONS[Constants.D2F] = D2F; - INSTRUCTIONS[Constants.I2B] = I2B; - INSTRUCTIONS[Constants.I2C] = I2C; - INSTRUCTIONS[Constants.I2S] = I2S; - INSTRUCTIONS[Constants.LCMP] = LCMP; - INSTRUCTIONS[Constants.FCMPL] = FCMPL; - INSTRUCTIONS[Constants.FCMPG] = FCMPG; - INSTRUCTIONS[Constants.DCMPL] = DCMPL; - INSTRUCTIONS[Constants.DCMPG] = DCMPG; - INSTRUCTIONS[Constants.IRETURN] = IRETURN; - INSTRUCTIONS[Constants.LRETURN] = LRETURN; - INSTRUCTIONS[Constants.FRETURN] = FRETURN; - INSTRUCTIONS[Constants.DRETURN] = DRETURN; - INSTRUCTIONS[Constants.ARETURN] = ARETURN; - INSTRUCTIONS[Constants.RETURN] = RETURN; - INSTRUCTIONS[Constants.ARRAYLENGTH] = ARRAYLENGTH; - INSTRUCTIONS[Constants.ATHROW] = ATHROW; - INSTRUCTIONS[Constants.MONITORENTER] = MONITORENTER; - INSTRUCTIONS[Constants.MONITOREXIT] = MONITOREXIT; - } - } -} diff --git a/src/org/apache/bcel/generic/InstructionFactory.java b/src/org/apache/bcel/generic/InstructionFactory.java deleted file mode 100644 index 35c1c5f..0000000 --- a/src/org/apache/bcel/generic/InstructionFactory.java +++ /dev/null @@ -1,746 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; - -/** - * Instances of this class may be used, e.g., to generate typed versions of - * instructions. Its main purpose is to be used as the byte code generating - * backend of a compiler. You can subclass it to add your own create methods. - * - * @version $Id: InstructionFactory.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Constants - */ -public class InstructionFactory implements InstructionConstants, - java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected ClassGen cg; - protected ConstantPoolGen cp; - - public InstructionFactory(ClassGen cg, ConstantPoolGen cp) { - this.cg = cg; - this.cp = cp; - } - - /** - * Initialize with ClassGen object - */ - public InstructionFactory(ClassGen cg) { - this(cg, cg.getConstantPool()); - } - - /** - * Initialize just with ConstantPoolGen object - */ - public InstructionFactory(ConstantPoolGen cp) { - this(null, cp); - } - - /** - * Create an invoke instruction. - * - * @param class_name - * name of the called class - * @param name - * name of the called method - * @param ret_type - * return type of method - * @param arg_types - * argument types of method - * @param kind - * how to invoke, i.e., INVOKEINTERFACE, INVOKESTATIC, - * INVOKEVIRTUAL, or INVOKESPECIAL - * @see Constants - */ - public InvokeInstruction createInvoke(String class_name, String name, - Type ret_type, Type[] arg_types, short kind) { - int index; - int nargs = 0; - String signature = Type.getMethodSignature(ret_type, arg_types); - for (int i = 0; i < arg_types.length; i++) { - nargs += arg_types[i].getSize(); - } - if (kind == Constants.INVOKEINTERFACE) { - index = cp.addInterfaceMethodref(class_name, name, signature); - } else { - index = cp.addMethodref(class_name, name, signature); - } - switch (kind) { - case Constants.INVOKESPECIAL: - return new INVOKESPECIAL(index); - case Constants.INVOKEVIRTUAL: - return new INVOKEVIRTUAL(index); - case Constants.INVOKESTATIC: - return new INVOKESTATIC(index); - case Constants.INVOKEINTERFACE: - return new INVOKEINTERFACE(index, nargs + 1); - default: - throw new RuntimeException("Oops: Unknown invoke kind:" + kind); - } - } - - /** - * Create a call to the most popular System.out.println() method. - * - * @param s - * the string to print - */ - public InstructionList createPrintln(String s) { - InstructionList il = new InstructionList(); - int out = cp.addFieldref("java.lang.System", "out", - "Ljava/io/PrintStream;"); - int println = cp.addMethodref("java.io.PrintStream", "println", - "(Ljava/lang/String;)V"); - il.append(new GETSTATIC(out)); - il.append(new PUSH(cp, s)); - il.append(new INVOKEVIRTUAL(println)); - return il; - } - - /** - * Uses PUSH to push a constant value onto the stack. - * - * @param value - * must be of type Number, Boolean, Character or String - */ - public Instruction createConstant(Object value) { - PUSH push; - if (value instanceof Number) { - push = new PUSH(cp, (Number) value); - } else if (value instanceof String) { - push = new PUSH(cp, (String) value); - } else if (value instanceof Boolean) { - push = new PUSH(cp, (Boolean) value); - } else if (value instanceof Character) { - push = new PUSH(cp, (Character) value); - } else { - throw new ClassGenException("Illegal type: " + value.getClass()); - } - return push.getInstruction(); - } - - private static class MethodObject { - - Type[] arg_types; - Type result_type; - String class_name; - String name; - - MethodObject(String c, String n, Type r, Type[] a, int acc) { - class_name = c; - name = n; - result_type = r; - arg_types = a; - } - } - - private InvokeInstruction createInvoke(MethodObject m, short kind) { - return createInvoke(m.class_name, m.name, m.result_type, m.arg_types, - kind); - } - - private static MethodObject[] append_mos = { - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.STRING }, - Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.OBJECT }, - Constants.ACC_PUBLIC), - null, - null, // indices 2, 3 - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.BOOLEAN }, - Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.CHAR }, - Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.FLOAT }, - Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.DOUBLE }, - Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.INT }, - Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, // No append(byte) - new Type[] { Type.INT }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, // No append(short) - new Type[] { Type.INT }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.LONG }, - Constants.ACC_PUBLIC) }; - - private static final boolean isString(Type type) { - return ((type instanceof ObjectType) && ((ObjectType) type) - .getClassName().equals("java.lang.String")); - } - - public Instruction createAppend(Type type) { - byte t = type.getType(); - if (isString(type)) { - return createInvoke(append_mos[0], Constants.INVOKEVIRTUAL); - } - switch (t) { - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_FLOAT: - case Constants.T_DOUBLE: - case Constants.T_BYTE: - case Constants.T_SHORT: - case Constants.T_INT: - case Constants.T_LONG: - return createInvoke(append_mos[t], Constants.INVOKEVIRTUAL); - case Constants.T_ARRAY: - case Constants.T_OBJECT: - return createInvoke(append_mos[1], Constants.INVOKEVIRTUAL); - default: - throw new RuntimeException("Oops: No append for this type? " + type); - } - } - - /** - * Create a field instruction. - * - * @param class_name - * name of the accessed class - * @param name - * name of the referenced field - * @param type - * type of field - * @param kind - * how to access, i.e., GETFIELD, PUTFIELD, GETSTATIC, PUTSTATIC - * @see Constants - */ - public FieldInstruction createFieldAccess(String class_name, String name, - Type type, short kind) { - int index; - String signature = type.getSignature(); - index = cp.addFieldref(class_name, name, signature); - switch (kind) { - case Constants.GETFIELD: - return new GETFIELD(index); - case Constants.PUTFIELD: - return new PUTFIELD(index); - case Constants.GETSTATIC: - return new GETSTATIC(index); - case Constants.PUTSTATIC: - return new PUTSTATIC(index); - default: - throw new RuntimeException("Oops: Unknown getfield kind:" + kind); - } - } - - /** - * Create reference to `this' - */ - public static Instruction createThis() { - return new ALOAD(0); - } - - /** - * Create typed return - */ - public static ReturnInstruction createReturn(Type type) { - switch (type.getType()) { - case Constants.T_ARRAY: - case Constants.T_OBJECT: - return ARETURN; - case Constants.T_INT: - case Constants.T_SHORT: - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_BYTE: - return IRETURN; - case Constants.T_FLOAT: - return FRETURN; - case Constants.T_DOUBLE: - return DRETURN; - case Constants.T_LONG: - return LRETURN; - case Constants.T_VOID: - return RETURN; - default: - throw new RuntimeException("Invalid type: " + type); - } - } - - private static final ArithmeticInstruction createBinaryIntOp(char first, - String op) { - switch (first) { - case '-': - return ISUB; - case '+': - return IADD; - case '%': - return IREM; - case '*': - return IMUL; - case '/': - return IDIV; - case '&': - return IAND; - case '|': - return IOR; - case '^': - return IXOR; - case '<': - return ISHL; - case '>': - return op.equals(">>>") ? (ArithmeticInstruction) IUSHR - : (ArithmeticInstruction) ISHR; - default: - throw new RuntimeException("Invalid operand " + op); - } - } - - private static final ArithmeticInstruction createBinaryLongOp(char first, - String op) { - switch (first) { - case '-': - return LSUB; - case '+': - return LADD; - case '%': - return LREM; - case '*': - return LMUL; - case '/': - return LDIV; - case '&': - return LAND; - case '|': - return LOR; - case '^': - return LXOR; - case '<': - return LSHL; - case '>': - return op.equals(">>>") ? (ArithmeticInstruction) LUSHR - : (ArithmeticInstruction) LSHR; - default: - throw new RuntimeException("Invalid operand " + op); - } - } - - private static final ArithmeticInstruction createBinaryFloatOp(char op) { - switch (op) { - case '-': - return FSUB; - case '+': - return FADD; - case '*': - return FMUL; - case '/': - return FDIV; - default: - throw new RuntimeException("Invalid operand " + op); - } - } - - private static final ArithmeticInstruction createBinaryDoubleOp(char op) { - switch (op) { - case '-': - return DSUB; - case '+': - return DADD; - case '*': - return DMUL; - case '/': - return DDIV; - default: - throw new RuntimeException("Invalid operand " + op); - } - } - -/** - * Create binary operation for simple basic types, such as int and float. - * - * @param op operation, such as "+", "*", "<<", etc. - */ - public static ArithmeticInstruction createBinaryOperation(String op, - Type type) { - char first = op.toCharArray()[0]; - switch (type.getType()) { - case Constants.T_BYTE: - case Constants.T_SHORT: - case Constants.T_INT: - case Constants.T_CHAR: - return createBinaryIntOp(first, op); - case Constants.T_LONG: - return createBinaryLongOp(first, op); - case Constants.T_FLOAT: - return createBinaryFloatOp(first); - case Constants.T_DOUBLE: - return createBinaryDoubleOp(first); - default: - throw new RuntimeException("Invalid type " + type); - } - } - - /** - * @param size - * size of operand, either 1 (int, e.g.) or 2 (double) - */ - public static StackInstruction createPop(int size) { - return (size == 2) ? (StackInstruction) POP2 : (StackInstruction) POP; - } - - /** - * @param size - * size of operand, either 1 (int, e.g.) or 2 (double) - */ - public static StackInstruction createDup(int size) { - return (size == 2) ? (StackInstruction) DUP2 : (StackInstruction) DUP; - } - - /** - * @param size - * size of operand, either 1 (int, e.g.) or 2 (double) - */ - public static StackInstruction createDup_2(int size) { - return (size == 2) ? (StackInstruction) DUP2_X2 - : (StackInstruction) DUP_X2; - } - - /** - * @param size - * size of operand, either 1 (int, e.g.) or 2 (double) - */ - public static StackInstruction createDup_1(int size) { - return (size == 2) ? (StackInstruction) DUP2_X1 - : (StackInstruction) DUP_X1; - } - - /** - * @param index - * index of local variable - */ - public static LocalVariableInstruction createStore(Type type, int index) { - switch (type.getType()) { - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_BYTE: - case Constants.T_SHORT: - case Constants.T_INT: - return new ISTORE(index); - case Constants.T_FLOAT: - return new FSTORE(index); - case Constants.T_DOUBLE: - return new DSTORE(index); - case Constants.T_LONG: - return new LSTORE(index); - case Constants.T_ARRAY: - case Constants.T_OBJECT: - return new ASTORE(index); - default: - throw new RuntimeException("Invalid type " + type); - } - } - - /** - * @param index - * index of local variable - */ - public static LocalVariableInstruction createLoad(Type type, int index) { - switch (type.getType()) { - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_BYTE: - case Constants.T_SHORT: - case Constants.T_INT: - return new ILOAD(index); - case Constants.T_FLOAT: - return new FLOAD(index); - case Constants.T_DOUBLE: - return new DLOAD(index); - case Constants.T_LONG: - return new LLOAD(index); - case Constants.T_ARRAY: - case Constants.T_OBJECT: - return new ALOAD(index); - default: - throw new RuntimeException("Invalid type " + type); - } - } - - /** - * @param type - * type of elements of array, i.e., array.getElementType() - */ - public static ArrayInstruction createArrayLoad(Type type) { - switch (type.getType()) { - case Constants.T_BOOLEAN: - case Constants.T_BYTE: - return BALOAD; - case Constants.T_CHAR: - return CALOAD; - case Constants.T_SHORT: - return SALOAD; - case Constants.T_INT: - return IALOAD; - case Constants.T_FLOAT: - return FALOAD; - case Constants.T_DOUBLE: - return DALOAD; - case Constants.T_LONG: - return LALOAD; - case Constants.T_ARRAY: - case Constants.T_OBJECT: - return AALOAD; - default: - throw new RuntimeException("Invalid type " + type); - } - } - - /** - * @param type - * type of elements of array, i.e., array.getElementType() - */ - public static ArrayInstruction createArrayStore(Type type) { - switch (type.getType()) { - case Constants.T_BOOLEAN: - case Constants.T_BYTE: - return BASTORE; - case Constants.T_CHAR: - return CASTORE; - case Constants.T_SHORT: - return SASTORE; - case Constants.T_INT: - return IASTORE; - case Constants.T_FLOAT: - return FASTORE; - case Constants.T_DOUBLE: - return DASTORE; - case Constants.T_LONG: - return LASTORE; - case Constants.T_ARRAY: - case Constants.T_OBJECT: - return AASTORE; - default: - throw new RuntimeException("Invalid type " + type); - } - } - - /** - * Create conversion operation for two stack operands, this may be an I2C, - * instruction, e.g., if the operands are basic types and CHECKCAST if they - * are reference types. - */ - public Instruction createCast(Type src_type, Type dest_type) { - if ((src_type instanceof BasicType) && (dest_type instanceof BasicType)) { - byte dest = dest_type.getType(); - byte src = src_type.getType(); - if (dest == Constants.T_LONG - && (src == Constants.T_CHAR || src == Constants.T_BYTE || src == Constants.T_SHORT)) { - src = Constants.T_INT; - } - String[] short_names = { "C", "F", "D", "B", "S", "I", "L" }; - String name = "org.apache.bcel.generic." - + short_names[src - Constants.T_CHAR] + "2" - + short_names[dest - Constants.T_CHAR]; - Instruction i = null; - try { - i = (Instruction) java.lang.Class.forName(name).newInstance(); - } catch (Exception e) { - throw new RuntimeException("Could not find instruction: " - + name); - } - return i; - } else if ((src_type instanceof ReferenceType) - && (dest_type instanceof ReferenceType)) { - if (dest_type instanceof ArrayType) { - return new CHECKCAST(cp.addArrayClass((ArrayType) dest_type)); - } else { - return new CHECKCAST(cp.addClass(((ObjectType) dest_type) - .getClassName())); - } - } else { - throw new RuntimeException("Can not cast " + src_type + " to " - + dest_type); - } - } - - public GETFIELD createGetField(String class_name, String name, Type t) { - return new GETFIELD(cp.addFieldref(class_name, name, t.getSignature())); - } - - public GETSTATIC createGetStatic(String class_name, String name, Type t) { - return new GETSTATIC(cp.addFieldref(class_name, name, t.getSignature())); - } - - public PUTFIELD createPutField(String class_name, String name, Type t) { - return new PUTFIELD(cp.addFieldref(class_name, name, t.getSignature())); - } - - public PUTSTATIC createPutStatic(String class_name, String name, Type t) { - return new PUTSTATIC(cp.addFieldref(class_name, name, t.getSignature())); - } - - public CHECKCAST createCheckCast(ReferenceType t) { - if (t instanceof ArrayType) { - return new CHECKCAST(cp.addArrayClass((ArrayType) t)); - } else { - return new CHECKCAST(cp.addClass((ObjectType) t)); - } - } - - public INSTANCEOF createInstanceOf(ReferenceType t) { - if (t instanceof ArrayType) { - return new INSTANCEOF(cp.addArrayClass((ArrayType) t)); - } else { - return new INSTANCEOF(cp.addClass((ObjectType) t)); - } - } - - public NEW createNew(ObjectType t) { - return new NEW(cp.addClass(t)); - } - - public NEW createNew(String s) { - return createNew(new ObjectType(s)); - } - - /** - * Create new array of given size and type. - * - * @return an instruction that creates the corresponding array at runtime, - * i.e. is an AllocationInstruction - */ - public Instruction createNewArray(Type t, short dim) { - if (dim == 1) { - if (t instanceof ObjectType) { - return new ANEWARRAY(cp.addClass((ObjectType) t)); - } else if (t instanceof ArrayType) { - return new ANEWARRAY(cp.addArrayClass((ArrayType) t)); - } else { - return new NEWARRAY(((BasicType) t).getType()); - } - } else { - ArrayType at; - if (t instanceof ArrayType) { - at = (ArrayType) t; - } else { - at = new ArrayType(t, dim); - } - return new MULTIANEWARRAY(cp.addArrayClass(at), dim); - } - } - - /** - * Create "null" value for reference types, 0 for basic types like int - */ - public static Instruction createNull(Type type) { - switch (type.getType()) { - case Constants.T_ARRAY: - case Constants.T_OBJECT: - return ACONST_NULL; - case Constants.T_INT: - case Constants.T_SHORT: - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_BYTE: - return ICONST_0; - case Constants.T_FLOAT: - return FCONST_0; - case Constants.T_DOUBLE: - return DCONST_0; - case Constants.T_LONG: - return LCONST_0; - case Constants.T_VOID: - return NOP; - default: - throw new RuntimeException("Invalid type: " + type); - } - } - - /** - * Create branch instruction by given opcode, except LOOKUPSWITCH and - * TABLESWITCH. For those you should use the SWITCH compound instruction. - */ - public static BranchInstruction createBranchInstruction(short opcode, - InstructionHandle target) { - switch (opcode) { - case Constants.IFEQ: - return new IFEQ(target); - case Constants.IFNE: - return new IFNE(target); - case Constants.IFLT: - return new IFLT(target); - case Constants.IFGE: - return new IFGE(target); - case Constants.IFGT: - return new IFGT(target); - case Constants.IFLE: - return new IFLE(target); - case Constants.IF_ICMPEQ: - return new IF_ICMPEQ(target); - case Constants.IF_ICMPNE: - return new IF_ICMPNE(target); - case Constants.IF_ICMPLT: - return new IF_ICMPLT(target); - case Constants.IF_ICMPGE: - return new IF_ICMPGE(target); - case Constants.IF_ICMPGT: - return new IF_ICMPGT(target); - case Constants.IF_ICMPLE: - return new IF_ICMPLE(target); - case Constants.IF_ACMPEQ: - return new IF_ACMPEQ(target); - case Constants.IF_ACMPNE: - return new IF_ACMPNE(target); - case Constants.GOTO: - return new GOTO(target); - case Constants.JSR: - return new JSR(target); - case Constants.IFNULL: - return new IFNULL(target); - case Constants.IFNONNULL: - return new IFNONNULL(target); - case Constants.GOTO_W: - return new GOTO_W(target); - case Constants.JSR_W: - return new JSR_W(target); - default: - throw new RuntimeException("Invalid opcode: " + opcode); - } - } - - public void setClassGen(ClassGen c) { - cg = c; - } - - public ClassGen getClassGen() { - return cg; - } - - public void setConstantPool(ConstantPoolGen c) { - cp = c; - } - - public ConstantPoolGen getConstantPool() { - return cp; - } -} diff --git a/src/org/apache/bcel/generic/InstructionHandle.java b/src/org/apache/bcel/generic/InstructionHandle.java deleted file mode 100644 index 5129d00..0000000 --- a/src/org/apache/bcel/generic/InstructionHandle.java +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.apache.bcel.classfile.Utility; - -/** - * Instances of this class give users a handle to the instructions contained in - * an InstructionList. Instruction objects may be used more than once within a - * list, this is useful because it saves memory and may be much faster. - * - * Within an InstructionList an InstructionHandle object is wrapped around all - * instructions, i.e., it implements a cell in a doubly-linked list. From the - * outside only the next and the previous instruction (handle) are accessible. - * One can traverse the list via an Enumeration returned by - * InstructionList.elements(). - * - * @version $Id: InstructionHandle.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Instruction - * @see BranchHandle - * @see InstructionList - */ -public class InstructionHandle implements java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - InstructionHandle next, prev; // Will be set from the outside - Instruction instruction; - protected int i_position = -1; // byte code offset of instruction - private Set targeters; - private Map attributes; - - public final InstructionHandle getNext() { - return next; - } - - public final InstructionHandle getPrev() { - return prev; - } - - public final Instruction getInstruction() { - return instruction; - } - - /** - * Replace current instruction contained in this handle. Old instruction is - * disposed using Instruction.dispose(). - */ - public void setInstruction(Instruction i) { // Overridden in BranchHandle - if (i == null) { - throw new ClassGenException("Assigning null to handle"); - } - if ((this.getClass() != BranchHandle.class) - && (i instanceof BranchInstruction)) { - throw new ClassGenException("Assigning branch instruction " + i - + " to plain handle"); - } - if (instruction != null) { - instruction.dispose(); - } - instruction = i; - } - - /** - * Temporarily swap the current instruction, without disturbing anything. - * Meant to be used by a debugger, implementing breakpoints. Current - * instruction is returned. - */ - public Instruction swapInstruction(Instruction i) { - Instruction oldInstruction = instruction; - instruction = i; - return oldInstruction; - } - - /* private */protected InstructionHandle(Instruction i) { - setInstruction(i); - } - - private static InstructionHandle ih_list = null; // List of reusable handles - - /** - * Factory method. - */ - static final InstructionHandle getInstructionHandle(Instruction i) { - if (ih_list == null) { - return new InstructionHandle(i); - } else { - InstructionHandle ih = ih_list; - ih_list = ih.next; - ih.setInstruction(i); - return ih; - } - } - - /** - * Called by InstructionList.setPositions when setting the position for - * every instruction. In the presence of variable length instructions - * `setPositions()' performs multiple passes over the instruction list to - * calculate the correct (byte) positions and offsets by calling this - * function. - * - * @param offset - * additional offset caused by preceding (variable length) - * instructions - * @param max_offset - * the maximum offset that may be caused by these instructions - * @return additional offset caused by possible change of this instruction's - * length - */ - protected int updatePosition(int offset, int max_offset) { - i_position += offset; - return 0; - } - - /** - * @return the position, i.e., the byte code offset of the contained - * instruction. This is accurate only after - * InstructionList.setPositions() has been called. - */ - public int getPosition() { - return i_position; - } - - /** - * Set the position, i.e., the byte code offset of the contained - * instruction. - */ - void setPosition(int pos) { - i_position = pos; - } - - /** - * Overridden in BranchHandle - */ - protected void addHandle() { - next = ih_list; - ih_list = this; - } - - /** - * Delete contents, i.e., remove user access and make handle reusable. - */ - void dispose() { - next = prev = null; - instruction.dispose(); - instruction = null; - i_position = -1; - attributes = null; - removeAllTargeters(); - addHandle(); - } - - /** - * Remove all targeters, if any. - */ - public void removeAllTargeters() { - if (targeters != null) { - targeters.clear(); - } - } - - /** - * Denote this handle isn't referenced anymore by t. - */ - public void removeTargeter(InstructionTargeter t) { - if (targeters != null) { - targeters.remove(t); - } - } - - /** - * Denote this handle is being referenced by t. - */ - public void addTargeter(InstructionTargeter t) { - if (targeters == null) { - targeters = new HashSet(); - } - // if(!targeters.contains(t)) - targeters.add(t); - } - - public boolean hasTargeters() { - return (targeters != null) && (targeters.size() > 0); - } - - /** - * @return null, if there are no targeters - */ - public InstructionTargeter[] getTargeters() { - if (!hasTargeters()) { - return null; - } - InstructionTargeter[] t = new InstructionTargeter[targeters.size()]; - targeters.toArray(t); - return t; - } - - /** - * @return a (verbose) string representation of the contained instruction. - */ - public String toString(boolean verbose) { - return Utility.format(i_position, 4, false, ' ') + ": " - + instruction.toString(verbose); - } - - /** - * @return a string representation of the contained instruction. - */ - @Override - public String toString() { - return toString(true); - } - - /** - * Add an attribute to an instruction handle. - * - * @param key - * the key object to store/retrieve the attribute - * @param attr - * the attribute to associate with this handle - */ - public void addAttribute(Object key, Object attr) { - if (attributes == null) { - attributes = new HashMap(3); - } - attributes.put(key, attr); - } - - /** - * Delete an attribute of an instruction handle. - * - * @param key - * the key object to retrieve the attribute - */ - public void removeAttribute(Object key) { - if (attributes != null) { - attributes.remove(key); - } - } - - /** - * Get attribute of an instruction handle. - * - * @param key - * the key object to store/retrieve the attribute - */ - public Object getAttribute(Object key) { - if (attributes != null) { - return attributes.get(key); - } - return null; - } - - /** - * @return all attributes associated with this handle - */ - public Collection getAttributes() { - if (attributes == null) { - attributes = new HashMap(3); - } - return attributes.values(); - } - - /** - * Convenience method, simply calls accept() on the contained instruction. - * - * @param v - * Visitor object - */ - public void accept(Visitor v) { - instruction.accept(v); - } -} diff --git a/src/org/apache/bcel/generic/InstructionList.java b/src/org/apache/bcel/generic/InstructionList.java deleted file mode 100644 index 5003628..0000000 --- a/src/org/apache/bcel/generic/InstructionList.java +++ /dev/null @@ -1,1334 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.util.ByteSequence; - -/** - * This class is a container for a list of Instruction objects. Instructions can be - * appended, inserted, moved, deleted, etc.. Instructions are being wrapped into - * InstructionHandles objects that are - * returned upon append/insert operations. They give the user (read only) access - * to the list structure, such that it can be traversed and manipulated in a - * controlled way. - * - * A list is finally dumped to a byte code array with getByteCode. - * - * @version $Id: InstructionList.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see Instruction - * @see InstructionHandle - * @see BranchHandle - */ -public class InstructionList implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private InstructionHandle start = null, end = null; - private int length = 0; // number of elements in list - private int[] byte_positions; // byte code offsets corresponding to - // instructions - - /** - * Create (empty) instruction list. - */ - public InstructionList() { - } - - /** - * Create instruction list containing one instruction. - * - * @param i - * initial instruction - */ - public InstructionList(Instruction i) { - append(i); - } - - /** - * Create instruction list containing one instruction. - * - * @param i - * initial instruction - */ - public InstructionList(BranchInstruction i) { - append(i); - } - - /** - * Initialize list with (nonnull) compound instruction. Consumes argument - * list, i.e., it becomes empty. - * - * @param c - * compound instruction (list) - */ - public InstructionList(CompoundInstruction c) { - append(c.getInstructionList()); - } - - /** - * Test for empty list. - */ - public boolean isEmpty() { - return start == null; - } // && end == null - - /** - * Find the target instruction (handle) that corresponds to the given target - * position (byte code offset). - * - * @param ihs - * array of instruction handles, i.e. il.getInstructionHandles() - * @param pos - * array of positions corresponding to ihs, i.e. - * il.getInstructionPositions() - * @param count - * length of arrays - * @param target - * target position to search for - * @return target position's instruction handle if available - */ - public static InstructionHandle findHandle(InstructionHandle[] ihs, - int[] pos, int count, int target) { - int l = 0, r = count - 1; - /* - * Do a binary search since the pos array is orderd. - */ - do { - int i = (l + r) / 2; - int j = pos[i]; - if (j == target) { - return ihs[i]; - } else if (target < j) { - r = i - 1; - } else { - l = i + 1; - } - } while (l <= r); - return null; - } - - /** - * Get instruction handle for instruction at byte code position pos. This - * only works properly, if the list is freshly initialized from a byte array - * or setPositions() has been called before this method. - * - * @param pos - * byte code position to search for - * @return target position's instruction handle if available - */ - public InstructionHandle findHandle(int pos) { - InstructionHandle[] ihs = getInstructionHandles(); - return findHandle(ihs, byte_positions, length, pos); - } - - /** - * Initialize instruction list from byte array. - * - * @param code - * byte array containing the instructions - */ - public InstructionList(byte[] code) { - ByteSequence bytes = new ByteSequence(code); - InstructionHandle[] ihs = new InstructionHandle[code.length]; - int[] pos = new int[code.length]; // Can't be more than that - int count = 0; // Contains actual length - /* - * Pass 1: Create an object for each byte code and append them to the - * list. - */ - try { - while (bytes.available() > 0) { - // Remember byte offset and associate it with the instruction - int off = bytes.getIndex(); - pos[count] = off; - /* - * Read one instruction from the byte stream, the byte position - * is set accordingly. - */ - Instruction i = Instruction.readInstruction(bytes); - InstructionHandle ih; - if (i instanceof BranchInstruction) { - ih = append((BranchInstruction) i); - } else { - ih = append(i); - } - ih.setPosition(off); - ihs[count] = ih; - count++; - } - } catch (IOException e) { - throw new ClassGenException(e.toString()); - } - byte_positions = new int[count]; // Trim to proper size - System.arraycopy(pos, 0, byte_positions, 0, count); - /* - * Pass 2: Look for BranchInstruction and update their targets, i.e., - * convert offsets to instruction handles. - */ - for (int i = 0; i < count; i++) { - if (ihs[i] instanceof BranchHandle) { - BranchInstruction bi = (BranchInstruction) ihs[i].instruction; - int target = bi.position + bi.getIndex(); /* - * Byte code position: - * relative -> absolute. - */ - // Search for target position - InstructionHandle ih = findHandle(ihs, pos, count, target); - if (ih == null) { - throw new ClassGenException( - "Couldn't find target for branch: " + bi); - } - bi.setTarget(ih); // Update target - // If it is a Select instruction, update all branch targets - if (bi instanceof Select) { // Either LOOKUPSWITCH or - // TABLESWITCH - Select s = (Select) bi; - int[] indices = s.getIndices(); - for (int j = 0; j < indices.length; j++) { - target = bi.position + indices[j]; - ih = findHandle(ihs, pos, count, target); - if (ih == null) { - throw new ClassGenException( - "Couldn't find target for switch: " + bi); - } - s.setTarget(j, ih); // Update target - } - } - } - } - } - - /** - * Append another list after instruction (handle) ih contained in this list. - * Consumes argument list, i.e., it becomes empty. - * - * @param ih - * where to append the instruction list - * @param il - * Instruction list to append to this one - * @return instruction handle pointing to the first appended - * instruction - */ - public InstructionHandle append(InstructionHandle ih, InstructionList il) { - if (il == null) { - throw new ClassGenException("Appending null InstructionList"); - } - if (il.isEmpty()) { - return ih; - } - InstructionHandle next = ih.next, ret = il.start; - ih.next = il.start; - il.start.prev = ih; - il.end.next = next; - if (next != null) { - next.prev = il.end; - } else { - end = il.end; // Update end ... - } - length += il.length; // Update length - il.clear(); - return ret; - } - - /** - * Append another list after instruction i contained in this list. Consumes - * argument list, i.e., it becomes empty. - * - * @param i - * where to append the instruction list - * @param il - * Instruction list to append to this one - * @return instruction handle pointing to the first appended - * instruction - */ - public InstructionHandle append(Instruction i, InstructionList il) { - InstructionHandle ih; - if ((ih = findInstruction2(i)) == null) { - throw new ClassGenException("Instruction " + i - + " is not contained in this list."); - } - return append(ih, il); - } - - /** - * Append another list to this one. Consumes argument list, i.e., it becomes - * empty. - * - * @param il - * list to append to end of this list - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(InstructionList il) { - if (il == null) { - throw new ClassGenException("Appending null InstructionList"); - } - if (il.isEmpty()) { - return null; - } - if (isEmpty()) { - start = il.start; - end = il.end; - length = il.length; - il.clear(); - return start; - } else { - return append(end, il); // was end.instruction - } - } - - /** - * Append an instruction to the end of this list. - * - * @param ih - * instruction to append - */ - private void append(InstructionHandle ih) { - if (isEmpty()) { - start = end = ih; - ih.next = ih.prev = null; - } else { - end.next = ih; - ih.prev = end; - ih.next = null; - end = ih; - } - length++; // Update length - } - - /** - * Append an instruction to the end of this list. - * - * @param i - * instruction to append - * @return instruction handle of the appended instruction - */ - public InstructionHandle append(Instruction i) { - InstructionHandle ih = InstructionHandle.getInstructionHandle(i); - append(ih); - return ih; - } - - /** - * Append a branch instruction to the end of this list. - * - * @param i - * branch instruction to append - * @return branch instruction handle of the appended instruction - */ - public BranchHandle append(BranchInstruction i) { - BranchHandle ih = BranchHandle.getBranchHandle(i); - append(ih); - return ih; - } - - /** - * Append a single instruction j after another instruction i, which must be - * in this list of course! - * - * @param i - * Instruction in list - * @param j - * Instruction to append after i in list - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(Instruction i, Instruction j) { - return append(i, new InstructionList(j)); - } - - /** - * Append a compound instruction, after instruction i. - * - * @param i - * Instruction in list - * @param c - * The composite instruction (containing an InstructionList) - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(Instruction i, CompoundInstruction c) { - return append(i, c.getInstructionList()); - } - - /** - * Append a compound instruction. - * - * @param c - * The composite instruction (containing an InstructionList) - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(CompoundInstruction c) { - return append(c.getInstructionList()); - } - - /** - * Append a compound instruction. - * - * @param ih - * where to append the instruction list - * @param c - * The composite instruction (containing an InstructionList) - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(InstructionHandle ih, CompoundInstruction c) { - return append(ih, c.getInstructionList()); - } - - /** - * Append an instruction after instruction (handle) ih contained in this - * list. - * - * @param ih - * where to append the instruction list - * @param i - * Instruction to append - * @return instruction handle pointing to the first appended - * instruction - */ - public InstructionHandle append(InstructionHandle ih, Instruction i) { - return append(ih, new InstructionList(i)); - } - - /** - * Append an instruction after instruction (handle) ih contained in this - * list. - * - * @param ih - * where to append the instruction list - * @param i - * Instruction to append - * @return instruction handle pointing to the first appended - * instruction - */ - public BranchHandle append(InstructionHandle ih, BranchInstruction i) { - BranchHandle bh = BranchHandle.getBranchHandle(i); - InstructionList il = new InstructionList(); - il.append(bh); - append(ih, il); - return bh; - } - - /** - * Insert another list before Instruction handle ih contained in this list. - * Consumes argument list, i.e., it becomes empty. - * - * @param ih - * where to append the instruction list - * @param il - * Instruction list to insert - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(InstructionHandle ih, InstructionList il) { - if (il == null) { - throw new ClassGenException("Inserting null InstructionList"); - } - if (il.isEmpty()) { - return ih; - } - InstructionHandle prev = ih.prev, ret = il.start; - ih.prev = il.end; - il.end.next = ih; - il.start.prev = prev; - if (prev != null) { - prev.next = il.start; - } else { - start = il.start; // Update start ... - } - length += il.length; // Update length - il.clear(); - return ret; - } - - /** - * Insert another list. - * - * @param il - * list to insert before start of this list - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(InstructionList il) { - if (isEmpty()) { - append(il); // Code is identical for this case - return start; - } else { - return insert(start, il); - } - } - - /** - * Insert an instruction at start of this list. - * - * @param ih - * instruction to insert - */ - private void insert(InstructionHandle ih) { - if (isEmpty()) { - start = end = ih; - ih.next = ih.prev = null; - } else { - start.prev = ih; - ih.next = start; - ih.prev = null; - start = ih; - } - length++; - } - - /** - * Insert another list before Instruction i contained in this list. Consumes - * argument list, i.e., it becomes empty. - * - * @param i - * where to append the instruction list - * @param il - * Instruction list to insert - * @return instruction handle pointing to the first inserted instruction, - * i.e., il.getStart() - */ - public InstructionHandle insert(Instruction i, InstructionList il) { - InstructionHandle ih; - if ((ih = findInstruction1(i)) == null) { - throw new ClassGenException("Instruction " + i - + " is not contained in this list."); - } - return insert(ih, il); - } - - /** - * Insert an instruction at start of this list. - * - * @param i - * instruction to insert - * @return instruction handle of the inserted instruction - */ - public InstructionHandle insert(Instruction i) { - InstructionHandle ih = InstructionHandle.getInstructionHandle(i); - insert(ih); - return ih; - } - - /** - * Insert a branch instruction at start of this list. - * - * @param i - * branch instruction to insert - * @return branch instruction handle of the appended instruction - */ - public BranchHandle insert(BranchInstruction i) { - BranchHandle ih = BranchHandle.getBranchHandle(i); - insert(ih); - return ih; - } - - /** - * Insert a single instruction j before another instruction i, which must be - * in this list of course! - * - * @param i - * Instruction in list - * @param j - * Instruction to insert before i in list - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(Instruction i, Instruction j) { - return insert(i, new InstructionList(j)); - } - - /** - * Insert a compound instruction before instruction i. - * - * @param i - * Instruction in list - * @param c - * The composite instruction (containing an InstructionList) - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(Instruction i, CompoundInstruction c) { - return insert(i, c.getInstructionList()); - } - - /** - * Insert a compound instruction. - * - * @param c - * The composite instruction (containing an InstructionList) - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(CompoundInstruction c) { - return insert(c.getInstructionList()); - } - - /** - * Insert an instruction before instruction (handle) ih contained in this - * list. - * - * @param ih - * where to insert to the instruction list - * @param i - * Instruction to insert - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(InstructionHandle ih, Instruction i) { - return insert(ih, new InstructionList(i)); - } - - /** - * Insert a compound instruction. - * - * @param ih - * where to insert the instruction list - * @param c - * The composite instruction (containing an InstructionList) - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(InstructionHandle ih, CompoundInstruction c) { - return insert(ih, c.getInstructionList()); - } - - /** - * Insert an instruction before instruction (handle) ih contained in this - * list. - * - * @param ih - * where to insert to the instruction list - * @param i - * Instruction to insert - * @return instruction handle of the first inserted instruction - */ - public BranchHandle insert(InstructionHandle ih, BranchInstruction i) { - BranchHandle bh = BranchHandle.getBranchHandle(i); - InstructionList il = new InstructionList(); - il.append(bh); - insert(ih, il); - return bh; - } - - /** - * Take all instructions (handles) from "start" to "end" and append them - * after the new location "target". Of course, "end" must be after "start" - * and target must not be located withing this range. If you want to move - * something to the start of the list use null as value for target.
      - * Any instruction targeters pointing to handles within the block, keep - * their targets. - * - * @param start - * of moved block - * @param end - * of moved block - * @param target - * of moved block - */ - public void move(InstructionHandle start, InstructionHandle end, - InstructionHandle target) { - // Step 1: Check constraints - if ((start == null) || (end == null)) { - throw new ClassGenException("Invalid null handle: From " + start - + " to " + end); - } - if ((target == start) || (target == end)) { - throw new ClassGenException("Invalid range: From " + start + " to " - + end + " contains target " + target); - } - for (InstructionHandle ih = start; ih != end.next; ih = ih.next) { - if (ih == null) { - throw new ClassGenException("Invalid range: From " + start - + " to " + end); - } else if (ih == target) { - throw new ClassGenException("Invalid range: From " + start - + " to " + end + " contains target " + target); - } - } - // Step 2: Temporarily remove the given instructions from the list - InstructionHandle prev = start.prev, next = end.next; - if (prev != null) { - prev.next = next; - } else { - this.start = next; - } - if (next != null) { - next.prev = prev; - } else { - this.end = prev; - } - start.prev = end.next = null; - // Step 3: append after target - if (target == null) { // append to start of list - if (this.start != null) { - this.start.prev = end; - } - end.next = this.start; - this.start = start; - } else { - next = target.next; - target.next = start; - start.prev = target; - end.next = next; - if (next != null) { - next.prev = end; - } else { - this.end = end; - } - } - } - - /** - * Move a single instruction (handle) to a new location. - * - * @param ih - * moved instruction - * @param target - * new location of moved instruction - */ - public void move(InstructionHandle ih, InstructionHandle target) { - move(ih, ih, target); - } - - /** - * Remove from instruction `prev' to instruction `next' both contained in - * this list. Throws TargetLostException when one of the removed instruction - * handles is still being targeted. - * - * @param prev - * where to start deleting (predecessor, exclusive) - * @param next - * where to end deleting (successor, exclusive) - */ - private void remove(InstructionHandle prev, InstructionHandle next) - throws TargetLostException { - InstructionHandle first, last; // First and last deleted instruction - if ((prev == null) && (next == null)) { // singleton list - first = last = start; - start = end = null; - } else { - if (prev == null) { // At start of list - first = start; - start = next; - } else { - first = prev.next; - prev.next = next; - } - if (next == null) { // At end of list - last = end; - end = prev; - } else { - last = next.prev; - next.prev = prev; - } - } - first.prev = null; // Completely separated from rest of list - last.next = null; - List target_vec = new ArrayList(); - for (InstructionHandle ih = first; ih != null; ih = ih.next) { - ih.getInstruction().dispose(); // e.g. BranchInstructions release - // their targets - } - StringBuffer buf = new StringBuffer("{ "); - for (InstructionHandle ih = first; ih != null; ih = next) { - next = ih.next; - length--; - if (ih.hasTargeters()) { // Still got targeters? - target_vec.add(ih); - buf.append(ih.toString(true) + " "); - ih.next = ih.prev = null; - } else { - ih.dispose(); - } - } - buf.append("}"); - if (!target_vec.isEmpty()) { - InstructionHandle[] targeted = new InstructionHandle[target_vec - .size()]; - target_vec.toArray(targeted); - throw new TargetLostException(targeted, buf.toString()); - } - } - - /** - * Remove instruction from this list. The corresponding Instruction handles - * must not be reused! - * - * @param ih - * instruction (handle) to remove - */ - public void delete(InstructionHandle ih) throws TargetLostException { - remove(ih.prev, ih.next); - } - - /** - * Remove instruction from this list. The corresponding Instruction handles - * must not be reused! - * - * @param i - * instruction to remove - */ - public void delete(Instruction i) throws TargetLostException { - InstructionHandle ih; - if ((ih = findInstruction1(i)) == null) { - throw new ClassGenException("Instruction " + i - + " is not contained in this list."); - } - delete(ih); - } - - /** - * Remove instructions from instruction `from' to instruction `to' contained - * in this list. The user must ensure that `from' is an instruction before - * `to', or risk havoc. The corresponding Instruction handles must not be - * reused! - * - * @param from - * where to start deleting (inclusive) - * @param to - * where to end deleting (inclusive) - */ - public void delete(InstructionHandle from, InstructionHandle to) - throws TargetLostException { - remove(from.prev, to.next); - } - - /** - * Remove instructions from instruction `from' to instruction `to' contained - * in this list. The user must ensure that `from' is an instruction before - * `to', or risk havoc. The corresponding Instruction handles must not be - * reused! - * - * @param from - * where to start deleting (inclusive) - * @param to - * where to end deleting (inclusive) - */ - public void delete(Instruction from, Instruction to) - throws TargetLostException { - InstructionHandle from_ih, to_ih; - if ((from_ih = findInstruction1(from)) == null) { - throw new ClassGenException("Instruction " + from - + " is not contained in this list."); - } - if ((to_ih = findInstruction2(to)) == null) { - throw new ClassGenException("Instruction " + to - + " is not contained in this list."); - } - delete(from_ih, to_ih); - } - - /** - * Search for given Instruction reference, start at beginning of list. - * - * @param i - * instruction to search for - * @return instruction found on success, null otherwise - */ - private InstructionHandle findInstruction1(Instruction i) { - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - if (ih.instruction == i) { - return ih; - } - } - return null; - } - - /** - * Search for given Instruction reference, start at end of list - * - * @param i - * instruction to search for - * @return instruction found on success, null otherwise - */ - private InstructionHandle findInstruction2(Instruction i) { - for (InstructionHandle ih = end; ih != null; ih = ih.prev) { - if (ih.instruction == i) { - return ih; - } - } - return null; - } - - public boolean contains(InstructionHandle i) { - if (i == null) { - return false; - } - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - if (ih == i) { - return true; - } - } - return false; - } - - public boolean contains(Instruction i) { - return findInstruction1(i) != null; - } - - public void setPositions() { - setPositions(false); - } - - /** - * Give all instructions their position number (offset in byte stream), - * i.e., make the list ready to be dumped. - * - * @param check - * Perform sanity checks, e.g. if all targeted instructions - * really belong to this list - */ - public void setPositions(boolean check) { - int max_additional_bytes = 0, additional_bytes = 0; - int index = 0, count = 0; - int[] pos = new int[length]; - /* - * Pass 0: Sanity checks - */ - if (check) { - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - if (i instanceof BranchInstruction) { // target instruction - // within list? - Instruction inst = ((BranchInstruction) i).getTarget().instruction; - if (!contains(inst)) { - throw new ClassGenException("Branch target of " - + Constants.OPCODE_NAMES[i.opcode] + ":" + inst - + " not in instruction list"); - } - if (i instanceof Select) { - InstructionHandle[] targets = ((Select) i).getTargets(); - for (int j = 0; j < targets.length; j++) { - inst = targets[j].instruction; - if (!contains(inst)) { - throw new ClassGenException("Branch target of " - + Constants.OPCODE_NAMES[i.opcode] - + ":" + inst - + " not in instruction list"); - } - } - } - if (!(ih instanceof BranchHandle)) { - throw new ClassGenException("Branch instruction " - + Constants.OPCODE_NAMES[i.opcode] + ":" + inst - + " not contained in BranchHandle."); - } - } - } - } - /* - * Pass 1: Set position numbers and sum up the maximum number of bytes - * an instruction may be shifted. - */ - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - ih.setPosition(index); - pos[count++] = index; - /* - * Get an estimate about how many additional bytes may be added, - * because BranchInstructions may have variable length depending on - * the target offset (short vs. int) or alignment issues - * (TABLESWITCH and LOOKUPSWITCH). - */ - switch (i.getOpcode()) { - case Constants.JSR: - case Constants.GOTO: - max_additional_bytes += 2; - break; - case Constants.TABLESWITCH: - case Constants.LOOKUPSWITCH: - max_additional_bytes += 3; - break; - } - index += i.getLength(); - } - /* - * Pass 2: Expand the variable-length (Branch)Instructions depending on - * the target offset (short or int) and ensure that branch targets are - * within this list. - */ - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - additional_bytes += ih.updatePosition(additional_bytes, - max_additional_bytes); - } - /* - * Pass 3: Update position numbers (which may have changed due to the - * preceding expansions), like pass 1. - */ - index = count = 0; - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - ih.setPosition(index); - pos[count++] = index; - index += i.getLength(); - } - byte_positions = new int[count]; // Trim to proper size - System.arraycopy(pos, 0, byte_positions, 0, count); - } - - /** - * When everything is finished, use this method to convert the instruction - * list into an array of bytes. - * - * @return the byte code ready to be dumped - */ - public byte[] getByteCode() { - // Update position indices of instructions - setPositions(); - ByteArrayOutputStream b = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(b); - try { - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - i.dump(out); // Traverse list - } - } catch (IOException e) { - System.err.println(e); - return null; - } - return b.toByteArray(); - } - - /** - * @return an array of instructions without target information for branch - * instructions. - */ - public Instruction[] getInstructions() { - ByteSequence bytes = new ByteSequence(getByteCode()); - List instructions = new ArrayList(); - try { - while (bytes.available() > 0) { - instructions.add(Instruction.readInstruction(bytes)); - } - } catch (IOException e) { - throw new ClassGenException(e.toString()); - } - return instructions.toArray(new Instruction[instructions.size()]); - } - - @Override - public String toString() { - return toString(true); - } - - /** - * @param verbose - * toggle output format - * @return String containing all instructions in this list. - */ - public String toString(boolean verbose) { - StringBuffer buf = new StringBuffer(); - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - buf.append(ih.toString(verbose)).append("\n"); - } - return buf.toString(); - } - - /** - * @return Enumeration that lists all instructions (handles) - */ - public Iterator iterator() { - return new Iterator() { - - private InstructionHandle ih = start; - - @Override - public Object next() { - InstructionHandle i = ih; - ih = ih.next; - return i; - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean hasNext() { - return ih != null; - } - }; - } - - /** - * @return array containing all instructions (handles) - */ - public InstructionHandle[] getInstructionHandles() { - InstructionHandle[] ihs = new InstructionHandle[length]; - InstructionHandle ih = start; - for (int i = 0; i < length; i++) { - ihs[i] = ih; - ih = ih.next; - } - return ihs; - } - - /** - * Get positions (offsets) of all instructions in the list. This relies on - * that the list has been freshly created from an byte code array, or that - * setPositions() has been called. Otherwise this may be inaccurate. - * - * @return array containing all instruction's offset in byte code - */ - public int[] getInstructionPositions() { - return byte_positions; - } - - /** - * @return complete, i.e., deep copy of this list - */ - public InstructionList copy() { - Map map = new HashMap(); - InstructionList il = new InstructionList(); - /* - * Pass 1: Make copies of all instructions, append them to the new list - * and associate old instruction references with the new ones, i.e., a - * 1:1 mapping. - */ - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - Instruction c = i.copy(); // Use clone for shallow copy - if (c instanceof BranchInstruction) { - map.put(ih, il.append((BranchInstruction) c)); - } else { - map.put(ih, il.append(c)); - } - } - /* - * Pass 2: Update branch targets. - */ - InstructionHandle ih = start; - InstructionHandle ch = il.start; - while (ih != null) { - Instruction i = ih.instruction; - Instruction c = ch.instruction; - if (i instanceof BranchInstruction) { - BranchInstruction bi = (BranchInstruction) i; - BranchInstruction bc = (BranchInstruction) c; - InstructionHandle itarget = bi.getTarget(); // old target - // New target is in hash map - bc.setTarget(map.get(itarget)); - if (bi instanceof Select) { // Either LOOKUPSWITCH or - // TABLESWITCH - InstructionHandle[] itargets = ((Select) bi).getTargets(); - InstructionHandle[] ctargets = ((Select) bc).getTargets(); - for (int j = 0; j < itargets.length; j++) { // Update all - // targets - ctargets[j] = map.get(itargets[j]); - } - } - } - ih = ih.next; - ch = ch.next; - } - return il; - } - - /** - * Replace all references to the old constant pool with references to the - * new constant pool - */ - public void replaceConstantPool(ConstantPoolGen old_cp, - ConstantPoolGen new_cp) { - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - if (i instanceof CPInstruction) { - CPInstruction ci = (CPInstruction) i; - Constant c = old_cp.getConstant(ci.getIndex()); - ci.setIndex(new_cp.addConstant(c, old_cp)); - } - } - } - - private void clear() { - start = end = null; - length = 0; - } - - /** - * Delete contents of list. Provides besser memory utilization, because the - * system then may reuse the instruction handles. This method is typically - * called right after - * MethodGen.getMethod(). - */ - public void dispose() { - // Traverse in reverse order, because ih.next is overwritten - for (InstructionHandle ih = end; ih != null; ih = ih.prev) { - /* - * Causes BranchInstructions to release target and targeters, - * because it calls dispose() on the contained instruction. - */ - ih.dispose(); - } - clear(); - } - - /** - * @return start of list - */ - public InstructionHandle getStart() { - return start; - } - - /** - * @return end of list - */ - public InstructionHandle getEnd() { - return end; - } - - /** - * @return length of list (Number of instructions, not bytes) - */ - public int getLength() { - return length; - } - - /** - * @return length of list (Number of instructions, not bytes) - */ - public int size() { - return length; - } - - /** - * Redirect all references from old_target to new_target, i.e., update - * targets of branch instructions. - * - * @param old_target - * the old target instruction handle - * @param new_target - * the new target instruction handle - */ - public void redirectBranches(InstructionHandle old_target, - InstructionHandle new_target) { - for (InstructionHandle ih = start; ih != null; ih = ih.next) { - Instruction i = ih.getInstruction(); - if (i instanceof BranchInstruction) { - BranchInstruction b = (BranchInstruction) i; - InstructionHandle target = b.getTarget(); - if (target == old_target) { - b.setTarget(new_target); - } - if (b instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH - InstructionHandle[] targets = ((Select) b).getTargets(); - for (int j = 0; j < targets.length; j++) { - if (targets[j] == old_target) { - ((Select) b).setTarget(j, new_target); - } - } - } - } - } - } - - /** - * Redirect all references of local variables from old_target to new_target. - * - * @param lg - * array of local variables - * @param old_target - * the old target instruction handle - * @param new_target - * the new target instruction handle - * @see MethodGen - */ - public void redirectLocalVariables(LocalVariableGen[] lg, - InstructionHandle old_target, InstructionHandle new_target) { - for (int i = 0; i < lg.length; i++) { - InstructionHandle start = lg[i].getStart(); - InstructionHandle end = lg[i].getEnd(); - if (start == old_target) { - lg[i].setStart(new_target); - } - if (end == old_target) { - lg[i].setEnd(new_target); - } - } - } - - /** - * Redirect all references of exception handlers from old_target to - * new_target. - * - * @param exceptions - * array of exception handlers - * @param old_target - * the old target instruction handle - * @param new_target - * the new target instruction handle - * @see MethodGen - */ - public void redirectExceptionHandlers(CodeExceptionGen[] exceptions, - InstructionHandle old_target, InstructionHandle new_target) { - for (int i = 0; i < exceptions.length; i++) { - if (exceptions[i].getStartPC() == old_target) { - exceptions[i].setStartPC(new_target); - } - if (exceptions[i].getEndPC() == old_target) { - exceptions[i].setEndPC(new_target); - } - if (exceptions[i].getHandlerPC() == old_target) { - exceptions[i].setHandlerPC(new_target); - } - } - } - - private List observers; - - /** - * Add observer for this object. - */ - public void addObserver(InstructionListObserver o) { - if (observers == null) { - observers = new ArrayList(); - } - observers.add(o); - } - - /** - * Remove observer for this object. - */ - public void removeObserver(InstructionListObserver o) { - if (observers != null) { - observers.remove(o); - } - } - - /** - * Call notify() method on all observers. This method is not called - * automatically whenever the state has changed, but has to be called by the - * user after he has finished editing the object. - */ - public void update() { - if (observers != null) { - for (Iterator e = observers.iterator(); e - .hasNext();) { - e.next().notify(this); - } - } - } -} diff --git a/src/org/apache/bcel/generic/InstructionListObserver.java b/src/org/apache/bcel/generic/InstructionListObserver.java deleted file mode 100644 index b89f6da..0000000 --- a/src/org/apache/bcel/generic/InstructionListObserver.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Implement this interface if you're interested in changes to an - * InstructionList object and register yourself with addObserver(). - * - * @version $Id: InstructionListObserver.java 386056 2006-03-15 11:31:56Z tcurdt - * $ - * @author M. Dahm - */ -public interface InstructionListObserver { - - public void notify(InstructionList list); -} diff --git a/src/org/apache/bcel/generic/InstructionTargeter.java b/src/org/apache/bcel/generic/InstructionTargeter.java deleted file mode 100644 index 2e78bff..0000000 --- a/src/org/apache/bcel/generic/InstructionTargeter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denote that a class targets InstructionHandles within an InstructionList. - * Namely the following implementers: - * - * @see BranchHandle - * @see LocalVariableGen - * @see CodeExceptionGen - * @version $Id: InstructionTargeter.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface InstructionTargeter { - - public boolean containsTarget(InstructionHandle ih); - - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih); -} diff --git a/src/org/apache/bcel/generic/InvokeInstruction.java b/src/org/apache/bcel/generic/InvokeInstruction.java deleted file mode 100644 index e6f7f5a..0000000 --- a/src/org/apache/bcel/generic/InvokeInstruction.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.util.StringTokenizer; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantPool; - -/** - * Super class for the INVOKExxx family of instructions. - * - * @version $Id: InvokeInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class InvokeInstruction extends FieldOrMethod implements - ExceptionThrower, TypedInstruction, StackConsumer, StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - InvokeInstruction() { - } - - /** - * @param index - * to constant pool - */ - protected InvokeInstruction(short opcode, int index) { - super(opcode, index); - } - - /** - * @return mnemonic for instruction with symbolic references resolved - */ - @Override - public String toString(ConstantPool cp) { - Constant c = cp.getConstant(index); - StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); - return Constants.OPCODE_NAMES[opcode] + " " - + tok.nextToken().replace('.', '/') + tok.nextToken(); - } - - /** - * Also works for instructions whose stack effect depends on the constant - * pool entry they reference. - * - * @return Number of words consumed from stack by this instruction - */ - @Override - public int consumeStack(ConstantPoolGen cpg) { - String signature = getSignature(cpg); - Type[] args = Type.getArgumentTypes(signature); - int sum; - if (opcode == Constants.INVOKESTATIC) { - sum = 0; - } else { - sum = 1; // this reference - } - int n = args.length; - for (int i = 0; i < n; i++) { - sum += args[i].getSize(); - } - return sum; - } - - /** - * Also works for instructions whose stack effect depends on the constant - * pool entry they reference. - * - * @return Number of words produced onto stack by this instruction - */ - @Override - public int produceStack(ConstantPoolGen cpg) { - return getReturnType(cpg).getSize(); - } - - /** - * @return return type of referenced method. - */ - @Override - public Type getType(ConstantPoolGen cpg) { - return getReturnType(cpg); - } - - /** - * @return name of referenced method. - */ - public String getMethodName(ConstantPoolGen cpg) { - return getName(cpg); - } - - /** - * @return return type of referenced method. - */ - public Type getReturnType(ConstantPoolGen cpg) { - return Type.getReturnType(getSignature(cpg)); - } - - /** - * @return argument types of referenced method. - */ - public Type[] getArgumentTypes(ConstantPoolGen cpg) { - return Type.getArgumentTypes(getSignature(cpg)); - } -} diff --git a/src/org/apache/bcel/generic/JSR.java b/src/org/apache/bcel/generic/JSR.java deleted file mode 100644 index 8ef3a0d..0000000 --- a/src/org/apache/bcel/generic/JSR.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; - -/** - * JSR - Jump to subroutine - * - * @version $Id: JSR.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class JSR extends JsrInstruction implements VariableLengthInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - JSR() { - } - - public JSR(InstructionHandle target) { - super(org.apache.bcel.Constants.JSR, target); - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - index = getTargetOffset(); - if (opcode == org.apache.bcel.Constants.JSR) { - super.dump(out); - } else { // JSR_W - index = getTargetOffset(); - out.writeByte(opcode); - out.writeInt(index); - } - } - - @Override - protected int updatePosition(int offset, int max_offset) { - int i = getTargetOffset(); // Depending on old position value - position += offset; // Position may be shifted by preceding expansions - if (Math.abs(i) >= (32767 - max_offset)) { // to large for short - // (estimate) - opcode = org.apache.bcel.Constants.JSR_W; - length = 5; - return 2; // 5 - 3 - } - return 0; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitVariableLengthInstruction(this); - v.visitBranchInstruction(this); - v.visitJsrInstruction(this); - v.visitJSR(this); - } -} diff --git a/src/org/apache/bcel/generic/JSR_W.java b/src/org/apache/bcel/generic/JSR_W.java deleted file mode 100644 index b6d7c2b..0000000 --- a/src/org/apache/bcel/generic/JSR_W.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * JSR_W - Jump to subroutine - * - * @version $Id: JSR_W.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class JSR_W extends JsrInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - JSR_W() { - } - - public JSR_W(InstructionHandle target) { - super(org.apache.bcel.Constants.JSR_W, target); - length = 5; - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - index = getTargetOffset(); - out.writeByte(opcode); - out.writeInt(index); - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - index = bytes.readInt(); - length = 5; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitBranchInstruction(this); - v.visitJsrInstruction(this); - v.visitJSR_W(this); - } -} diff --git a/src/org/apache/bcel/generic/JsrInstruction.java b/src/org/apache/bcel/generic/JsrInstruction.java deleted file mode 100644 index c8aa663..0000000 --- a/src/org/apache/bcel/generic/JsrInstruction.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Super class for JSR - Jump to subroutine - * - * @version $Id: JsrInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class JsrInstruction extends BranchInstruction implements - UnconditionalBranch, TypedInstruction, StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - JsrInstruction(short opcode, InstructionHandle target) { - super(opcode, target); - } - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - JsrInstruction() { - } - - /** - * @return return address type - */ - @Override - public Type getType(ConstantPoolGen cp) { - return new ReturnaddressType(physicalSuccessor()); - } - - /** - * Returns an InstructionHandle to the physical successor of this - * JsrInstruction. For this method to work, this JsrInstruction object - * must not be shared between multiple InstructionHandle objects! - * Formally, there must not be InstructionHandle objects i, j where i != j - * and i.getInstruction() == this == j.getInstruction(). - * - * @return an InstructionHandle to the "next" instruction that will be - * executed when RETurned from a subroutine. - */ - public InstructionHandle physicalSuccessor() { - InstructionHandle ih = this.target; - // Rewind! - while (ih.getPrev() != null) { - ih = ih.getPrev(); - } - // Find the handle for "this" JsrInstruction object. - while (ih.getInstruction() != this) { - ih = ih.getNext(); - } - InstructionHandle toThis = ih; - while (ih != null) { - ih = ih.getNext(); - if ((ih != null) && (ih.getInstruction() == this)) { - throw new RuntimeException( - "physicalSuccessor() called on a shared JsrInstruction."); - } - } - // Return the physical successor - return toThis.getNext(); - } -} diff --git a/src/org/apache/bcel/generic/L2D.java b/src/org/apache/bcel/generic/L2D.java deleted file mode 100644 index 046f452..0000000 --- a/src/org/apache/bcel/generic/L2D.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * L2D - Convert long to double - * - *
      - * Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: L2D.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class L2D extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public L2D() { - super(org.apache.bcel.Constants.L2D); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitL2D(this); - } -} diff --git a/src/org/apache/bcel/generic/L2F.java b/src/org/apache/bcel/generic/L2F.java deleted file mode 100644 index 04bae18..0000000 --- a/src/org/apache/bcel/generic/L2F.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * L2F - Convert long to float - * - *
      - * Stack: ..., value.word1, value.word2 -> ..., result
      - * 
      - * - * @version $Id: L2F.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class L2F extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public L2F() { - super(org.apache.bcel.Constants.L2F); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitL2F(this); - } -} diff --git a/src/org/apache/bcel/generic/L2I.java b/src/org/apache/bcel/generic/L2I.java deleted file mode 100644 index 24e328b..0000000 --- a/src/org/apache/bcel/generic/L2I.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * L2I - Convert long to int - * - *
      - * Stack: ..., value.word1, value.word2 -> ..., result
      - * 
      - * - * @version $Id: L2I.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class L2I extends ConversionInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public L2I() { - super(org.apache.bcel.Constants.L2I); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitL2I(this); - } -} diff --git a/src/org/apache/bcel/generic/LADD.java b/src/org/apache/bcel/generic/LADD.java deleted file mode 100644 index 3f60586..0000000 --- a/src/org/apache/bcel/generic/LADD.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LADD - Add longs - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result.word2 - * - * @version $Id: LADD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LADD extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LADD() { - super(org.apache.bcel.Constants.LADD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLADD(this); - } -} diff --git a/src/org/apache/bcel/generic/LALOAD.java b/src/org/apache/bcel/generic/LALOAD.java deleted file mode 100644 index b627d12..0000000 --- a/src/org/apache/bcel/generic/LALOAD.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LALOAD - Load long from array - * - *
      - * Stack: ..., arrayref, index -> ..., value1, value2
      - * 
      - * - * @version $Id: LALOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LALOAD extends ArrayInstruction implements StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Load long from array - */ - public LALOAD() { - super(org.apache.bcel.Constants.LALOAD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitLALOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/LAND.java b/src/org/apache/bcel/generic/LAND.java deleted file mode 100644 index 09ae32c..0000000 --- a/src/org/apache/bcel/generic/LAND.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LAND - Bitwise AND longs - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result.word2 - * - * @version $Id: LAND.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LAND extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LAND() { - super(org.apache.bcel.Constants.LAND); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLAND(this); - } -} diff --git a/src/org/apache/bcel/generic/LASTORE.java b/src/org/apache/bcel/generic/LASTORE.java deleted file mode 100644 index b3e953b..0000000 --- a/src/org/apache/bcel/generic/LASTORE.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LASTORE - Store into long array - * - *
      - * Stack: ..., arrayref, index, value.word1, value.word2 -> ...
      - * 
      - * - * @version $Id: LASTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LASTORE extends ArrayInstruction implements StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Store long into array - */ - public LASTORE() { - super(org.apache.bcel.Constants.LASTORE); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitLASTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/LCMP.java b/src/org/apache/bcel/generic/LCMP.java deleted file mode 100644 index 70ce072..0000000 --- a/src/org/apache/bcel/generic/LCMP.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LCMP - Compare longs: - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result <= -1, 0, 1> - * - * @version $Id: LCMP.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LCMP extends Instruction implements TypedInstruction, - StackProducer, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LCMP() { - super(org.apache.bcel.Constants.LCMP, (short) 1); - } - - /** - * @return Type.LONG - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.LONG; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitLCMP(this); - } -} diff --git a/src/org/apache/bcel/generic/LCONST.java b/src/org/apache/bcel/generic/LCONST.java deleted file mode 100644 index c8ce03c..0000000 --- a/src/org/apache/bcel/generic/LCONST.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LCONST - Push 0 or 1, other values cause an exception - * - *
      - * Stack: ... -> ...,
      - * 
      - * - * @version $Id: LCONST.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LCONST extends Instruction implements ConstantPushInstruction, - TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - private long value; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LCONST() { - } - - public LCONST(long l) { - super(org.apache.bcel.Constants.LCONST_0, (short) 1); - if (l == 0) { - opcode = org.apache.bcel.Constants.LCONST_0; - } else if (l == 1) { - opcode = org.apache.bcel.Constants.LCONST_1; - } else { - throw new ClassGenException("LCONST can be used only for 0 and 1: " - + l); - } - value = l; - } - - @Override - public Number getValue() { - return new Long(value); - } - - /** - * @return Type.LONG - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.LONG; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitLCONST(this); - } -} diff --git a/src/org/apache/bcel/generic/LDC.java b/src/org/apache/bcel/generic/LDC.java deleted file mode 100644 index e0e318d..0000000 --- a/src/org/apache/bcel/generic/LDC.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * LDC - Push item from constant pool. - * - *
      - * Stack: ... -> ..., item
      - * 
      - * - * @version $Id: LDC.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LDC extends CPInstruction implements PushInstruction, - ExceptionThrower, TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LDC() { - } - - public LDC(int index) { - super(org.apache.bcel.Constants.LDC_W, index); - setSize(); - } - - // Adjust to proper size - protected final void setSize() { - if (index <= org.apache.bcel.Constants.MAX_BYTE) { // Fits in one byte? - opcode = org.apache.bcel.Constants.LDC; - length = 2; - } else { - opcode = org.apache.bcel.Constants.LDC_W; - length = 3; - } - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - if (length == 2) { - out.writeByte(index); - } else { - out.writeShort(index); - } - } - - /** - * Set the index to constant pool and adjust size. - */ - @Override - public final void setIndex(int index) { - super.setIndex(index); - setSize(); - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - length = 2; - index = bytes.readUnsignedByte(); - } - - public Object getValue(ConstantPoolGen cpg) { - org.apache.bcel.classfile.Constant c = cpg.getConstantPool() - .getConstant(index); - switch (c.getTag()) { - case org.apache.bcel.Constants.CONSTANT_String: - int i = ((org.apache.bcel.classfile.ConstantString) c) - .getStringIndex(); - c = cpg.getConstantPool().getConstant(i); - return ((org.apache.bcel.classfile.ConstantUtf8) c).getBytes(); - case org.apache.bcel.Constants.CONSTANT_Float: - return new Float( - ((org.apache.bcel.classfile.ConstantFloat) c).getBytes()); - case org.apache.bcel.Constants.CONSTANT_Integer: - return new Integer( - ((org.apache.bcel.classfile.ConstantInteger) c).getBytes()); - case org.apache.bcel.Constants.CONSTANT_Class: - return c; - default: // Never reached - throw new RuntimeException("Unknown or invalid constant type at " - + index); - } - } - - @Override - public Type getType(ConstantPoolGen cpg) { - switch (cpg.getConstantPool().getConstant(index).getTag()) { - case org.apache.bcel.Constants.CONSTANT_String: - return Type.STRING; - case org.apache.bcel.Constants.CONSTANT_Float: - return Type.FLOAT; - case org.apache.bcel.Constants.CONSTANT_Integer: - return Type.INT; - case org.apache.bcel.Constants.CONSTANT_Class: - return Type.CLASS; - default: // Never reached - throw new RuntimeException("Unknown or invalid constant type at " - + index); - } - } - - @Override - public Class[] getExceptions() { - return org.apache.bcel.ExceptionConstants.EXCS_STRING_RESOLUTION; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitLDC(this); - } -} diff --git a/src/org/apache/bcel/generic/LDC2_W.java b/src/org/apache/bcel/generic/LDC2_W.java deleted file mode 100644 index 4d193fe..0000000 --- a/src/org/apache/bcel/generic/LDC2_W.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LDC2_W - Push long or double from constant pool - * - *
      - * Stack: ... -> ..., item.word1, item.word2
      - * 
      - * - * @version $Id: LDC2_W.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LDC2_W extends CPInstruction implements PushInstruction, - TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LDC2_W() { - } - - public LDC2_W(int index) { - super(org.apache.bcel.Constants.LDC2_W, index); - } - - @Override - public Type getType(ConstantPoolGen cpg) { - switch (cpg.getConstantPool().getConstant(index).getTag()) { - case org.apache.bcel.Constants.CONSTANT_Long: - return Type.LONG; - case org.apache.bcel.Constants.CONSTANT_Double: - return Type.DOUBLE; - default: // Never reached - throw new RuntimeException("Unknown constant type " + opcode); - } - } - - public Number getValue(ConstantPoolGen cpg) { - org.apache.bcel.classfile.Constant c = cpg.getConstantPool() - .getConstant(index); - switch (c.getTag()) { - case org.apache.bcel.Constants.CONSTANT_Long: - return new Long( - ((org.apache.bcel.classfile.ConstantLong) c).getBytes()); - case org.apache.bcel.Constants.CONSTANT_Double: - return new Double( - ((org.apache.bcel.classfile.ConstantDouble) c).getBytes()); - default: // Never reached - throw new RuntimeException("Unknown or invalid constant type at " - + index); - } - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitLDC2_W(this); - } -} diff --git a/src/org/apache/bcel/generic/LDC_W.java b/src/org/apache/bcel/generic/LDC_W.java deleted file mode 100644 index e5c77f2..0000000 --- a/src/org/apache/bcel/generic/LDC_W.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * LDC_W - Push item from constant pool (wide index) - * - *
      - * Stack: ... -> ..., item.word1, item.word2
      - * 
      - * - * @version $Id: LDC_W.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LDC_W extends LDC { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LDC_W() { - } - - public LDC_W(int index) { - super(index); - } - - /** - * Read needed data (i.e., index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - setIndex(bytes.readUnsignedShort()); - // Override just in case it has been changed - opcode = org.apache.bcel.Constants.LDC_W; - length = 3; - } -} diff --git a/src/org/apache/bcel/generic/LDIV.java b/src/org/apache/bcel/generic/LDIV.java deleted file mode 100644 index f35b670..0000000 --- a/src/org/apache/bcel/generic/LDIV.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LDIV - Divide longs - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result.word2 - * - * @version $Id: LDIV.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LDIV extends ArithmeticInstruction implements ExceptionThrower { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LDIV() { - super(org.apache.bcel.Constants.LDIV); - } - - @Override - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLDIV(this); - } -} diff --git a/src/org/apache/bcel/generic/LLOAD.java b/src/org/apache/bcel/generic/LLOAD.java deleted file mode 100644 index ebe3e0d..0000000 --- a/src/org/apache/bcel/generic/LLOAD.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LLOAD - Load long from local variable - * - *
      - * Stack ... -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: LLOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LLOAD extends LoadInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LLOAD() { - super(org.apache.bcel.Constants.LLOAD, - org.apache.bcel.Constants.LLOAD_0); - } - - public LLOAD(int n) { - super(org.apache.bcel.Constants.LLOAD, - org.apache.bcel.Constants.LLOAD_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitLLOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/LMUL.java b/src/org/apache/bcel/generic/LMUL.java deleted file mode 100644 index 6c62284..0000000 --- a/src/org/apache/bcel/generic/LMUL.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LMUL - Multiply longs - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result.word2 - * - * @version $Id: LMUL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LMUL extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LMUL() { - super(org.apache.bcel.Constants.LMUL); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLMUL(this); - } -} diff --git a/src/org/apache/bcel/generic/LNEG.java b/src/org/apache/bcel/generic/LNEG.java deleted file mode 100644 index 4c750e6..0000000 --- a/src/org/apache/bcel/generic/LNEG.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LNEG - Negate long - * - *
      - * Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: LNEG.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LNEG extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LNEG() { - super(org.apache.bcel.Constants.LNEG); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLNEG(this); - } -} diff --git a/src/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/org/apache/bcel/generic/LOOKUPSWITCH.java deleted file mode 100644 index 8b63e39..0000000 --- a/src/org/apache/bcel/generic/LOOKUPSWITCH.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * LOOKUPSWITCH - Switch with unordered set of values - * - * @version $Id: LOOKUPSWITCH.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see SWITCH - */ -public class LOOKUPSWITCH extends Select { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LOOKUPSWITCH() { - } - - public LOOKUPSWITCH(int[] match, InstructionHandle[] targets, - InstructionHandle defaultTarget) { - super(org.apache.bcel.Constants.LOOKUPSWITCH, match, targets, - defaultTarget); - length = (short) (9 + match_length * 8); /* - * alignment remainder assumed 0 - * here, until dump time. - */ - fixed_length = length; - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - super.dump(out); - out.writeInt(match_length); // npairs - for (int i = 0; i < match_length; i++) { - out.writeInt(match[i]); // match-offset pairs - out.writeInt(indices[i] = getTargetOffset(targets[i])); - } - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - super.initFromFile(bytes, wide); // reads padding - match_length = bytes.readInt(); - fixed_length = (short) (9 + match_length * 8); - length = (short) (fixed_length + padding); - match = new int[match_length]; - indices = new int[match_length]; - targets = new InstructionHandle[match_length]; - for (int i = 0; i < match_length; i++) { - match[i] = bytes.readInt(); - indices[i] = bytes.readInt(); - } - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitVariableLengthInstruction(this); - v.visitStackProducer(this); - v.visitBranchInstruction(this); - v.visitSelect(this); - v.visitLOOKUPSWITCH(this); - } -} diff --git a/src/org/apache/bcel/generic/LOR.java b/src/org/apache/bcel/generic/LOR.java deleted file mode 100644 index 3796ef0..0000000 --- a/src/org/apache/bcel/generic/LOR.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LOR - Bitwise OR long - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: LOR.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LOR extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LOR() { - super(org.apache.bcel.Constants.LOR); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLOR(this); - } -} diff --git a/src/org/apache/bcel/generic/LREM.java b/src/org/apache/bcel/generic/LREM.java deleted file mode 100644 index 1d595f8..0000000 --- a/src/org/apache/bcel/generic/LREM.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LREM - Remainder of long - * - *
      - * Stack: ..., value1, value2 -> result
      - * 
      - * - * @version $Id: LREM.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LREM extends ArithmeticInstruction implements ExceptionThrower { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LREM() { - super(org.apache.bcel.Constants.LREM); - } - - @Override - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLREM(this); - } -} diff --git a/src/org/apache/bcel/generic/LRETURN.java b/src/org/apache/bcel/generic/LRETURN.java deleted file mode 100644 index 1450d7b..0000000 --- a/src/org/apache/bcel/generic/LRETURN.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LRETURN - Return long from method - * - *
      - * Stack: ..., value.word1, value.word2 -> <empty>
      - * 
      - * - * @version $Id: LRETURN.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LRETURN extends ReturnInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LRETURN() { - super(org.apache.bcel.Constants.LRETURN); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitLRETURN(this); - } -} diff --git a/src/org/apache/bcel/generic/LSHL.java b/src/org/apache/bcel/generic/LSHL.java deleted file mode 100644 index 3f931c8..0000000 --- a/src/org/apache/bcel/generic/LSHL.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LSHL - Arithmetic shift left long - * - *
      - * Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: LSHL.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LSHL extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LSHL() { - super(org.apache.bcel.Constants.LSHL); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLSHL(this); - } -} diff --git a/src/org/apache/bcel/generic/LSHR.java b/src/org/apache/bcel/generic/LSHR.java deleted file mode 100644 index 8ab7427..0000000 --- a/src/org/apache/bcel/generic/LSHR.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LSHR - Arithmetic shift right long - * - *
      - * Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
      - * 
      - * - * @version $Id: LSHR.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LSHR extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LSHR() { - super(org.apache.bcel.Constants.LSHR); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLSHR(this); - } -} diff --git a/src/org/apache/bcel/generic/LSTORE.java b/src/org/apache/bcel/generic/LSTORE.java deleted file mode 100644 index 3e2dc4a..0000000 --- a/src/org/apache/bcel/generic/LSTORE.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LSTORE - Store long into local variable - * - *
      - * Stack: ..., value.word1, value.word2 -> ...
      - * 
      - * - * @version $Id: LSTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LSTORE extends StoreInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LSTORE() { - super(org.apache.bcel.Constants.LSTORE, - org.apache.bcel.Constants.LSTORE_0); - } - - public LSTORE(int n) { - super(org.apache.bcel.Constants.LSTORE, - org.apache.bcel.Constants.LSTORE_0, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - super.accept(v); - v.visitLSTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/LSUB.java b/src/org/apache/bcel/generic/LSUB.java deleted file mode 100644 index 21cc308..0000000 --- a/src/org/apache/bcel/generic/LSUB.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LSUB - Substract longs - * - *
      - * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
      - * 
      - * - * ..., result.word1, result.word2 - * - * @version $Id: LSUB.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LSUB extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LSUB() { - super(org.apache.bcel.Constants.LSUB); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLSUB(this); - } -} diff --git a/src/org/apache/bcel/generic/LUSHR.java b/src/org/apache/bcel/generic/LUSHR.java deleted file mode 100644 index 382e0fa..0000000 --- a/src/org/apache/bcel/generic/LUSHR.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LUSHR - Logical shift right long - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: LUSHR.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LUSHR extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LUSHR() { - super(org.apache.bcel.Constants.LUSHR); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLUSHR(this); - } -} diff --git a/src/org/apache/bcel/generic/LXOR.java b/src/org/apache/bcel/generic/LXOR.java deleted file mode 100644 index a0101d2..0000000 --- a/src/org/apache/bcel/generic/LXOR.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * LXOR - Bitwise XOR long - * - *
      - * Stack: ..., value1, value2 -> ..., result
      - * 
      - * - * @version $Id: LXOR.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class LXOR extends ArithmeticInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public LXOR() { - super(org.apache.bcel.Constants.LXOR); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLXOR(this); - } -} diff --git a/src/org/apache/bcel/generic/LineNumberGen.java b/src/org/apache/bcel/generic/LineNumberGen.java deleted file mode 100644 index 5cb0b67..0000000 --- a/src/org/apache/bcel/generic/LineNumberGen.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.classfile.LineNumber; - -/** - * This class represents a line number within a method, i.e., give an - * instruction a line number corresponding to the source code line. - * - * @version $Id: LineNumberGen.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see LineNumber - * @see MethodGen - */ -public class LineNumberGen implements InstructionTargeter, Cloneable, - java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private InstructionHandle ih; - private int src_line; - - /** - * Create a line number. - * - * @param ih - * instruction handle to reference - */ - public LineNumberGen(InstructionHandle ih, int src_line) { - setInstruction(ih); - setSourceLine(src_line); - } - - /** - * @return true, if ih is target of this line number - */ - @Override - public boolean containsTarget(InstructionHandle ih) { - return this.ih == ih; - } - - /** - * @param old_ih - * old target - * @param new_ih - * new target - */ - @Override - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - if (old_ih != ih) { - throw new ClassGenException("Not targeting " + old_ih + ", but " - + ih + "}"); - } else { - setInstruction(new_ih); - } - } - - /** - * Get LineNumber attribute . - * - * This relies on that the instruction list has already been dumped to byte - * code or or that the `setPositions' methods has been called for the - * instruction list. - */ - public LineNumber getLineNumber() { - return new LineNumber(ih.getPosition(), src_line); - } - - public void setInstruction(InstructionHandle ih) { - BranchInstruction.notifyTarget(this.ih, ih, this); - this.ih = ih; - } - - @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; - } - } - - public InstructionHandle getInstruction() { - return ih; - } - - public void setSourceLine(int src_line) { - this.src_line = src_line; - } - - public int getSourceLine() { - return src_line; - } -} diff --git a/src/org/apache/bcel/generic/LoadClass.java b/src/org/apache/bcel/generic/LoadClass.java deleted file mode 100644 index fcea1c0..0000000 --- a/src/org/apache/bcel/generic/LoadClass.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denotes that an instruction may start the process of loading and resolving - * the referenced class in the Virtual Machine. - * - * @version $Id: LoadClass.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface LoadClass { - - /** - * Returns the ObjectType of the referenced class or interface that may be - * loaded and resolved. - * - * @return object type that may be loaded or null if a primitive is - * referenced - */ - public ObjectType getLoadClassType(ConstantPoolGen cpg); - - /** - * Returns the type associated with this instruction. LoadClass instances - * are always typed, but this type does not always refer to the type of the - * class or interface that it possibly forces to load. For example, GETFIELD - * would return the type of the field and not the type of the class where - * the field is defined. If no class is forced to be loaded, null is - * returned. An example for this is an ANEWARRAY instruction that creates an - * int[][]. - * - * @see #getLoadClassType(ConstantPoolGen) - */ - public Type getType(ConstantPoolGen cpg); -} diff --git a/src/org/apache/bcel/generic/LoadInstruction.java b/src/org/apache/bcel/generic/LoadInstruction.java deleted file mode 100644 index b04252f..0000000 --- a/src/org/apache/bcel/generic/LoadInstruction.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denotes an unparameterized instruction to load a value from a local variable, - * e.g. ILOAD. - * - * @version $Id: LoadInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class LoadInstruction extends LocalVariableInstruction - implements PushInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. tag and length - * are defined in readInstruction and initFromFile, respectively. - */ - LoadInstruction(short canon_tag, short c_tag) { - super(canon_tag, c_tag); - } - - /** - * @param opcode - * Instruction opcode - * @param c_tag - * Instruction number for compact version, ALOAD_0, e.g. - * @param n - * local variable index (unsigned short) - */ - protected LoadInstruction(short opcode, short c_tag, int n) { - super(opcode, c_tag, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitTypedInstruction(this); - v.visitLocalVariableInstruction(this); - v.visitLoadInstruction(this); - } -} diff --git a/src/org/apache/bcel/generic/LocalVariableGen.java b/src/org/apache/bcel/generic/LocalVariableGen.java deleted file mode 100644 index df446e3..0000000 --- a/src/org/apache/bcel/generic/LocalVariableGen.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.LocalVariable; - -/** - * This class represents a local variable within a method. It contains its - * scope, name and type. The generated LocalVariable object can be obtained with - * getLocalVariable which needs the instruction list and the constant pool as - * parameters. - * - * @version $Id: LocalVariableGen.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see LocalVariable - * @see MethodGen - */ -public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, - Cloneable, java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - private int index; - private String name; - private Type type; - private InstructionHandle start, end; - - /** - * Generate a local variable that with index `index'. Note that double and - * long variables need two indexs. Index indices have to be provided by the - * user. - * - * @param index - * index of local variable - * @param name - * its name - * @param type - * its type - * @param start - * from where the instruction is valid (null means from the - * start) - * @param end - * until where the instruction is valid (null means to the end) - */ - public LocalVariableGen(int index, String name, Type type, - InstructionHandle start, InstructionHandle end) { - if ((index < 0) || (index > Constants.MAX_SHORT)) { - throw new ClassGenException("Invalid index index: " + index); - } - this.name = name; - this.type = type; - this.index = index; - setStart(start); - setEnd(end); - } - - /** - * Get LocalVariable object. - * - * This relies on that the instruction list has already been dumped to byte - * code or or that the `setPositions' methods has been called for the - * instruction list. - * - * Note that for local variables whose scope end at the last instruction of - * the method's code, the JVM specification is ambiguous: both a - * start_pc+length ending at the last instruction and start_pc+length ending - * at first index beyond the end of the code are valid. - * - * @param cp - * constant pool - */ - public LocalVariable getLocalVariable(ConstantPoolGen cp) { - int start_pc = start.getPosition(); - int length = end.getPosition() - start_pc; - if (length > 0) { - length += end.getInstruction().getLength(); - } - int name_index = cp.addUtf8(name); - int signature_index = cp.addUtf8(type.getSignature()); - return new LocalVariable(start_pc, length, name_index, signature_index, - index, cp.getConstantPool()); - } - - public void setIndex(int index) { - this.index = index; - } - - public int getIndex() { - return index; - } - - @Override - public void setName(String name) { - this.name = name; - } - - @Override - public String getName() { - return name; - } - - @Override - public void setType(Type type) { - this.type = type; - } - - @Override - public Type getType() { - return type; - } - - public InstructionHandle getStart() { - return start; - } - - public InstructionHandle getEnd() { - return end; - } - - public void setStart(InstructionHandle start) { - BranchInstruction.notifyTarget(this.start, start, this); - this.start = start; - } - - public void setEnd(InstructionHandle end) { - BranchInstruction.notifyTarget(this.end, end, this); - this.end = end; - } - - /** - * @param old_ih - * old target, either start or end - * @param new_ih - * new target - */ - @Override - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - boolean targeted = false; - if (start == old_ih) { - targeted = true; - setStart(new_ih); - } - if (end == old_ih) { - targeted = true; - setEnd(new_ih); - } - if (!targeted) { - throw new ClassGenException("Not targeting " + old_ih + ", but {" - + start + ", " + end + "}"); - } - } - - /** - * @return true, if ih is target of this variable - */ - @Override - public boolean containsTarget(InstructionHandle ih) { - return (start == ih) || (end == ih); - } - - /** - * @return a hash code value for the object. - */ - @Override - public int hashCode() { - // If the user changes the name or type, problems with the targeter - // hashmap will occur - int hc = index ^ name.hashCode() ^ type.hashCode(); - return hc; - } - - /** - * We consider to local variables to be equal, if the use the same index and - * are valid in the same range. - */ - @Override - public boolean equals(Object o) { - if (!(o instanceof LocalVariableGen)) { - return false; - } - LocalVariableGen l = (LocalVariableGen) o; - return (l.index == index) && (l.start == start) && (l.end == end); - } - - @Override - public String toString() { - return "LocalVariableGen(" + name + ", " + type + ", " + start + ", " - + end + ")"; - } - - @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; - } - } -} diff --git a/src/org/apache/bcel/generic/LocalVariableInstruction.java b/src/org/apache/bcel/generic/LocalVariableInstruction.java deleted file mode 100644 index ee7836c..0000000 --- a/src/org/apache/bcel/generic/LocalVariableInstruction.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.util.ByteSequence; - -/** - * Abstract super class for instructions dealing with local variables. - * - * @version $Id: LocalVariableInstruction.java 386056 2006-03-15 11:31:56Z - * tcurdt $ - * @author M. Dahm - */ -public abstract class LocalVariableInstruction extends Instruction implements - TypedInstruction, IndexedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected int n = -1; // index of referenced variable - private short c_tag = -1; // compact version, such as ILOAD_0 - private short canon_tag = -1; // canonical tag such as ILOAD - - private final boolean wide() { - return n > Constants.MAX_BYTE; - } - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. tag and length - * are defined in readInstruction and initFromFile, respectively. - */ - LocalVariableInstruction(short canon_tag, short c_tag) { - super(); - this.canon_tag = canon_tag; - this.c_tag = c_tag; - } - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Also used by IINC()! - */ - LocalVariableInstruction() { - } - - /** - * @param opcode - * Instruction opcode - * @param c_tag - * Instruction number for compact version, ALOAD_0, e.g. - * @param n - * local variable index (unsigned short) - */ - protected LocalVariableInstruction(short opcode, short c_tag, int n) { - super(opcode, (short) 2); - this.c_tag = c_tag; - canon_tag = opcode; - setIndex(n); - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - if (wide()) { - out.writeByte(Constants.WIDE); - } - out.writeByte(opcode); - if (length > 1) { // Otherwise ILOAD_n, instruction, e.g. - if (wide()) { - out.writeShort(n); - } else { - out.writeByte(n); - } - } - } - - /** - * Long output format: - * - * <name of opcode> "["<opcode number>"]" "("<length of - * instruction>")" "<"< local variable index>">" - * - * @param verbose - * long/short format switch - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - if (((opcode >= Constants.ILOAD_0) && (opcode <= Constants.ALOAD_3)) - || ((opcode >= Constants.ISTORE_0) && (opcode <= Constants.ASTORE_3))) { - return super.toString(verbose); - } else { - return super.toString(verbose) + " " + n; - } - } - - /** - * Read needed data (e.g. index) from file. PRE: (ILOAD <= tag <= ALOAD_3) - * || (ISTORE <= tag <= ASTORE_3) - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - if (wide) { - n = bytes.readUnsignedShort(); - length = 4; - } else if (((opcode >= Constants.ILOAD) && (opcode <= Constants.ALOAD)) - || ((opcode >= Constants.ISTORE) && (opcode <= Constants.ASTORE))) { - n = bytes.readUnsignedByte(); - length = 2; - } else if (opcode <= Constants.ALOAD_3) { // compact load instruction - // such as ILOAD_2 - n = (opcode - Constants.ILOAD_0) % 4; - length = 1; - } else { // Assert ISTORE_0 <= tag <= ASTORE_3 - n = (opcode - Constants.ISTORE_0) % 4; - length = 1; - } - } - - /** - * @return local variable index referred by this instruction. - */ - @Override - public final int getIndex() { - return n; - } - - /** - * Set the local variable index - */ - @Override - public void setIndex(int n) { - if ((n < 0) || (n > Constants.MAX_SHORT)) { - throw new ClassGenException("Illegal value: " + n); - } - this.n = n; - if (n >= 0 && n <= 3) { // Use more compact instruction xLOAD_n - opcode = (short) (c_tag + n); - length = 1; - } else { - opcode = canon_tag; - if (wide()) { - length = 4; - } else { - length = 2; - } - } - } - - /** - * @return canonical tag for instruction, e.g., ALOAD for ALOAD_0 - */ - public short getCanonicalTag() { - return canon_tag; - } - - /** - * Returns the type associated with the instruction - in case of ALOAD or - * ASTORE Type.OBJECT is returned. This is just a bit incorrect, because - * ALOAD and ASTORE may work on every ReferenceType (including Type.NULL) - * and ASTORE may even work on a ReturnaddressType . - * - * @return type associated with the instruction - */ - @Override - public Type getType(ConstantPoolGen cp) { - switch (canon_tag) { - case Constants.ILOAD: - case Constants.ISTORE: - return Type.INT; - case Constants.LLOAD: - case Constants.LSTORE: - return Type.LONG; - case Constants.DLOAD: - case Constants.DSTORE: - return Type.DOUBLE; - case Constants.FLOAD: - case Constants.FSTORE: - return Type.FLOAT; - case Constants.ALOAD: - case Constants.ASTORE: - return Type.OBJECT; - default: - throw new ClassGenException("Oops: unknown case in switch" - + canon_tag); - } - } -} diff --git a/src/org/apache/bcel/generic/MONITORENTER.java b/src/org/apache/bcel/generic/MONITORENTER.java deleted file mode 100644 index b0e706e..0000000 --- a/src/org/apache/bcel/generic/MONITORENTER.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * MONITORENTER - Enter monitor for object - * - *
      - * Stack: ..., objectref -> ...
      - * 
      - * - * @version $Id: MONITORENTER.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class MONITORENTER extends Instruction implements ExceptionThrower, - StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public MONITORENTER() { - super(org.apache.bcel.Constants.MONITORENTER, (short) 1); - } - - @Override - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION }; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitMONITORENTER(this); - } -} diff --git a/src/org/apache/bcel/generic/MONITOREXIT.java b/src/org/apache/bcel/generic/MONITOREXIT.java deleted file mode 100644 index 5db445d..0000000 --- a/src/org/apache/bcel/generic/MONITOREXIT.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * MONITOREXIT - Exit monitor for object - * - *
      - * Stack: ..., objectref -> ...
      - * 
      - * - * @version $Id: MONITOREXIT.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class MONITOREXIT extends Instruction implements ExceptionThrower, - StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public MONITOREXIT() { - super(org.apache.bcel.Constants.MONITOREXIT, (short) 1); - } - - @Override - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION }; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitMONITOREXIT(this); - } -} diff --git a/src/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/org/apache/bcel/generic/MULTIANEWARRAY.java deleted file mode 100644 index 9c5bf1e..0000000 --- a/src/org/apache/bcel/generic/MULTIANEWARRAY.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.ExceptionConstants; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.util.ByteSequence; - -/** - * MULTIANEWARRAY - Create new mutidimensional array of references - * - *
      - * Stack: ..., count1, [count2, ...] -> ..., arrayref
      - * 
      - * - * @version $Id: MULTIANEWARRAY.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class MULTIANEWARRAY extends CPInstruction implements LoadClass, - AllocationInstruction, ExceptionThrower { - - /** - * - */ - private static final long serialVersionUID = 1L; - private short dimensions; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - MULTIANEWARRAY() { - } - - public MULTIANEWARRAY(int index, short dimensions) { - super(org.apache.bcel.Constants.MULTIANEWARRAY, index); - if (dimensions < 1) { - throw new ClassGenException("Invalid dimensions value: " - + dimensions); - } - this.dimensions = dimensions; - length = 4; - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - out.writeShort(index); - out.writeByte(dimensions); - } - - /** - * Read needed data (i.e., no. dimension) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - super.initFromFile(bytes, wide); - dimensions = bytes.readByte(); - length = 4; - } - - /** - * @return number of dimensions to be created - */ - public final short getDimensions() { - return dimensions; - } - - /** - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - return super.toString(verbose) + " " + index + " " + dimensions; - } - - /** - * @return mnemonic for instruction with symbolic references resolved - */ - @Override - public String toString(ConstantPool cp) { - return super.toString(cp) + " " + dimensions; - } - - /** - * Also works for instructions whose stack effect depends on the constant - * pool entry they reference. - * - * @return Number of words consumed from stack by this instruction - */ - @Override - public int consumeStack(ConstantPoolGen cpg) { - return dimensions; - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy( - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, - 0, - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length + 1] = ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - return cs; - } - - @Override - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - Type t = getType(cpg); - if (t instanceof ArrayType) { - t = ((ArrayType) t).getBasicType(); - } - return (t instanceof ObjectType) ? (ObjectType) t : null; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitAllocationInstruction(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitMULTIANEWARRAY(this); - } -} diff --git a/src/org/apache/bcel/generic/MethodGen.java b/src/org/apache/bcel/generic/MethodGen.java deleted file mode 100644 index 5704f06..0000000 --- a/src/org/apache/bcel/generic/MethodGen.java +++ /dev/null @@ -1,1108 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Stack; - -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.CodeException; -import org.apache.bcel.classfile.ExceptionTable; -import org.apache.bcel.classfile.LineNumber; -import org.apache.bcel.classfile.LineNumberTable; -import org.apache.bcel.classfile.LocalVariable; -import org.apache.bcel.classfile.LocalVariableTable; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.util.BCELComparator; - -/** - * Template class for building up a method. This is done by defining exception - * handlers, adding thrown exceptions, local variables and attributes, whereas - * the `LocalVariableTable' and `LineNumberTable' attributes will be set - * automatically for the code. Use stripAttributes() if you don't like this. - * - * While generating code it may be necessary to insert NOP operations. You can - * use the `removeNOPs' method to get rid off them. The resulting method object - * can be obtained via the `getMethod()' method. - * - * @version $Id: MethodGen.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @author Patrick C. Beard - * [setMaxStack()] - * @see InstructionList - * @see Method - */ -public class MethodGen extends FieldGenOrMethodGen { - - /** - * - */ - private static final long serialVersionUID = 1L; - private String class_name; - private Type[] arg_types; - private String[] arg_names; - private int max_locals; - private int max_stack; - private InstructionList il; - private boolean strip_attributes; - private List variable_vec = new ArrayList(); - private List line_number_vec = new ArrayList(); - private List exception_vec = new ArrayList(); - private List throws_vec = new ArrayList(); - private List code_attrs_vec = new ArrayList(); - private static BCELComparator _cmp = new BCELComparator() { - - @Override - public boolean equals(Object o1, Object o2) { - MethodGen THIS = (MethodGen) o1; - MethodGen THAT = (MethodGen) o2; - return THIS.getName().equals(THAT.getName()) - && THIS.getSignature().equals(THAT.getSignature()); - } - - @Override - public int hashCode(Object o) { - MethodGen THIS = (MethodGen) o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); - } - }; - - /** - * Declare method. If the method is non-static the constructor automatically - * declares a local variable `$this' in slot 0. The actual code is contained - * in the `il' parameter, which may further manipulated by the user. But he - * must take care not to remove any instruction (handles) that are still - * referenced from this object. - * - * For example one may not add a local variable and later remove the - * instructions it refers to without causing havoc. It is safe however if - * you remove that local variable, too. - * - * @param access_flags - * access qualifiers - * @param return_type - * method type - * @param arg_types - * argument types - * @param arg_names - * argument names (if this is null, default names will be - * provided for them) - * @param method_name - * name of method - * @param class_name - * class name containing this method (may be null, if you don't - * care) - * @param il - * instruction list associated with this method, may be null only - * for abstract or native methods - * @param cp - * constant pool - */ - public MethodGen(int access_flags, Type return_type, Type[] arg_types, - String[] arg_names, String method_name, String class_name, - InstructionList il, ConstantPoolGen cp) { - setAccessFlags(access_flags); - setType(return_type); - setArgumentTypes(arg_types); - setArgumentNames(arg_names); - setName(method_name); - setClassName(class_name); - setInstructionList(il); - setConstantPool(cp); - boolean abstract_ = isAbstract() || isNative(); - InstructionHandle start = null; - InstructionHandle end = null; - if (!abstract_) { - start = il.getStart(); - end = il.getEnd(); - /* - * Add local variables, namely the implicit `this' and the arguments - */ - if (!isStatic() && (class_name != null)) { // Instance method -> - // `this' is local var 0 - addLocalVariable("this", new ObjectType(class_name), start, end); - } - } - if (arg_types != null) { - int size = arg_types.length; - for (int i = 0; i < size; i++) { - if (Type.VOID == arg_types[i]) { - throw new ClassGenException( - "'void' is an illegal argument type for a method"); - } - } - if (arg_names != null) { // Names for variables provided? - if (size != arg_names.length) { - throw new ClassGenException( - "Mismatch in argument array lengths: " + size - + " vs. " + arg_names.length); - } - } else { // Give them dummy names - arg_names = new String[size]; - for (int i = 0; i < size; i++) { - arg_names[i] = "arg" + i; - } - setArgumentNames(arg_names); - } - if (!abstract_) { - for (int i = 0; i < size; i++) { - addLocalVariable(arg_names[i], arg_types[i], start, end); - } - } - } - } - - /** - * Instantiate from existing method. - * - * @param m - * method - * @param class_name - * class name containing this method - * @param cp - * constant pool - */ - public MethodGen(Method m, String class_name, ConstantPoolGen cp) { - this( - m.getAccessFlags(), - Type.getReturnType(m.getSignature()), - Type.getArgumentTypes(m.getSignature()), - null /* may be overridden anyway */ - , - m.getName(), - class_name, - ((m.getAccessFlags() & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) == 0) ? new InstructionList( - m.getCode().getCode()) : null, cp); - Attribute[] attributes = m.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - Attribute a = attributes[i]; - if (a instanceof Code) { - Code c = (Code) a; - setMaxStack(c.getMaxStack()); - setMaxLocals(c.getMaxLocals()); - CodeException[] ces = c.getExceptionTable(); - if (ces != null) { - for (int j = 0; j < ces.length; j++) { - CodeException ce = ces[j]; - int type = ce.getCatchType(); - ObjectType c_type = null; - if (type > 0) { - String cen = m.getConstantPool().getConstantString( - type, Constants.CONSTANT_Class); - c_type = new ObjectType(cen); - } - int end_pc = ce.getEndPC(); - int length = m.getCode().getCode().length; - InstructionHandle end; - if (length == end_pc) { // May happen, because end_pc is - // exclusive - end = il.getEnd(); - } else { - end = il.findHandle(end_pc); - end = end.getPrev(); // Make it inclusive - } - addExceptionHandler(il.findHandle(ce.getStartPC()), - end, il.findHandle(ce.getHandlerPC()), c_type); - } - } - Attribute[] c_attributes = c.getAttributes(); - for (int j = 0; j < c_attributes.length; j++) { - a = c_attributes[j]; - if (a instanceof LineNumberTable) { - LineNumber[] ln = ((LineNumberTable) a) - .getLineNumberTable(); - for (int k = 0; k < ln.length; k++) { - LineNumber l = ln[k]; - InstructionHandle ih = il - .findHandle(l.getStartPC()); - if (ih != null) { - addLineNumber(ih, l.getLineNumber()); - } - } - } else if (a instanceof LocalVariableTable) { - LocalVariable[] lv = ((LocalVariableTable) a) - .getLocalVariableTable(); - removeLocalVariables(); - for (int k = 0; k < lv.length; k++) { - LocalVariable l = lv[k]; - InstructionHandle start = il.findHandle(l - .getStartPC()); - InstructionHandle end = il.findHandle(l - .getStartPC() + l.getLength()); - // Repair malformed handles - if (null == start) { - start = il.getStart(); - } - if (null == end) { - end = il.getEnd(); - } - addLocalVariable(l.getName(), - Type.getType(l.getSignature()), - l.getIndex(), start, end); - } - } else { - addCodeAttribute(a); - } - } - } else if (a instanceof ExceptionTable) { - String[] names = ((ExceptionTable) a).getExceptionNames(); - for (int j = 0; j < names.length; j++) { - addException(names[j]); - } - } else { - addAttribute(a); - } - } - } - - /** - * Adds a local variable to this method. - * - * @param name - * variable name - * @param type - * variable type - * @param slot - * the index of the local variable, if type is long or double, - * the next available index is slot+2 - * @param start - * from where the variable is valid - * @param end - * until where the variable is valid - * @return new local variable object - * @see LocalVariable - */ - public LocalVariableGen addLocalVariable(String name, Type type, int slot, - InstructionHandle start, InstructionHandle end) { - byte t = type.getType(); - if (t != Constants.T_ADDRESS) { - int add = type.getSize(); - if (slot + add > max_locals) { - max_locals = slot + add; - } - LocalVariableGen l = new LocalVariableGen(slot, name, type, start, - end); - int i; - if ((i = variable_vec.indexOf(l)) >= 0) { - variable_vec.set(i, l); - } else { - variable_vec.add(l); - } - return l; - } else { - throw new IllegalArgumentException("Can not use " + type - + " as type for local variable"); - } - } - - /** - * Adds a local variable to this method and assigns an index automatically. - * - * @param name - * variable name - * @param type - * variable type - * @param start - * from where the variable is valid, if this is null, it is valid - * from the start - * @param end - * until where the variable is valid, if this is null, it is - * valid to the end - * @return new local variable object - * @see LocalVariable - */ - public LocalVariableGen addLocalVariable(String name, Type type, - InstructionHandle start, InstructionHandle end) { - return addLocalVariable(name, type, max_locals, start, end); - } - - /** - * Remove a local variable, its slot will not be reused, if you do not use - * addLocalVariable with an explicit index argument. - */ - public void removeLocalVariable(LocalVariableGen l) { - variable_vec.remove(l); - } - - /** - * Remove all local variables. - */ - public void removeLocalVariables() { - variable_vec.clear(); - } - - /** - * Sort local variables by index - */ - private static final void sort(LocalVariableGen[] vars, int l, int r) { - int i = l, j = r; - int m = vars[(l + r) / 2].getIndex(); - LocalVariableGen h; - do { - while (vars[i].getIndex() < m) { - i++; - } - while (m < vars[j].getIndex()) { - j--; - } - if (i <= j) { - h = vars[i]; - vars[i] = vars[j]; - vars[j] = h; // Swap elements - i++; - j--; - } - } while (i <= j); - if (l < j) { - sort(vars, l, j); - } - if (i < r) { - sort(vars, i, r); - } - } - - /* - * If the range of the variable has not been set yet, it will be set to be - * valid from the start to the end of the instruction list. - * - * @return array of declared local variables sorted by index - */ - public LocalVariableGen[] getLocalVariables() { - int size = variable_vec.size(); - LocalVariableGen[] lg = new LocalVariableGen[size]; - variable_vec.toArray(lg); - for (int i = 0; i < size; i++) { - if (lg[i].getStart() == null) { - lg[i].setStart(il.getStart()); - } - if (lg[i].getEnd() == null) { - lg[i].setEnd(il.getEnd()); - } - } - if (size > 1) { - sort(lg, 0, size - 1); - } - return lg; - } - - /** - * @return `LocalVariableTable' attribute of all the local variables of this - * method. - */ - public LocalVariableTable getLocalVariableTable(ConstantPoolGen cp) { - LocalVariableGen[] lg = getLocalVariables(); - int size = lg.length; - LocalVariable[] lv = new LocalVariable[size]; - for (int i = 0; i < size; i++) { - lv[i] = lg[i].getLocalVariable(cp); - } - return new LocalVariableTable(cp.addUtf8("LocalVariableTable"), - 2 + lv.length * 10, lv, cp.getConstantPool()); - } - - /** - * Give an instruction a line number corresponding to the source code line. - * - * @param ih - * instruction to tag - * @return new line number object - * @see LineNumber - */ - public LineNumberGen addLineNumber(InstructionHandle ih, int src_line) { - LineNumberGen l = new LineNumberGen(ih, src_line); - line_number_vec.add(l); - return l; - } - - /** - * Remove a line number. - */ - public void removeLineNumber(LineNumberGen l) { - line_number_vec.remove(l); - } - - /** - * Remove all line numbers. - */ - public void removeLineNumbers() { - line_number_vec.clear(); - } - - /* - * @return array of line numbers - */ - public LineNumberGen[] getLineNumbers() { - LineNumberGen[] lg = new LineNumberGen[line_number_vec.size()]; - line_number_vec.toArray(lg); - return lg; - } - - /** - * @return `LineNumberTable' attribute of all the local variables of this - * method. - */ - public LineNumberTable getLineNumberTable(ConstantPoolGen cp) { - int size = line_number_vec.size(); - LineNumber[] ln = new LineNumber[size]; - try { - for (int i = 0; i < size; i++) { - ln[i] = line_number_vec.get(i).getLineNumber(); - } - } catch (ArrayIndexOutOfBoundsException e) { - } // Never occurs - return new LineNumberTable(cp.addUtf8("LineNumberTable"), - 2 + ln.length * 4, ln, cp.getConstantPool()); - } - - /** - * Add an exception handler, i.e., specify region where a handler is active - * and an instruction where the actual handling is done. - * - * @param start_pc - * Start of region (inclusive) - * @param end_pc - * End of region (inclusive) - * @param handler_pc - * Where handling is done - * @param catch_type - * class type of handled exception or null if any exception is - * handled - * @return new exception handler object - */ - public CodeExceptionGen addExceptionHandler(InstructionHandle start_pc, - InstructionHandle end_pc, InstructionHandle handler_pc, - ObjectType catch_type) { - if ((start_pc == null) || (end_pc == null) || (handler_pc == null)) { - throw new ClassGenException( - "Exception handler target is null instruction"); - } - CodeExceptionGen c = new CodeExceptionGen(start_pc, end_pc, handler_pc, - catch_type); - exception_vec.add(c); - return c; - } - - /** - * Remove an exception handler. - */ - public void removeExceptionHandler(CodeExceptionGen c) { - exception_vec.remove(c); - } - - /** - * Remove all line numbers. - */ - public void removeExceptionHandlers() { - exception_vec.clear(); - } - - /* - * @return array of declared exception handlers - */ - public CodeExceptionGen[] getExceptionHandlers() { - CodeExceptionGen[] cg = new CodeExceptionGen[exception_vec.size()]; - exception_vec.toArray(cg); - return cg; - } - - /** - * @return code exceptions for `Code' attribute - */ - private CodeException[] getCodeExceptions() { - int size = exception_vec.size(); - CodeException[] c_exc = new CodeException[size]; - try { - for (int i = 0; i < size; i++) { - CodeExceptionGen c = exception_vec.get(i); - c_exc[i] = c.getCodeException(cp); - } - } catch (ArrayIndexOutOfBoundsException e) { - } - return c_exc; - } - - /** - * Add an exception possibly thrown by this method. - * - * @param class_name - * (fully qualified) name of exception - */ - public void addException(String class_name) { - throws_vec.add(class_name); - } - - /** - * Remove an exception. - */ - public void removeException(String c) { - throws_vec.remove(c); - } - - /** - * Remove all exceptions. - */ - public void removeExceptions() { - throws_vec.clear(); - } - - /* - * @return array of thrown exceptions - */ - public String[] getExceptions() { - String[] e = new String[throws_vec.size()]; - throws_vec.toArray(e); - return e; - } - - /** - * @return `Exceptions' attribute of all the exceptions thrown by this - * method. - */ - private ExceptionTable getExceptionTable(ConstantPoolGen cp) { - int size = throws_vec.size(); - int[] ex = new int[size]; - try { - for (int i = 0; i < size; i++) { - ex[i] = cp.addClass(throws_vec.get(i)); - } - } catch (ArrayIndexOutOfBoundsException e) { - } - return new ExceptionTable(cp.addUtf8("Exceptions"), 2 + 2 * size, ex, - cp.getConstantPool()); - } - - /** - * Add an attribute to the code. Currently, the JVM knows about the - * LineNumberTable, LocalVariableTable and StackMap attributes, where the - * former two will be generated automatically and the latter is used for the - * MIDP only. Other attributes will be ignored by the JVM but do no harm. - * - * @param a - * attribute to be added - */ - public void addCodeAttribute(Attribute a) { - code_attrs_vec.add(a); - } - - /** - * Remove a code attribute. - */ - public void removeCodeAttribute(Attribute a) { - code_attrs_vec.remove(a); - } - - /** - * Remove all code attributes. - */ - public void removeCodeAttributes() { - code_attrs_vec.clear(); - } - - /** - * @return all attributes of this method. - */ - public Attribute[] getCodeAttributes() { - Attribute[] attributes = new Attribute[code_attrs_vec.size()]; - code_attrs_vec.toArray(attributes); - return attributes; - } - - /** - * Get method object. Never forget to call setMaxStack() or - * setMaxStack(max), respectively, before calling this method (the same - * applies for max locals). - * - * @return method object - */ - public Method getMethod() { - String signature = getSignature(); - int name_index = cp.addUtf8(name); - int signature_index = cp.addUtf8(signature); - /* - * Also updates positions of instructions, i.e., their indices - */ - byte[] byte_code = null; - if (il != null) { - byte_code = il.getByteCode(); - } - LineNumberTable lnt = null; - LocalVariableTable lvt = null; - /* - * Create LocalVariableTable and LineNumberTable attributes (for - * debuggers, e.g.) - */ - if ((variable_vec.size() > 0) && !strip_attributes) { - addCodeAttribute(lvt = getLocalVariableTable(cp)); - } - if ((line_number_vec.size() > 0) && !strip_attributes) { - addCodeAttribute(lnt = getLineNumberTable(cp)); - } - Attribute[] code_attrs = getCodeAttributes(); - /* - * Each attribute causes 6 additional header bytes - */ - int attrs_len = 0; - for (int i = 0; i < code_attrs.length; i++) { - attrs_len += (code_attrs[i].getLength() + 6); - } - CodeException[] c_exc = getCodeExceptions(); - int exc_len = c_exc.length * 8; // Every entry takes 8 bytes - Code code = null; - if ((il != null) && !isAbstract() && !isNative()) { - // Remove any stale code attribute - Attribute[] attributes = getAttributes(); - for (int i = 0; i < attributes.length; i++) { - Attribute a = attributes[i]; - if (a instanceof Code) { - removeAttribute(a); - } - } - code = new Code(cp.addUtf8("Code"), 8 + byte_code.length + // prologue - // byte - // code - 2 + exc_len + // exceptions - 2 + attrs_len, // attributes - max_stack, max_locals, byte_code, c_exc, code_attrs, - cp.getConstantPool()); - addAttribute(code); - } - ExceptionTable et = null; - if (throws_vec.size() > 0) { - addAttribute(et = getExceptionTable(cp)); - // Add `Exceptions' if there are "throws" clauses - } - Method m = new Method(access_flags, name_index, signature_index, - getAttributes(), cp.getConstantPool()); - // Undo effects of adding attributes - if (lvt != null) { - removeCodeAttribute(lvt); - } - if (lnt != null) { - removeCodeAttribute(lnt); - } - if (code != null) { - removeAttribute(code); - } - if (et != null) { - removeAttribute(et); - } - return m; - } - - /** - * Remove all NOPs from the instruction list (if possible) and update every - * object refering to them, i.e., branch instructions, local variables and - * exception handlers. - */ - public void removeNOPs() { - if (il != null) { - InstructionHandle next; - /* - * Check branch instructions. - */ - for (InstructionHandle ih = il.getStart(); ih != null; ih = next) { - next = ih.next; - if ((next != null) && (ih.getInstruction() instanceof NOP)) { - try { - il.delete(ih); - } catch (TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - for (int i = 0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i] - .getTargeters(); - for (int j = 0; j < targeters.length; j++) { - targeters[j].updateTarget(targets[i], next); - } - } - } - } - } - } - } - - /** - * Set maximum number of local variables. - */ - public void setMaxLocals(int m) { - max_locals = m; - } - - public int getMaxLocals() { - return max_locals; - } - - /** - * Set maximum stack size for this method. - */ - public void setMaxStack(int m) { - max_stack = m; - } - - public int getMaxStack() { - return max_stack; - } - - /** - * @return class that contains this method - */ - public String getClassName() { - return class_name; - } - - public void setClassName(String class_name) { - this.class_name = class_name; - } - - public void setReturnType(Type return_type) { - setType(return_type); - } - - public Type getReturnType() { - return getType(); - } - - public void setArgumentTypes(Type[] arg_types) { - this.arg_types = arg_types; - } - - public Type[] getArgumentTypes() { - return arg_types.clone(); - } - - public void setArgumentType(int i, Type type) { - arg_types[i] = type; - } - - public Type getArgumentType(int i) { - return arg_types[i]; - } - - public void setArgumentNames(String[] arg_names) { - this.arg_names = arg_names; - } - - public String[] getArgumentNames() { - return arg_names.clone(); - } - - public void setArgumentName(int i, String name) { - arg_names[i] = name; - } - - public String getArgumentName(int i) { - return arg_names[i]; - } - - public InstructionList getInstructionList() { - return il; - } - - public void setInstructionList(InstructionList il) { - this.il = il; - } - - @Override - public String getSignature() { - return Type.getMethodSignature(type, arg_types); - } - - /** - * Computes max. stack size by performing control flow analysis. - */ - public void setMaxStack() { - if (il != null) { - max_stack = getMaxStack(cp, il, getExceptionHandlers()); - } else { - max_stack = 0; - } - } - - /** - * Compute maximum number of local variables. - */ - public void setMaxLocals() { - if (il != null) { - int max = isStatic() ? 0 : 1; - if (arg_types != null) { - for (int i = 0; i < arg_types.length; i++) { - max += arg_types[i].getSize(); - } - } - for (InstructionHandle ih = il.getStart(); ih != null; ih = ih - .getNext()) { - Instruction ins = ih.getInstruction(); - if ((ins instanceof LocalVariableInstruction) - || (ins instanceof RET) || (ins instanceof IINC)) { - int index = ((IndexedInstruction) ins).getIndex() - + ((TypedInstruction) ins).getType(cp).getSize(); - if (index > max) { - max = index; - } - } - } - max_locals = max; - } else { - max_locals = 0; - } - } - - /** - * Do not/Do produce attributes code attributesLineNumberTable and - * LocalVariableTable, like javac -O - */ - public void stripAttributes(boolean flag) { - strip_attributes = flag; - } - - static final class BranchTarget { - - InstructionHandle target; - int stackDepth; - - BranchTarget(InstructionHandle target, int stackDepth) { - this.target = target; - this.stackDepth = stackDepth; - } - } - - static final class BranchStack { - - Stack branchTargets = new Stack(); - Hashtable visitedTargets = new Hashtable(); - - public void push(InstructionHandle target, int stackDepth) { - if (visited(target)) { - return; - } - branchTargets.push(visit(target, stackDepth)); - } - - public BranchTarget pop() { - if (!branchTargets.empty()) { - BranchTarget bt = branchTargets.pop(); - return bt; - } - return null; - } - - private final BranchTarget visit(InstructionHandle target, - int stackDepth) { - BranchTarget bt = new BranchTarget(target, stackDepth); - visitedTargets.put(target, bt); - return bt; - } - - private final boolean visited(InstructionHandle target) { - return (visitedTargets.get(target) != null); - } - } - - /** - * Computes stack usage of an instruction list by performing control flow - * analysis. - * - * @return maximum stack depth used by method - */ - public static int getMaxStack(ConstantPoolGen cp, InstructionList il, - CodeExceptionGen[] et) { - BranchStack branchTargets = new BranchStack(); - /* - * Initially, populate the branch stack with the exception handlers, - * because these aren't (necessarily) branched to explicitly. in each - * case, the stack will have depth 1, containing the exception object. - */ - for (int i = 0; i < et.length; i++) { - InstructionHandle handler_pc = et[i].getHandlerPC(); - if (handler_pc != null) { - branchTargets.push(handler_pc, 1); - } - } - int stackDepth = 0, maxStackDepth = 0; - InstructionHandle ih = il.getStart(); - while (ih != null) { - Instruction instruction = ih.getInstruction(); - short opcode = instruction.getOpcode(); - int delta = instruction.produceStack(cp) - - instruction.consumeStack(cp); - stackDepth += delta; - if (stackDepth > maxStackDepth) { - maxStackDepth = stackDepth; - } - // choose the next instruction based on whether current is a branch. - if (instruction instanceof BranchInstruction) { - BranchInstruction branch = (BranchInstruction) instruction; - if (instruction instanceof Select) { - // explore all of the select's targets. the default target - // is handled below. - Select select = (Select) branch; - InstructionHandle[] targets = select.getTargets(); - for (int i = 0; i < targets.length; i++) { - branchTargets.push(targets[i], stackDepth); - } - // nothing to fall through to. - ih = null; - } else if (!(branch instanceof IfInstruction)) { - // if an instruction that comes back to following PC, - // push next instruction, with stack depth reduced by 1. - if (opcode == Constants.JSR || opcode == Constants.JSR_W) { - branchTargets.push(ih.getNext(), stackDepth - 1); - } - ih = null; - } - // for all branches, the target of the branch is pushed on the - // branch stack. - // conditional branches have a fall through case, selects don't, - // and - // jsr/jsr_w return to the next instruction. - branchTargets.push(branch.getTarget(), stackDepth); - } else { - // check for instructions that terminate the method. - if (opcode == Constants.ATHROW - || opcode == Constants.RET - || (opcode >= Constants.IRETURN && opcode <= Constants.RETURN)) { - ih = null; - } - } - // normal case, go to the next instruction. - if (ih != null) { - ih = ih.getNext(); - } - // if we have no more instructions, see if there are any deferred - // branches to explore. - if (ih == null) { - BranchTarget bt = branchTargets.pop(); - if (bt != null) { - ih = bt.target; - stackDepth = bt.stackDepth; - } - } - } - return maxStackDepth; - } - - private List observers; - - /** - * Add observer for this object. - */ - public void addObserver(MethodObserver o) { - if (observers == null) { - observers = new ArrayList(); - } - observers.add(o); - } - - /** - * Remove observer for this object. - */ - public void removeObserver(MethodObserver o) { - if (observers != null) { - observers.remove(o); - } - } - - /** - * Call notify() method on all observers. This method is not called - * automatically whenever the state has changed, but has to be called by the - * user after he has finished editing the object. - */ - public void update() { - if (observers != null) { - for (Iterator e = observers.iterator(); e.hasNext();) { - e.next().notify(this); - } - } - } - - /** - * Return string representation close to declaration format, `public static - * void main(String[]) throws IOException', e.g. - * - * @return String representation of the method. - */ - @Override - public final String toString() { - String access = Utility.accessToString(access_flags); - String signature = Type.getMethodSignature(type, arg_types); - signature = Utility.methodSignatureToString(signature, name, access, - true, getLocalVariableTable(cp)); - StringBuffer buf = new StringBuffer(signature); - if (throws_vec.size() > 0) { - for (Iterator e = throws_vec.iterator(); e.hasNext();) { - buf.append("\n\t\tthrows ").append(e.next()); - } - } - return buf.toString(); - } - - /** - * @return deep copy of this method - */ - public MethodGen copy(String class_name, ConstantPoolGen cp) { - Method m = ((MethodGen) clone()).getMethod(); - MethodGen mg = new MethodGen(m, class_name, this.cp); - if (this.cp != cp) { - mg.setConstantPool(cp); - mg.getInstructionList().replaceConstantPool(this.cp, cp); - } - return mg; - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator - * Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. By default two - * MethodGen objects are said to be equal when their names and signatures - * are equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. By default - * return the hashcode of the method's name XOR signature. - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return _cmp.hashCode(this); - } -} diff --git a/src/org/apache/bcel/generic/MethodObserver.java b/src/org/apache/bcel/generic/MethodObserver.java deleted file mode 100644 index 442af3b..0000000 --- a/src/org/apache/bcel/generic/MethodObserver.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Implement this interface if you're interested in changes to a MethodGen - * object and register yourself with addObserver(). - * - * @version $Id: MethodObserver.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface MethodObserver { - - public void notify(MethodGen method); -} diff --git a/src/org/apache/bcel/generic/NEW.java b/src/org/apache/bcel/generic/NEW.java deleted file mode 100644 index 3c39d51..0000000 --- a/src/org/apache/bcel/generic/NEW.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.ExceptionConstants; - -/** - * NEW - Create new object - * - *
      - * Stack: ... -> ..., objectref
      - * 
      - * - * @version $Id: NEW.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class NEW extends CPInstruction implements LoadClass, - AllocationInstruction, ExceptionThrower, StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - NEW() { - } - - public NEW(int index) { - super(org.apache.bcel.Constants.NEW, index); - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy( - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, - 0, - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length + 1] = ExceptionConstants.INSTANTIATION_ERROR; - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - return cs; - } - - @Override - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - return (ObjectType) getType(cpg); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitAllocationInstruction(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitNEW(this); - } -} diff --git a/src/org/apache/bcel/generic/NEWARRAY.java b/src/org/apache/bcel/generic/NEWARRAY.java deleted file mode 100644 index 2323811..0000000 --- a/src/org/apache/bcel/generic/NEWARRAY.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * NEWARRAY - Create new array of basic type (int, short, ...) - * - *
      - * Stack: ..., count -> ..., arrayref
      - * 
      - * - * type must be one of T_INT, T_SHORT, ... - * - * @version $Id: NEWARRAY.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class NEWARRAY extends Instruction implements AllocationInstruction, - ExceptionThrower, StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - private byte type; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - NEWARRAY() { - } - - public NEWARRAY(byte type) { - super(org.apache.bcel.Constants.NEWARRAY, (short) 2); - this.type = type; - } - - public NEWARRAY(BasicType type) { - this(type.getType()); - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - out.writeByte(type); - } - - /** - * @return numeric code for basic element type - */ - public final byte getTypecode() { - return type; - } - - /** - * @return type of constructed array - */ - public final Type getType() { - return new ArrayType(BasicType.getType(type), 1); - } - - /** - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - return super.toString(verbose) + " " - + org.apache.bcel.Constants.TYPE_NAMES[type]; - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - type = bytes.readByte(); - length = 2; - } - - @Override - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION }; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitAllocationInstruction(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitNEWARRAY(this); - } -} diff --git a/src/org/apache/bcel/generic/NOP.java b/src/org/apache/bcel/generic/NOP.java deleted file mode 100644 index 2816704..0000000 --- a/src/org/apache/bcel/generic/NOP.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * NOP - Do nothing - * - * @version $Id: NOP.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class NOP extends Instruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public NOP() { - super(org.apache.bcel.Constants.NOP, (short) 1); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitNOP(this); - } -} diff --git a/src/org/apache/bcel/generic/NamedAndTyped.java b/src/org/apache/bcel/generic/NamedAndTyped.java deleted file mode 100644 index ccfc98f..0000000 --- a/src/org/apache/bcel/generic/NamedAndTyped.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denote entity that has both name and type. This is true for local variables, - * methods and fields. - * - * @version $Id: NamedAndTyped.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface NamedAndTyped { - - public String getName(); - - public Type getType(); - - public void setName(String name); - - public void setType(Type type); -} diff --git a/src/org/apache/bcel/generic/ObjectType.java b/src/org/apache/bcel/generic/ObjectType.java deleted file mode 100644 index 885fe4f..0000000 --- a/src/org/apache/bcel/generic/ObjectType.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; - -/** - * Denotes reference such as java.lang.String. - * - * @version $Id: ObjectType.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ObjectType extends ReferenceType { - - /** - * - */ - private static final long serialVersionUID = 1L; - private String class_name; // Class name of type - - /** - * @param class_name - * fully qualified class name, e.g. java.lang.String - */ - public ObjectType(String class_name) { - super(Constants.T_REFERENCE, "L" + class_name.replace('.', '/') + ";"); - this.class_name = class_name.replace('/', '.'); - } - - /** - * @return name of referenced class - */ - public String getClassName() { - return class_name; - } - - /** - * @return a hash code value for the object. - */ - @Override - public int hashCode() { - return class_name.hashCode(); - } - - /** - * @return true if both type objects refer to the same class. - */ - @Override - public boolean equals(Object type) { - return (type instanceof ObjectType) ? ((ObjectType) type).class_name - .equals(class_name) : false; - } - - /** - * If "this" doesn't reference a class, it references an interface or a - * non-existant entity. - * - * @deprecated this method returns an inaccurate result if the class or - * interface referenced cannot be found: use - * referencesClassExact() instead - */ - @Deprecated - public boolean referencesClass() { - try { - JavaClass jc = Repository.lookupClass(class_name); - return jc.isClass(); - } catch (ClassNotFoundException e) { - return false; - } - } - - /** - * If "this" doesn't reference an interface, it references a class or a - * non-existant entity. - * - * @deprecated this method returns an inaccurate result if the class or - * interface referenced cannot be found: use - * referencesInterfaceExact() instead - */ - @Deprecated - public boolean referencesInterface() { - try { - JavaClass jc = Repository.lookupClass(class_name); - return !jc.isClass(); - } catch (ClassNotFoundException e) { - return false; - } - } - - /** - * Return true if this type references a class, false if it references an - * interface. - * - * @return true if the type references a class, false if it references an - * interface - * @throws ClassNotFoundException - * if the class or interface referenced by this type can't be - * found - */ - public boolean referencesClassExact() throws ClassNotFoundException { - JavaClass jc = Repository.lookupClass(class_name); - return jc.isClass(); - } - - /** - * Return true if this type references an interface, false if it references - * a class. - * - * @return true if the type references an interface, false if it references - * a class - * @throws ClassNotFoundException - * if the class or interface referenced by this type can't be - * found - */ - public boolean referencesInterfaceExact() throws ClassNotFoundException { - JavaClass jc = Repository.lookupClass(class_name); - return !jc.isClass(); - } - - /** - * Return true if this type is a subclass of given ObjectType. - * - * @throws ClassNotFoundException - * if any of this class's superclasses can't be found - */ - public boolean subclassOf(ObjectType superclass) - throws ClassNotFoundException { - if (this.referencesInterface() || superclass.referencesInterface()) { - return false; - } - return Repository.instanceOf(this.class_name, superclass.class_name); - } - - /** - * Java Virtual Machine Specification edition 2, 5.4.4 Access Control - * - * @throws ClassNotFoundException - * if the class referenced by this type can't be found - */ - public boolean accessibleTo(ObjectType accessor) - throws ClassNotFoundException { - JavaClass jc = Repository.lookupClass(class_name); - if (jc.isPublic()) { - return true; - } else { - JavaClass acc = Repository.lookupClass(accessor.class_name); - return acc.getPackageName().equals(jc.getPackageName()); - } - } -} diff --git a/src/org/apache/bcel/generic/POP.java b/src/org/apache/bcel/generic/POP.java deleted file mode 100644 index 58df478..0000000 --- a/src/org/apache/bcel/generic/POP.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * POP - Pop top operand stack word - * - *
      - * Stack: ..., word -> ...
      - * 
      - * - * @version $Id: POP.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class POP extends StackInstruction implements PopInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public POP() { - super(org.apache.bcel.Constants.POP); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitStackInstruction(this); - v.visitPOP(this); - } -} diff --git a/src/org/apache/bcel/generic/POP2.java b/src/org/apache/bcel/generic/POP2.java deleted file mode 100644 index 685c9e8..0000000 --- a/src/org/apache/bcel/generic/POP2.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * POP2 - Pop two top operand stack words - * - *
      - * Stack: ..., word2, word1 -> ...
      - * 
      - * - * @version $Id: POP2.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class POP2 extends StackInstruction implements PopInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public POP2() { - super(org.apache.bcel.Constants.POP2); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitStackInstruction(this); - v.visitPOP2(this); - } -} diff --git a/src/org/apache/bcel/generic/PUSH.java b/src/org/apache/bcel/generic/PUSH.java deleted file mode 100644 index 7fcbafb..0000000 --- a/src/org/apache/bcel/generic/PUSH.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; - -/** - * Wrapper class for push operations, which are implemented either as BIPUSH, - * LDC or xCONST_n instructions. - * - * @version $Id: PUSH.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class PUSH implements CompoundInstruction, - VariableLengthInstruction, InstructionConstants { - - private Instruction instruction; - - /** - * This constructor also applies for values of type short, char, byte - * - * @param cp - * Constant pool - * @param value - * to be pushed - */ - public PUSH(ConstantPoolGen cp, int value) { - if ((value >= -1) && (value <= 5)) { - instruction = INSTRUCTIONS[Constants.ICONST_0 + value]; - } else if ((value >= -128) && (value <= 127)) { - instruction = new BIPUSH((byte) value); - } else if ((value >= -32768) && (value <= 32767)) { - instruction = new SIPUSH((short) value); - } else { - instruction = new LDC(cp.addInteger(value)); - } - } - - /** - * @param cp - * Constant pool - * @param value - * to be pushed - */ - public PUSH(ConstantPoolGen cp, boolean value) { - instruction = INSTRUCTIONS[Constants.ICONST_0 + (value ? 1 : 0)]; - } - - /** - * @param cp - * Constant pool - * @param value - * to be pushed - */ - public PUSH(ConstantPoolGen cp, float value) { - if (value == 0.0) { - instruction = FCONST_0; - } else if (value == 1.0) { - instruction = FCONST_1; - } else if (value == 2.0) { - instruction = FCONST_2; - } else { - instruction = new LDC(cp.addFloat(value)); - } - } - - /** - * @param cp - * Constant pool - * @param value - * to be pushed - */ - public PUSH(ConstantPoolGen cp, long value) { - if (value == 0) { - instruction = LCONST_0; - } else if (value == 1) { - instruction = LCONST_1; - } else { - instruction = new LDC2_W(cp.addLong(value)); - } - } - - /** - * @param cp - * Constant pool - * @param value - * to be pushed - */ - public PUSH(ConstantPoolGen cp, double value) { - if (value == 0.0) { - instruction = DCONST_0; - } else if (value == 1.0) { - instruction = DCONST_1; - } else { - instruction = new LDC2_W(cp.addDouble(value)); - } - } - - /** - * @param cp - * Constant pool - * @param value - * to be pushed - */ - public PUSH(ConstantPoolGen cp, String value) { - if (value == null) { - instruction = ACONST_NULL; - } else { - instruction = new LDC(cp.addString(value)); - } - } - - /** - * @param cp - * Constant pool - * @param value - * to be pushed - */ - public PUSH(ConstantPoolGen cp, Number value) { - if ((value instanceof Integer) || (value instanceof Short) - || (value instanceof Byte)) { - instruction = new PUSH(cp, value.intValue()).instruction; - } else if (value instanceof Double) { - instruction = new PUSH(cp, value.doubleValue()).instruction; - } else if (value instanceof Float) { - instruction = new PUSH(cp, value.floatValue()).instruction; - } else if (value instanceof Long) { - instruction = new PUSH(cp, value.longValue()).instruction; - } else { - throw new ClassGenException("What's this: " + value); - } - } - - /** - * creates a push object from a Character value. Warning: Make sure not to - * attempt to allow autoboxing to create this value parameter, as an - * alternative constructor will be called - * - * @param cp - * Constant pool - * @param value - * to be pushed - */ - public PUSH(ConstantPoolGen cp, Character value) { - this(cp, value.charValue()); - } - - /** - * @param cp - * Constant pool - * @param value - * to be pushed - */ - public PUSH(ConstantPoolGen cp, Boolean value) { - this(cp, value.booleanValue()); - } - - @Override - public final InstructionList getInstructionList() { - return new InstructionList(instruction); - } - - public final Instruction getInstruction() { - return instruction; - } - - /** - * @return mnemonic for instruction - */ - @Override - public String toString() { - return instruction.toString() + " (PUSH)"; - } -} diff --git a/src/org/apache/bcel/generic/PUTFIELD.java b/src/org/apache/bcel/generic/PUTFIELD.java deleted file mode 100644 index 392d954..0000000 --- a/src/org/apache/bcel/generic/PUTFIELD.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; - -/** - * PUTFIELD - Put field in object - * - *
      - * Stack: ..., objectref, value -> ...
      - * 
      - * - * OR - * - *
      - * Stack: ..., objectref, value.word1, value.word2 -> ...
      - * 
      - * - * @version $Id: PUTFIELD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class PUTFIELD extends FieldInstruction implements PopInstruction, - ExceptionThrower { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - PUTFIELD() { - } - - public PUTFIELD(int index) { - super(Constants.PUTFIELD, index); - } - - @Override - public int consumeStack(ConstantPoolGen cpg) { - return getFieldSize(cpg) + 1; - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, - 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitTypedInstruction(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitFieldInstruction(this); - v.visitPUTFIELD(this); - } -} diff --git a/src/org/apache/bcel/generic/PUTSTATIC.java b/src/org/apache/bcel/generic/PUTSTATIC.java deleted file mode 100644 index 9ab5689..0000000 --- a/src/org/apache/bcel/generic/PUTSTATIC.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; - -/** - * PUTSTATIC - Put static field in class - * - *
      - * Stack: ..., value -> ...
      - * 
      - * - * OR - * - *
      - * Stack: ..., value.word1, value.word2 -> ...
      - * 
      - * - * @version $Id: PUTSTATIC.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, - PopInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - PUTSTATIC() { - } - - public PUTSTATIC(int index) { - super(Constants.PUTSTATIC, index); - } - - @Override - public int consumeStack(ConstantPoolGen cpg) { - return getFieldSize(cpg); - } - - @Override - public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, - 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - return cs; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitTypedInstruction(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitFieldInstruction(this); - v.visitPUTSTATIC(this); - } -} diff --git a/src/org/apache/bcel/generic/PopInstruction.java b/src/org/apache/bcel/generic/PopInstruction.java deleted file mode 100644 index 209be34..0000000 --- a/src/org/apache/bcel/generic/PopInstruction.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denotes an unparameterized instruction to pop a value on top from the stack, - * such as ISTORE, POP, PUTSTATIC. - * - * @version $Id: PopInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see ISTORE - * @see POP - */ -public interface PopInstruction extends StackConsumer { -} diff --git a/src/org/apache/bcel/generic/PushInstruction.java b/src/org/apache/bcel/generic/PushInstruction.java deleted file mode 100644 index fc94439..0000000 --- a/src/org/apache/bcel/generic/PushInstruction.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denotes an unparameterized instruction to produce a value on top of the - * stack, such as ILOAD, LDC, SIPUSH, DUP, ICONST, etc. - * - * @version $Id: PushInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * - * @see ILOAD - * @see ICONST - * @see LDC - * @see DUP - * @see SIPUSH - * @see GETSTATIC - */ -public interface PushInstruction extends StackProducer { -} diff --git a/src/org/apache/bcel/generic/RET.java b/src/org/apache/bcel/generic/RET.java deleted file mode 100644 index 7e4d78a..0000000 --- a/src/org/apache/bcel/generic/RET.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * RET - Return from subroutine - * - *
      - * Stack: ... -> ...
      - * 
      - * - * @version $Id: RET.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class RET extends Instruction implements IndexedInstruction, - TypedInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - private boolean wide; - private int index; // index to local variable containg the return address - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - RET() { - } - - public RET(int index) { - super(org.apache.bcel.Constants.RET, (short) 2); - setIndex(index); // May set wide as side effect - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - if (wide) { - out.writeByte(org.apache.bcel.Constants.WIDE); - } - out.writeByte(opcode); - if (wide) { - out.writeShort(index); - } else { - out.writeByte(index); - } - } - - private final void setWide() { - wide = index > org.apache.bcel.Constants.MAX_BYTE; - if (wide) { - length = 4; // Including the wide byte - } else { - length = 2; - } - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - this.wide = wide; - if (wide) { - index = bytes.readUnsignedShort(); - length = 4; - } else { - index = bytes.readUnsignedByte(); - length = 2; - } - } - - /** - * @return index of local variable containg the return address - */ - @Override - public final int getIndex() { - return index; - } - - /** - * Set index of local variable containg the return address - */ - @Override - public final void setIndex(int n) { - if (n < 0) { - throw new ClassGenException("Negative index value: " + n); - } - index = n; - setWide(); - } - - /** - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - return super.toString(verbose) + " " + index; - } - - /** - * @return return address type - */ - @Override - public Type getType(ConstantPoolGen cp) { - return ReturnaddressType.NO_TARGET; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitRET(this); - } -} diff --git a/src/org/apache/bcel/generic/RETURN.java b/src/org/apache/bcel/generic/RETURN.java deleted file mode 100644 index e2dc937..0000000 --- a/src/org/apache/bcel/generic/RETURN.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * RETURN - Return from void method - * - *
      - * Stack: ... -> <empty>
      - * 
      - * - * @version $Id: RETURN.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class RETURN extends ReturnInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public RETURN() { - super(org.apache.bcel.Constants.RETURN); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitRETURN(this); - } -} diff --git a/src/org/apache/bcel/generic/ReferenceType.java b/src/org/apache/bcel/generic/ReferenceType.java deleted file mode 100644 index 8bb497a..0000000 --- a/src/org/apache/bcel/generic/ReferenceType.java +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; - -/** - * Super class for object and array types. - * - * @version $Id: ReferenceType.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class ReferenceType extends Type { - - /** - * - */ - private static final long serialVersionUID = 1L; - - protected ReferenceType(byte t, String s) { - super(t, s); - } - - /** - * Class is non-abstract but not instantiable from the outside - */ - ReferenceType() { - super(Constants.T_OBJECT, ""); - } - - /** - * Return true iff this type is castable to another type t as defined in the - * JVM specification. The case where this is Type.NULL is not defined (see - * the CHECKCAST definition in the JVM specification). However, because e.g. - * CHECKCAST doesn't throw a ClassCastException when casting a null - * reference to any Object, true is returned in this case. - * - * @throws ClassNotFoundException - * if any classes or interfaces required to determine assignment - * compatibility can't be found - */ - public boolean isCastableTo(Type t) throws ClassNotFoundException { - if (this.equals(Type.NULL)) { - return true; // If this is ever changed in isAssignmentCompatible() - } - return isAssignmentCompatibleWith(t); - /* - * Yes, it's true: It's the same definition. See vmspec2 AASTORE / - * CHECKCAST definitions. - */ - } - - /** - * Return true iff this is assignment compatible with another type t as - * defined in the JVM specification; see the AASTORE definition there. - * - * @throws ClassNotFoundException - * if any classes or interfaces required to determine assignment - * compatibility can't be found - */ - public boolean isAssignmentCompatibleWith(Type t) - throws ClassNotFoundException { - if (!(t instanceof ReferenceType)) { - return false; - } - ReferenceType T = (ReferenceType) t; - if (this.equals(Type.NULL)) { - return true; // This is not explicitely stated, but clear. Isn't it? - } - /* - * If this is a class type then - */ - if ((this instanceof ObjectType) - && (((ObjectType) this).referencesClassExact())) { - /* - * If T is a class type, then this must be the same class as T, or - * this must be a subclass of T; - */ - if ((T instanceof ObjectType) - && (((ObjectType) T).referencesClassExact())) { - if (this.equals(T)) { - return true; - } - if (Repository.instanceOf(((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) { - return true; - } - } - /* - * If T is an interface type, this must implement interface T. - */ - if ((T instanceof ObjectType) - && (((ObjectType) T).referencesInterfaceExact())) { - if (Repository.implementationOf( - ((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) { - return true; - } - } - } - /* - * If this is an interface type, then: - */ - if ((this instanceof ObjectType) - && (((ObjectType) this).referencesInterfaceExact())) { - /* - * If T is a class type, then T must be Object (2.4.7). - */ - if ((T instanceof ObjectType) - && (((ObjectType) T).referencesClassExact())) { - if (T.equals(Type.OBJECT)) { - return true; - } - } - /* - * If T is an interface type, then T must be the same interface as - * this or a superinterface of this (2.13.2). - */ - if ((T instanceof ObjectType) - && (((ObjectType) T).referencesInterfaceExact())) { - if (this.equals(T)) { - return true; - } - if (Repository.implementationOf( - ((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) { - return true; - } - } - } - /* - * If this is an array type, namely, the type SC[], that is, an array of - * components of type SC, then: - */ - if (this instanceof ArrayType) { - /* - * If T is a class type, then T must be Object (�2.4.7). - */ - if ((T instanceof ObjectType) - && (((ObjectType) T).referencesClassExact())) { - if (T.equals(Type.OBJECT)) { - return true; - } - } - /* - * If T is an array type TC[], that is, an array of components of - * type TC, then one of the following must be true: - */ - if (T instanceof ArrayType) { - /* - * TC and SC are the same primitive type (�2.4.1). - */ - Type sc = ((ArrayType) this).getElementType(); - Type tc = ((ArrayType) T).getElementType(); - if (sc instanceof BasicType && tc instanceof BasicType - && sc.equals(tc)) { - return true; - } - /* - * TC and SC are reference types (�2.4.6), and type SC is - * assignable to TC by these runtime rules. - */ - if (tc instanceof ReferenceType && sc instanceof ReferenceType - && ((ReferenceType) sc).isAssignmentCompatibleWith(tc)) { - return true; - } - } - /* - * If T is an interface type, T must be one of the interfaces - * implemented by arrays (�2.15). - */ - // TODO: Check if this is still valid or find a way to dynamically - // find out which - // interfaces arrays implement. However, as of the JVM specification - // edition 2, there - // are at least two different pages where assignment compatibility - // is defined and - // on one of them "interfaces implemented by arrays" is exchanged - // with "'Cloneable' or - // 'java.io.Serializable'" - if ((T instanceof ObjectType) - && (((ObjectType) T).referencesInterfaceExact())) { - for (int ii = 0; ii < Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS.length; ii++) { - if (T.equals(new ObjectType( - Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) { - return true; - } - } - } - } - return false; // default. - } - - /** - * This commutative operation returns the first common superclass (narrowest - * ReferenceType referencing a class, not an interface). If one of the types - * is a superclass of the other, the former is returned. If "this" is - * Type.NULL, then t is returned. If t is Type.NULL, then "this" is - * returned. If "this" equals t ['this.equals(t)'] "this" is returned. If - * "this" or t is an ArrayType, then Type.OBJECT is returned; unless their - * dimensions match. Then an ArrayType of the same number of dimensions is - * returned, with its basic type being the first common super class of the - * basic types of "this" and t. If "this" or t is a ReferenceType - * referencing an interface, then Type.OBJECT is returned. If not all of the - * two classes' superclasses cannot be found, "null" is returned. See the - * JVM specification edition 2, "�4.9.2 The Bytecode Verifier". - * - * @throws ClassNotFoundException - * on failure to find superclasses of this type, or the type - * passed as a parameter - */ - public ReferenceType getFirstCommonSuperclass(ReferenceType t) - throws ClassNotFoundException { - if (this.equals(Type.NULL)) { - return t; - } - if (t.equals(Type.NULL)) { - return this; - } - if (this.equals(t)) { - return this; - /* - * TODO: Above sounds a little arbitrary. On the other hand, there - * is no object referenced by Type.NULL so we can also say all the - * objects referenced by Type.NULL were derived from - * java.lang.Object. However, the Java Language's "instanceof" - * operator proves us wrong: "null" is not referring to an instance - * of java.lang.Object :) - */ - } - /* - * This code is from a bug report by Konstantin Shagin - * - */ - if ((this instanceof ArrayType) && (t instanceof ArrayType)) { - ArrayType arrType1 = (ArrayType) this; - ArrayType arrType2 = (ArrayType) t; - if ((arrType1.getDimensions() == arrType2.getDimensions()) - && arrType1.getBasicType() instanceof ObjectType - && arrType2.getBasicType() instanceof ObjectType) { - return new ArrayType( - ((ObjectType) arrType1.getBasicType()).getFirstCommonSuperclass((ObjectType) arrType2 - .getBasicType()), arrType1.getDimensions()); - } - } - if ((this instanceof ArrayType) || (t instanceof ArrayType)) { - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of - // every ArrayType? - } - if (((this instanceof ObjectType) && ((ObjectType) this) - .referencesInterfaceExact()) - || ((t instanceof ObjectType) && ((ObjectType) t) - .referencesInterfaceExact())) { - return Type.OBJECT; - // TODO: The above line is correct comparing to the vmspec2. But one - // could - // make class file verification a bit stronger here by using the - // notion of - // superinterfaces or even castability or assignment compatibility. - } - // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other - .getClassName()); - if ((thiz_sups == null) || (other_sups == null)) { - return null; - } - // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; - System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); - System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); - this_sups[0] = Repository.lookupClass(thiz.getClassName()); - t_sups[0] = Repository.lookupClass(other.getClassName()); - for (int i = 0; i < t_sups.length; i++) { - for (int j = 0; j < this_sups.length; j++) { - if (this_sups[j].equals(t_sups[i])) { - return new ObjectType(this_sups[j].getClassName()); - } - } - } - // Huh? Did you ask for Type.OBJECT's superclass?? - return null; - } - - /** - * This commutative operation returns the first common superclass (narrowest - * ReferenceType referencing a class, not an interface). If one of the types - * is a superclass of the other, the former is returned. If "this" is - * Type.NULL, then t is returned. If t is Type.NULL, then "this" is - * returned. If "this" equals t ['this.equals(t)'] "this" is returned. If - * "this" or t is an ArrayType, then Type.OBJECT is returned. If "this" or t - * is a ReferenceType referencing an interface, then Type.OBJECT is - * returned. If not all of the two classes' superclasses cannot be found, - * "null" is returned. See the JVM specification edition 2, - * "�4.9.2 The Bytecode Verifier". - * - * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has - * slightly changed semantics. - * @throws ClassNotFoundException - * on failure to find superclasses of this type, or the type - * passed as a parameter - */ - @Deprecated - public ReferenceType firstCommonSuperclass(ReferenceType t) - throws ClassNotFoundException { - if (this.equals(Type.NULL)) { - return t; - } - if (t.equals(Type.NULL)) { - return this; - } - if (this.equals(t)) { - return this; - /* - * TODO: Above sounds a little arbitrary. On the other hand, there - * is no object referenced by Type.NULL so we can also say all the - * objects referenced by Type.NULL were derived from - * java.lang.Object. However, the Java Language's "instanceof" - * operator proves us wrong: "null" is not referring to an instance - * of java.lang.Object :) - */ - } - if ((this instanceof ArrayType) || (t instanceof ArrayType)) { - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of - // every ArrayType? - } - if (((this instanceof ObjectType) && ((ObjectType) this) - .referencesInterface()) - || ((t instanceof ObjectType) && ((ObjectType) t) - .referencesInterface())) { - return Type.OBJECT; - // TODO: The above line is correct comparing to the vmspec2. But one - // could - // make class file verification a bit stronger here by using the - // notion of - // superinterfaces or even castability or assignment compatibility. - } - // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other - .getClassName()); - if ((thiz_sups == null) || (other_sups == null)) { - return null; - } - // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; - System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); - System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); - this_sups[0] = Repository.lookupClass(thiz.getClassName()); - t_sups[0] = Repository.lookupClass(other.getClassName()); - for (int i = 0; i < t_sups.length; i++) { - for (int j = 0; j < this_sups.length; j++) { - if (this_sups[j].equals(t_sups[i])) { - return new ObjectType(this_sups[j].getClassName()); - } - } - } - // Huh? Did you ask for Type.OBJECT's superclass?? - return null; - } -} diff --git a/src/org/apache/bcel/generic/ReturnInstruction.java b/src/org/apache/bcel/generic/ReturnInstruction.java deleted file mode 100644 index 509de9e..0000000 --- a/src/org/apache/bcel/generic/ReturnInstruction.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; - -/** - * Super class for the xRETURN family of instructions. - * - * @version $Id: ReturnInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class ReturnInstruction extends Instruction implements - ExceptionThrower, TypedInstruction, StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ReturnInstruction() { - } - - /** - * @param opcode - * of instruction - */ - protected ReturnInstruction(short opcode) { - super(opcode, (short) 1); - } - - public Type getType() { - switch (opcode) { - case Constants.IRETURN: - return Type.INT; - case Constants.LRETURN: - return Type.LONG; - case Constants.FRETURN: - return Type.FLOAT; - case Constants.DRETURN: - return Type.DOUBLE; - case Constants.ARETURN: - return Type.OBJECT; - case Constants.RETURN: - return Type.VOID; - default: // Never reached - throw new ClassGenException("Unknown type " + opcode); - } - } - - @Override - public Class[] getExceptions() { - return new Class[] { ExceptionConstants.ILLEGAL_MONITOR_STATE }; - } - - /** - * @return type associated with the instruction - */ - @Override - public Type getType(ConstantPoolGen cp) { - return getType(); - } -} diff --git a/src/org/apache/bcel/generic/ReturnaddressType.java b/src/org/apache/bcel/generic/ReturnaddressType.java deleted file mode 100644 index 8847ac8..0000000 --- a/src/org/apache/bcel/generic/ReturnaddressType.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import org.apache.bcel.Constants; - -/** - * Returnaddress, the type JSR or JSR_W instructions push upon the stack. - * - * see vmspec2 3.3.3 - * - * @version $Id: ReturnaddressType.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author Enver Haase - */ -public class ReturnaddressType extends Type { - - /** - * - */ - private static final long serialVersionUID = 1L; - public static final ReturnaddressType NO_TARGET = new ReturnaddressType(); - private InstructionHandle returnTarget; - - /** - * A Returnaddress [that doesn't know where to return to]. - */ - private ReturnaddressType() { - super(Constants.T_ADDRESS, ""); - } - - /** - * Creates a ReturnaddressType object with a target. - */ - public ReturnaddressType(InstructionHandle returnTarget) { - super(Constants.T_ADDRESS, ""); - this.returnTarget = returnTarget; - } - - /** - * @return a hash code value for the object. - */ - @Override - public int hashCode() { - if (returnTarget == null) { - return 0; - } - return returnTarget.hashCode(); - } - - /** - * Returns if the two Returnaddresses refer to the same target. - */ - @Override - public boolean equals(Object rat) { - if (!(rat instanceof ReturnaddressType)) { - return false; - } - ReturnaddressType that = (ReturnaddressType) rat; - if (this.returnTarget == null || that.returnTarget == null) { - return that.returnTarget == this.returnTarget; - } - return that.returnTarget.equals(this.returnTarget); - } - - /** - * @return the target of this ReturnaddressType - */ - public InstructionHandle getTarget() { - return returnTarget; - } -} diff --git a/src/org/apache/bcel/generic/SALOAD.java b/src/org/apache/bcel/generic/SALOAD.java deleted file mode 100644 index 1cdf688..0000000 --- a/src/org/apache/bcel/generic/SALOAD.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * SALOAD - Load short from array - * - *
      - * Stack: ..., arrayref, index -> ..., value
      - * 
      - * - * @version $Id: SALOAD.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class SALOAD extends ArrayInstruction implements StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public SALOAD() { - super(org.apache.bcel.Constants.SALOAD); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitSALOAD(this); - } -} diff --git a/src/org/apache/bcel/generic/SASTORE.java b/src/org/apache/bcel/generic/SASTORE.java deleted file mode 100644 index 2cab8c0..0000000 --- a/src/org/apache/bcel/generic/SASTORE.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * SASTORE - Store into short array - * - *
      - * Stack: ..., arrayref, index, value -> ...
      - * 
      - * - * @version $Id: SASTORE.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class SASTORE extends ArrayInstruction implements StackConsumer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public SASTORE() { - super(org.apache.bcel.Constants.SASTORE); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitSASTORE(this); - } -} diff --git a/src/org/apache/bcel/generic/SIPUSH.java b/src/org/apache/bcel/generic/SIPUSH.java deleted file mode 100644 index 6647d61..0000000 --- a/src/org/apache/bcel/generic/SIPUSH.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * SIPUSH - Push short - * - *
      - * Stack: ... -> ..., value
      - * 
      - * - * @version $Id: SIPUSH.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class SIPUSH extends Instruction implements ConstantPushInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - private short b; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - SIPUSH() { - } - - public SIPUSH(short b) { - super(org.apache.bcel.Constants.SIPUSH, (short) 3); - this.b = b; - } - - /** - * Dump instruction as short code to stream out. - */ - @Override - public void dump(DataOutputStream out) throws IOException { - super.dump(out); - out.writeShort(b); - } - - /** - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - return super.toString(verbose) + " " + b; - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - length = 3; - b = bytes.readShort(); - } - - @Override - public Number getValue() { - return new Integer(b); - } - - /** - * @return Type.SHORT - */ - @Override - public Type getType(ConstantPoolGen cp) { - return Type.SHORT; - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitSIPUSH(this); - } -} diff --git a/src/org/apache/bcel/generic/SWAP.java b/src/org/apache/bcel/generic/SWAP.java deleted file mode 100644 index ce28366..0000000 --- a/src/org/apache/bcel/generic/SWAP.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * SWAP - Swa top operand stack word - * - *
      - * Stack: ..., word2, word1 -> ..., word1, word2
      - * 
      - * - * @version $Id: SWAP.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class SWAP extends StackInstruction implements StackConsumer, - StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public SWAP() { - super(org.apache.bcel.Constants.SWAP); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitStackInstruction(this); - v.visitSWAP(this); - } -} diff --git a/src/org/apache/bcel/generic/SWITCH.java b/src/org/apache/bcel/generic/SWITCH.java deleted file mode 100644 index 3a8937f..0000000 --- a/src/org/apache/bcel/generic/SWITCH.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * SWITCH - Branch depending on int value, generates either LOOKUPSWITCH or - * TABLESWITCH instruction, depending on whether the match values (int[]) can be - * sorted with no gaps between the numbers. - * - * @version $Id: SWITCH.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class SWITCH implements CompoundInstruction { - - private int[] match; - private InstructionHandle[] targets; - private Select instruction; - private int match_length; - - /** - * Template for switch() constructs. If the match array can be sorted in - * ascending order with gaps no larger than max_gap between the numbers, a - * TABLESWITCH instruction is generated, and a LOOKUPSWITCH otherwise. The - * former may be more efficient, but needs more space. - * - * Note, that the key array always will be sorted, though we leave the - * original arrays unaltered. - * - * @param match - * array of match values (case 2: ... case 7: ..., etc.) - * @param targets - * the instructions to be branched to for each case - * @param target - * the default target - * @param max_gap - * maximum gap that may between case branches - */ - public SWITCH(int[] match, InstructionHandle[] targets, - InstructionHandle target, int max_gap) { - this.match = match.clone(); - this.targets = targets.clone(); - if ((match_length = match.length) < 2) { - instruction = new TABLESWITCH(match, targets, target); - } else { - sort(0, match_length - 1); - if (matchIsOrdered(max_gap)) { - fillup(max_gap, target); - instruction = new TABLESWITCH(this.match, this.targets, target); - } else { - instruction = new LOOKUPSWITCH(this.match, this.targets, target); - } - } - } - - public SWITCH(int[] match, InstructionHandle[] targets, - InstructionHandle target) { - this(match, targets, target, 1); - } - - private final void fillup(int max_gap, InstructionHandle target) { - int max_size = match_length + match_length * max_gap; - int[] m_vec = new int[max_size]; - InstructionHandle[] t_vec = new InstructionHandle[max_size]; - int count = 1; - m_vec[0] = match[0]; - t_vec[0] = targets[0]; - for (int i = 1; i < match_length; i++) { - int prev = match[i - 1]; - int gap = match[i] - prev; - for (int j = 1; j < gap; j++) { - m_vec[count] = prev + j; - t_vec[count] = target; - count++; - } - m_vec[count] = match[i]; - t_vec[count] = targets[i]; - count++; - } - match = new int[count]; - targets = new InstructionHandle[count]; - System.arraycopy(m_vec, 0, match, 0, count); - System.arraycopy(t_vec, 0, targets, 0, count); - } - - /** - * Sort match and targets array with QuickSort. - */ - private final void sort(int l, int r) { - int i = l, j = r; - int h, m = match[(l + r) / 2]; - InstructionHandle h2; - do { - while (match[i] < m) { - i++; - } - while (m < match[j]) { - j--; - } - if (i <= j) { - h = match[i]; - match[i] = match[j]; - match[j] = h; // Swap elements - h2 = targets[i]; - targets[i] = targets[j]; - targets[j] = h2; // Swap instructions, too - i++; - j--; - } - } while (i <= j); - if (l < j) { - sort(l, j); - } - if (i < r) { - sort(i, r); - } - } - - /** - * @return match is sorted in ascending order with no gap bigger than - * max_gap? - */ - private final boolean matchIsOrdered(int max_gap) { - for (int i = 1; i < match_length; i++) { - if (match[i] - match[i - 1] > max_gap) { - return false; - } - } - return true; - } - - @Override - public final InstructionList getInstructionList() { - return new InstructionList(instruction); - } - - public final Instruction getInstruction() { - return instruction; - } -} diff --git a/src/org/apache/bcel/generic/Select.java b/src/org/apache/bcel/generic/Select.java deleted file mode 100644 index 19213d4..0000000 --- a/src/org/apache/bcel/generic/Select.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * Select - Abstract super class for LOOKUPSWITCH and TABLESWITCH instructions. - * - *

      - * We use our super's target property as the default target. - * - * @version $Id: Select.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see LOOKUPSWITCH - * @see TABLESWITCH - * @see InstructionList - */ -public abstract class Select extends BranchInstruction implements - VariableLengthInstruction, StackProducer { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected int[] match; // matches, i.e., case 1: ... - protected int[] indices; // target offsets - protected InstructionHandle[] targets; // target objects in instruction list - protected int fixed_length; // fixed length defined by subclasses - protected int match_length; // number of cases - protected int padding = 0; // number of pad bytes for alignment - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - Select() { - } - - /** - * (Match, target) pairs for switch. `Match' and `targets' must have the - * same length of course. - * - * @param match - * array of matching values - * @param targets - * instruction targets - * @param defaultTarget - * default instruction target - */ - Select(short opcode, int[] match, InstructionHandle[] targets, - InstructionHandle defaultTarget) { - super(opcode, defaultTarget); - this.targets = targets; - for (int i = 0; i < targets.length; i++) { - notifyTarget(null, targets[i], this); - } - this.match = match; - if ((match_length = match.length) != targets.length) { - throw new ClassGenException( - "Match and target array have not the same length"); - } - indices = new int[match_length]; - } - - /** - * Since this is a variable length instruction, it may shift the following - * instructions which then need to update their position. - * - * Called by InstructionList.setPositions when setting the position for - * every instruction. In the presence of variable length instructions - * `setPositions' performs multiple passes over the instruction list to - * calculate the correct (byte) positions and offsets by calling this - * function. - * - * @param offset - * additional offset caused by preceding (variable length) - * instructions - * @param max_offset - * the maximum offset that may be caused by these instructions - * @return additional offset caused by possible change of this instruction's - * length - */ - @Override - protected int updatePosition(int offset, int max_offset) { - position += offset; // Additional offset caused by preceding SWITCHs, - // GOTOs, etc. - short old_length = length; - /* - * Alignment on 4-byte-boundary, + 1, because of tag byte. - */ - padding = (4 - ((position + 1) % 4)) % 4; - length = (short) (fixed_length + padding); // Update length - return length - old_length; - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - for (int i = 0; i < padding; i++) { - out.writeByte(0); - } - index = getTargetOffset(); // Write default target offset - out.writeInt(index); - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - padding = (4 - (bytes.getIndex() % 4)) % 4; // Compute number of pad - // bytes - for (int i = 0; i < padding; i++) { - bytes.readByte(); - } - // Default branch target common for both cases (TABLESWITCH, - // LOOKUPSWITCH) - index = bytes.readInt(); - } - - /** - * @return mnemonic for instruction - */ - @Override - public String toString(boolean verbose) { - StringBuffer buf = new StringBuffer(super.toString(verbose)); - if (verbose) { - for (int i = 0; i < match_length; i++) { - String s = "null"; - if (targets[i] != null) { - s = targets[i].getInstruction().toString(); - } - buf.append("(").append(match[i]).append(", ").append(s) - .append(" = {").append(indices[i]).append("})"); - } - } else { - buf.append(" ..."); - } - return buf.toString(); - } - - /** - * Set branch target for `i'th case - */ - public void setTarget(int i, InstructionHandle target) { - notifyTarget(targets[i], target, this); - targets[i] = target; - } - - /** - * @param old_ih - * old target - * @param new_ih - * new target - */ - @Override - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - boolean targeted = false; - if (target == old_ih) { - targeted = true; - setTarget(new_ih); - } - for (int i = 0; i < targets.length; i++) { - if (targets[i] == old_ih) { - targeted = true; - setTarget(i, new_ih); - } - } - if (!targeted) { - throw new ClassGenException("Not targeting " + old_ih); - } - } - - /** - * @return true, if ih is target of this instruction - */ - @Override - public boolean containsTarget(InstructionHandle ih) { - if (target == ih) { - return true; - } - for (int i = 0; i < targets.length; i++) { - if (targets[i] == ih) { - return true; - } - } - return false; - } - - @Override - protected Object clone() throws CloneNotSupportedException { - Select copy = (Select) super.clone(); - copy.match = match.clone(); - copy.indices = indices.clone(); - copy.targets = targets.clone(); - return copy; - } - - /** - * Inform targets that they're not targeted anymore. - */ - @Override - void dispose() { - super.dispose(); - for (int i = 0; i < targets.length; i++) { - targets[i].removeTargeter(this); - } - } - - /** - * @return array of match indices - */ - public int[] getMatchs() { - return match; - } - - /** - * @return array of match target offsets - */ - public int[] getIndices() { - return indices; - } - - /** - * @return array of match targets - */ - public InstructionHandle[] getTargets() { - return targets; - } -} diff --git a/src/org/apache/bcel/generic/StackConsumer.java b/src/org/apache/bcel/generic/StackConsumer.java deleted file mode 100644 index e1460ad..0000000 --- a/src/org/apache/bcel/generic/StackConsumer.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denote an instruction that may consume a value from the stack. - * - * @version $Id: StackConsumer.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface StackConsumer { - - /** - * @return how many words are consumed from stack - */ - public int consumeStack(ConstantPoolGen cpg); -} diff --git a/src/org/apache/bcel/generic/StackInstruction.java b/src/org/apache/bcel/generic/StackInstruction.java deleted file mode 100644 index 277bffd..0000000 --- a/src/org/apache/bcel/generic/StackInstruction.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Super class for stack operations like DUP and POP. - * - * @version $Id: StackInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class StackInstruction extends Instruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - StackInstruction() { - } - - /** - * @param opcode - * instruction opcode - */ - protected StackInstruction(short opcode) { - super(opcode, (short) 1); - } - - /** - * @return Type.UNKNOWN - */ - public Type getType(ConstantPoolGen cp) { - return Type.UNKNOWN; - } -} diff --git a/src/org/apache/bcel/generic/StackProducer.java b/src/org/apache/bcel/generic/StackProducer.java deleted file mode 100644 index 783b3d4..0000000 --- a/src/org/apache/bcel/generic/StackProducer.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denote an instruction that may produce a value on top of the stack (this - * excludes DUP_X1, e.g.) - * - * @version $Id: StackProducer.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface StackProducer { - - /** - * @return how many words are produced on stack - */ - public int produceStack(ConstantPoolGen cpg); -} diff --git a/src/org/apache/bcel/generic/StoreInstruction.java b/src/org/apache/bcel/generic/StoreInstruction.java deleted file mode 100644 index 1b3ae70..0000000 --- a/src/org/apache/bcel/generic/StoreInstruction.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denotes an unparameterized instruction to store a value into a local - * variable, e.g. ISTORE. - * - * @version $Id: StoreInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public abstract class StoreInstruction extends LocalVariableInstruction - implements PopInstruction { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. tag and length - * are defined in readInstruction and initFromFile, respectively. - */ - StoreInstruction(short canon_tag, short c_tag) { - super(canon_tag, c_tag); - } - - /** - * @param opcode - * Instruction opcode - * @param c_tag - * Instruction number for compact version, ASTORE_0, e.g. - * @param n - * local variable index (unsigned short) - */ - protected StoreInstruction(short opcode, short c_tag, int n) { - super(opcode, c_tag, n); - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitTypedInstruction(this); - v.visitLocalVariableInstruction(this); - v.visitStoreInstruction(this); - } -} diff --git a/src/org/apache/bcel/generic/TABLESWITCH.java b/src/org/apache/bcel/generic/TABLESWITCH.java deleted file mode 100644 index eb0677c..0000000 --- a/src/org/apache/bcel/generic/TABLESWITCH.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.io.DataOutputStream; -import java.io.IOException; -import org.apache.bcel.util.ByteSequence; - -/** - * TABLESWITCH - Switch within given range of values, i.e., low..high - * - * @version $Id: TABLESWITCH.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @see SWITCH - */ -public class TABLESWITCH extends Select { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - TABLESWITCH() { - } - - /** - * @param match - * sorted array of match values, match[0] must be low value, - * match[match_length - 1] high value - * @param targets - * where to branch for matched values - * @param defaultTarget - * default branch - */ - public TABLESWITCH(int[] match, InstructionHandle[] targets, - InstructionHandle defaultTarget) { - super(org.apache.bcel.Constants.TABLESWITCH, match, targets, - defaultTarget); - length = (short) (13 + match_length * 4); /* - * Alignment remainder assumed 0 - * here, until dump time - */ - fixed_length = length; - } - - /** - * Dump instruction as byte code to stream out. - * - * @param out - * Output stream - */ - @Override - public void dump(DataOutputStream out) throws IOException { - super.dump(out); - int low = (match_length > 0) ? match[0] : 0; - out.writeInt(low); - int high = (match_length > 0) ? match[match_length - 1] : 0; - out.writeInt(high); - for (int i = 0; i < match_length; i++) { - out.writeInt(indices[i] = getTargetOffset(targets[i])); - } - } - - /** - * Read needed data (e.g. index) from file. - */ - @Override - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException { - super.initFromFile(bytes, wide); - int low = bytes.readInt(); - int high = bytes.readInt(); - match_length = high - low + 1; - fixed_length = (short) (13 + match_length * 4); - length = (short) (fixed_length + padding); - match = new int[match_length]; - indices = new int[match_length]; - targets = new InstructionHandle[match_length]; - for (int i = low; i <= high; i++) { - match[i - low] = i; - } - for (int i = 0; i < match_length; i++) { - indices[i] = bytes.readInt(); - } - } - - /** - * 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 v - * Visitor object - */ - @Override - public void accept(Visitor v) { - v.visitVariableLengthInstruction(this); - v.visitStackProducer(this); - v.visitBranchInstruction(this); - v.visitSelect(this); - v.visitTABLESWITCH(this); - } -} diff --git a/src/org/apache/bcel/generic/TargetLostException.java b/src/org/apache/bcel/generic/TargetLostException.java deleted file mode 100644 index 42d00b6..0000000 --- a/src/org/apache/bcel/generic/TargetLostException.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Thrown by InstructionList.remove() when one or multiple disposed instruction - * are still being referenced by a InstructionTargeter object. I.e. the - * InstructionTargeter has to be notified that (one of) the InstructionHandle it - * is referencing is being removed from the InstructionList and thus not valid - * anymore. - * - * Making this an exception instead of a return value forces the user to handle - * these case explicitely in a try { ... } catch. The following code illustrates - * how this may be done: - * - *

      - *     ...
      - *     try {
      - * il.delete(start_ih, end_ih);
      - *     } catch(TargetLostException e) {
      - *       InstructionHandle[] targets = e.getTargets();
      - *  for(int i=0; i < targets.length; i++) {
      - *    InstructionTargeter[] targeters = targets[i].getTargeters();
      - *     
      - *    for(int j=0; j < targeters.length; j++)
      - *      targeters[j].updateTarget(targets[i], new_target);
      - *       }
      - *     }
      - * 
      - * - * @see InstructionHandle - * @see InstructionList - * @see InstructionTargeter - * @version $Id: TargetLostException.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class TargetLostException extends Exception { - - /** - * - */ - private static final long serialVersionUID = 1L; - private InstructionHandle[] targets; - - TargetLostException(InstructionHandle[] t, String mesg) { - super(mesg); - targets = t; - } - - /** - * @return list of instructions still being targeted. - */ - public InstructionHandle[] getTargets() { - return targets; - } -} diff --git a/src/org/apache/bcel/generic/Type.java b/src/org/apache/bcel/generic/Type.java deleted file mode 100644 index 5cd5ad7..0000000 --- a/src/org/apache/bcel/generic/Type.java +++ /dev/null @@ -1,340 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.ClassFormatException; -import org.apache.bcel.classfile.Utility; - -/** - * Abstract super class for all possible java types, namely basic types such as - * int, object types like String and array types, e.g. int[] - * - * @version $Id: Type.java 393344 2006-04-12 00:38:34Z tcurdt $ - * @author M. Dahm - */ -public abstract class Type implements java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected byte type; - protected String signature; // signature for the type - /** - * Predefined constants - */ - public static final BasicType VOID = new BasicType(Constants.T_VOID); - public static final BasicType BOOLEAN = new BasicType(Constants.T_BOOLEAN); - public static final BasicType INT = new BasicType(Constants.T_INT); - public static final BasicType SHORT = new BasicType(Constants.T_SHORT); - public static final BasicType BYTE = new BasicType(Constants.T_BYTE); - public static final BasicType LONG = new BasicType(Constants.T_LONG); - public static final BasicType DOUBLE = new BasicType(Constants.T_DOUBLE); - public static final BasicType FLOAT = new BasicType(Constants.T_FLOAT); - public static final BasicType CHAR = new BasicType(Constants.T_CHAR); - public static final ObjectType OBJECT = new ObjectType("java.lang.Object"); - public static final ObjectType CLASS = new ObjectType("java.lang.Class"); - public static final ObjectType STRING = new ObjectType("java.lang.String"); - public static final ObjectType STRINGBUFFER = new ObjectType( - "java.lang.StringBuffer"); - public static final ObjectType THROWABLE = new ObjectType( - "java.lang.Throwable"); - public static final Type[] NO_ARGS = new Type[0]; - public static final ReferenceType NULL = new ReferenceType() { - - /** - * - */ - private static final long serialVersionUID = 1L; - }; - public static final Type UNKNOWN = new Type(Constants.T_UNKNOWN, - "") { - - /** - * - */ - private static final long serialVersionUID = 1L; - }; - - protected Type(byte t, String s) { - type = t; - signature = s; - } - - /** - * @return hashcode of Type - */ - @Override - public int hashCode() { - return type ^ signature.hashCode(); - } - - /** - * @return whether the Types are equal - */ - @Override - public boolean equals(Object o) { - if (o instanceof Type) { - Type t = (Type) o; - return (type == t.type) && signature.equals(t.signature); - } - return false; - } - - /** - * @return signature for given type. - */ - public String getSignature() { - return signature; - } - - /** - * @return type as defined in Constants - */ - public byte getType() { - return type; - } - - /** - * @return stack size of this type (2 for long and double, 0 for void, 1 - * otherwise) - */ - public int getSize() { - switch (type) { - case Constants.T_DOUBLE: - case Constants.T_LONG: - return 2; - case Constants.T_VOID: - return 0; - default: - return 1; - } - } - - /** - * @return Type string, e.g. `int[]' - */ - @Override - public String toString() { - return ((this.equals(Type.NULL) || (type >= Constants.T_UNKNOWN))) ? signature - : Utility.signatureToString(signature, false); - } - - /** - * Convert type to Java method signature, e.g. int[] f(java.lang.String x) - * becomes (Ljava/lang/String;)[I - * - * @param return_type - * what the method returns - * @param arg_types - * what are the argument types - * @return method signature for given type(s). - */ - public static String getMethodSignature(Type return_type, Type[] arg_types) { - StringBuffer buf = new StringBuffer("("); - int length = (arg_types == null) ? 0 : arg_types.length; - for (int i = 0; i < length; i++) { - buf.append(arg_types[i].getSignature()); - } - buf.append(')'); - buf.append(return_type.getSignature()); - return buf.toString(); - } - - private static ThreadLocal consumed_chars = new ThreadLocal() { - - @Override - protected Integer initialValue() { - return new Integer(0); - } - };// int consumed_chars=0; // Remember position in string, see - // getArgumentTypes - - private static int unwrap(ThreadLocal tl) { - return tl.get().intValue(); - } - - private static void wrap(ThreadLocal tl, int value) { - tl.set(new Integer(value)); - } - - /** - * Convert signature to a Type object. - * - * @param signature - * signature string such as Ljava/lang/String; - * @return type object - */ - public static final Type getType(String signature) - throws StringIndexOutOfBoundsException { - byte type = Utility.typeOfSignature(signature); - if (type <= Constants.T_VOID) { - // corrected concurrent private static field acess - wrap(consumed_chars, 1); - return BasicType.getType(type); - } else if (type == Constants.T_ARRAY) { - int dim = 0; - do { // Count dimensions - dim++; - } while (signature.charAt(dim) == '['); - // Recurse, but just once, if the signature is ok - Type t = getType(signature.substring(dim)); - // corrected concurrent private static field acess - // consumed_chars += dim; // update counter - is replaced by - int _temp = unwrap(consumed_chars) + dim; - wrap(consumed_chars, _temp); - return new ArrayType(t, dim); - } else { // type == T_REFERENCE - int index = signature.indexOf(';'); // Look for closing `;' - if (index < 0) { - throw new ClassFormatException("Invalid signature: " - + signature); - } - // corrected concurrent private static field acess - wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are - // removed - return new ObjectType(signature.substring(1, index).replace('/', - '.')); - } - } - - /** - * Convert return value of a method (signature) to a Type object. - * - * @param signature - * signature string such as (Ljava/lang/String;)V - * @return return type - */ - public static Type getReturnType(String signature) { - try { - // Read return type after `)' - int index = signature.lastIndexOf(')') + 1; - return getType(signature.substring(index)); - } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " - + signature); - } - } - - /** - * Convert arguments of a method (signature) to an array of Type objects. - * - * @param signature - * signature string such as (Ljava/lang/String;)V - * @return array of argument types - */ - public static Type[] getArgumentTypes(String signature) { - List vec = new ArrayList(); - int index; - Type[] types; - try { // Read all declarations between for `(' and `)' - if (signature.charAt(0) != '(') { - throw new ClassFormatException("Invalid method signature: " - + signature); - } - index = 1; // current string position - while (signature.charAt(index) != ')') { - vec.add(getType(signature.substring(index))); - // corrected concurrent private static field acess - index += unwrap(consumed_chars); // update position - } - } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " - + signature); - } - types = new Type[vec.size()]; - vec.toArray(types); - return types; - } - - /** - * Convert runtime java.lang.Class to BCEL Type object. - * - * @param cl - * Java class - * @return corresponding Type object - */ - public static Type getType(java.lang.Class cl) { - if (cl == null) { - throw new IllegalArgumentException("Class must not be null"); - } - /* - * That's an amzingly easy case, because getName() returns the - * signature. That's what we would have liked anyway. - */ - if (cl.isArray()) { - return getType(cl.getName()); - } else if (cl.isPrimitive()) { - if (cl == Integer.TYPE) { - return INT; - } else if (cl == Void.TYPE) { - return VOID; - } else if (cl == Double.TYPE) { - return DOUBLE; - } else if (cl == Float.TYPE) { - return FLOAT; - } else if (cl == Boolean.TYPE) { - return BOOLEAN; - } else if (cl == Byte.TYPE) { - return BYTE; - } else if (cl == Short.TYPE) { - return SHORT; - } else if (cl == Byte.TYPE) { - return BYTE; - } else if (cl == Long.TYPE) { - return LONG; - } else if (cl == Character.TYPE) { - return CHAR; - } else { - throw new IllegalStateException( - "Ooops, what primitive type is " + cl); - } - } else { // "Real" class - return new ObjectType(cl.getName()); - } - } - - /** - * Convert runtime java.lang.Class[] to BCEL Type objects. - * - * @param classes - * an array of runtime class objects - * @return array of corresponding Type objects - */ - public static Type[] getTypes(java.lang.Class[] classes) { - Type[] ret = new Type[classes.length]; - for (int i = 0; i < ret.length; i++) { - ret[i] = getType(classes[i]); - } - return ret; - } - - public static String getSignature(java.lang.reflect.Method meth) { - StringBuffer sb = new StringBuffer("("); - Class[] params = meth.getParameterTypes(); // avoid clone - for (int j = 0; j < params.length; j++) { - sb.append(getType(params[j]).getSignature()); - } - sb.append(")"); - sb.append(getType(meth.getReturnType()).getSignature()); - return sb.toString(); - } -} diff --git a/src/org/apache/bcel/generic/TypedInstruction.java b/src/org/apache/bcel/generic/TypedInstruction.java deleted file mode 100644 index 98d0e43..0000000 --- a/src/org/apache/bcel/generic/TypedInstruction.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Get the type associated with an instruction, int for ILOAD, or the type of - * the field of a PUTFIELD instruction, e.g.. - * - * @version $Id: TypedInstruction.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface TypedInstruction { - - public Type getType(ConstantPoolGen cpg); -} diff --git a/src/org/apache/bcel/generic/UnconditionalBranch.java b/src/org/apache/bcel/generic/UnconditionalBranch.java deleted file mode 100644 index 74266b7..0000000 --- a/src/org/apache/bcel/generic/UnconditionalBranch.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denotes an instruction to perform an unconditional branch, i.e., GOTO, JSR. - * - * @version $Id: UnconditionalBranch.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * - * @see GOTO - * @see JSR - */ -public interface UnconditionalBranch { -} diff --git a/src/org/apache/bcel/generic/VariableLengthInstruction.java b/src/org/apache/bcel/generic/VariableLengthInstruction.java deleted file mode 100644 index f05aa29..0000000 --- a/src/org/apache/bcel/generic/VariableLengthInstruction.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Denotes an instruction to be a variable length instruction, such as GOTO, - * JSR, LOOKUPSWITCH and TABLESWITCH. - * - * @version $Id: VariableLengthInstruction.java 386056 2006-03-15 11:31:56Z - * tcurdt $ - * @author M. Dahm - * - * @see GOTO - * @see JSR - * @see LOOKUPSWITCH - * @see TABLESWITCH - */ -public interface VariableLengthInstruction { -} diff --git a/src/org/apache/bcel/generic/Visitor.java b/src/org/apache/bcel/generic/Visitor.java deleted file mode 100644 index e2588e2..0000000 --- a/src/org/apache/bcel/generic/Visitor.java +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.generic; - -/** - * Interface implementing the Visitor pattern programming style. I.e., a class - * that implements this interface can handle all types of instructions with the - * properly typed methods just by calling the accept() method. - * - * @version $Id: Visitor.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public interface Visitor { - - public void visitStackInstruction(StackInstruction obj); - - public void visitLocalVariableInstruction(LocalVariableInstruction obj); - - public void visitBranchInstruction(BranchInstruction obj); - - public void visitLoadClass(LoadClass obj); - - public void visitFieldInstruction(FieldInstruction obj); - - public void visitIfInstruction(IfInstruction obj); - - public void visitConversionInstruction(ConversionInstruction obj); - - public void visitPopInstruction(PopInstruction obj); - - public void visitStoreInstruction(StoreInstruction obj); - - public void visitTypedInstruction(TypedInstruction obj); - - public void visitSelect(Select obj); - - public void visitJsrInstruction(JsrInstruction obj); - - public void visitGotoInstruction(GotoInstruction obj); - - public void visitUnconditionalBranch(UnconditionalBranch obj); - - public void visitPushInstruction(PushInstruction obj); - - public void visitArithmeticInstruction(ArithmeticInstruction obj); - - public void visitCPInstruction(CPInstruction obj); - - public void visitInvokeInstruction(InvokeInstruction obj); - - public void visitArrayInstruction(ArrayInstruction obj); - - public void visitAllocationInstruction(AllocationInstruction obj); - - public void visitReturnInstruction(ReturnInstruction obj); - - public void visitFieldOrMethod(FieldOrMethod obj); - - public void visitConstantPushInstruction(ConstantPushInstruction obj); - - public void visitExceptionThrower(ExceptionThrower obj); - - public void visitLoadInstruction(LoadInstruction obj); - - public void visitVariableLengthInstruction(VariableLengthInstruction obj); - - public void visitStackProducer(StackProducer obj); - - public void visitStackConsumer(StackConsumer obj); - - public void visitACONST_NULL(ACONST_NULL obj); - - public void visitGETSTATIC(GETSTATIC obj); - - public void visitIF_ICMPLT(IF_ICMPLT obj); - - public void visitMONITOREXIT(MONITOREXIT obj); - - public void visitIFLT(IFLT obj); - - public void visitLSTORE(LSTORE obj); - - public void visitPOP2(POP2 obj); - - public void visitBASTORE(BASTORE obj); - - public void visitISTORE(ISTORE obj); - - public void visitCHECKCAST(CHECKCAST obj); - - public void visitFCMPG(FCMPG obj); - - public void visitI2F(I2F obj); - - public void visitATHROW(ATHROW obj); - - public void visitDCMPL(DCMPL obj); - - public void visitARRAYLENGTH(ARRAYLENGTH obj); - - public void visitDUP(DUP obj); - - public void visitINVOKESTATIC(INVOKESTATIC obj); - - public void visitLCONST(LCONST obj); - - public void visitDREM(DREM obj); - - public void visitIFGE(IFGE obj); - - public void visitCALOAD(CALOAD obj); - - public void visitLASTORE(LASTORE obj); - - public void visitI2D(I2D obj); - - public void visitDADD(DADD obj); - - public void visitINVOKESPECIAL(INVOKESPECIAL obj); - - public void visitIAND(IAND obj); - - public void visitPUTFIELD(PUTFIELD obj); - - public void visitILOAD(ILOAD obj); - - public void visitDLOAD(DLOAD obj); - - public void visitDCONST(DCONST obj); - - public void visitNEW(NEW obj); - - public void visitIFNULL(IFNULL obj); - - public void visitLSUB(LSUB obj); - - public void visitL2I(L2I obj); - - public void visitISHR(ISHR obj); - - public void visitTABLESWITCH(TABLESWITCH obj); - - public void visitIINC(IINC obj); - - public void visitDRETURN(DRETURN obj); - - public void visitFSTORE(FSTORE obj); - - public void visitDASTORE(DASTORE obj); - - public void visitIALOAD(IALOAD obj); - - public void visitDDIV(DDIV obj); - - public void visitIF_ICMPGE(IF_ICMPGE obj); - - public void visitLAND(LAND obj); - - public void visitIDIV(IDIV obj); - - public void visitLOR(LOR obj); - - public void visitCASTORE(CASTORE obj); - - public void visitFREM(FREM obj); - - public void visitLDC(LDC obj); - - public void visitBIPUSH(BIPUSH obj); - - public void visitDSTORE(DSTORE obj); - - public void visitF2L(F2L obj); - - public void visitFMUL(FMUL obj); - - public void visitLLOAD(LLOAD obj); - - public void visitJSR(JSR obj); - - public void visitFSUB(FSUB obj); - - public void visitSASTORE(SASTORE obj); - - public void visitALOAD(ALOAD obj); - - public void visitDUP2_X2(DUP2_X2 obj); - - public void visitRETURN(RETURN obj); - - public void visitDALOAD(DALOAD obj); - - public void visitSIPUSH(SIPUSH obj); - - public void visitDSUB(DSUB obj); - - public void visitL2F(L2F obj); - - public void visitIF_ICMPGT(IF_ICMPGT obj); - - public void visitF2D(F2D obj); - - public void visitI2L(I2L obj); - - public void visitIF_ACMPNE(IF_ACMPNE obj); - - public void visitPOP(POP obj); - - public void visitI2S(I2S obj); - - public void visitIFEQ(IFEQ obj); - - public void visitSWAP(SWAP obj); - - public void visitIOR(IOR obj); - - public void visitIREM(IREM obj); - - public void visitIASTORE(IASTORE obj); - - public void visitNEWARRAY(NEWARRAY obj); - - public void visitINVOKEINTERFACE(INVOKEINTERFACE obj); - - public void visitINEG(INEG obj); - - public void visitLCMP(LCMP obj); - - public void visitJSR_W(JSR_W obj); - - public void visitMULTIANEWARRAY(MULTIANEWARRAY obj); - - public void visitDUP_X2(DUP_X2 obj); - - public void visitSALOAD(SALOAD obj); - - public void visitIFNONNULL(IFNONNULL obj); - - public void visitDMUL(DMUL obj); - - public void visitIFNE(IFNE obj); - - public void visitIF_ICMPLE(IF_ICMPLE obj); - - public void visitLDC2_W(LDC2_W obj); - - public void visitGETFIELD(GETFIELD obj); - - public void visitLADD(LADD obj); - - public void visitNOP(NOP obj); - - public void visitFALOAD(FALOAD obj); - - public void visitINSTANCEOF(INSTANCEOF obj); - - public void visitIFLE(IFLE obj); - - public void visitLXOR(LXOR obj); - - public void visitLRETURN(LRETURN obj); - - public void visitFCONST(FCONST obj); - - public void visitIUSHR(IUSHR obj); - - public void visitBALOAD(BALOAD obj); - - public void visitDUP2(DUP2 obj); - - public void visitIF_ACMPEQ(IF_ACMPEQ obj); - - public void visitIMPDEP1(IMPDEP1 obj); - - public void visitMONITORENTER(MONITORENTER obj); - - public void visitLSHL(LSHL obj); - - public void visitDCMPG(DCMPG obj); - - public void visitD2L(D2L obj); - - public void visitIMPDEP2(IMPDEP2 obj); - - public void visitL2D(L2D obj); - - public void visitRET(RET obj); - - public void visitIFGT(IFGT obj); - - public void visitIXOR(IXOR obj); - - public void visitINVOKEVIRTUAL(INVOKEVIRTUAL obj); - - public void visitFASTORE(FASTORE obj); - - public void visitIRETURN(IRETURN obj); - - public void visitIF_ICMPNE(IF_ICMPNE obj); - - public void visitFLOAD(FLOAD obj); - - public void visitLDIV(LDIV obj); - - public void visitPUTSTATIC(PUTSTATIC obj); - - public void visitAALOAD(AALOAD obj); - - public void visitD2I(D2I obj); - - public void visitIF_ICMPEQ(IF_ICMPEQ obj); - - public void visitAASTORE(AASTORE obj); - - public void visitARETURN(ARETURN obj); - - public void visitDUP2_X1(DUP2_X1 obj); - - public void visitFNEG(FNEG obj); - - public void visitGOTO_W(GOTO_W obj); - - public void visitD2F(D2F obj); - - public void visitGOTO(GOTO obj); - - public void visitISUB(ISUB obj); - - public void visitF2I(F2I obj); - - public void visitDNEG(DNEG obj); - - public void visitICONST(ICONST obj); - - public void visitFDIV(FDIV obj); - - public void visitI2B(I2B obj); - - public void visitLNEG(LNEG obj); - - public void visitLREM(LREM obj); - - public void visitIMUL(IMUL obj); - - public void visitIADD(IADD obj); - - public void visitLSHR(LSHR obj); - - public void visitLOOKUPSWITCH(LOOKUPSWITCH obj); - - public void visitDUP_X1(DUP_X1 obj); - - public void visitFCMPL(FCMPL obj); - - public void visitI2C(I2C obj); - - public void visitLMUL(LMUL obj); - - public void visitLUSHR(LUSHR obj); - - public void visitISHL(ISHL obj); - - public void visitLALOAD(LALOAD obj); - - public void visitASTORE(ASTORE obj); - - public void visitANEWARRAY(ANEWARRAY obj); - - public void visitFRETURN(FRETURN obj); - - public void visitFADD(FADD obj); - - public void visitBREAKPOINT(BREAKPOINT obj); -} diff --git a/src/org/apache/bcel/generic/package.html b/src/org/apache/bcel/generic/package.html deleted file mode 100644 index 201d573..0000000 --- a/src/org/apache/bcel/generic/package.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

      -This package contains the "generic" part of the -Byte Code Engineering -Library, i.e., classes to dynamically modify class objects and -byte code instructions. -

      - - diff --git a/src/org/apache/bcel/package.html b/src/org/apache/bcel/package.html deleted file mode 100644 index aaded50..0000000 --- a/src/org/apache/bcel/package.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - -

      -This package contains basic classes for the -Byte Code Engineering Library - and constants defined by the - - JVM specification. -

      - - diff --git a/src/org/apache/bcel/util/BCELComparator.java b/src/org/apache/bcel/util/BCELComparator.java deleted file mode 100644 index 89770c1..0000000 --- a/src/org/apache/bcel/util/BCELComparator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.util; - -/** - * Used for BCEL comparison strategy - * - * @author M. Dahm - * @version $Id: BCELComparator.java 410087 2006-05-29 12:12:19Z tcurdt $ - * @since 5.2 - */ -public interface BCELComparator { - - /** - * Compare two objects and return what THIS.equals(THAT) should return - * - * @param THIS - * @param THAT - * @return true if and only if THIS equals THAT - */ - public boolean equals(Object THIS, Object THAT); - - /** - * Return hashcode for THIS.hashCode() - * - * @param THIS - * @return hashcode for THIS.hashCode() - */ - public int hashCode(Object THIS); -} diff --git a/src/org/apache/bcel/util/BCELFactory.java b/src/org/apache/bcel/util/BCELFactory.java deleted file mode 100644 index ea52018..0000000 --- a/src/org/apache/bcel/util/BCELFactory.java +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.util; - -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.generic.AllocationInstruction; -import org.apache.bcel.generic.ArrayInstruction; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.BranchHandle; -import org.apache.bcel.generic.BranchInstruction; -import org.apache.bcel.generic.CHECKCAST; -import org.apache.bcel.generic.CPInstruction; -import org.apache.bcel.generic.CodeExceptionGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ConstantPushInstruction; -import org.apache.bcel.generic.EmptyVisitor; -import org.apache.bcel.generic.FieldInstruction; -import org.apache.bcel.generic.IINC; -import org.apache.bcel.generic.INSTANCEOF; -import org.apache.bcel.generic.Instruction; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InvokeInstruction; -import org.apache.bcel.generic.LDC; -import org.apache.bcel.generic.LDC2_W; -import org.apache.bcel.generic.LocalVariableInstruction; -import org.apache.bcel.generic.MULTIANEWARRAY; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.NEWARRAY; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.RET; -import org.apache.bcel.generic.ReturnInstruction; -import org.apache.bcel.generic.Select; -import org.apache.bcel.generic.Type; - -/** - * Factory creates il.append() statements, and sets instruction targets. A - * helper class for BCELifier. - * - * @see BCELifier - * @version $Id: BCELFactory.java 410087 2006-05-29 12:12:19Z tcurdt $ - * @author M. Dahm - */ -class BCELFactory extends EmptyVisitor { - - private MethodGen _mg; - private PrintWriter _out; - private ConstantPoolGen _cp; - - BCELFactory(MethodGen mg, PrintWriter out) { - _mg = mg; - _cp = mg.getConstantPool(); - _out = out; - } - - private Map branch_map = new HashMap(); // Map - - public void start() { - if (!_mg.isAbstract() && !_mg.isNative()) { - for (InstructionHandle ih = _mg.getInstructionList().getStart(); ih != null; ih = ih - .getNext()) { - Instruction i = ih.getInstruction(); - if (i instanceof BranchInstruction) { - branch_map.put(i, ih); // memorize container - } - if (ih.hasTargeters()) { - if (i instanceof BranchInstruction) { - _out.println(" InstructionHandle ih_" - + ih.getPosition() + ";"); - } else { - _out.print(" InstructionHandle ih_" - + ih.getPosition() + " = "); - } - } else { - _out.print(" "); - } - if (!visitInstruction(i)) { - i.accept(this); - } - } - updateBranchTargets(); - updateExceptionHandlers(); - } - } - - private boolean visitInstruction(Instruction i) { - short opcode = i.getOpcode(); - if ((InstructionConstants.INSTRUCTIONS[opcode] != null) - && !(i instanceof ConstantPushInstruction) - && !(i instanceof ReturnInstruction)) { // Handled below - _out.println("il.append(InstructionConstants." - + i.getName().toUpperCase(Locale.ENGLISH) + ");"); - return true; - } - return false; - } - - @Override - public void visitLocalVariableInstruction(LocalVariableInstruction i) { - short opcode = i.getOpcode(); - Type type = i.getType(_cp); - if (opcode == Constants.IINC) { - _out.println("il.append(new IINC(" + i.getIndex() + ", " - + ((IINC) i).getIncrement() + "));"); - } else { - String kind = (opcode < Constants.ISTORE) ? "Load" : "Store"; - _out.println("il.append(_factory.create" + kind + "(" - + BCELifier.printType(type) + ", " + i.getIndex() + "));"); - } - } - - @Override - public void visitArrayInstruction(ArrayInstruction i) { - short opcode = i.getOpcode(); - Type type = i.getType(_cp); - String kind = (opcode < Constants.IASTORE) ? "Load" : "Store"; - _out.println("il.append(_factory.createArray" + kind + "(" - + BCELifier.printType(type) + "));"); - } - - @Override - public void visitFieldInstruction(FieldInstruction i) { - short opcode = i.getOpcode(); - String class_name = i.getClassName(_cp); - String field_name = i.getFieldName(_cp); - Type type = i.getFieldType(_cp); - _out.println("il.append(_factory.createFieldAccess(\"" + class_name - + "\", \"" + field_name + "\", " + BCELifier.printType(type) - + ", " + "Constants." - + Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH) - + "));"); - } - - @Override - public void visitInvokeInstruction(InvokeInstruction i) { - short opcode = i.getOpcode(); - String class_name = i.getClassName(_cp); - String method_name = i.getMethodName(_cp); - Type type = i.getReturnType(_cp); - Type[] arg_types = i.getArgumentTypes(_cp); - _out.println("il.append(_factory.createInvoke(\"" + class_name - + "\", \"" + method_name + "\", " + BCELifier.printType(type) - + ", " + BCELifier.printArgumentTypes(arg_types) + ", " - + "Constants." - + Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH) - + "));"); - } - - @Override - public void visitAllocationInstruction(AllocationInstruction i) { - Type type; - if (i instanceof CPInstruction) { - type = ((CPInstruction) i).getType(_cp); - } else { - type = ((NEWARRAY) i).getType(); - } - short opcode = ((Instruction) i).getOpcode(); - int dim = 1; - switch (opcode) { - case Constants.NEW: - _out.println("il.append(_factory.createNew(\"" - + ((ObjectType) type).getClassName() + "\"));"); - break; - case Constants.MULTIANEWARRAY: - dim = ((MULTIANEWARRAY) i).getDimensions(); - case Constants.ANEWARRAY: - case Constants.NEWARRAY: - if (type instanceof ArrayType) { - type = ((ArrayType) type).getBasicType(); - } - _out.println("il.append(_factory.createNewArray(" - + BCELifier.printType(type) + ", (short) " + dim + "));"); - break; - default: - throw new RuntimeException("Oops: " + opcode); - } - } - - private void createConstant(Object value) { - String embed = value.toString(); - if (value instanceof String) { - embed = '"' + Utility.convertString(value.toString()) + '"'; - } else if (value instanceof Character) { - embed = "(char)0x" - + Integer.toHexString(((Character) value).charValue()); - } - _out.println("il.append(new PUSH(_cp, " + embed + "));"); - } - - @Override - public void visitLDC(LDC i) { - createConstant(i.getValue(_cp)); - } - - @Override - public void visitLDC2_W(LDC2_W i) { - createConstant(i.getValue(_cp)); - } - - @Override - public void visitConstantPushInstruction(ConstantPushInstruction i) { - createConstant(i.getValue()); - } - - @Override - public void visitINSTANCEOF(INSTANCEOF i) { - Type type = i.getType(_cp); - _out.println("il.append(new INSTANCEOF(_cp.addClass(" - + BCELifier.printType(type) + ")));"); - } - - @Override - public void visitCHECKCAST(CHECKCAST i) { - Type type = i.getType(_cp); - _out.println("il.append(_factory.createCheckCast(" - + BCELifier.printType(type) + "));"); - } - - @Override - public void visitReturnInstruction(ReturnInstruction i) { - Type type = i.getType(_cp); - _out.println("il.append(_factory.createReturn(" - + BCELifier.printType(type) + "));"); - } - - // Memorize BranchInstructions that need an update - private List branches = new ArrayList(); - - @Override - public void visitBranchInstruction(BranchInstruction bi) { - BranchHandle bh = (BranchHandle) branch_map.get(bi); - int pos = bh.getPosition(); - String name = bi.getName() + "_" + pos; - if (bi instanceof Select) { - Select s = (Select) bi; - branches.add(bi); - StringBuffer args = new StringBuffer("new int[] { "); - int[] matchs = s.getMatchs(); - for (int i = 0; i < matchs.length; i++) { - args.append(matchs[i]); - if (i < matchs.length - 1) { - args.append(", "); - } - } - args.append(" }"); - _out.print("Select " + name + " = new " - + bi.getName().toUpperCase(Locale.ENGLISH) + "(" + args - + ", new InstructionHandle[] { "); - for (int i = 0; i < matchs.length; i++) { - _out.print("null"); - if (i < matchs.length - 1) { - _out.print(", "); - } - } - _out.println(" }, null);"); - } else { - int t_pos = bh.getTarget().getPosition(); - String target; - if (pos > t_pos) { - target = "ih_" + t_pos; - } else { - branches.add(bi); - target = "null"; - } - _out.println(" BranchInstruction " + name - + " = _factory.createBranchInstruction(" + "Constants." - + bi.getName().toUpperCase(Locale.ENGLISH) + ", " + target - + ");"); - } - if (bh.hasTargeters()) { - _out.println(" ih_" + pos + " = il.append(" + name + ");"); - } else { - _out.println(" il.append(" + name + ");"); - } - } - - @Override - public void visitRET(RET i) { - _out.println("il.append(new RET(" + i.getIndex() + ")));"); - } - - private void updateBranchTargets() { - for (Iterator i = branches.iterator(); i.hasNext();) { - BranchInstruction bi = i.next(); - BranchHandle bh = (BranchHandle) branch_map.get(bi); - int pos = bh.getPosition(); - String name = bi.getName() + "_" + pos; - int t_pos = bh.getTarget().getPosition(); - _out.println(" " + name + ".setTarget(ih_" + t_pos + ");"); - if (bi instanceof Select) { - InstructionHandle[] ihs = ((Select) bi).getTargets(); - for (int j = 0; j < ihs.length; j++) { - t_pos = ihs[j].getPosition(); - _out.println(" " + name + ".setTarget(" + j + ", ih_" - + t_pos + ");"); - } - } - } - } - - private void updateExceptionHandlers() { - CodeExceptionGen[] handlers = _mg.getExceptionHandlers(); - for (int i = 0; i < handlers.length; i++) { - CodeExceptionGen h = handlers[i]; - String type = (h.getCatchType() == null) ? "null" : BCELifier - .printType(h.getCatchType()); - _out.println(" method.addExceptionHandler(" + "ih_" - + h.getStartPC().getPosition() + ", " + "ih_" - + h.getEndPC().getPosition() + ", " + "ih_" - + h.getHandlerPC().getPosition() + ", " + type + ");"); - } - } -} diff --git a/src/org/apache/bcel/util/BCELifier.java b/src/org/apache/bcel/util/BCELifier.java deleted file mode 100644 index a10b5da..0000000 --- a/src/org/apache/bcel/util/BCELifier.java +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.util; - -import java.io.OutputStream; -import java.io.PrintWriter; -import java.util.Locale; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.Type; - -/** - * This class takes a given JavaClass object and converts it to a Java program - * that creates that very class using BCEL. This gives new users of BCEL a - * useful example showing how things are done with BCEL. It does not cover all - * features of BCEL, but tries to mimic hand-written code as close as possible. - * - * @version $Id: BCELifier.java 394939 2006-04-18 13:23:49Z tcurdt $ - * @author M. Dahm - */ -public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { - - private static final int FLAG_FOR_UNKNOWN = -1; - private static final int FLAG_FOR_CLASS = 0; - private static final int FLAG_FOR_METHOD = 1; - private JavaClass _clazz; - private PrintWriter _out; - private ConstantPoolGen _cp; - - /** - * @param clazz - * Java class to "decompile" - * @param out - * where to output Java program - */ - public BCELifier(JavaClass clazz, OutputStream out) { - _clazz = clazz; - _out = new PrintWriter(out); - _cp = new ConstantPoolGen(_clazz.getConstantPool()); - } - - /** - * Start Java code generation - */ - public void start() { - visitJavaClass(_clazz); - _out.flush(); - } - - @Override - public void visitJavaClass(JavaClass clazz) { - String class_name = clazz.getClassName(); - String super_name = clazz.getSuperclassName(); - String package_name = clazz.getPackageName(); - String inter = Utility.printArray(clazz.getInterfaceNames(), false, - true); - if (!"".equals(package_name)) { - class_name = class_name.substring(package_name.length() + 1); - _out.println("package " + package_name + ";"); - _out.println(); - } - _out.println("import org.apache.bcel.generic.*;"); - _out.println("import org.apache.bcel.classfile.*;"); - _out.println("import org.apache.bcel.*;"); - _out.println("import java.io.*;"); - _out.println(); - _out.println("public class " + class_name - + "Creator implements Constants {"); - _out.println(" private InstructionFactory _factory;"); - _out.println(" private ConstantPoolGen _cp;"); - _out.println(" private ClassGen _cg;"); - _out.println(); - _out.println(" public " + class_name + "Creator() {"); - _out.println(" _cg = new ClassGen(\"" - + (("".equals(package_name)) ? class_name : package_name + "." - + class_name) + "\", \"" + super_name + "\", " + "\"" - + clazz.getSourceFileName() + "\", " - + printFlags(clazz.getAccessFlags(), FLAG_FOR_CLASS) + ", " - + "new String[] { " + inter + " });"); - _out.println(); - _out.println(" _cp = _cg.getConstantPool();"); - _out.println(" _factory = new InstructionFactory(_cg, _cp);"); - _out.println(" }"); - _out.println(); - printCreate(); - Field[] fields = clazz.getFields(); - if (fields.length > 0) { - _out.println(" private void createFields() {"); - _out.println(" FieldGen field;"); - for (int i = 0; i < fields.length; i++) { - fields[i].accept(this); - } - _out.println(" }"); - _out.println(); - } - Method[] methods = clazz.getMethods(); - for (int i = 0; i < methods.length; i++) { - _out.println(" private void createMethod_" + i + "() {"); - methods[i].accept(this); - _out.println(" }"); - _out.println(); - } - printMain(); - _out.println("}"); - } - - private void printCreate() { - _out.println(" public void create(OutputStream out) throws IOException {"); - Field[] fields = _clazz.getFields(); - if (fields.length > 0) { - _out.println(" createFields();"); - } - Method[] methods = _clazz.getMethods(); - for (int i = 0; i < methods.length; i++) { - _out.println(" createMethod_" + i + "();"); - } - _out.println(" _cg.getJavaClass().dump(out);"); - _out.println(" }"); - _out.println(); - } - - private void printMain() { - String class_name = _clazz.getClassName(); - _out.println(" public static void main(String[] args) throws Exception {"); - _out.println(" " + class_name + "Creator creator = new " - + class_name + "Creator();"); - _out.println(" creator.create(new FileOutputStream(\"" + class_name - + ".class\"));"); - _out.println(" }"); - } - - @Override - public void visitField(Field field) { - _out.println(); - _out.println(" field = new FieldGen(" - + printFlags(field.getAccessFlags()) + ", " - + printType(field.getSignature()) + ", \"" + field.getName() - + "\", _cp);"); - ConstantValue cv = field.getConstantValue(); - if (cv != null) { - String value = cv.toString(); - _out.println(" field.setInitValue(" + value + ")"); - } - _out.println(" _cg.addField(field.getField());"); - } - - @Override - public void visitMethod(Method method) { - MethodGen mg = new MethodGen(method, _clazz.getClassName(), _cp); - Type result_type = mg.getReturnType(); - Type[] arg_types = mg.getArgumentTypes(); - _out.println(" InstructionList il = new InstructionList();"); - _out.println(" MethodGen method = new MethodGen(" - + printFlags(method.getAccessFlags(), FLAG_FOR_METHOD) + ", " - + printType(result_type) + ", " + printArgumentTypes(arg_types) - + ", " + "new String[] { " - + Utility.printArray(mg.getArgumentNames(), false, true) - + " }, \"" + method.getName() + "\", \"" - + _clazz.getClassName() + "\", il, _cp);"); - _out.println(); - BCELFactory factory = new BCELFactory(mg, _out); - factory.start(); - _out.println(" method.setMaxStack();"); - _out.println(" method.setMaxLocals();"); - _out.println(" _cg.addMethod(method.getMethod());"); - _out.println(" il.dispose();"); - } - - static String printFlags(int flags) { - return printFlags(flags, FLAG_FOR_UNKNOWN); - } - - static String printFlags(int flags, int reason) { - if (flags == 0) { - return "0"; - } - StringBuffer buf = new StringBuffer(); - for (int i = 0, pow = 1; pow <= Constants.MAX_ACC_FLAG; i++) { - if ((flags & pow) != 0) { - if ((pow == Constants.ACC_SYNCHRONIZED) - && (reason == FLAG_FOR_CLASS)) { - buf.append("ACC_SUPER | "); - } else if ((pow == Constants.ACC_VOLATILE) - && (reason == FLAG_FOR_METHOD)) { - buf.append("ACC_BRIDGE | "); - } else if ((pow == Constants.ACC_TRANSIENT) - && (reason == FLAG_FOR_METHOD)) { - buf.append("ACC_VARARGS | "); - } else { - buf.append("ACC_") - .append(Constants.ACCESS_NAMES[i] - .toUpperCase(Locale.ENGLISH)).append(" | "); - } - } - pow <<= 1; - } - String str = buf.toString(); - return str.substring(0, str.length() - 3); - } - - static String printArgumentTypes(Type[] arg_types) { - if (arg_types.length == 0) { - return "Type.NO_ARGS"; - } - StringBuffer args = new StringBuffer(); - for (int i = 0; i < arg_types.length; i++) { - args.append(printType(arg_types[i])); - if (i < arg_types.length - 1) { - args.append(", "); - } - } - return "new Type[] { " + args.toString() + " }"; - } - - static String printType(Type type) { - return printType(type.getSignature()); - } - - static String printType(String signature) { - Type type = Type.getType(signature); - byte t = type.getType(); - if (t <= Constants.T_VOID) { - return "Type." - + Constants.TYPE_NAMES[t].toUpperCase(Locale.ENGLISH); - } else if (type.toString().equals("java.lang.String")) { - return "Type.STRING"; - } else if (type.toString().equals("java.lang.Object")) { - return "Type.OBJECT"; - } else if (type.toString().equals("java.lang.StringBuffer")) { - return "Type.STRINGBUFFER"; - } else if (type instanceof ArrayType) { - ArrayType at = (ArrayType) type; - return "new ArrayType(" + printType(at.getBasicType()) + ", " - + at.getDimensions() + ")"; - } else { - return "new ObjectType(\"" - + Utility.signatureToString(signature, false) + "\")"; - } - } - - /** - * Default main method - */ - public static void main(String[] argv) throws Exception { - JavaClass java_class; - String name = argv[0]; - if ((java_class = Repository.lookupClass(name)) == null) { - java_class = new ClassParser(name).parse(); // May throw IOException - } - BCELifier bcelifier = new BCELifier(java_class, System.out); - bcelifier.start(); - } -} diff --git a/src/org/apache/bcel/util/ByteSequence.java b/src/org/apache/bcel/util/ByteSequence.java deleted file mode 100644 index 918827d..0000000 --- a/src/org/apache/bcel/util/ByteSequence.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.util; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; - -/** - * Utility class that implements a sequence of bytes which can be read via the - * `readByte()' method. This is used to implement a wrapper for the Java byte - * code stream to gain some more readability. - * - * @version $Id: ByteSequence.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public final class ByteSequence extends DataInputStream { - - private ByteArrayStream byte_stream; - - public ByteSequence(byte[] bytes) { - super(new ByteArrayStream(bytes)); - byte_stream = (ByteArrayStream) in; - } - - public final int getIndex() { - return byte_stream.getPosition(); - } - - final void unreadByte() { - byte_stream.unreadByte(); - } - - private static final class ByteArrayStream extends ByteArrayInputStream { - - ByteArrayStream(byte[] bytes) { - super(bytes); - } - - final int getPosition() { - return pos; - } // is protected in ByteArrayInputStream - - final void unreadByte() { - if (pos > 0) { - pos--; - } - } - } -} diff --git a/src/org/apache/bcel/util/ClassPath.java b/src/org/apache/bcel/util/ClassPath.java deleted file mode 100644 index 76c42b2..0000000 --- a/src/org/apache/bcel/util/ClassPath.java +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.util; - -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.StringTokenizer; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -/** - * Responsible for loading (class) files from the CLASSPATH. Inspired by - * sun.tools.ClassPath. - * - * @version $Id: ClassPath.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ClassPath implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); - private PathEntry[] paths; - private String class_path; - - /** - * Search for classes in given path. - */ - public ClassPath(String class_path) { - this.class_path = class_path; - List vec = new ArrayList(); - for (StringTokenizer tok = new StringTokenizer(class_path, - System.getProperty("path.separator")); tok.hasMoreTokens();) { - String path = tok.nextToken(); - if (!path.equals("")) { - File file = new File(path); - try { - if (file.exists()) { - if (file.isDirectory()) { - vec.add(new Dir(path)); - } else { - vec.add(new Zip(new ZipFile(file))); - } - } - } catch (IOException e) { - System.err - .println("CLASSPATH component " + file + ": " + e); - } - } - } - paths = new PathEntry[vec.size()]; - vec.toArray(paths); - } - - /** - * Search for classes in CLASSPATH. - * - * @deprecated Use SYSTEM_CLASS_PATH constant - */ - @Deprecated - public ClassPath() { - this(getClassPath()); - } - - /** - * @return used class path string - */ - @Override - public String toString() { - return class_path; - } - - @Override - public int hashCode() { - return class_path.hashCode(); - } - - @Override - public boolean equals(Object o) { - if (o instanceof ClassPath) { - return class_path.equals(((ClassPath) o).class_path); - } - return false; - } - - private static final void getPathComponents(String path, List list) { - if (path != null) { - StringTokenizer tok = new StringTokenizer(path, File.pathSeparator); - while (tok.hasMoreTokens()) { - String name = tok.nextToken(); - File file = new File(name); - if (file.exists()) { - list.add(name); - } - } - } - } - - /** - * Checks for class path components in the following properties: - * "java.class.path", "sun.boot.class.path", "java.ext.dirs" - * - * @return class path as used by default by BCEL - */ - public static final String getClassPath() { - String class_path = System.getProperty("java.class.path"); - String boot_path = System.getProperty("sun.boot.class.path"); - String ext_path = System.getProperty("java.ext.dirs"); - List list = new ArrayList(); - getPathComponents(class_path, list); - getPathComponents(boot_path, list); - List dirs = new ArrayList(); - getPathComponents(ext_path, dirs); - for (Iterator e = dirs.iterator(); e.hasNext();) { - File ext_dir = new File(e.next()); - String[] extensions = ext_dir.list(new FilenameFilter() { - - @Override - public boolean accept(File dir, String name) { - name = name.toLowerCase(Locale.ENGLISH); - return name.endsWith(".zip") || name.endsWith(".jar"); - } - }); - if (extensions != null) { - for (int i = 0; i < extensions.length; i++) { - list.add(ext_dir.getPath() + File.separatorChar - + extensions[i]); - } - } - } - StringBuffer buf = new StringBuffer(); - for (Iterator e = list.iterator(); e.hasNext();) { - buf.append(e.next()); - if (e.hasNext()) { - buf.append(File.pathSeparatorChar); - } - } - return buf.toString().intern(); - } - - /** - * @param name - * fully qualified class name, e.g. java.lang.String - * @return input stream for class - */ - public InputStream getInputStream(String name) throws IOException { - return getInputStream(name.replace('.', '/'), ".class"); - } - - /** - * Return stream for class or resource on CLASSPATH. - * - * @param name - * fully qualified file name, e.g. java/lang/String - * @param suffix - * file name ends with suff, e.g. .java - * @return input stream for file on class path - */ - public InputStream getInputStream(String name, String suffix) - throws IOException { - InputStream is = null; - try { - is = getClass().getClassLoader().getResourceAsStream(name + suffix); - } catch (Exception e) { - } - if (is != null) { - return is; - } - return getClassFile(name, suffix).getInputStream(); - } - - /** - * @param name - * fully qualified file name, e.g. java/lang/String - * @param suffix - * file name ends with suff, e.g. .java - * @return class file for the java class - */ - public ClassFile getClassFile(String name, String suffix) - throws IOException { - for (int i = 0; i < paths.length; i++) { - ClassFile cf; - if ((cf = paths[i].getClassFile(name, suffix)) != null) { - return cf; - } - } - throw new IOException("Couldn't find: " + name + suffix); - } - - /** - * @param name - * fully qualified class name, e.g. java.lang.String - * @return input stream for class - */ - public ClassFile getClassFile(String name) throws IOException { - return getClassFile(name, ".class"); - } - - /** - * @param name - * fully qualified file name, e.g. java/lang/String - * @param suffix - * file name ends with suffix, e.g. .java - * @return byte array for file on class path - */ - public byte[] getBytes(String name, String suffix) throws IOException { - DataInputStream dis = null; - try { - InputStream is = getInputStream(name, suffix); - if (is == null) { - throw new IOException("Couldn't find: " + name + suffix); - } - dis = new DataInputStream(is); - byte[] bytes = new byte[is.available()]; - dis.readFully(bytes); - return bytes; - } finally { - if (dis != null) { - dis.close(); - } - } - } - - /** - * @return byte array for class - */ - public byte[] getBytes(String name) throws IOException { - return getBytes(name, ".class"); - } - - /** - * @param name - * name of file to search for, e.g. java/lang/String.java - * @return full (canonical) path for file - */ - public String getPath(String name) throws IOException { - int index = name.lastIndexOf('.'); - String suffix = ""; - if (index > 0) { - suffix = name.substring(index); - name = name.substring(0, index); - } - return getPath(name, suffix); - } - - /** - * @param name - * name of file to search for, e.g. java/lang/String - * @param suffix - * file name suffix, e.g. .java - * @return full (canonical) path for file, if it exists - */ - public String getPath(String name, String suffix) throws IOException { - return getClassFile(name, suffix).getPath(); - } - - private static abstract class PathEntry implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - abstract ClassFile getClassFile(String name, String suffix) - throws IOException; - } - - /** - * Contains information about file/ZIP entry of the Java class. - */ - public interface ClassFile { - - /** - * @return input stream for class file. - */ - public abstract InputStream getInputStream() throws IOException; - - /** - * @return canonical path to class file. - */ - public abstract String getPath(); - - /** - * @return base path of found class, i.e. class is contained relative to - * that path, which may either denote a directory, or zip file - */ - public abstract String getBase(); - - /** - * @return modification time of class file. - */ - public abstract long getTime(); - - /** - * @return size of class file. - */ - public abstract long getSize(); - } - - private static class Dir extends PathEntry { - - /** - * - */ - private static final long serialVersionUID = 1L; - private String dir; - - Dir(String d) { - dir = d; - } - - @Override - ClassFile getClassFile(String name, String suffix) throws IOException { - final File file = new File(dir + File.separatorChar - + name.replace('.', File.separatorChar) + suffix); - return file.exists() ? new ClassFile() { - - @Override - public InputStream getInputStream() throws IOException { - return new FileInputStream(file); - } - - @Override - public String getPath() { - try { - return file.getCanonicalPath(); - } catch (IOException e) { - return null; - } - } - - @Override - public long getTime() { - return file.lastModified(); - } - - @Override - public long getSize() { - return file.length(); - } - - @Override - public String getBase() { - return dir; - } - } : null; - } - - @Override - public String toString() { - return dir; - } - } - - private static class Zip extends PathEntry { - - /** - * - */ - private static final long serialVersionUID = 1L; - private ZipFile zip; - - Zip(ZipFile z) { - zip = z; - } - - @Override - ClassFile getClassFile(String name, String suffix) throws IOException { - final ZipEntry entry = zip - .getEntry(name.replace('.', '/') + suffix); - return (entry != null) ? new ClassFile() { - - @Override - public InputStream getInputStream() throws IOException { - return zip.getInputStream(entry); - } - - @Override - public String getPath() { - return entry.toString(); - } - - @Override - public long getTime() { - return entry.getTime(); - } - - @Override - public long getSize() { - return entry.getSize(); - } - - @Override - public String getBase() { - return zip.getName(); - } - } : null; - } - } -} diff --git a/src/org/apache/bcel/util/ClassQueue.java b/src/org/apache/bcel/util/ClassQueue.java deleted file mode 100644 index 8b761a4..0000000 --- a/src/org/apache/bcel/util/ClassQueue.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.util; - -import java.util.LinkedList; -import org.apache.bcel.classfile.JavaClass; - -/** - * Utility class implementing a (typesafe) queue of JavaClass objects. - * - * @version $Id: ClassQueue.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - */ -public class ClassQueue implements java.io.Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected LinkedList vec = new LinkedList(); - - public void enqueue(JavaClass clazz) { - vec.addLast(clazz); - } - - public JavaClass dequeue() { - return vec.removeFirst(); - } - - public boolean empty() { - return vec.isEmpty(); - } - - @Override - public String toString() { - return vec.toString(); - } -} diff --git a/src/org/apache/bcel/util/Repository.java b/src/org/apache/bcel/util/Repository.java deleted file mode 100644 index 3d33a7c..0000000 --- a/src/org/apache/bcel/util/Repository.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.util; - -import org.apache.bcel.classfile.JavaClass; - -/** - * Abstract definition of a class repository. Instances may be used to load - * classes from different sources and may be used in the - * Repository.setRepository method. - * - * @see org.apache.bcel.Repository - * @version $Id: Repository.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @author David Dixon-Peugh - */ -public interface Repository extends java.io.Serializable { - - /** - * Store the provided class under "clazz.getClassName()" - */ - public void storeClass(JavaClass clazz); - - /** - * Remove class from repository - */ - public void removeClass(JavaClass clazz); - - /** - * Find the class with the name provided, if the class isn't there, return - * NULL. - */ - public JavaClass findClass(String className); - - /** - * Find the class with the name provided, if the class isn't there, make an - * attempt to load it. - */ - public JavaClass loadClass(String className) - throws java.lang.ClassNotFoundException; - - /** - * Find the JavaClass instance for the given run-time class object - */ - public JavaClass loadClass(Class clazz) - throws java.lang.ClassNotFoundException; - - /** - * Clear all entries from cache. - */ - public void clear(); - - /** - * Get the ClassPath associated with this Repository - */ - public ClassPath getClassPath(); -} diff --git a/src/org/apache/bcel/util/SyntheticRepository.java b/src/org/apache/bcel/util/SyntheticRepository.java deleted file mode 100644 index 784fa05..0000000 --- a/src/org/apache/bcel/util/SyntheticRepository.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.util; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.ref.SoftReference; -import java.util.HashMap; -import java.util.Map; - -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.JavaClass; - -/** - * This repository is used in situations where a Class is created outside the - * realm of a ClassLoader. Classes are loaded from the file systems using the - * paths specified in the given class path. By default, this is the value - * returned by ClassPath.getClassPath().
      - * It is designed to be used as a singleton, however it can also be used with - * custom classpaths. - * - * /** Abstract definition of a class repository. Instances may be used to load - * classes from different sources and may be used in the - * Repository.setRepository method. - * - * @see org.apache.bcel.Repository - * - * @version $Id: SyntheticRepository.java 386056 2006-03-15 11:31:56Z tcurdt $ - * @author M. Dahm - * @author David Dixon-Peugh - */ -public class SyntheticRepository implements Repository { - - /** - * - */ - private static final long serialVersionUID = 1L; - private static Map _instances = new HashMap(); // CLASSPATH - // X - // REPOSITORY - private ClassPath _path = null; - private Map> _loadedClasses = new HashMap>(); // CLASSNAME - // X - // JAVACLASS - - private SyntheticRepository(ClassPath path) { - _path = path; - } - - public static SyntheticRepository getInstance() { - return getInstance(ClassPath.SYSTEM_CLASS_PATH); - } - - public static SyntheticRepository getInstance(ClassPath classPath) { - SyntheticRepository rep = _instances.get(classPath); - if (rep == null) { - rep = new SyntheticRepository(classPath); - _instances.put(classPath, rep); - } - return rep; - } - - /** - * Store a new JavaClass instance into this Repository. - */ - @Override - public void storeClass(JavaClass clazz) { - _loadedClasses.put(clazz.getClassName(), new SoftReference( - clazz)); - clazz.setRepository(this); - } - - /** - * Remove class from repository - */ - @Override - public void removeClass(JavaClass clazz) { - _loadedClasses.remove(clazz.getClassName()); - } - - /** - * Find an already defined (cached) JavaClass object by name. - */ - @Override - public JavaClass findClass(String className) { - SoftReference ref = _loadedClasses.get(className); - if (ref == null) { - return null; - } - return (JavaClass) ref.get(); - } - - /** - * Find a JavaClass object by name. If it is already in this Repository, the - * Repository version is returned. Otherwise, the Repository's classpath is - * searched for the class (and it is added to the Repository if found). - * - * @param className - * the name of the class - * @return the JavaClass object - * @throws ClassNotFoundException - * if the class is not in the Repository, and could not be found - * on the classpath - */ - @Override - public JavaClass loadClass(String className) throws ClassNotFoundException { - if (className == null || className.equals("")) { - throw new IllegalArgumentException("Invalid class name " - + className); - } - className = className.replace('/', '.'); // Just in case, canonical form - JavaClass clazz = findClass(className); - if (clazz != null) { - return clazz; - } - try { - return loadClass(_path.getInputStream(className), className); - } catch (IOException e) { - throw new ClassNotFoundException( - "Exception while looking for class " + className + ": " - + e.toString()); - } - } - - /** - * Find the JavaClass object for a runtime Class object. If a class with the - * same name is already in this Repository, the Repository version is - * returned. Otherwise, getResourceAsStream() is called on the Class object - * to find the class's representation. If the representation is found, it is - * added to the Repository. - * - * @see Class - * @param clazz - * the runtime Class object - * @return JavaClass object for given runtime class - * @throws ClassNotFoundException - * if the class is not in the Repository, and its representation - * could not be found - */ - @Override - public JavaClass loadClass(Class clazz) throws ClassNotFoundException { - String className = clazz.getName(); - JavaClass repositoryClass = findClass(className); - if (repositoryClass != null) { - return repositoryClass; - } - String name = className; - int i = name.lastIndexOf('.'); - if (i > 0) { - name = name.substring(i + 1); - } - return loadClass(clazz.getResourceAsStream(name + ".class"), className); - } - - private JavaClass loadClass(InputStream is, String className) - throws ClassNotFoundException { - try { - if (is != null) { - ClassParser parser = new ClassParser(is, className); - JavaClass clazz = parser.parse(); - storeClass(clazz); - return clazz; - } - } catch (IOException e) { - throw new ClassNotFoundException( - "Exception while looking for class " + className + ": " - + e.toString()); - } - throw new ClassNotFoundException("SyntheticRepository could not load " - + className); - } - - /** - * ClassPath associated with the Repository. - */ - @Override - public ClassPath getClassPath() { - return _path; - } - - /** - * Clear all entries from cache. - */ - @Override - public void clear() { - _loadedClasses.clear(); - } -} diff --git a/src/org/apache/bcel/util/package.html b/src/org/apache/bcel/util/package.html deleted file mode 100644 index a58b20f..0000000 --- a/src/org/apache/bcel/util/package.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - -

      -This package contains utility classes for the -Byte Code Engineering -Library, namely: -

      -

      -

        -
      • Collection classes for JavaClass objects
      • -
      • A converter for class files to HTML
      • -
      • A tool to find instructions patterns via regular expressions
      • -
      • A class to find classes as defined in the CLASSPATH
      • -
      • A class loader that allows to create classes at run time
      • -
      - -

      - -