es2c/runtime/include/runtime.h

115 lines
4.4 KiB
C
Raw Normal View History

2025-01-16 22:48:30 +00:00
#pragma once
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
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));