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
 |