-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathant.h
More file actions
234 lines (184 loc) · 9.43 KB
/
Copy pathant.h
File metadata and controls
234 lines (184 loc) · 9.43 KB
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#ifndef ANT_H
#define ANT_H
#pragma once
#define PCRE2_CODE_UNIT_WIDTH 8
#include "types.h"
#include "common.h"
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
#define STR_PROTO "__proto__"
#define STR_PROTO_LEN 9
#define CFUNC_HAS_PROTOTYPE 0x01u
#define ANT_ASSERT(cond, msg) ({ \
if (!(cond)) { \
fprintf(stderr, "ANT FATAL: %s\n %s:%d\n", msg, __FILE__, __LINE__); \
abort(); \
}})
#define ANT_STRING(s) js_mkstr(js, s, sizeof(s) - 1)
#define ANT_COPY(buf, len, s) cpy(buf, len, s, sizeof(s) - 1)
#define REMAIN(n, len) ((n) >= (len) ? 0 : (len) - (n))
#define JS_NAN ((double)NAN)
#define JS_NEG_NAN ((double)(-NAN))
#define JS_INF ((double)INFINITY)
#define JS_NEG_INF ((double)(-INFINITY))
#define js_true (NANBOX_PREFIX | ((ant_value_t)T_BOOL << NANBOX_TYPE_SHIFT) | 1)
#define js_false (NANBOX_PREFIX | ((ant_value_t)T_BOOL << NANBOX_TYPE_SHIFT))
#define js_bool(x) (js_false | (ant_value_t)!!(x))
ant_t *js_create(void *buf, size_t len);
ant_t *js_create_dynamic();
ant_value_t js_glob(ant_t *);
void js_mark_constructor(ant_value_t value, bool is_constructor);
// TODO: improve naming
ant_value_t js_eval_bytecode(ant_t *, const char *, size_t);
ant_value_t js_eval_bytecode_module(ant_t *, const char *, size_t);
ant_value_t js_eval_bytecode_eval(ant_t *, const char *, size_t);
ant_value_t js_eval_bytecode_eval_with_strict(ant_t *, const char *, size_t, bool);
ant_value_t js_eval_bytecode_repl(ant_t *, const char *, size_t);
void js_destroy(ant_t *);
bool js_truthy(ant_t *, ant_value_t);
void js_setstackbase(ant_t *, void *);
void js_setstacklimit(ant_t *, size_t);
uint32_t js_to_uint32(double d);
int32_t js_to_int32(double d);
bool js_chkargs(ant_value_t *, int, const char *);
void js_set_filename(ant_t *, const char *);
void js_stats(ant_t *, size_t *total, size_t *min, size_t *cstacksize);
ant_value_t js_mkundef(void);
ant_value_t js_mknull(void);
ant_value_t js_mknum(double);
ant_value_t js_mkpromise(ant_t *js);
ant_value_t js_mkgenerator(ant_t *js);
ant_value_t js_getthis(ant_t *);
void js_setthis(ant_t *, ant_value_t);
ant_value_t js_getcurrentfunc(ant_t *);
ant_value_t js_get(ant_t *, ant_value_t, const char *);
ant_value_t js_getprop_proto(ant_t *, ant_value_t, const char *);
ant_value_t js_getprop_fallback(ant_t *js, ant_value_t obj, const char *name);
ant_value_t js_getprop_super(ant_t *js, ant_value_t super_obj, ant_value_t receiver, const char *name);
ant_offset_t js_arr_len(ant_t *js, ant_value_t arr);
ant_value_t js_arr_get(ant_t *js, ant_value_t arr, ant_offset_t idx);
bool js_iter(
ant_t *js,
ant_value_t iterable,
bool (*callback)(
ant_t *js,
ant_value_t value,
void *udata
),
void *udata
);
const char *js_sym_desc(ant_value_t sym);
const char *js_sym_key(ant_value_t sym);
ant_value_t js_mksym_for(ant_t *, const char *key);
ant_value_t js_symbol_to_string(ant_t *js, ant_value_t sym);
ant_value_t js_get_sym(ant_t *, ant_value_t obj, ant_value_t sym);
ant_value_t js_get_symbol(ant_t *, ant_value_t obj, const char *key);
ant_value_t js_get_sym_with_receiver(ant_t *, ant_value_t obj, ant_value_t sym, ant_value_t receiver);
ant_value_t js_mkobj(ant_t *);
ant_value_t js_mkobj_with_inobj_limit(ant_t *, uint8_t inobj_limit);
ant_value_t js_newobj(ant_t *);
ant_value_t js_mkarr(ant_t *);
ant_value_t js_mkstr(ant_t *, const void *, size_t);
ant_value_t js_mkstr_permanent(ant_t *, const void *, size_t);
ant_value_t js_mkbigint(ant_t *, const char *digits, size_t len, bool negative);
ant_value_t js_mksym(ant_t *, const char *desc);
ant_value_t js_mksym_well_known(ant_t *, const char *desc);
ant_value_t js_mkfun_meta(const ant_cfunc_meta_t *meta);
ant_value_t js_mkfun_dyn(ant_cfunc_t fn);
ant_value_t js_heavy_mkfun(ant_t *js, ant_value_t (*fn)(ant_params_t), ant_value_t data);
ant_value_t js_heavy_mkfun_native(ant_t *js, ant_value_t (*fn)(ant_params_t), void *ptr, uint32_t tag);
ant_value_t js_mkprop_fast(ant_t *js, ant_value_t obj, const char *key, size_t len, ant_value_t v);
// TODO: deprecate
ant_offset_t js_mkprop_fast_off(ant_t *js, ant_value_t obj, const char *key, size_t len, ant_value_t v);
#define js_mkfun(fn) ({ \
static const ant_cfunc_meta_t _ant_cfunc_meta = { (fn), NULL, 0, 0 }; \
js_mkfun_meta(&_ant_cfunc_meta); \
})
#define js_mkfun_arity(fn, arity) ({ \
static const ant_cfunc_meta_t _ant_cfunc_meta = { (fn), NULL, (arity), 0 }; \
js_mkfun_meta(&_ant_cfunc_meta); \
})
#define js_mkfun_flags(fn, flags) ({ \
static const ant_cfunc_meta_t _ant_cfunc_meta = { (fn), NULL, 0, (flags) }; \
js_mkfun_meta(&_ant_cfunc_meta); \
})
#define js_mkfun_arity_flags(fn, arity, flags) ({ \
static const ant_cfunc_meta_t _ant_cfunc_meta = { (fn), NULL, (arity), (flags) }; \
js_mkfun_meta(&_ant_cfunc_meta); \
})
void js_set(ant_t *, ant_value_t, const char *, ant_value_t);
void js_set_exact(ant_t *, ant_value_t, const char *, ant_value_t);
void js_set_sym(ant_t *, ant_value_t obj, ant_value_t sym, ant_value_t val);
void js_set_symbol(ant_t *, ant_value_t obj, const char *key, ant_value_t val);
void js_saveval(ant_t *js, ant_offset_t off, ant_value_t v);
void js_merge_obj(ant_t *, ant_value_t dst, ant_value_t src);
void js_arr_push(ant_t *, ant_value_t arr, ant_value_t val);
void js_set_proto(ant_value_t obj, ant_value_t proto);
void js_set_proto_wb(ant_t *js, ant_value_t obj, ant_value_t proto);
void js_set_proto_init(ant_value_t obj, ant_value_t proto);
ant_value_t js_propref_load(ant_t *js, ant_offset_t handle);
ant_value_t js_setprop(ant_t *, ant_value_t obj, ant_value_t key, ant_value_t val);
ant_value_t js_setprop_nonconfigurable(ant_t *, ant_value_t obj, const char *key, size_t keylen, ant_value_t val);
ant_value_t js_get_proto(ant_t *, ant_value_t obj);
ant_value_t js_get_ctor_proto(ant_t *, const char *name, size_t len);
ant_value_t js_tostring_val(ant_t *js, ant_value_t value);
uint8_t vtype(ant_value_t val);
size_t vdata(ant_value_t val);
bool js_is_constructor(ant_value_t value);
ant_object_t *js_obj_ptr(ant_value_t val);
ant_value_t js_obj_from_ptr(ant_object_t *obj);
double js_getnum(ant_value_t val);
char *js_getstr(ant_t *js, ant_value_t val, size_t *len);
const char *js_str(ant_t *, ant_value_t val);
const char *get_str_prop(ant_t *js, ant_value_t obj, const char *key, ant_offset_t klen, ant_offset_t *out_len);
typedef struct {
void *ctx;
ant_offset_t off;
} ant_iter_t;
typedef struct {
uint32_t slot;
bool is_symbol;
const char *str;
size_t key_len;
ant_offset_t sym_off;
} ant_iter_key_t;
ant_iter_t js_prop_iter_begin(ant_t *js, ant_value_t obj);
void js_prop_iter_end(ant_iter_t *iter);
bool js_prop_iter_next_key(ant_iter_t *iter, ant_iter_key_t *key_out, ant_value_t *value);
bool js_prop_iter_next(ant_iter_t *iter, const char **key, size_t *key_len, ant_value_t *value);
bool js_prop_iter_next_val(ant_iter_t *iter, ant_value_t *key_out, ant_value_t *value);
bool js_is_own_enumerable_prop(ant_t *js, ant_value_t source, ant_object_t *source_ptr, const ant_iter_key_t *key);
bool js_copy_exotic_own_props(ant_t *js, ant_value_t dst, ant_value_t src);
ant_value_t js_obj_to_func(ant_value_t obj);
ant_value_t js_obj_to_func_ex(ant_value_t obj, uint8_t flags);
ant_value_t js_mktypedarray(void *data);
void *js_gettypedarray(ant_value_t val);
void js_check_unhandled_rejections(ant_t *js);
void js_setup_import_meta(ant_t *js, const char *filename);
void js_process_promise_handlers(ant_t *js, ant_value_t promise);
void js_mark_promise_trigger_dequeued(ant_t *js, ant_value_t promise);
bool js_mark_promise_trigger_queued(ant_t *js, ant_value_t promise);
bool js_try_get_own_data_prop(ant_t *js, ant_value_t obj, const char *key, size_t key_len, ant_value_t *out);
void js_reject_promise(ant_t *js, ant_value_t promise, ant_value_t value);
void js_resolve_promise(ant_t *js, ant_value_t promise, ant_value_t value);
typedef ant_value_t (*js_getter_fn)(ant_t *js, ant_value_t obj, const char *key, size_t key_len);
typedef ant_value_t (*js_keys_fn)(ant_t *js, ant_value_t obj);
typedef bool (*js_setter_fn)(ant_t *js, ant_value_t obj, const char *key, size_t key_len, ant_value_t value);
typedef bool (*js_deleter_fn)(ant_t *js, ant_value_t obj, const char *key, size_t key_len);
typedef void (*js_finalizer_fn)(ant_t *js, ant_object_t *obj);
void js_set_getter(ant_value_t obj, js_getter_fn getter);
void js_set_setter(ant_value_t obj, js_setter_fn setter);
void js_set_deleter(ant_value_t obj, js_deleter_fn deleter);
void js_set_keys(ant_value_t obj, js_keys_fn keys);
void js_set_finalizer(ant_value_t obj, js_finalizer_fn fn);
ant_value_t js_get_slot(ant_value_t obj, internal_slot_t slot);
ant_value_t js_promise_assimilate_awaitable(ant_t *js, ant_value_t value);
ant_value_t js_promise_then(ant_t *js, ant_value_t promise, ant_value_t on_fulfilled, ant_value_t on_rejected);
void js_set_slot(ant_value_t obj, internal_slot_t slot, ant_value_t value);
void js_set_slot_wb(ant_t *, ant_value_t obj, internal_slot_t slot, ant_value_t value);
bool js_reserve_slots(ant_value_t obj, uint8_t capacity);
#endif