Forked from
Michal Vlasák / ni-run-template
10 commits behind, 52 commits ahead of the upstream repository.
-
Michal Štěpánek authoredMichal Štěpánek authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
bc_interpreter.h 1.62 KiB
#pragma once
#include "parser.h"
#include "heap.h"
#define OPERAND_STACK_INIT_CAPACITY 512
#define FRAME_STACK_CAPACITY 512
typedef struct Class {
u16 member_count;
u16 * members;
} Class;
typedef struct Constant {
ConstantType kind;
union {
i32 integer;
bool boolean;
Str string;
ConstantFunction function;
Class class;
};
} Constant;
typedef struct Program {
u16 constant_count;
Constant * constant_pool;
Class globals;
u16 entry_point;
} Program;
typedef struct OperandStack {
Value ** elements;
size_t size;
size_t capacity;
} OperandStack;
void ostack_init ( OperandStack * stack );
Value * ostack_pop ( OperandStack * stack );
Value * ostack_top ( OperandStack * stack );
void ostack_push ( OperandStack * stack , Value * value );
void ostack_destroy ( OperandStack * stack );
typedef struct Frame {
struct Frame * prev;
size_t return_ip;
Value * locals [];
} Frame;
typedef struct VM {
Program program;
Heap heap;
OperandStack stack;
Value * globals;
Frame * local_frame;
size_t instruction_pointer;
} VM;
void vm_init ( VM * vm, size_t heap_size );
void vm_destroy ( VM * vm );
Value * alloc_constant ( VM * vm, u16 index );
ObjectValue * create_object ( VM * vm, Class * class );
void print_operand_value ( Value * value );
void print_call ( VM * vm, u16 index, u8 arguments );
void read_header ( Str input, size_t * pos );
void read_constant_pool ( Program * program, Str input, size_t * pos );
void parse_program ( Program * program, Str input );
void bc_function_call ( VM * vm, u8 arguments, bool is_function, Str * name );
int vm_interpret ( VM * vm, Str input );