/* javahost.h:  Copyright (C) Codemist Ltd., 1996.                      */
 

#define JAVA_MAGIC 0xCAFEBABE
#define JAVA_THIS_MAJ 45
#define JAVA_THIS_MIN 3

/* The following structures define the internal format of a class file: */

typedef int32 *(*JavaBuiltin)(int32 *);

typedef enum Attribute_Sort
{   ATT_unknown,
    ATT_SourceFile,
    ATT_ConstantValue,
    ATT_Code,
    ATT_Exceptions,
    ATT_LineNumberTable,
    ATT_LocalVariableTable
} Attribute_Sort;

typedef struct Attribute_Info Attribute_Info;

typedef struct SourceFile_Attribute
{   unsigned16 sourcefile_index;
} SourceFile_Attribute;

typedef struct ConstantValue_Attribute
{   unsigned16 constantvalue_index;
} ConstantValue_Attribute;

    /* logically local to Code_Attribute */
    typedef struct Exception_Info
    {   unsigned16 start_pc;
        unsigned16 end_pc;
        unsigned16 handler_pc;
        unsigned16 catch_type;
    } Exception_Info;

typedef struct Code_Attribute
{   unsigned16 max_stack;
    unsigned16 max_locals;
    unsigned32 code_length;
    unsigned16 exception_table_length;
    unsigned16 attributes_count;
    unsigned8  *code;
    Exception_Info *exception_table;
    Attribute_Info *attributes;
} Code_Attribute;

typedef struct Exceptions_Attribute
{   unsigned16 number_of_exceptions;
    unsigned16 *exception_index_table;
} Exceptions_Attribute;

    /* logically local to LineNumberTable_Attribute */
    typedef struct LineNumber_Info
    {   unsigned16 start_pc;
        unsigned16 line_number;
    } LineNumber_Info;

typedef struct LineNumberTable_Attribute
{   unsigned16 line_number_table_length;
    LineNumber_Info *line_number_table;
} LineNumberTable_Attribute;

    /* logically local to LocalVariableTable_Attribute */
    typedef struct LocalVariable_Info
    {   unsigned16 start_pc;
        unsigned16 length;
        unsigned16 name_index;
        unsigned16 signature_index;
        unsigned16 slot;
    } LocalVariable_Info;

typedef struct LocalVariableTable_Attribute
{   unsigned16 local_variable_table_length;
    LocalVariable_Info *local_variable_table;
} LocalVariableTable_Attribute;

/*typedef*/ struct Attribute_Info
{   enum Attribute_Sort sort;
    union { SourceFile_Attribute *sourcefile;
            ConstantValue_Attribute *constantvalue;
            Code_Attribute *code;
            Exceptions_Attribute *exceptions;
            LineNumberTable_Attribute *linenumbertable;
            LocalVariableTable_Attribute *localvariabletable; }  uattr;
};

typedef struct Cp_Info
{   unsigned8 tag;
    unsigned16 len;
    union { unsigned32 val; char *utf8; void *ptr; } u;
} Cp_Info;

/* Currently Field_Info and Method_Info are identical, but note they    */
/* allow different attributes.                                          */
typedef struct Field_Info
{   unsigned16 access_flags;
    unsigned16 name_index;
    unsigned16 signature_index;
    unsigned16 attributes_count;
    Attribute_Info *attributes;
} Field_Info;

typedef struct Method_Info
{   unsigned16 access_flags;
    unsigned16 name_index;
    unsigned16 signature_index;
    unsigned16 attributes_count;
    Attribute_Info *attributes;
} Method_Info;

typedef struct ClassFile {
/* Internal representation of class file: see rdClassFile().            */
    unsigned16 access_flags;
    unsigned16 this_class;
    unsigned16 super_class;

    unsigned16 constant_pool_count;
    unsigned16 interfaces_count;
    unsigned16 fields_count;
    unsigned16 methods_count;
    unsigned16 attributes_count;

    Cp_Info *constant_pool;
    unsigned16 *interfaces;
    Field_Info *fields;
    Method_Info *methods;
    Attribute_Info *attributes;
} ClassFile;

/* Cp_Info tags: */
#define CONSTANT_Class          7
#define CONSTANT_FieldRef       9
#define CONSTANT_MethodRef     10
#define CONSTANT_InterfaceMethodRef     11
#define CONSTANT_String         8
#define CONSTANT_Integer        3
#define CONSTANT_Float          4
#define CONSTANT_Long           5
#define CONSTANT_Double         6
#define CONSTANT_NameAndType   12
#define CONSTANT_Utf8           1
#define CONSTANT_Unicode        2
/* The next (illegal) tag represents the 2nd word of a long or double.  */
#define CONSTANT_Xhalf         42

/* access_flags: */
#define ACC_PUBLIC              0x0001
#define ACC_PRIVATE             0x0002
#define ACC_PROTECTED           0x0004
#define ACC_STATIC              0x0008
#define ACC_FINAL               0x0010
#define ACC_SYNCHRONIZED        0x0020
#define ACC_VOLATILE            0x0040
#define ACC_TRANSIENT           0x0080
#define ACC_NATIVE              0x0100
#define ACC_INTERFACE           0x0200
#define ACC_ABSTRACT            0x0400

/* end of javahost.h */
