#ifndef MJS_CORE_H
#define MJS_CORE_H
#include "mjs_ffi.h"
#include "mjs_gc.h"
#include "mjs_internal.h"
#if defined(__cplusplus)
extern "C" {
#endif
#define JUMP_INSTRUCTION_SIZE 2
enum mjs_type {
MJS_TYPE_UNDEFINED,
MJS_TYPE_NULL,
MJS_TYPE_BOOLEAN,
MJS_TYPE_NUMBER,
MJS_TYPE_STRING,
MJS_TYPE_FOREIGN,
MJS_TYPE_OBJECT_GENERIC,
MJS_TYPE_OBJECT_ARRAY,
MJS_TYPE_OBJECT_FUNCTION,
MJS_TYPES_CNT
};
enum mjs_call_stack_frame_item {
CALL_STACK_FRAME_ITEM_RETVAL_STACK_IDX,
CALL_STACK_FRAME_ITEM_LOOP_ADDR_IDX,
CALL_STACK_FRAME_ITEM_SCOPE_IDX,
CALL_STACK_FRAME_ITEM_RETURN_ADDR,
CALL_STACK_FRAME_ITEM_THIS,
CALL_STACK_FRAME_ITEMS_CNT
};
#define MAKE_TAG(s, t) \
((uint64_t)(s) << 63 | (uint64_t) 0x7ff0 << 48 | (uint64_t)(t) << 48)
#define MJS_TAG_OBJECT MAKE_TAG(1, 1)
#define MJS_TAG_FOREIGN MAKE_TAG(1, 2)
#define MJS_TAG_UNDEFINED MAKE_TAG(1, 3)
#define MJS_TAG_BOOLEAN MAKE_TAG(1, 4)
#define MJS_TAG_NAN MAKE_TAG(1, 5)
#define MJS_TAG_STRING_I MAKE_TAG(1, 6)
#define MJS_TAG_STRING_5 MAKE_TAG(1, 7)
#define MJS_TAG_STRING_O MAKE_TAG(1, 8)
#define MJS_TAG_STRING_F MAKE_TAG(1, 9)
#define MJS_TAG_STRING_C MAKE_TAG(1, 10)
#define MJS_TAG_STRING_D MAKE_TAG(1, 11)
#define MJS_TAG_ARRAY MAKE_TAG(1, 12)
#define MJS_TAG_FUNCTION MAKE_TAG(1, 13)
#define MJS_TAG_FUNCTION_FFI MAKE_TAG(1, 14)
#define MJS_TAG_NULL MAKE_TAG(1, 15)
#define MJS_TAG_MASK MAKE_TAG(1, 15)
struct mjs_vals {
mjs_val_t this_obj;
mjs_val_t dataview_proto;
mjs_val_t last_getprop_obj;
};
struct mjs_bcode_part {
size_t start_idx;
struct {
const char *p;
size_t len;
} data;
mjs_err_t exec_res : 4;
unsigned in_rom : 1;
};
struct mjs {
struct mbuf bcode_gen;
struct mbuf bcode_parts;
size_t bcode_len;
struct mbuf stack;
struct mbuf call_stack;
struct mbuf arg_stack;
struct mbuf scopes;
struct mbuf loop_addresses;
struct mbuf owned_strings;
struct mbuf foreign_strings;
struct mbuf owned_values;
struct mbuf json_visited_stack;
struct mjs_vals vals;
char *error_msg;
char *stack_trace;
enum mjs_err error;
mjs_ffi_resolver_t *dlsym;
ffi_cb_args_t *ffi_cb_args;
size_t cur_bcode_offset;
struct gc_arena object_arena;
struct gc_arena property_arena;
struct gc_arena ffi_sig_arena;
unsigned inhibit_gc : 1;
unsigned need_gc : 1;
unsigned generate_jsc : 1;
};
typedef uint32_t mjs_header_item_t;
enum mjs_header_items {
MJS_HDR_ITEM_TOTAL_SIZE,
MJS_HDR_ITEM_BCODE_OFFSET,
MJS_HDR_ITEM_MAP_OFFSET,
MJS_HDR_ITEMS_CNT
};
MJS_PRIVATE size_t mjs_get_func_addr(mjs_val_t v);
MJS_PRIVATE int mjs_getretvalpos(struct mjs *mjs);
MJS_PRIVATE enum mjs_type mjs_get_type(mjs_val_t v);
MJS_PRIVATE void mjs_gen_stack_trace(struct mjs *mjs, size_t offset);
MJS_PRIVATE mjs_val_t vtop(struct mbuf *m);
MJS_PRIVATE size_t mjs_stack_size(const struct mbuf *m);
MJS_PRIVATE mjs_val_t *vptr(struct mbuf *m, int idx);
MJS_PRIVATE void push_mjs_val(struct mbuf *m, mjs_val_t v);
MJS_PRIVATE mjs_val_t mjs_pop_val(struct mbuf *m);
MJS_PRIVATE mjs_val_t mjs_pop(struct mjs *mjs);
MJS_PRIVATE void mjs_push(struct mjs *mjs, mjs_val_t v);
MJS_PRIVATE void mjs_die(struct mjs *mjs);
#if defined(__cplusplus)
}
#endif
#endif