⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jitbasic.c

📁 kaffe Java 解释器语言,源码,Java的子集系统,开放源代码
💻 C
字号:
/* * jitBasic.c * * Copyright (c) 2003 University of Utah and the Flux Group. * All rights reserved. * * This file is licensed under the terms of the GNU Public License. * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * Contributed by the Flux Research Group, Department of Computer Science, * University of Utah, http://www.cs.utah.edu/flux/ */#include "config.h"#include "object.h"#include "support.h"#include "utf8const.h"#include "classMethod.h"#include "stringParsing.h"#if !defined(TRANSLATOR)int internal_test(char *class_name){	return( 0 );}#else#include <machine.h>#include <slots.h>#include <seq.h>#include <labels.h>#include <codeproto.h>#include <basecode.h>Method *findMethodNoSig(Hjava_lang_Class *cl, Utf8Const *name){	Method *retval = 0;	int lpc;	assert(cl != 0);	assert(name != 0);	for( lpc = 0; (lpc < CLASS_NMETHODS(cl)) && !retval; lpc++ )	{		if( CLASS_METHODS(cl)[lpc].name == name )			retval = &CLASS_METHODS(cl)[lpc];	}	assert(retval != 0);		return( retval );}#define MAX_TEST_FIELD_COMPONENTS 64struct testField {	char *tf_Name;	int tf_ComponentCount;	int tf_MethodIndex;	parsedString tf_Components[MAX_TEST_FIELD_COMPONENTS];};staticint fieldComponentHandler(struct testField *tf){	int retval = 1;	tf->tf_ComponentCount += 1;	tf->tf_Components[tf->tf_ComponentCount] = tf->tf_Components[0];	if( tf->tf_Components[0].len == 0 )		tf->tf_MethodIndex = tf->tf_ComponentCount + 1;	return( retval );}int parseTestField(struct testField *tf){	return parseString(		tf->tf_Name,		SPO_NotEmpty,		  SPO_Do,		    SPO_String, &tf->tf_Components[0],		    SPO_While, "_", "",		    SPO_Handle, fieldComponentHandler, tf,		    SPO_End,		  SPO_End,		SPO_End);}int field2values(jvalue *dst, parsed_signature_t *ps, struct testField *tf){	int lpc, retval = 1;	for( lpc = 1; (lpc <= ps->nargs) && retval; lpc++ )	{		parsedString *arg;		char *str;		arg = &tf->tf_Components[lpc + 1];		switch( ps->signature->data[ps->ret_and_args[lpc]] )		{		case 'Z':			dst[lpc - 1].z = !cmpPStrStr(arg, "true");			break;		case 'B':			dst[lpc - 1].b = (char)strtol(arg->data, 0, 0);			break;		case 'C':			dst[lpc - 1].c = arg->data[0];			break;		case 'S':			dst[lpc - 1].s = (short)strtol(arg->data, 0, 0);			break;		case 'I':			dst[lpc - 1].i = strtoul(arg->data, 0, 0);			break;		case 'J':			dst[lpc - 1].j = (long long)strtouq(arg->data, 0, 0);			break;		case 'D':		case 'F':			if( (str = promoteParsedString(arg)) )			{				double value;				char *sep;								if( (sep = strchr(str, 'd')) )				{					*sep = '.';				}				value = strtod(str, 0);				if( ps->signature->data[ps->ret_and_args[lpc]]				    == 'D' )				{					dst[lpc - 1].d = value;				}				else				{					dst[lpc - 1].f = (float)value;				}				gc_free(str);			}			else			{				retval = 0;			}			break;		default:			assert(0);			break;		}	}	return( retval );}int testMethod(Hjava_lang_Class *cl, Field *field){	struct testField tf;	errorInfo einfo;	int retval = 0;	tf.tf_Name = (char *)field->name->data;	tf.tf_ComponentCount = 0;	if( parseTestField(&tf) )	{		Utf8Const *utf;		Method *meth;				utf = utf8ConstNew(tf.tf_Components[tf.tf_MethodIndex].data,				   -1);		meth = findMethodNoSig(cl, utf);		if( translate(meth, &einfo) )		{			jvalue args[MAX_TEST_FIELD_COMPONENTS];			void *methblock;			jvalue rc;			field2values(args, METHOD_PSIG(meth), &tf);			methblock = GC_getObjectBase(main_collector,						     METHOD_NATIVECODE(meth));			callMethodA(meth,				    METHOD_NATIVECODE(meth),				    0,				    args,				    &rc,				    0);			if( !memcmp(&rc, field->info.addr, field->bsize) )			{				kaffe_dprintf("Success %08x\n", rc.i);				retval = 1;			}			else			{				kaffe_dprintf("Failure %08x %f\n", rc.i, rc.d);			}		}		else		{			assert(0);		}	}	return( retval );}int internal_test(parsedString *ps){	char *class_name;	int retval = 0;	if( (class_name = promoteParsedString(ps)) )	{		Hjava_lang_Class *cl;		errorInfo einfo;		int lpc;				retval = 1;		loadStaticClass(&cl, class_name);		processClass(cl, CSTATE_COMPLETE, &einfo);		kaffe_dprintf("class: %s\n", cl->name->data);		for( lpc = 0; (lpc < CLASS_NSFIELDS(cl)) && retval; lpc++ )		{			Field *field;						field = &CLASS_SFIELDS(cl)[lpc];			kaffe_dprintf("  field: %s = 0x%08x\n",				      field->name->data,				      ((int *)field->info.addr)[0]);			if( !strncmp("test_", field->name->data, 5) )			{				retval = testMethod(cl, field);			}		}		gc_free(class_name);	}	return( retval );}#endif

⌨️ 快捷键说明

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