#pragma once #include #include #include typedef struct js_value { void *data; enum { JS_T_UNDEFINED, JS_T_NULL, JS_T_BOOL, JS_T_STR, JS_T_NUM, JS_T_FUNC, JS_T_OBJ, JS_T_ARR, } type; } js_value_t; typedef struct js_capture *js_capture_t; typedef struct js_ctx *js_ctx_t; typedef js_value_t (*js_func_body_t)(js_ctx_t ctx, js_value_t self, size_t argc, js_value_t argv); typedef struct { uint16_t *data; size_t size: sizeof(size_t) - 1; size_t dynamic: 1; } js_string_t; const js_string_t EMPTY = { .data = &(uint16_t[]){'t'}, .size = -1, .dynamic = false }; #define JS_STRING_LITERAL(literal) ((js_string_t) { .data = (literal), .size = sizeof (literal) / sizeof (literal)[0] - 1, .dynamic = false }) js_value_t JS_UNDEFINED = { .data = NULL, .type = JS_T_UNDEFINED }; js_value_t JS_NULL = { .data = NULL, .type = JS_T_NULL }; js_value_t JS_TRUE = { .data = (void*)1, .type = JS_T_BOOL }; js_value_t JS_FALSE = { .data = (void*)0, .type = JS_T_BOOL }; const js_string_t JS_TYPES[] = { JS_STRING_LITERAL(u"undefined"), JS_STRING_LITERAL(u"object"), JS_STRING_LITERAL(u"boolean"), JS_STRING_LITERAL(u"string"), JS_STRING_LITERAL(u"number"), JS_STRING_LITERAL(u"function"), JS_STRING_LITERAL(u"object"), JS_STRING_LITERAL(u"object"), }; extern bool JS_ERR_FLAG; js_value_t js_mk_num(double val); js_value_t js_mk_bool(bool val); js_value_t js_mk_str(js_ctx_t ctx, js_string_t str); js_value_t js_mk_sym(js_ctx_t ctx, js_string_t name); js_value_t js_mk_obj(js_ctx_t ctx); js_value_t js_mk_arr(js_ctx_t ctx, size_t cap); js_value_t js_mk_args(js_ctx_t ctx, size_t argc, js_value_t *argv); js_value_t js_mk_func(js_ctx_t ctx, bool apply, bool construct, js_string_t name, js_func_body_t body, size_t capn, js_capture_t *capv); int32_t js_to_int32(js_ctx_t ctx, js_value_t val); int64_t js_to_int64(js_ctx_t ctx, js_value_t val); bool js_to_bool(js_ctx_t ctx, js_value_t val); js_string_t js_to_string(js_ctx_t ctx, js_value_t val); js_value_t js_op_add(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_op_sub(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_op_mod(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_op_div(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_op_neg(js_ctx_t ctx, js_value_t val); js_value_t js_op_b_and(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_op_b_or(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_op_b_xor(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_op_b_rsh(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_op_b_lsh(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_op_b_ursh(js_ctx_t ctx, js_value_t a, js_value_t b); bool js_op_b_not(js_ctx_t ctx, js_value_t val); bool js_op_less(js_ctx_t ctx, js_value_t a, js_value_t b); bool js_op_gr(js_ctx_t ctx, js_value_t a, js_value_t b); bool js_op_leq(js_ctx_t ctx, js_value_t a, js_value_t b); bool js_op_geq(js_ctx_t ctx, js_value_t a, js_value_t b); bool js_op_eq_loose(js_ctx_t ctx, js_value_t a, js_value_t b); bool js_op_neq_loose(js_ctx_t ctx, js_value_t a, js_value_t b); bool js_op_eq(js_ctx_t ctx, js_value_t a, js_value_t b); bool js_op_neq(js_ctx_t ctx, js_value_t a, js_value_t b); js_value_t js_obj_set_proto(js_ctx_t ctx, js_value_t obj, js_value_t proto); js_value_t js_obj_get_proto(js_ctx_t ctx, js_value_t obj); js_value_t js_obj_get_own(js_ctx_t ctx, js_value_t obj, js_value_t key); js_value_t js_obj_set_own(js_ctx_t ctx, js_value_t obj, js_value_t key, js_value_t value); js_value_t js_obj_has_own(js_ctx_t ctx, js_value_t obj, js_value_t key); js_value_t js_obj_del_own(js_ctx_t ctx, js_value_t obj, js_value_t key); js_value_t js_obj_get(js_ctx_t ctx, js_value_t obj, js_value_t key); bool js_obj_set(js_ctx_t ctx, js_value_t obj, js_value_t key, js_value_t value); bool js_obj_has(js_ctx_t ctx, js_value_t obj, js_value_t key); js_value_t js_obj_def_field(js_ctx_t ctx, js_value_t obj, js_value_t key, bool w, bool c, bool e); js_value_t js_obj_def_prop(js_ctx_t ctx, js_value_t obj, js_value_t key, js_value_t get, js_value_t set, bool c, bool e); js_value_t js_func_apply(js_ctx_t ctx, js_value_t func, js_value_t self, size_t argc, js_value_t *argv); js_value_t js_func_construct(js_ctx_t ctx, js_value_t func, js_value_t self, size_t argc, js_value_t *argv); js_value_t js_get_error(js_ctx_t ctx); js_value_t js_return(js_ctx_t ctx, js_value_t val); void js_gc_(); int js_runtime_bootstrap(int argc, const char **argv, void (*callee)(js_ctx_t ctx));