itypes.c

来自「基于LWVCL开发的库」· C语言 代码 · 共 261 行

C
261
字号
/* * itypes.c * Internal types. * * Copyright (c) 1996, 1997 *	Transvirtual Technologies, Inc.  All rights reserved. * * Copyright (c) 2004, 2007 *	Kaffe.org contributors. See ChangeLog for details. All rights reserved. *    * See the file "license.terms" for information on usage and redistribution  * of this file.  */#include "config.h"#include "config-std.h"#include "config-mem.h"#include "debug.h"#include "classMethod.h"#include "jni_md.h"#include "itypes.h"#include "baseClasses.h"#include "stringSupport.h"#include "object.h"#include "access.h"Hjava_lang_Class* intClass;Hjava_lang_Class* longClass;Hjava_lang_Class* booleanClass;Hjava_lang_Class* charClass;Hjava_lang_Class* floatClass; Hjava_lang_Class* doubleClass;Hjava_lang_Class* byteClass; Hjava_lang_Class* shortClass;     Hjava_lang_Class* voidClass;Hjava_lang_Class* types[MAXTYPES];staticvoidinitPrimClass(Hjava_lang_Class** class, const char* name, char sig, int len){	errorInfo info;	classEntry* centry;	char entryName[10];	Hjava_lang_Class* clazz = newClass();	Utf8Const *uname;	if (clazz == 0) {		goto bad;	}	(*class) = clazz;	if (!gc_add_ref(clazz)) {		goto bad;	}	clazz->vtable = _PRIMITIVE_DTABLE;	clazz->name = utf8ConstFromString(name);	clazz->accflags = ACC_PUBLIC | ACC_FINAL;	CLASS_PRIM_SIG(clazz) = sig;        CLASS_PRIM_NAME(clazz) = utf8ConstNew(&sig, 1);	clazz->this_inner_index = -1;	if (!clazz->name || !CLASS_PRIM_NAME(clazz)) {		goto bad;	}	TYPE_PRIM_SIZE(clazz) = len;	/* prevent any attempt to process those in processClass */	clazz->state = CSTATE_COMPLETE;	/* Add primitive types to the class pool as well 	 * This allows us to find them by name---for instance from gcj code.	 *	 * Note that a user-defined "class int" is impossible cause "int"	 * is a keyword.	 */	assert(strlen(name) <= 8);	sprintf(entryName, ";%s", name);	uname = utf8ConstFromString(entryName);	centry = lookupClassEntry(uname, NULL, &info);	utf8ConstRelease(uname);	if (centry == 0) {		goto bad;	}	clazz->centry = centry;	centry->data.cl = clazz;	return;bad:	dprintf("not enough memory to run kaffe\n");	KAFFEVM_ABORT();}/* * Intialise the internal types. */voidinitTypes(void){	DBG(INIT, dprintf("initTypes()\n"); );	initPrimClass(&byteClass, "byte", 'B', 1);	initPrimClass(&shortClass, "short", 'S', 2);	initPrimClass(&intClass, "int", 'I', 4);	initPrimClass(&longClass, "long", 'J', 8);	initPrimClass(&booleanClass, "boolean", 'Z', 1);	initPrimClass(&charClass, "char", 'C', 2);	initPrimClass(&floatClass, "float", 'F', 4);	initPrimClass(&doubleClass, "double", 'D', 8);	initPrimClass(&voidClass, "void", 'V', 0);	TYPE_CLASS(TYPE_Boolean) = booleanClass;	TYPE_CLASS(TYPE_Char) = charClass;	TYPE_CLASS(TYPE_Float) = floatClass;	TYPE_CLASS(TYPE_Double) = doubleClass;	TYPE_CLASS(TYPE_Byte) = byteClass;	TYPE_CLASS(TYPE_Short) = shortClass;	TYPE_CLASS(TYPE_Int) = intClass;	TYPE_CLASS(TYPE_Long) = longClass;#if defined(KAFFE_XDEBUGGING)	byteClass->stab_id = STYPE_BYTE;	shortClass->stab_id = STYPE_SHORT;	intClass->stab_id = STYPE_INT;	longClass->stab_id = STYPE_LONG;	booleanClass->stab_id = STYPE_BOOLEAN;	charClass->stab_id = STYPE_CHAR;	floatClass->stab_id = STYPE_FLOAT;	doubleClass->stab_id = STYPE_DOUBLE;	voidClass->stab_id = STYPE_VOID;#endif		DBG(INIT, dprintf("initTypes() done\n"); );}/* * Finish the internal types. */voidfinishTypes(void){	DBG(INIT, dprintf("finishTypes()\n"); );	byteClass->head.vtable = getClassVtable();	shortClass->head.vtable = getClassVtable();	intClass->head.vtable = getClassVtable();	longClass->head.vtable = getClassVtable();	booleanClass->head.vtable = getClassVtable();	charClass->head.vtable = getClassVtable();	floatClass->head.vtable = getClassVtable();	doubleClass->head.vtable = getClassVtable();	voidClass->head.vtable = getClassVtable();	DBG(INIT, dprintf("finishTypes() done\n"); );}staticHjava_lang_Class*classFromSig(const char** strp, Hjava_lang_ClassLoader* loader, errorInfo *einfo){	Hjava_lang_Class* cl;	Utf8Const* utf8;	const char* start;	const char* end;	switch (*(*strp)++) {	case '[': return (lookupArray(classFromSig(strp, loader, einfo),				      einfo));	case 'L':		start = *strp;		for (end = start; *end != 0 && *end != ';'; end++)			;		if (*end != ';') {			return (NULL);		}		*strp = end + 1;		utf8 = utf8ConstNew(start, end - start);		if (!utf8) {			postOutOfMemory(einfo);			return (NULL);		}		cl = loadClass(utf8, loader, einfo);		utf8ConstRelease(utf8);		return(cl);	default:		return getPrimitiveClassFromSignature(*(*(strp)-1));	}}/* * Get a class by name from loader 'loader' * Fails if there are extraneous characters as in "Ljava/lang/Object;V" * * To be used if "sig" contains exactly one class name. */Hjava_lang_Class*getClassFromSignature(const char* sig, Hjava_lang_ClassLoader* loader, errorInfo *einfo){	const char *const sig0 = sig;	Hjava_lang_Class *cls = classFromSig(&sig, loader, einfo);	/* name must consume all characters in string */	if (cls != NULL && *sig == '\0') {		return (cls);	}	/* 	 * or rather VerifyError?  It could be a malformed sig in a malformed	 * .class file, or it could be a malformed user input from 	 * Class.forName()	 */	postExceptionMessage(einfo, JAVA_LANG(NoClassDefFoundError), "%s", sig0);	return (NULL);}/* * Like getClassFromSignature, except don't check that there are no * extraneous characters after a parsed name. * * Can be used if "sig" is a pointer in a signature, i.e., is a signature part. */Hjava_lang_Class*getClassFromSignaturePart(const char* sig, Hjava_lang_ClassLoader* loader, errorInfo *einfo){	Hjava_lang_Class *cls = classFromSig(&sig, loader, einfo);	/* If class has been found, return it. */	if (cls != NULL) {		return cls;	}	/* Otherwise, post an exception message. */	postException(einfo, JAVA_LANG(VerifyError));	return (NULL);}/** * Return a primitive class for a given signature. * * @param sig signature (V,I,Z,S,B,C,F,D,J) * * @return primitive class corresponding to signature, otherwise NULL. */Hjava_lang_Class*getPrimitiveClassFromSignature(const char sig){	switch(sig) {	case 'V': return (voidClass);	case 'I': return (intClass);	case 'Z': return (booleanClass);	case 'S': return (shortClass);	case 'B': return (byteClass);	case 'C': return (charClass);	case 'F': return (floatClass);	case 'D': return (doubleClass);	case 'J': return (longClass);	default:		return NULL;	}}

⌨️ 快捷键说明

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