forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			119 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #ifndef HX_NEKO_FUNC_H
 | ||
|  | #define HX_NEKO_FUNC_H
 | ||
|  | 
 | ||
|  | #define NEKO_VERSION	180
 | ||
|  | 
 | ||
|  | typedef intptr_t int_val; | ||
|  | 
 | ||
|  | typedef enum { | ||
|  | 	VAL_INT			= 0xFF, | ||
|  | 	VAL_NULL		= 0, | ||
|  | 	VAL_FLOAT		= 1, | ||
|  | 	VAL_BOOL		= 2, | ||
|  | 	VAL_STRING		= 3, | ||
|  | 	VAL_OBJECT		= 4, | ||
|  | 	VAL_ARRAY		= 5, | ||
|  | 	VAL_FUNCTION	= 6, | ||
|  | 	VAL_ABSTRACT	= 7, | ||
|  | 	VAL_PRIMITIVE	= 6 | 8, | ||
|  | 	VAL_JITFUN		= 6 | 16, | ||
|  | 	VAL_32_BITS		= 0xFFFFFFFF | ||
|  | } neko_val_type; | ||
|  | 
 | ||
|  | struct _neko_value { | ||
|  | 	neko_val_type t; | ||
|  | }; | ||
|  | 
 | ||
|  | struct _neko_objtable; | ||
|  | struct _neko_buffer; | ||
|  | 
 | ||
|  | #ifndef HAVE_NEKO_TYPES
 | ||
|  | typedef struct _neko_vkind *neko_vkind; | ||
|  | typedef struct _neko_value *neko_value; | ||
|  | typedef struct _neko_buffer *neko_buffer; | ||
|  | #endif
 | ||
|  | 
 | ||
|  | typedef struct _neko_objtable* neko_objtable; | ||
|  | typedef double tfloat; | ||
|  | 
 | ||
|  | typedef void (*finalizer)(neko_value v); | ||
|  | 
 | ||
|  | #pragma pack(4)
 | ||
|  | typedef struct { | ||
|  | 	neko_val_type t; | ||
|  | 	tfloat f; | ||
|  | } vfloat; | ||
|  | #pragma pack()
 | ||
|  | 
 | ||
|  | typedef struct _vobject { | ||
|  | 	neko_val_type t; | ||
|  | 	neko_objtable table; | ||
|  | 	struct _vobject *proto; | ||
|  | } vobject; | ||
|  | 
 | ||
|  | typedef struct { | ||
|  | 	neko_val_type t; | ||
|  | 	int nargs; | ||
|  | 	void *addr; | ||
|  | 	neko_value env; | ||
|  | 	void *module; | ||
|  | } vfunction; | ||
|  | 
 | ||
|  | typedef struct { | ||
|  | 	neko_val_type t; | ||
|  | 	char c; | ||
|  | } vstring; | ||
|  | 
 | ||
|  | typedef struct { | ||
|  | 	neko_val_type t; | ||
|  | 	neko_value ptr; | ||
|  | } varray; | ||
|  | 
 | ||
|  | typedef struct { | ||
|  | 	neko_val_type t; | ||
|  | 	neko_vkind kind; | ||
|  | 	void *data; | ||
|  | } vabstract; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #define neko_val_tag(v)			(*(neko_val_type*)(v))
 | ||
|  | #define neko_val_is_null(v)		((v) == val_null)
 | ||
|  | #define neko_val_is_int(v)		((((int)(int_val)(v)) & 1) != 0)
 | ||
|  | #define neko_val_is_number(v)	(neko_val_is_int(v) || neko_val_tag(v) == VAL_FLOAT)
 | ||
|  | #define neko_val_is_float(v)		(!neko_val_is_int(v) && neko_val_tag(v) == VAL_FLOAT)
 | ||
|  | #define neko_val_is_string(v)	(!neko_val_is_int(v) && (neko_val_tag(v)&7) == VAL_STRING)
 | ||
|  | #define neko_val_is_function(v)	(!neko_val_is_int(v) && (neko_val_tag(v)&7) == VAL_FUNCTION)
 | ||
|  | #define neko_val_is_object(v)	(!neko_val_is_int(v) && neko_val_tag(v) == VAL_OBJECT)
 | ||
|  | #define neko_val_is_array(v)		(!neko_val_is_int(v) && (neko_val_tag(v)&7) == VAL_ARRAY)
 | ||
|  | #define neko_val_is_abstract(v)  (!neko_val_is_int(v) && neko_val_tag(v) == VAL_ABSTRACT)
 | ||
|  | #define neko_val_is_kind(v,t)	(neko_val_is_abstract(v) && neko_val_kind(v) == (t))
 | ||
|  | #define neko_val_check_kind(v,t)	if( !neko_val_is_kind(v,t) ) neko_error();
 | ||
|  | #define neko_val_check_function(f,n) if( !neko_val_is_function(f) || (neko_val_fun_nargs(f) != (n) && neko_val_fun_nargs(f) != VAR_ARGS) ) neko_error();
 | ||
|  | #define neko_val_check(v,t)		if( !neko_val_is_##t(v) ) neko_error();
 | ||
|  | #define neko_val_data(v)			((vabstract*)(v))->data
 | ||
|  | #define neko_val_kind(v)			((vabstract*)(v))->kind
 | ||
|  | 
 | ||
|  | #define neko_val_type(v)			(neko_val_is_int(v) ? VAL_INT : (neko_val_tag(v)&7))
 | ||
|  | #define neko_val_int(v)			(((int)(int_val)(v)) >> 1)
 | ||
|  | #define neko_val_float(v)		(CONV_FLOAT ((vfloat*)(v))->f)
 | ||
|  | #define neko_val_bool(v)			((v) == neko_val_true)
 | ||
|  | #define neko_val_number(v)		(neko_val_is_int(v)?neko_val_int(v):neko_val_float(v))
 | ||
|  | #define neko_val_hdata(v)		((vhash*)neko_val_data(v))
 | ||
|  | #define neko_val_string(v)		(&((vstring*)(v))->c)
 | ||
|  | #define neko_val_strlen(v)		(neko_val_tag(v) >> 3)
 | ||
|  | #define neko_val_set_length(v,l) neko_val_tag(v) = (neko_val_tag(v)&7) | ((l) << 3)
 | ||
|  | #define neko_val_set_size		neko_val_set_length
 | ||
|  | 
 | ||
|  | #define neko_val_array_size(v)	(neko_val_tag(v) >> 3)
 | ||
|  | #define neko_val_array_ptr(v)	(&((varray*)(v))->ptr)
 | ||
|  | #define neko_val_fun_nargs(v)	((vfunction*)(v))->nargs
 | ||
|  | #define neko_alloc_int(v)		((neko_value)(int_val)((((int)(v)) << 1) | 1))
 | ||
|  | #define neko_alloc_bool(b)		((b)?neko_val_true:neko_val_false)
 | ||
|  | 
 | ||
|  | #define neko_max_array_size		((1 << 29) - 1)
 | ||
|  | #define neko_max_string_size		((1 << 29) - 1)
 | ||
|  | #define neko_invalid_comparison	0xFE
 | ||
|  | 
 | ||
|  | #endif // HX_NEKO_FUNC_H
 |