This is JavaCodeAttribute.h in view mode; [Download] [Up]
// Copyright (c) 1995 David Engberg All rights reserved // $Id: JavaCodeAttribute.h,v 1.7 1996/07/12 20:42:34 geppetto Exp $ #ifndef _JavaCodeAttribute_h #define _JavaCodeAttribute_h #include "JavaAttribute.h" class CJavaLineNumberTable; class CJavaLocalVariableTable; class CCompiler; class CJavaClassFile; // // Class name : CJavaCodeAttribute // Description : This is the attribute used in a method information // node to store the code for that method. // class CJavaCodeAttribute : public CJavaAttribute { DynamicCastDeclarations; public: static CJavaCodeAttribute* ParseBuffer(string::const_iterator& javaBuffer, const CJavaClassFile& classFile); virtual ~CJavaCodeAttribute(); void Disassemble(ostream& toStream) const; string Compile(CJavaClassFile& inClass) const; typedef struct { unsigned short fStartPC; unsigned short fEndPC; unsigned short fHandlerPC; JavaConstantIndex fCatchType; } ExceptionInfo; typedef enum { nop = 0, aconst_null = 1, iconst_m1 = 2, iconst_0 = 3, iconst_1 = 4, iconst_2 = 5, iconst_3 = 6, iconst_4 = 7, iconst_5 = 8, lconst_0 = 9, lconst_1 = 10, fconst_0 = 11, fconst_1 = 12, fconst_2 = 13, dconst_0 = 14, dconst_1 = 15, bipush = 16, sipush = 17, ldc = 18, ldc2 = 19, ldc2_w = 20, iload = 21, lload = 22, fload = 23, dload = 24, aload = 25, iload_0 = 26, iload_1 = 27, iload_2 = 28, iload_3 = 29, lload_0 = 30, lload_1 = 31, lload_2 = 32, lload_3 = 33, fload_0 = 34, fload_1 = 35, fload_2 = 36, fload_3 = 37, dload_0 = 38, dload_1 = 39, dload_2 = 40, dload_3 = 41, aload_0 = 42, aload_1 = 43, aload_2 = 44, aload_3 = 45, iaload = 46, laload = 47, faload = 48, daload = 49, aaload = 50, baload = 51, caload = 52, saload = 53, istore = 54, lstore = 55, fstore = 56, dstore = 57, astore = 58, istore_0 = 59, istore_1 = 60, istore_2 = 61, istore_3 = 62, lstore_0 = 63, lstore_1 = 64, lstore_2 = 65, lstore_3 = 66, fstore_0 = 67, fstore_1 = 68, fstore_2 = 69, fstore_3 = 70, dstore_0 = 71, dstore_1 = 72, dstore_2 = 73, dstore_3 = 74, astore_0 = 75, astore_1 = 76, astore_2 = 77, astore_3 = 78, iastore = 79, lastore = 80, fastore = 81, dastore = 82, aastore = 83, bastore = 84, castore = 85, sastore = 86, pop = 87, pop2 = 88, dup = 89, dup_x1 = 90, dup_x2 = 91, dup2 = 92, dup2_x1 = 93, dup2_x2 = 94, swap = 95, iadd = 96, ladd = 97, fadd = 98, dadd = 99, isub = 100, lsub = 101, fsub = 102, dsub = 103, imul = 104, lmul = 105, fmul = 106, dmul = 107, idiv = 108, ldiv = 109, fdiv = 110, ddiv = 111, irem = 112, lrem = 113, frem = 114, drem = 115, ineg = 116, lneg = 117, fneg = 118, dneg = 119, ishl = 120, lshl = 121, ishr = 122, lshr = 123, iushr = 124, lushr = 125, iand = 126, land = 127, ior = 128, lor = 129, ixor = 130, lxor = 131, iinc = 132, i2l = 133, i2f = 134, i2d = 135, l2i = 136, l2f = 137, l2d = 138, f2i = 139, f2l = 140, f2d = 141, d2i = 142, d2l = 143, d2f = 144, int2byte = 145, int2char = 146, int2short = 147, lcmp = 148, fcmpl = 149, fcmpg = 150, dcmpl = 151, dcmpg = 152, ifeq = 153, ifne = 154, iflt = 155, ifge = 156, ifgt = 157, ifle = 158, if_icmpeq = 159, if_icmpne = 160, if_icmplt = 161, if_icmpge = 162, if_icmpgt = 163, if_icmple = 164, if_acmpeq = 165, if_acmpne = 166, op_goto = 167, // heh. 'goto' is a C++ reserved word jsr = 168, ret = 169, tableswitch = 170, lookupswitch = 171, ireturn = 172, lreturn = 173, freturn = 174, dreturn = 175, areturn = 176, op_return = 177, // 'return' is also a reserved word... getstatic = 178, putstatic = 179, getfield = 180, putfield = 181, invokevirtual = 182, invokenonvirtual = 183, invokestatic = 184, invokeinterface = 185, op_new = 187, // as is 'new' newarray = 188, anewarray = 189, arraylength = 190, athrow = 191, checkcast = 192, instanceof = 193, monitorenter = 194, monitorexit = 195, wide = 196, multianewarray = 197, ifnull = 198, ifnonnull = 199, goto_w = 200, jsr_w = 201, breakpoint = 202, ret_w = 209 } Opcode; typedef struct { const char* fName; short fOperands; } OpcodeInfo; static void PrintOpcodeName(Opcode opcode, ostream& toStream); static short GetOpcodeArguments(Opcode forOpcode); unsigned short AddLocalVariable(unsigned short width = 1); unsigned long CountLocalVariables() const { return fMaxLocals; } const string& GetCode() const { return fCode; } unsigned long GetCodeSize() const { return fCode.size(); } void AppendToCode(unsigned char byte) { fCode += byte; } void AppendToCode(unsigned short value); void AppendToCode(unsigned long value); void AddExceptionHandler(const ExceptionInfo& handlerInfo); typedef vector<ExceptionInfo> ExceptionTable; ExceptionTable::const_iterator ExceptionsBegin() const; ExceptionTable::const_iterator ExceptionsEnd() const; ExceptionTable::iterator ExceptionsBegin(); ExceptionTable::iterator ExceptionsEnd(); void RemoveExceptionHandler(const ExceptionTable::iterator& exception); void SetLineNumbers(CJavaLineNumberTable* adoptTable); unsigned long ClosestLineNumber(unsigned long toProgramCounter) const; protected: friend class CCompiler; CJavaCodeAttribute(); private: static const OpcodeInfo gOpcodeSpecs[]; unsigned short fMaxStack; unsigned short fMaxLocals; string fCode; ExceptionTable fExceptionTable; CJavaLineNumberTable* fLineNumberTable; CJavaLocalVariableTable* fLocalVariableTable; }; // // Class name : CJavaLineNumberTable // Description : This is the attribute used in a code attribute node to // store the line number table to convert bytecode instruction to source // code line. // class CJavaLineNumberTable : public CJavaAttribute { DynamicCastDeclarations; public: static CJavaLineNumberTable* ParseBuffer(string::const_iterator& buffer); virtual ~CJavaLineNumberTable(); string Compile(CJavaClassFile& inClass) const; typedef struct { unsigned short fStartPC; unsigned short fLineNumber; } LineInfo; typedef vector<LineInfo> LineVector; CJavaLineNumberTable(const LineVector& lineInfo); LineVector::const_iterator GetLinesBegin() const { return fTable.begin(); } LineVector::const_iterator GetLinesEnd() const { return fTable.end(); } unsigned long ClosestLineNumber(unsigned long toProgramCounter) const; protected: friend class CCompiler; CJavaLineNumberTable() {} private: LineVector fTable; }; // // Class name : CJavaLocalVariableTable // Description : This is the attribute used in a code attribute node to // store the information needed to decode the name and signature of a // local variable at run-time. // class CJavaLocalVariableTable : public CJavaAttribute { DynamicCastDeclarations; public: static CJavaLocalVariableTable* ParseBuffer(string::const_iterator& buffer); virtual ~CJavaLocalVariableTable(); string Compile(CJavaClassFile& inClass) const; typedef struct { unsigned short fStartPC; unsigned short fLength; unsigned short fNameIndex; unsigned short fSignatureIndex; unsigned short fSlot; } VariableInfo; protected: friend class CCompiler; CJavaLocalVariableTable() {} private: vector<VariableInfo> fTable; }; #endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.