itypes.c
来自「kaffe Java 解释器语言,源码,Java的子集系统,开放源代码」· C语言 代码 · 共 225 行
C
225 行
/* * itypes.c * Internal types. * * Copyright (c) 1996, 1997 * Transvirtual Technologies, Inc. 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 "kaffe/jtypes.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, 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->dtable = _PRIMITIVE_DTABLE; clazz->name = utf8ConstNew(name, -1); clazz->accflags = ACC_PUBLIC | ACC_FINAL; CLASS_PRIM_SIG(clazz) = sig; CLASS_PRIM_NAME(clazz) = utf8ConstNew(&sig, 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 = utf8ConstNew(entryName, -1); centry = lookupClassEntry(uname, 0, &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"); 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; DBG(INIT, dprintf("initTypes() done\n"); )}/* * Finish the internal types. */voidfinishTypes(void){ DBG(INIT, dprintf("finishTypes()\n"); ) byteClass->head.dtable = ClassClass->dtable; shortClass->head.dtable = ClassClass->dtable; intClass->head.dtable = ClassClass->dtable; longClass->head.dtable = ClassClass->dtable; booleanClass->head.dtable = ClassClass->dtable; charClass->head.dtable = ClassClass->dtable; floatClass->head.dtable = ClassClass->dtable; doubleClass->head.dtable = ClassClass->dtable; voidClass->head.dtable = ClassClass->dtable; 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 '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); case '[': return (lookupArray(classFromSig(strp, loader, einfo), einfo)); case 'L': start = *strp; for (end = start; *end != 0 && *end != ';'; end++) ; *strp = end; if (*end == ';') { (*strp)++; } else { postException(einfo, JAVA_LANG(VerifyError)); return (NULL); } utf8 = utf8ConstNew(start, end - start); if (!utf8) { postOutOfMemory(einfo); return (0); } cl = loadClass(utf8, loader, einfo); utf8ConstRelease(utf8); return(cl); default: /* malformed signature */ postException(einfo, JAVA_LANG(VerifyError)); return (NULL); }}/* * 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 != 0 && *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 (0);}/* * 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){ return (classFromSig(&sig, loader, einfo));}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?