29#ifndef MAX_FRAME_LOCALS 30#define MAX_FRAME_LOCALS 64 34#define MAX_GLOBALS 128 38#define OUTPUT_SIZE 1024 42#define STACK_SIZE 1024 45static const char *opcode_names[] = {
46 "NOP",
"LOAD_CONST",
"LOAD_LOCAL",
"STORE_LOCAL",
47 "LOAD_GLOBAL",
"STORE_GLOBAL",
"ADD",
"SUB",
"MUL",
"DIV",
48 "LT",
"LTE",
"GT",
"GTE",
"EQ",
"NEQ",
"POP",
"JUMP",
49 "JUMP_IF_FALSE",
"CALL",
"RETURN",
"PRINT",
"ECHO",
"HALT",
51 "MOD",
"AND",
"OR",
"NOT",
"DUP",
"SWAP",
52 "MAKE_ARRAY",
"INDEX_GET",
"INDEX_SET",
53 "LEN",
"PUSH",
"APOP",
"SET",
"INSERT",
"REMOVE",
"SLICE",
54 "TO_NUMBER",
"TO_STRING",
"CAST",
"TYPEOF",
55 "SPLIT",
"JOIN",
"SUBSTR",
"FIND",
56 "REGEX_MATCH",
"REGEX_SEARCH",
"REGEX_REPLACE",
57 "CONTAINS",
"INDEX_OF",
"CLEAR",
59 "MIN",
"MAX",
"CLAMP",
"ABS",
"POW",
"RANDOM_SEED",
"RANDOM_INT",
60 "MAKE_MAP",
"KEYS",
"VALUES",
"HAS_KEY",
61 "READ_FILE",
"WRITE_FILE",
"ENV",
"INPUT_LINE",
"PROC_RUN",
"PROC_SYSTEM",
62 "TIME_NOW_MS",
"CLOCK_MONO_MS",
"DATE_FORMAT",
63 "THREAD_SPAWN",
"THREAD_JOIN",
"SLEEP_MS",
65 "BAND",
"BOR",
"BXOR",
"BNOT",
"SHL",
"SHR",
"ROTL",
"ROTR",
66 "JSON_PARSE",
"JSON_STRINGIFY",
"JSON_FROM_FILE",
"JSON_TO_FILE",
67 "CURL_GET",
"CURL_POST",
"CURL_DOWNLOAD",
68 "SQLITE_OPEN",
"SQLITE_CLOSE",
"SQLITE_EXEC",
"SQLITE_QUERY",
69 "LIBSQL_OPEN",
"LIBSQL_CLOSE",
"LIBSQL_EXEC",
"LIBSQL_QUERY",
70 "PCSC_ESTABLISH",
"PCSC_RELEASE",
"PCSC_LIST_READERS",
"PCSC_CONNECT",
"PCSC_DISCONNECT",
"PCSC_TRANSMIT",
71 "PCRE2_TEST",
"PCRE2_MATCH",
"PCRE2_FINDALL",
72 "INI_LOAD",
"INI_FREE",
"INI_GET_STRING",
"INI_GET_INT",
"INI_GET_DOUBLE",
"INI_GET_BOOL",
"INI_SET",
"INI_UNSET",
"INI_SAVE",
73 "XML_PARSE",
"XML_ROOT",
"XML_NAME",
"XML_TEXT",
74 "SOCK_TCP_LISTEN",
"SOCK_TCP_ACCEPT",
"SOCK_TCP_CONNECT",
"SOCK_SEND",
"SOCK_RECV",
"SOCK_CLOSE",
"SOCK_UNIX_LISTEN",
"SOCK_UNIX_CONNECT",
75 "FD_SET_NONBLOCK",
"FD_POLL_READ",
"FD_POLL_WRITE",
78 "SERIAL_OPEN",
"SERIAL_CONFIG",
"SERIAL_SEND",
"SERIAL_RECV",
"SERIAL_CLOSE",
79 "TRY_PUSH",
"TRY_POP",
"THROW",
82 "RUST_HELLO",
"RUST_HELLO_ARGS",
"RUST_HELLO_ARGS_RETURN",
"RUST_GET_SP",
"RUST_SET_EXIT",
228static inline int opcode_is_valid(
int op) {
Definitions for the Fun VM bytecode: opcodes, instruction format, and bytecode container API.
Call frame representing one active function invocation.
Value locals[MAX_FRAME_LOCALS]
The Fun virtual machine state.
Value output[OUTPUT_SIZE]
int output_is_partial[OUTPUT_SIZE]
int(* on_error_repl)(struct VM *vm)
struct VM::@204221333366357065317066305241116055104274166224 breakpoints[64]
Value globals[MAX_GLOBALS]
long long debug_step_start_ic
Tagged union representing a Fun value.
size_t vm_offset_of_exit_code(void)
Obtain offsetof(VM, exit_code) for FFI struct field access.
void fun_rust_string_free(char *ptr)
size_t vm_offset_of_globals(void)
Obtain offsetof(VM, globals) for FFI struct field access.
size_t vm_value_sizeof(void)
Return sizeof(Value) for external FFI consumers.
void vm_raise_error(VM *vm, const char *msg)
Raise a runtime error honoring active try/catch/finally handlers. If a try handler is active in the c...
char * fun_rust_echo_string(const char *input)
void vm_debug_request_finish(VM *vm)
Request finish (run until the current frame returns).
void vm_debug_clear_breakpoints(VM *vm)
Remove all breakpoints from the VM.
void vm_debug_request_continue(VM *vm)
Resume normal execution (clear stepping state and stop flag).
void vm_debug_request_step(VM *vm)
Request single-step execution (stop after next instruction).
int vm_debug_delete_breakpoint(VM *vm, int id)
Delete a breakpoint by id.
void vm_push_i64(VM *vm, int64_t v)
Push a 64-bit integer as a VM int Value (C ABI helper).
int fun_op_cpp_add(struct VM *vm)
Add two 64-bit integers from the VM stack and push the sum.
void vm_init(VM *vm)
Initialize a VM instance to zero/initial state.
const char * fun_rust_get_string(void)
int fun_rust_print_string(const char *msg)
void vm_debug_reset(VM *vm)
Reset debugger state: breakpoints and stepping controls.
int fun_op_rget_sp(VM *vm)
void vm_run(VM *vm, Bytecode *entry)
Execute the provided entry bytecode in the VM. Pushes an initial frame and runs until HALT or an unre...
void vm_debug_request_next(VM *vm)
Request step-over (stop after next instruction in current frame).
size_t vm_offset_of_stack(void)
Obtain offsetof(VM, stack) for FFI struct field access.
size_t vm_offset_of_sp(void)
Obtain offsetof(VM, sp) for FFI struct field access.
void vm_free(VM *vm)
Free all resources owned by the VM (globals, frames, output buffers). The VM object itself is not fre...
size_t vm_sizeof(void)
Return sizeof(VM) for external FFI consumers.
int vm_debug_add_breakpoint(VM *vm, const char *file, int line)
Add a source breakpoint.
void vm_clear_output(VM *vm)
Clear the buffered output captured by the VM.
void vm_reset(VM *vm)
Reset VM to initial state, freeing globals/locals/output. The VM object remains valid for reuse after...
void * vm_as_mut_ptr(VM *vm)
Get a mutable byte pointer to the VM object. Extremely unsafe; for low-level FFI use only.
void vm_debug_list_breakpoints(VM *vm)
Print active breakpoints to stdout.
int fun_op_rset_exit(VM *vm)
void vm_print_output(VM *vm)
Print buffered output entries to stdout (debug aid).
int64_t vm_pop_i64(VM *vm)
Pop a numeric Value and convert it to a 64-bit integer (C ABI helper).
void vm_dump_globals(VM *vm)
Print non-nil globals (index and value) to stdout.