ftp.nice.ch/pub/next/developer/languages/java/guavac.0.2.5.s.tar.gz#/guavac-0.2.5/common/JavaCodeAttribute.h

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.