Something went wrong. Try again.
javascript for 🐜's, a tiny runtime with big ambitions antjs.org
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252#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>
static constexpr uint8_t CFUNC_HAS_PROTOTYPE = 0x01u;static constexpr uint8_t CFUNC_IS_CONSTRUCTOR = 0x02u;static constexpr uint8_t CFUNC_NATIVE_GETTER = 0x04u;static constexpr uint8_t CFUNC_REALM_FREE = 0x08u;
#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_INF ((double)INFINITY)#define JS_NEG_INF ((double)(-INFINITY))
typedef struct ant_isolate_options { size_t object_arena_bytes;} ant_isolate_options_t;
// create a new ant isolateant_t *ant_create(const ant_isolate_options_t *options);
// clean up after a threadvoid ant_thread_cleanup(void);
// globalThisant_value_t js_glob(ant_t *);
void init_intrinsic_symbols(ant_t *js);void js_init_function_has_instance(ant_t *js);bool js_realm_init_intrinsics(ant_t *js);bool js_realm_finish_intrinsics(ant_t *js);void js_mark_constructor(ant_value_t value, bool is_constructor);
typedef enum: uint8_t { JS_EVAL_COMPLETE, JS_EVAL_ASYNC_ENTRY,} js_eval_completion_kind_t;
typedef struct { ant_value_t value; coroutine_t *async_coro; js_eval_completion_kind_t kind;} js_eval_result_t;
typedef enum: uint8_t { JS_PROMISE_INVALID, JS_PROMISE_PENDING, JS_PROMISE_FULFILLED, JS_PROMISE_REJECTED,} js_promise_settlement_t;
js_promise_settlement_t js_promise_get_settlement( ant_t *js, ant_value_t promise, ant_value_t *value_out);
// TODO: improve namingant_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);js_eval_result_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_fallback_len(ant_t *js, ant_value_t obj, const char *name, size_t key_len);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 Ant_Object_CreateBare(ant_t *);ant_value_t Ant_Object_Create(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_mkbigint_permanent(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_mkprop_fast(ant_t *js, ant_value_t obj, const char *key, size_t len, ant_value_t v);
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_tostringtag(ant_t *, ant_value_t obj, ant_value_t tag);void js_set_symbol(ant_t *, ant_value_t obj, const char *key, ant_value_t val);bool js_prop_store(ant_t *js, ant_prop_loc_t loc, ant_value_t value);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_arr_reserve(ant_t *, ant_value_t arr, uint32_t n);void js_set_proto(ant_t *, ant_value_t obj, ant_value_t proto);void js_set_proto_wb(ant_t *, ant_value_t obj, ant_value_t proto);void js_set_proto_init(ant_value_t obj, ant_value_t proto);void *js_permanent_alloc(ant_t *, size_t size, size_t align);
ant_value_t js_get_proto(ant_t *, ant_value_t obj);ant_value_t js_tostring_val(ant_t *js, ant_value_t value);ant_value_t js_prop_load(ant_prop_loc_t loc);ant_value_t js_setprop(ant_t *, ant_value_t obj, ant_value_t key, ant_value_t val);ant_value_t js_setprop_keyed(ant_t *, ant_value_t obj, ant_value_t key, ant_value_t val);ant_value_t js_setprop_readonly_nonconfigurable(ant_t *, ant_value_t obj, const char *key, size_t keylen, ant_value_t val);
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 { ant_t *js; ant_object_t *obj; 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_is_constructor(ant_value_t value);bool js_mark_promise_trigger_queued(ant_t *js, ant_value_t promise);bool js_prop_iter_next_val(ant_iter_t *iter, ant_value_t *key_out, ant_value_t *value);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_try_get_own_data_prop(ant_t *js, ant_value_t obj, const char *key, size_t key_len, ant_value_t *out);bool js_is_own_enumerable_prop(ant_t *js, ant_value_t source, ant_object_t *source_ptr, const ant_iter_key_t *key);
ant_value_t js_obj_to_func(ant_t *js, ant_value_t obj);ant_value_t js_obj_to_func_ex(ant_t *js, 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);
void js_mark_promise_rejection_handled_chain(ant_t *js, ant_value_t promise);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);void js_process_promise_thenable_job(ant_t *js, ant_value_t promise, ant_value_t thenable, ant_value_t then_fn);
typedef void (*js_finalizer_fn)(ant_t *js, ant_object_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 ant_value_t (*js_definer_fn)( ant_t *js, ant_value_t obj, const char *key, size_t key_len, ant_value_t value, bool has_value, bool plain_data);
typedef ant_value_t (*js_getter_fn)( ant_t *js, ant_value_t obj, const char *key, size_t key_len);
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_definer(ant_value_t obj, js_definer_fn definer);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 Ant_Promise_Observe(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