classmethod.h
来自「基于LWVCL开发的库」· C头文件 代码 · 共 820 行 · 第 1/2 页
H
820 行
/* * classMethod.h * Class, method and field tables. * * Copyright (c) 1996, 1997, 2004 * Transvirtual Technologies, Inc. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file. */#ifndef __classmethod_h#define __classmethod_h#include <assert.h>#include "config.h"#include "gtypes.h"#include "machine.h"#include "access.h"#include "object.h"#include "md.h" /* XXX: need this here so KAFFE_PROFILER is accurately def'd */#include "constants.h"#include "errors.h"#include "jthread.h"#include "locks.h"#define MAXMETHOD 64/* Class state */typedef enum { CSTATE_FAILED = -1, CSTATE_UNLOADED, CSTATE_LOADED, CSTATE_LOADED_SUPER, CSTATE_PRELOADED, CSTATE_VERIFIED, CSTATE_DOING_PREPARE, CSTATE_PREPARED, CSTATE_DOING_LINK, CSTATE_LINKED, CSTATE_CONSTINIT, CSTATE_DOING_SUPER, CSTATE_USABLE, CSTATE_DOING_INIT, CSTATE_COMPLETE} class_state_t;struct _classEntry;struct _innerClass;struct Hjava_lang_String;#include <java_lang_ClassLoader.h>#include "reference.h"/** * Builtin stab type IDs. */typedef enum { STYPE_INT = 1, STYPE_INT_POINTER, STYPE_BYTE, STYPE_BYTE_POINTER, STYPE_SHORT, STYPE_SHORT_POINTER, STYPE_CHAR, STYPE_CHAR_POINTER, STYPE_LONG, STYPE_LONG_POINTER, STYPE_FLOAT, STYPE_FLOAT_POINTER, STYPE_DOUBLE, STYPE_DOUBLE_POINTER, STYPE_BOOLEAN, STYPE_BOOLEAN_POINTER, STYPE_VOID, STYPE_VOID_POINTER, STYPE_DISPATCH_TABLE, STYPE_ILOCK, STYPE_PROMOTED_BYTE, STYPE_PROMOTED_SHORT, STYPE_PROMOTED_CHAR, STYPE_PROMOTED_BOOLEAN, STYPE_MAX} stype_t;struct Hjava_lang_Class { Hjava_lang_Object head; /* A class is an object too */ /* these fields are also accessed from java and therefore MUST NOT BE CHANGED */ HArrayOfObject* signers; struct Hjava_security_ProtectionDomain* protectionDomain; struct Hjava_lang_Object* vmData; /* unused for kaffe */ struct Hjava_lang_Object* constructor; /* end of fields being accessed from java */ struct _iLock* lock; /* Lock for internal use */ /* Link to class entry */ struct _classEntry* centry; Utf8Const* name; Utf8Const* extSignature; constIndex enclosingClassIndex; constIndex enclosingMethodIndex; unsigned int packageLength; char* sourcefile; /* source file name if known */ accessFlags accflags; kaffeClassFlags kFlags; /* If non-NULL, a pointer to the superclass. * However, if state < CSTATE_DOING_PREPARE, then * (int) superclass is a constant pool index. */ void* superclass; struct _constants constants; /* For regular classes, an array of the methods defined in this class. For array types, used for CLASS_ELEMENT_TYPE. For primitive types, used by CLASS_ARRAY_CACHE. */ union { Method* methods; struct Hjava_lang_Class* element_type; struct Hjava_lang_Class* array_cache; } cache; short method_count; /* Number of methods in the dtable. */ /* If CLASS_IS_PRIMITIVE, then the CLASS_PRIM_SIG. */ unsigned short msize; /* Pointer to array of Fields, on for each field. Static fields come first. */ Field* fields; /* The size of the non-static fields, in bytes. For a primitive type, the length in bytes. Also used temporarily while reading fields. */ int size_in_bytes; /* Number of fields, including static fields. */ short field_count; /* Number of static fields. */ short nsfields; struct _dispatchTable* vtable; /* all interfaces supported by this class */ struct Hjava_lang_Class** interfaces; short* if2itable; /* redundant now */ void** itable2dtable; short interface_len; unsigned short total_interface_len; /* pointers to all itable2dtable entries of classes implementing this interface */ void*** implementors; /* interfaces only */ unsigned int impl_index; /* index of the class in the implementors array. */ Hjava_lang_ClassLoader* loader; /* A bitmap describing the layout of instances of that class. It contains CLASS_FSIZE/ALIGNMENTVOIDP bits. The MSB corresponds to the dtable field. */ int* gc_layout; class_state_t state; void* processingThread; /* This pointer contains the method which should be called * at object finalization. */ Method* finalizer; int alloc_type; /* allocation type */ /* array containing static data */ void* static_data; /* InnerClasses attribute */ short this_index; short this_inner_index; short nr_inner_classes; struct _innerClass* inner_classes; /* misc other stuff */ void* gcjPeer; /* only needed if GCJ_SUPPORT */#ifdef KAFFE_VMDEBUG int live_count;#endif#if defined(KAFFE_XPROFILER) || defined(KAFFE_XDEBUGGING) /** Stab type ID. */ int stab_id;#endif};#ifndef __DEFINED_CLASS#define __DEFINED_CLASStypedef struct Hjava_lang_Class Hjava_lang_Class;#endif/* * Functions for locking and waiting on *internal* class * bits. This is not for static+synchronized methods. * Use the centry lock, as it is convenient and available. */#define lockClass(C) lockMutex(((C)))#define unlockClass(C) unlockMutex(((C)))#define waitOnClass(C) waitCond(((C)), 0)#define signalOnClass(C) signalCond(((C)))#define broadcastOnClass(C) broadcastCond(((C)))#define METHOD_TRANSLATED(M) ((M)->kFlags & KFLAG_TRANSLATED)#define METHOD_JITTED(M) ((M)->kFlags & KFLAG_JITTED)#define METHOD_NATIVECODE(M) (((M)->idx == -1) ? \ ((M)->ncode) : \ ((M)->class->vtable->method[(M)->idx]))/* Like METHOD_NATIVECODE, except we take the address --- * gcc doesn't compile &( ? : ) expressions for some reason */#define PMETHOD_NATIVECODE(M) (((M)->idx == -1) ? \ (void*)&((M)->ncode) : \ &((M)->class->vtable->method[(M)->idx]))/** * Get start of native code of a method * * @param method a method * @return pointer to start of code */jitCodeHeader* getMethodCodeStart(Method * method);/** * Set start of native code of a method * * @param method a method * @param start pointer to start of code */void setMethodCodeStart(Method * method, jitCodeHeader* start);#define _SET_METHOD_NATIVECODE(M, C) do {\ if ((M)->idx == -1) {\ (M)->ncode = (C);\ } else { \ (M)->class->vtable->method[(M)->idx] = (C);\ } \} while (0)#define SET_METHOD_NATIVECODE(M, C) _SET_METHOD_NATIVECODE(M, C); \ (M)->kFlags |= KFLAG_TRANSLATED#define SET_METHOD_JITCODE(M, C) _SET_METHOD_NATIVECODE(M, C); \ (M)->kFlags |= KFLAG_TRANSLATED|KFLAG_JITTED;/* * Stats for the nameMapping object. * * searching - The system is searching for this particular class. * loading - The system is loading this particular class and/or its parents. * If a circularity exists in the hierarchy it will be detected in this * state. * loaded - The class and its parents have been loaded. * done - The class have been loaded and verified. */typedef enum { NMS_EMPTY, NMS_SEARCHING, NMS_LOADING, NMS_LOADED, NMS_DONE} name_mapping_state_t;/* * Class hash entry. */typedef struct _classEntry { struct _classEntry* next; Utf8Const* name; iStaticLock slock; name_mapping_state_t state; Hjava_lang_ClassLoader* loader; union { jthread_t thread; struct Hjava_lang_Class *cl; } data;} classEntry;/* * The nameDependency structure is used to detect cycles between classes. * Basically, its used as a simple deadlock detection system. * * next - The next object in the list. * thread - The thread that is blocked on "mapping". * mapping - The mapping that "thread" is waiting for. */typedef struct _nameDependency { struct _nameDependency *next; jthread_t thread; classEntry *mapping;} nameDependency;typedef struct _innerClass { u2 outer_class; u2 inner_class; u2 inner_class_accflags;} innerClass;typedef struct _parsed_signature { Utf8Const* signature; u2 nargs; u2 real_nargs; u2 ret_and_args[1]; /* index into signature */ /* ret_and_args[0]: return value ret_and_args[1]: first argument etc */} parsed_signature_t;typedef struct _jmethodID { Utf8Const* name; parsed_signature_t* parsed_sig; Utf8Const* extSignature; accessFlags accflags; kaffeClassFlags kFlags; long idx; /* Index into class->vtable */ u2 stacksz; u2 localsz; /* Only used for static/final/constructor methods */ nativecode* ncode; union { struct { jitCodeHeader* ncode_start; nativecode* ncode_end; } ncode; struct { unsigned char* code; unsigned int codelen; } bcode; } c; Hjava_lang_Class* class; struct _lineNumbers* lines; struct _localVariables* lvars; struct _jexception* exception_table; int ndeclared_exceptions; union { constIndex* local_exceptions; struct _jmethodID* remote_exceptions; } declared_exceptions_u;#define declared_exceptions declared_exceptions_u.local_exceptions int framesize; /* JIT only: size of frame */#if defined(KAFFE_PROFILER) profiler_click_t jitClicks; profiler_click_t totalClicks; profiler_click_t totalChildrenClicks; int callsCount;#endif} methods;#define METHOD_NAME(M) ((M)->name)#define METHOD_NAMED(M) (METHOD_NAME(M)->data)#define PSIG_UTF8(sig) ((sig)->signature)#define PSIG_DATA(sig) (PSIG_UTF8((sig))->data)#define PSIG_RET(sig) ((sig)->ret_and_args[0])#define PSIG_NARGS(sig) ((sig)->nargs)#define PSIG_ARG(sig,n) ((sig)->ret_and_args[1+n])#define PSIG_RNARGS(sig) ((sig)->real_nargs)#define METHOD_PSIG(M) ((M)->parsed_sig)#define METHOD_SIG(M) (PSIG_UTF8(METHOD_PSIG((M))))#define METHOD_SIGD(M) (PSIG_DATA(METHOD_PSIG((M))))#define METHOD_RET_TYPE(M) (METHOD_SIGD((M))+PSIG_RET(METHOD_PSIG((M))))#define METHOD_NARGS(M) (PSIG_NARGS(METHOD_PSIG((M))))#define METHOD_ARG_TYPE(M,N) (METHOD_SIGD((M))+PSIG_ARG(METHOD_PSIG((M)),(N)))#define METHOD_BYTECODE_LEN(M) ((M)->c.bcode.codelen)#define METHOD_BYTECODE_CODE(M) ((M)->c.bcode.code)typedef struct _dispatchTable { Hjava_lang_Class* class; void* __dummy0; /* For GCJ/C++ compatibility. */ void* method[1];} dispatchTable;#define DTABLE_CLASS 0#define DTABLE_METHODOFFSET (sizeof(void*)*2)#define DTABLE_METHODSIZE (sizeof(void*))typedef struct _jfieldID { Hjava_lang_Class* clazz; Utf8Const* name; Utf8Const* signature; Utf8Const* extSignature; Hjava_lang_Class* type; accessFlags accflags; u2 bsize; /* in bytes */ union { int boffset; /* offset in bytes (object) */ void* addr; /* address (static) */ u2 idx; /* constant value index */ } info;} fields;#define FIELD_UNRESOLVED_FLAG 0x8000#define FIELD_CONSTANT_VALUE 0x4000#define FIELD_RESOLVED(FLD) ((FLD)->type != 0 && !((FLD)->accflags & FIELD_UNRESOLVED_FLAG))/* Type of field FLD. Only valid if FIELD_RESOLVED(FLD). */#define FIELD_TYPE(FLD) ((FLD)->type)/* Size of field FLD, in bytes. */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?