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
							 |