115 lines
4.4 KiB
C
115 lines
4.4 KiB
C
#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)); |