-
Notifications
You must be signed in to change notification settings - Fork 2
/
eval.h
74 lines (59 loc) · 1.46 KB
/
eval.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#ifndef cb_eval_h
#define cb_eval_h
#include <stddef.h>
#include "compiler.h"
#include "gc.h"
#include "hashmap.h"
#include "value.h"
struct cb_upvalue {
size_t refcount;
int is_open;
union {
size_t idx;
struct cb_value value;
} v;
};
struct cb_frame {
struct cb_frame *parent;
size_t bp;
struct cb_module *module;
struct cb_value func;
};
union cb_inline_cache {
struct cb_load_struct_cache {
const struct cb_struct_spec *spec;
ssize_t index;
} load_struct;
struct cb_load_global_cache {
size_t version;
size_t index;
} load_global;
struct cb_load_from_module_cache {
size_t version;
size_t index;
} load_from_module;
};
struct cb_vm_state {
cb_bytecode *bytecode;
union cb_inline_cache *ic;
struct cb_value *stack;
struct cb_value *stack_top;
size_t stack_size;
struct cb_frame *frame;
struct cb_upvalue **upvalues;
size_t upvalues_idx, upvalues_size;
/* size of this array is based on number of modspecs in agent */
struct cb_module *modules;
struct cb_error *error;
};
extern struct cb_vm_state cb_vm_state;
void cb_vm_init(cb_bytecode *bytecode);
void cb_vm_deinit(void);
void cb_vm_grow_modules_array(size_t new_size);
int cb_eval(struct cb_vm_state *state, size_t pc, struct cb_frame *frame);
int cb_run(void);
struct cb_user_function *cb_caller(void);
int cb_vm_call_user_func(struct cb_value fn, struct cb_value *args,
size_t args_len, struct cb_value *result);
struct cb_value cb_get_upvalue(struct cb_upvalue *uv);
#endif