⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fields.h

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 H
字号:
/*
 * Copyright (c) 1998-2001 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * This software is the confidential and proprietary information of Sun
 * Microsystems, Inc. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Sun.
 * 
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
 * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
 * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
 * THIS SOFTWARE OR ITS DERIVATIVES.
 * 
 */

/*=========================================================================
 * SYSTEM:    KVM
 * SUBSYSTEM: Internal runtime structures
 * FILE:      fields.h
 * OVERVIEW:  Internal runtime structures for storing different kinds 
 *            of fields (constants, variables, methods, interfaces).
 *            Tables of these fields are created every time a new class
 *            is loaded into the virtual machine.
 * AUTHOR:    Antero Taivalsaari, Sun Labs
 *            Edited by Doug Simon 11/1998
 *            Sheng Liang, Frank Yellin
 *=======================================================================*/

/*=========================================================================
 * COMMENTS:
 * This file defines the VM-specific internal runtime structures
 * needed for representing fields, methods and interfaces.
 *=======================================================================*/

/*=========================================================================
 * Include files
 *=======================================================================*/

/*=========================================================================
 * COMMENTS:
 * FIELD is the basic structure that is used for representing
 * information about instance variables, static variables, constants
 * and static methods. It is used as a component in constant pool
 * and instance variable tables stored in CLASS structures.
 *
 * Method tables use a slightly larger structure (METHOD)
 * which is a logical subtype of FIELD. 
 *
 * Note: to speed up stack frame generation at runtime, we calculate
 * the number of parameters (argCount) and local variables (localCount)
 * for each method in advance upon class loading.
 *=======================================================================*/

/*=========================================================================
 * IMPORTANT: If you change the order of any of the data elements
 * in these data structures, make sure that the order matches
 * with the corresponding data structures in 'rom.h'.
 *=======================================================================*/

/*  FIELD */
struct fieldStruct {
    NameTypeKey nameTypeKey;
    long        accessFlags; /* Access indicators (public/private etc.) */
    INSTANCE_CLASS ofClass;  /* Backpointer to the class owning the field */
    union { 
        long  offset;        /* for dynamic objects */
        void *staticAddress; /* pointer to static.  */
    } u;
};

struct fieldTableStruct { 
    long length;
    struct fieldStruct fields[1];
};

/*  METHOD */
struct methodStruct {
    NameTypeKey   nameTypeKey;
    union { 
        struct {
            BYTE* code;
            HANDLERTABLE handlers;
            union {
                STACKMAP pointerMap;
                POINTERLIST verifierMap;
            } stackMaps;
            unsigned short codeLength;
            unsigned short maxStack; 
            /* frameSize should be here, rather than in the generic part, */
            /* but this gives us better packing of the bytes */
        } java;
        struct { 
            void (*code)(void);
            void *info;
        } native;
    } u;
    long  accessFlags;        /* Access indicators (public/private etc.) */
    INSTANCE_CLASS ofClass;   /* Backpointer to the class owning the field */
    unsigned short frameSize; /* Method frame size (arguments+local vars) */
    unsigned short argCount;  /* Method argument (parameter) count */
};

struct methodTableStruct { 
    long length;
    struct methodStruct methods[1];
};

/*=========================================================================
 * COMMENTS:
 * STACKMAPs are used internally by the KVM to store
 * information that the runtime part of the classfile
 * verifier can utilize to speed up verification.
 * This information is also utilized by the exact
 * garbage collector.
 *=======================================================================*/

#define STACK_MAP_SHORT_ENTRY_FLAG 0x8000
#define STACK_MAP_ENTRY_COUNT_MASK 0x7FFF
#define STACK_MAP_SHORT_ENTRY_OFFSET_MASK 0xFFF
#define STACK_MAP_SHORT_ENTRY_MAX_OFFSET 0xFFF
#define STACK_MAP_SHORT_ENTRY_MAX_STACK_SIZE 0xF

struct stackMapStruct {

    /* The high bit of nEntries is a flag indicating whether the structs are
     * short entries or not.  
     * If this is a short entry
     *       The low 12 bits of offset are the actual offset
     *       The high 4 bits of offset are the operand stack size
     *       stackMapKey is a bitmap giving the live locals and operand
     *          stacks.  ((char *)stackMapKey)[0] contains the low 8 bits and
     *          ((char *)stackMapKey)[1] contains the high 8 bits.
     * If this isn't a short entry, then offset is the actual 16-bit offset.
     * Stackmap key is an entry in the name table.  The first byte of the
     * entry is the stack size.  The remaining bytes are a variable length 
     * bitmap.
     */
    unsigned short nEntries;
    struct stackMapEntryStruct {
        unsigned short offset;
        unsigned short stackMapKey;
    } entries[1];
};

/*=========================================================================
 * COMMENTS:
 * The Java-level debugging interfaces need access to line number 
 * information.  The following structures are used for storing 
 * that information.
 *=======================================================================*/

#if ENABLE_JAVA_DEBUGGER

struct lineNumberStruct {
    unsigned short start_pc;
    unsigned short line_number;
};

struct lineNumberTableStruct {
    unsigned short length;
    struct lineNumberStruct lineNumber[1];
};

#endif /* ENABLE_JAVA_DEBUGGER */

/*=========================================================================
 * Sizes of the data structures above
 *=======================================================================*/

#define SIZEOF_FIELD             StructSizeInCells(fieldStruct)
#define SIZEOF_METHOD            StructSizeInCells(methodStruct)

#define SIZEOF_METHODTABLE(n)  \
        (StructSizeInCells(methodTableStruct) + (n - 1) * SIZEOF_METHOD)

#define SIZEOF_FIELDTABLE(n)   \
        (StructSizeInCells(fieldTableStruct) + (n - 1) * SIZEOF_FIELD)

/*=========================================================================
 * Operations on field and method tables
 *=======================================================================*/

FIELD  lookupField(INSTANCE_CLASS thisClass, NameTypeKey key);
METHOD lookupMethod(CLASS thisClass, NameTypeKey key, 
                    INSTANCE_CLASS currentClass);
METHOD getSpecialMethod(INSTANCE_CLASS thisClass, NameTypeKey key);

#if ENABLEPROFILING
int    getMethodTableSize(METHODTABLE methodTable);
#else 
# define getMethodTableSize(table) 0
#endif

/*=========================================================================
 * Debugging and printing operations
 *=======================================================================*/

#if INCLUDEDEBUGCODE
void   printFieldTable(FIELDTABLE fieldTable);
void   printMethodTable(METHODTABLE methodTable);
void   printFieldName(FIELD fieldTable,  LOGFILEPTR file);
void   printMethodName(METHOD methodTable, LOGFILEPTR file);
#else 
# define printFieldTable(x)
# define printMethodTable(y)
# define printFieldName(x, y)
# define printMethodName(x, y)
#endif

/*=========================================================================
 * Iterators
 *=======================================================================*/

#define FOR_EACH_METHOD(__var__, methodTable) {                            \
    if (methodTable != NULL) {                                             \
         METHOD __first_method__ = methodTable->methods;                   \
         METHOD __end_method__ = __first_method__ + methodTable->length;   \
         METHOD __var__;                                                   \
         for (__var__ = __first_method__; __var__ < __end_method__; __var__++) {

#define END_FOR_EACH_METHOD } } }

#define FOR_EACH_FIELD(__var__, fieldTable) {                            \
     if (fieldTable != NULL) {                                           \
         FIELD __first_field__ = fieldTable->fields;                     \
         FIELD __end_field__ = __first_field__ + fieldTable->length;     \
         FIELD __var__;                                                  \
         for (__var__ = __first_field__; __var__ < __end_field__; __var__++) { 

#define END_FOR_EACH_FIELD } } }

/*=========================================================================
 * Internal operations on signatures
 *=======================================================================*/

#define methodName(method) \
     (change_Key_to_Name((method)->nameTypeKey.nt.nameKey, NULL))

#define fieldName(field) \
     (change_Key_to_Name((field)->nameTypeKey.nt.nameKey, NULL))

#define getMethodSignature(method) \
      change_Key_to_MethodSignature((method)->nameTypeKey.nt.typeKey)

#define getFieldSignature(field) \
      change_Key_to_FieldSignature((field)->nameTypeKey.nt.typeKey)

char *change_Key_to_FieldSignature(FieldTypeKey);
char *change_Key_to_FieldSignature_inBuffer(FieldTypeKey, char *result);

char *change_Key_to_MethodSignature(MethodTypeKey);
char *change_Key_to_MethodSignature_inBuffer(MethodTypeKey, char *result);

FieldTypeKey change_FieldSignature_to_Key(CONST_CHAR_HANDLE, int offset,
                                          int length);
MethodTypeKey change_MethodSignature_to_Key(CONST_CHAR_HANDLE, int offset,
                                            int length);

NameTypeKey getNameAndTypeKey(const char* name, const char* type);

#define FIELD_KEY_ARRAY_SHIFT 13
#define FIELD_KEY_MASK 0x1FFF
#define MAX_FIELD_KEY_ARRAY_DEPTH 7

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -