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
|