view runtime/func.h @ 71:c40c3d399133

Add Int32@String and Get Char. Fix stack bug
author Mike Pavone <pavone@retrodev.com>
date Fri, 18 Jun 2010 15:07:09 -0400
parents d4b44ae2e34a
children a844c623c7df
line wrap: on
line source

#ifndef _FUNC_H_
#define _FUNC_H_

typedef struct object object;
typedef struct calldata calldata;

typedef enum {
	NORMAL_RETURN=0,
	EXCEPTION_RETURN,
	TAIL_RETURN,
	NO_CONVERSION,
	STACK_UNWIND
} returntype;


typedef returntype (*rhope_func)(calldata *);
typedef void (*special_func) (object *);

#define MethodName(name,type) f_ ## name ## AT_ ## type


#define Func(name,numparams) \
f_ ## name:\
		for(idx = numparams; idx < cdata->num_params; ++idx)\
			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
sf_ ## name:\
		lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
		my_cdata = cdata;


#define FuncNoLocals(name,numparams) \
f_ ## name:\
		for(idx = numparams; idx < cdata->num_params; ++idx)\
			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
sf_ ## name:\
		my_cdata = cdata;		

#define EndFunc(name)	\
		free_stack(ct, lv_ ## name);\
		func = cdata->func;
	
#define EndFuncNoLocals	\
		func = cdata->func;

#define Method(name) \
f_ ## name:\
sf_ ## name:\
		switch(get_blueprint(cdata->params[0])->type_id)\
		{
			
#define EndMethod(name) \
		default:\
			printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\
			cdata = alloc_cdata(ct, cdata, 0);\
			cdata->func = FUNC_ ## name;\
			goto _exception;\
		}
			
			
#define MethodDispatch(type_id,name,type_name) \
		case type_id:\
			goto m_ ## name ## AT_ ## type_name;
			
#define MethodImpl(name,type_name,mytype_id,numparams) \
f_ ## name ## AT_ ## type_name:\
sf_ ## name ## AT_ ## type_name:\
		if (cdata->num_params < 1)\
		{\
			cdata = alloc_cdata(ct, cdata, 0);\
			cdata->func = FUNC_ ## name ## AT_ ## type_name;\
			goto _exception;\
		}\
		if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
		{\
			puts("uh oh, need conversion and that's not implemented yet!");\
			exit(1);\
		}\
m_ ## name ## AT_ ## type_name:\
		for(idx = numparams; idx < cdata->num_params; ++idx)\
			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
		lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\
		my_cdata = cdata;
			
				
#define MethodImplNoLocals(name,type_name,mytype_id,numparams) \
f_ ## name ## AT_ ## type_name:\
sf_ ## name ## AT_ ## type_name:\
		if (cdata->num_params < 1)\
			cdata = alloc_cdata(ct, cdata, 0);\
			cdata->func = FUNC_ ## name ## AT_ ## type_name;\
			goto _exception;\
		if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
		{\
			puts("uh oh, need conversion and that's not implemented yet!");\
			exit(1);\
		}\
m_ ## name ## AT_ ## type_name:\
		for(idx = numparams; idx < cdata->num_params; ++idx)\
			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
		my_cdata = cdata;
			
#define NumParams
#define CallSpace

#define Param(num,convtypeid) \
	if(get_blueprint(cdata->params[num])->type_id != convtypeid)\
	{\
		puts("uh oh, need conversion and that's not implemented yet!");\
		exit(1);\
	}

#define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]);
#define Ret(num,val) cdata->params[num] = (object *)(val);
#define NumRet(num) cdata->num_params = num;
#define Exception
#define FuncDef(name) lt_ ## name * lv_ ## name;
#define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name;


#define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace);

#define SetParam(num,value) cdata->params[num] = value;

#define Call(tocall, numparams, resumeto, myname)\
			cdata->func = RES_  ## resumeto ## _ ## myname;\
			cdata->num_params = numparams;\
			cdata->vars = lv_ ## myname;\
			goto sf_ ## tocall;\
r ## resumeto ## _ ## myname:\
			my_cdata = cdata->lastframe;\
			lv_ ## myname = cdata->vars;
			
	
#define FreeCall\
			temp_cdata = cdata->lastframe;\
			free_stack(ct, cdata);\
			cdata = temp_cdata;

#define FreeCallMethod(myname,mytype)\
			temp_cdata = cdata->lastframe;\
			free_stack(ct, cdata);\
			cdata = temp_cdata;\
			lv_ ## myname ## AT_ ## type_name = (lt_ ## myname ## AT_ ## type_name *)(cdata+1);
			
#define TPrepCall(callspace) \
			func = cdata->lastframe->func;\
			temp_cdata = cdata->lastframe->lastframe;\
			free_stack(ct, cdata->lastframe);\
			cdata = alloc_cdata(ct, temp_cdata, callspace);\
			cdata->func = func;
			
#define TCall(tocall, numparams)\
			cdata->num_params = numparams;\
			goto sf_ ## tocall;
	
	
#endif //_FUNC_H_