classmethod.h
来自「kaffe Java 解释器语言,源码,Java的子集系统,开放源代码」· C头文件 代码 · 共 571 行 · 第 1/2 页
H
571 行
#define PSIG_NARGS(sig) (sig->nargs)#define PSIG_ARG(sig,n) ((sig)->ret_and_args[1+n])#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 _fields { Hjava_lang_Class* clazz; Utf8Const* name; Utf8Const* signature; 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. */#define FIELD_SIZE(FLD) ((FLD)->bsize)#define FIELD_WSIZE(FLD) ((FLD)->bsize <= sizeof(jint) ? 1 : 2)#define FIELD_BOFFSET(FLD) ((FLD)->info.boffset)#define FIELD_ADDRESS(FLD) ((FLD)->info.addr)#define FIELD_CONSTIDX(FLD) ((FLD)->info.idx)#define FIELD_ISPRIM(FLD) (FIELD_RESOLVED(FLD) \ && CLASS_IS_PRIMITIVE(FIELD_TYPE(FLD)))#define FIELD_ISREF(FLD) (!FIELD_ISPRIM(FLD) \ && FIELD_TYPE(FLD) != PtrClass)#define CLASSMAXSIG 256struct _Code;struct _method_info;struct _field_info;struct classFile;#define CLASS_METHODS(CLASS) ((CLASS)->methods)#define CLASS_NMETHODS(CLASS) ((CLASS)->nmethods)/* An array containing all the Fields, static fields first. */#define CLASS_FIELDS(CLASS) ((CLASS)->fields)/* An array containing all the static Fields. */#define CLASS_SFIELDS(CLASS) ((CLASS)->fields)/* The static data of this class */#define CLASS_STATICDATA(CLASS) ((CLASS)->static_data)/* An array containing all the instance (non-static) Fields. */#define CLASS_IFIELDS(CL) (&(CL)->fields[CLASS_NSFIELDS(CL)])/* Total number of fields (instance and static). */#define CLASS_NFIELDS(CLASS) ((CLASS)->nfields)/* Number of instance (non-static) fields. */#define CLASS_NIFIELDS(CLASS) ((CLASS)->nfields - (CLASS)->nsfields)/* Number of static fields. */#define CLASS_NSFIELDS(CLASS) ((CLASS)->nsfields)/* Size of a class fields (including header), in words. */#define CLASS_WFSIZE(CLASS) ((CLASS)->bfsize / sizeof(jint))/* Size of a class's fields (including header), in bytes. */#define CLASS_FSIZE(CLASS) ((CLASS)->bfsize)#define OBJECT_CLASS(OBJ) ((OBJ)->dtable->class)#define CLASS_CNAME(CL) ((CL)->name->data)#define CLASS_SOURCEFILE(CL) \ ((CL)->sourcefile == 0 ? "source file unknown" : (CL)->sourcefile)#define _PRIMITIVE_DTABLE ((struct _dispatchTable*)(-1))#define CLASS_IS_PRIMITIVE(CL) ((CL)->dtable == _PRIMITIVE_DTABLE)/* Assuming CLASS_IS_PRIMITIVE(CL), return the 1-letter signature code. */#define CLASS_PRIM_SIG(CL) ((CL)->msize)#define CLASS_PRIM_NAME(CL) (*(Utf8Const**)&(CL)->fields)/* A freshly born class that does have its name set, but the collector * may already want to know whether it'll be a boy or a girl. */#define CLASS_IS_ARRAY(CL) ((CL)->name && CLASS_CNAME(CL)[0] == '[')#define CLASS_IS_INTERFACE(CL) ((CL)->accflags & ACC_INTERFACE)#define CLASS_IS_ABSTRACT(CL) ((CL)->accflags & ACC_ABSTRACT)#define CLASS_IS_FINAL(CL) ((CL)->accflags & ACC_FINAL)/* For an array type, the types of the elements. */#define CLASS_ELEMENT_TYPE(ARRAYCLASS) (*(Hjava_lang_Class**)&(ARRAYCLASS)->methods)/* Used by the lookupArray function. */#define CLASS_ARRAY_CACHE(PRIMTYPE) (*(Hjava_lang_Class**)&(PRIMTYPE)->methods)#define TYPE_PRIM_SIZE(CL) ((CL)->bfsize)#define TYPE_SIZE(CL) \ (CLASS_IS_PRIMITIVE(CL) ? TYPE_PRIM_SIZE (CL) : PTR_TYPE_SIZE)#define METHOD_IS_PUBLIC(METH) ((METH)->accflags & ACC_PUBLIC)#define METHOD_IS_PROTECTED(METH) ((METH)->accflags & ACC_PROTECTED)#define METHOD_IS_PRIVATE(METH) ((METH)->accflags & ACC_PRIVATE)#define METHOD_IS_CONSTRUCTOR(METH) ((METH)->accflags & ACC_CONSTRUCTOR)#define METHOD_IS_STATIC(METH) ((METH)->accflags & ACC_STATIC)#define METHOD_IS_ABSTRACT(METH) ((METH)->accflags & ACC_ABSTRACT)#define METHOD_IS_FINAL(METH) ((METH)->accflags & ACC_FINAL)#define METHOD_IS_NATIVE(METH) ((METH)->accflags & ACC_NATIVE)#define METHOD_IS_STRICT(METH) ((METH)->accflags & ACC_STRICT)#define METHOD_IS_SYNCHRONISED(METH) ((METH)->accflags & ACC_SYNCHRONISED)#define CLASS_GCJ(C) ((C)->accflags & ACC_GCJ)#define SET_CLASS_GCJ(C) (C)->accflags |= ACC_GCJ/* For manipulating the constant pool in a class */#define CLASS_CONSTANTS(CL) (&(CL)->constants)#define CLASS_CONST_SIZE(CL) ((CL)->constants.size)#define CLASS_CONST_TAG(CL, IDX) ((CL)->constants.tags[IDX])#define CLASS_CONST_DATA(CL, IDX) ((CL)->constants.data[IDX])#define CLASS_CONST_UTF8(CL, IDX) WORD2UTF(CLASS_CONST_DATA(CL, IDX))#define CLASS_CONST_INT(CL, IDX) ((int32) CLASS_CONST_DATA(CL, IDX))#if SIZEOF_VOIDP == 8#define CLASS_CONST_LONG(CL, IDX) \ ((uint64) CLASS_CONST_DATA(CL, IDX))#else#define CLASS_CONST_LONG(CL, IDX) \ WORDS_TO_LONG ((CL)->constants.data[IDX], (CL)->constants.data[(IDX)+1])#endif#define CLASS_CONST_DOUBLE(CL, IDX) \ CLASS_CONST_LONG(CL, IDX)/* The first uint16 of the INDEX'th constant pool entry. */#define CLASS_CONST_USHORT1(CL, INDEX) ((CL)->constants.data[INDEX] & 0xFFFF)/* The second uint16 of the INDEX'th constant pool entry. */#define CLASS_CONST_USHORT2(CL, INDEX) \ ((uint16)((CL)->constants.data[INDEX] >> 16))/* * 'processClass' is the core of the class initialiser and can prepare a * class from the cradle to the grave. */bool processClass(Hjava_lang_Class*, int, errorInfo *einfo);Hjava_lang_Class* loadClass(Utf8Const*, Hjava_lang_ClassLoader*, errorInfo *einfo);Hjava_lang_Class* loadArray(Utf8Const*, Hjava_lang_ClassLoader*, errorInfo *einfo);Hjava_lang_Class* findClass(struct _classEntry* centry, errorInfo *einfo);void loadStaticClass(Hjava_lang_Class**, const char*);Hjava_lang_Class* setupClass(Hjava_lang_Class*, constIndex, constIndex, u2, Hjava_lang_ClassLoader*, errorInfo*);bool addSourceFile(Hjava_lang_Class* c, int idx, errorInfo*);bool addInnerClasses(Hjava_lang_Class* c, uint32 len, struct classFile* fp, errorInfo *info);int startMethods(Hjava_lang_Class*, u2 methct, errorInfo*);Method* addMethod(Hjava_lang_Class*, u2 access_flags, u2 name_index, u2 signature_index, errorInfo*);Method* addExceptionMethod(Hjava_lang_Class*, Utf8Const*, Utf8Const*);void addMethodCode(Method*, struct _Code*);Field* addField(Hjava_lang_Class*, u2 access_flags, u2 name_index, u2 signature_index, errorInfo* einfo);void addInterfaces(Hjava_lang_Class*, u2, Hjava_lang_Class**);void setFieldValue(Hjava_lang_Class*, Field*, u2);Hjava_lang_Class* resolveFieldType(Field*, Hjava_lang_Class*, errorInfo*);bool getInheritedMethodIndex(Hjava_lang_Class *clazz, Method *meth);classEntry* lookupClassEntry(Utf8Const*, Hjava_lang_ClassLoader*, errorInfo *info);classEntry* lookupClassEntryInternal(Utf8Const*, Hjava_lang_ClassLoader*);int removeClassEntries(Hjava_lang_ClassLoader*);void walkClassEntries(Collector *collector, Hjava_lang_ClassLoader*);Collector* initCollector(void);Hjava_lang_Class* lookupClass(const char*, Hjava_lang_ClassLoader*, errorInfo*);Hjava_lang_Class* lookupArray(Hjava_lang_Class*, errorInfo*);Hjava_lang_Class* lookupObjectArrayClass(Hjava_lang_Class*);Field* lookupClassField(Hjava_lang_Class*, Utf8Const*, bool, errorInfo *einfo);Hjava_lang_Class* getClass(constIndex, Hjava_lang_Class*, errorInfo *einfo);void countInsAndOuts(const char*, short*, short*, char*);int sizeofSigChar(char, bool);int sizeofSigItem(const char**, bool);int sizeofSig(const char**, bool);int sizeofSigMethod(Method *, bool);int sizeofSigClass(Hjava_lang_Class*, bool);void establishMethod(Method*);Hjava_lang_Class* getClassFromSignature(const char*, Hjava_lang_ClassLoader*, errorInfo*);Hjava_lang_Class* getClassFromSignaturePart(const char*, Hjava_lang_ClassLoader*, errorInfo*);int countArgsInSignature(const char *);parsed_signature_t* parseSignature(Utf8Const *, errorInfo*);int startFields(Hjava_lang_Class*, u2 fieldct, errorInfo*);void finishFields(Hjava_lang_Class*);void destroyClassLoader(Collector *, void *);struct Hjava_lang_String* resolveString(Hjava_lang_Class* clazz, int idx, errorInfo *einfo);int findPackageLength(const char *name);/* * Start a search for a class. If no other thread is searching for this * mapping then the responsibility falls on the current thread. * * ce - The mapping to start searching for. * out_cl - A placeholder for the class if it has already been bound. * einfo - An uninitialized errorInfo object. * returns - True, if the class is already bound or if this thread should be * responsible for searching/loading the class. False, if searching for this * class would result in a class circularity. */int classMappingSearch(classEntry *ce, Hjava_lang_Class **out_cl, errorInfo *einfo);/* * Start loading a class. * * ce - The mapping to start searching for. * out_cl - A placeholder for the class if it has already been bound. * einfo - An uninitialized errorInfo object. * returns - True, if the class is already bound or if this thread should be * responsible for searching/loading the class. False, if searching for this * class would result in a class circularity. */int classMappingLoad(classEntry *ce, Hjava_lang_Class **out_cl, errorInfo *einfo);/* * Transition a mapping to the loaded state. * * ce - The name mapping whose state should be updated. * cl - The class object that should be bound to this mapping. * return - The value of "cl" if the mapping wasn't already updated, otherwise, * it will be the value previously stored in the mapping. */Hjava_lang_Class *classMappingLoaded(classEntry *ce, Hjava_lang_Class *cl);/* * Force a mapping to a particular state. * * ce - The name mapping whose state should be updated. * nms - The state the mapping should be set to. */void setClassMappingState(classEntry *ce, name_mapping_state_t nms);void walkClassPool(int (*walker)(Hjava_lang_Class *clazz, void *), void *param);extern Utf8Const* init_name; /* "<clinit>" */extern Utf8Const* constructor_name; /* "<init>" */extern Utf8Const* final_name; /* "finalize" */extern Utf8Const* void_signature; /* "()V" */extern Utf8Const* Code_name; /* "Code" */extern Utf8Const* LineNumberTable_name; /* "LineNumberTable" */extern Utf8Const* ConstantValue_name; /* "ConstantValue" */extern Utf8Const* Exceptions_name; /* "Exceptions" */extern Utf8Const* SourceFile_name; /* "SourceFile" */extern Utf8Const* InnerClasses_name; /* "InnerClasses" */#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?