constants.c

来自「kaffe Java 解释器语言,源码,Java的子集系统,开放源代码」· C语言 代码 · 共 233 行

C
233
字号
/* * constants.c * Constant management. * * 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 "config-hacks.h"#include "gtypes.h"#include "access.h"#include "object.h"#include "constants.h"#include "object.h"#include "errors.h"#include "file.h"#include "exception.h"#include "classMethod.h"#include "utf8const.h"#include "debug.h"/* * XXX move into readClass.c *//* * Read in constant pool from opened file. */boolreadConstantPool(Hjava_lang_Class* this, classFile* fp, errorInfo *einfo){	constants* info = CLASS_CONSTANTS (this);	ConstSlot* pool;	u1* tags;	int i;	int j;	u1 type;	u2 len;	u2 d2, d2b;	u4 d4, d4b;	u2 poolsize;	const char* className = "unknown";  /* CLASS_CNAME(this) won't work until after constant pool is read... */	if (!checkBufSize(fp, 2, className, einfo))		return false;	readu2(&poolsize, fp);	DBG(READCLASS,	    dprintf("constant_pool_count=%d\n", poolsize);		);	/* Allocate space for tags and data */	pool = gc_malloc((sizeof(ConstSlot) + sizeof(u1)) * poolsize,			 GC_ALLOC_CONSTANT);	if (!pool) {		postOutOfMemory(einfo);		return false;	}	tags = (u1*)&pool[poolsize];	info->data = pool;	info->tags = tags;	info->size = poolsize;	pool[0] = 0;	tags[0] = CONSTANT_Unknown;	for (i = 1; i < info->size; i++) {		if (! checkBufSize(fp, 1, className, einfo))			goto fail;		readu1(&type, fp);		DBG(READCLASS,		    dprintf("Constant[%d] type %d\n", i, type);			);		tags[i] = type;		switch (type) {		case CONSTANT_Utf8:			if (! checkBufSize(fp, 2, className, einfo))				goto fail;			readu2(&len, fp);			if (! checkBufSize(fp, len, className, einfo))				goto fail;			if (!utf8ConstIsValidUtf8(fp->cur, len)) {				postExceptionMessage(einfo,					JAVA_LANG(ClassFormatError), 					"Invalid UTF-8 constant");				goto fail;			}			pool[i] = (ConstSlot) utf8ConstNew(fp->cur, len);			if (!pool[i]) {				postOutOfMemory(einfo);				goto fail;			}			seekm(fp, len);			break;		case CONSTANT_Class:		case CONSTANT_String:			if (! checkBufSize(fp, 2, className, einfo))				goto fail;			readu2(&d2, fp);			if ( (d2 == 0) || (d2 >= info->size) )			{				postExceptionMessage(					einfo,					JAVA_LANG(ClassFormatError),					"%s (Invalid constant pool index: %d)",					className,					d2);				goto fail;			}			pool[i] = d2;			break;		case CONSTANT_Fieldref:		case CONSTANT_Methodref:		case CONSTANT_InterfaceMethodref:		case CONSTANT_NameAndType:			if (! checkBufSize(fp, 4, className, einfo))				goto fail;			readu2(&d2, fp);			readu2(&d2b, fp);			pool[i] = (d2b << 16) | d2;			break;		case CONSTANT_Integer:		case CONSTANT_Float:			if (! checkBufSize(fp, 4, className, einfo))				goto fail;			readu4(&d4, fp);			pool[i] = d4;			break;		case CONSTANT_Long:			if (! checkBufSize(fp, 8, className, einfo))				goto fail;			readu4(&d4, fp);			readu4(&d4b, fp);#if SIZEOF_VOIDP == 8			pool[i] = WORDS_TO_LONG(d4, d4b);			i++;			pool[i] = 0;#else			pool[i] = d4;			i++;			pool[i] = d4b;#endif /* SIZEOF_VOIDP == 8 */			tags[i] = CONSTANT_Unknown;			break;		case CONSTANT_Double:			if (! checkBufSize(fp, 8, className, einfo))				goto fail;			readu4(&d4, fp);			readu4(&d4b, fp);#if SIZEOF_VOIDP == 8#if defined(DOUBLE_ORDER_OPPOSITE)			pool[i] = WORDS_TO_LONG(d4b, d4);#else			pool[i] = WORDS_TO_LONG(d4, d4b);#endif /* DOUBLE_ORDER_OPPOSITE */			i++;			pool[i] = 0;#else#if defined(DOUBLE_ORDER_OPPOSITE)			pool[i] = d4b;			i++;			pool[i] = d4;#else			pool[i] = d4;			i++;			pool[i] = d4b;#endif /* DOUBLE_ORDER_OPPOSITE */#endif /* SIZEOF_VOIDP == 8 */			tags[i] = CONSTANT_Unknown;			break;		default:			postExceptionMessage(einfo, 				JAVA_LANG(ClassFormatError), 					     "Invalid constant type %d in class",					     type);fail:			info->size = 0;			while (--i >= 0) {				if (tags[i] == CONSTANT_Utf8) {					utf8ConstRelease((Utf8Const*)pool[i]);				}			}			return false;		}	}	/* Perform some constant pool optimisations to allow for the	 * use of pre-compiled classes.	 */	for (i = 1; i < info->size; i++) {		switch (info->tags[i]) {		case CONSTANT_Class:		case CONSTANT_String:			j = CLASS_NAME(i, info);			if (info->tags[j] == CONSTANT_Utf8) {				/* Rewrite so points directly at string */				info->data[i] = info->data[j];				utf8ConstAddRef(WORD2UTF(info->data[j]));			}			else {				/* Set this tag so it will generate an error				 * during verification.				 */				info->tags[i] = CONSTANT_Error;			}			break;		default:			/* Ignore the rest */			break;		}	}	return true;}

⌨️ 快捷键说明

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