Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 28 additions & 4 deletions clang/ffi/api.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,34 @@ fn Term term_new_app(Term f, Term x);
fn Term term_new_lam_at(u64 loc, Term body);
fn Term term_new_lam(Term body);
fn Term term_new_var(u64 loc);
fn Term term_new_era(void);
fn Term term_new_ref(u32 nam);
fn Term term_new_mat(u32 nam, Term val, Term nxt);

fn u8 term_tag(Term t);
fn u32 term_ext(Term t);
fn u64 term_val(Term t);
fn u8 term_tag(Term t);
fn u32 term_ext(Term t);
fn u64 term_val(Term t);
fn u32 term_arity(Term t);
fn u8 term_sub_get(Term t);
fn Term term_sub_set(Term t, u8 sub);

fn Term heap_read(u64 loc);
fn void heap_set(u64 loc, Term t);
fn u64 heap_alloc(u64 words);

fn u32 table_find(const char *name, u32 len);
fn u32 table_find(const char *name, u32 len);
fn char *table_get(u32 id);

fn void sys_runtime_error(const char *msg);

fn u64 ffi_book_get(u32 id) {
return BOOK[id];
}

fn void ffi_book_set(u32 id, u64 loc) {
BOOK[id] = loc;
}

static const HvmApi HVM_API = {
.abi_version = ABI_VERSION,

Expand All @@ -40,17 +55,26 @@ static const HvmApi HVM_API = {
.term_new_lam_at = term_new_lam_at,
.term_new_lam = term_new_lam,
.term_new_var = term_new_var,
.term_new_era = term_new_era,
.term_new_ref = term_new_ref,
.term_new_mat = term_new_mat,

.term_tag = term_tag,
.term_ext = term_ext,
.term_val = term_val,
.term_arity = term_arity,
.term_sub_get = term_sub_get,
.term_sub_set = term_sub_set,

.heap_read = heap_read,
.heap_set = heap_set,
.heap_alloc = heap_alloc,

.table_find = table_find,
.name_from_str = table_find,
.table_get = table_get,
.book_get = ffi_book_get,
.book_set = ffi_book_set,

.runtime_error = sys_runtime_error
};
Expand Down
17 changes: 13 additions & 4 deletions clang/hvm_ffi.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
extern "C" {
#endif

#define ABI_VERSION 1
#define ABI_VERSION 2

#ifndef HVM_RUNTIME
typedef uint8_t u8;
Expand Down Expand Up @@ -38,20 +38,29 @@ typedef struct {
Term (*term_new_lam_at)(u64 loc, Term body);
Term (*term_new_lam)(Term body);
Term (*term_new_var)(u64 loc);
Term (*term_new_era)(void);
Term (*term_new_ref)(u32 name);
Term (*term_new_mat)(u32 name, Term hit, Term miss);

// accessors
u8 (*term_tag)(Term t);
u32 (*term_ext)(Term t);
u64 (*term_val)(Term t);
u32 (*term_arity)(Term t);
u8 (*term_sub_get)(Term t);
Term (*term_sub_set)(Term t, u8 sub);

// heap
Term (*heap_read)(u64 loc);
void (*heap_set)(u64 loc, Term t);
u64 (*heap_alloc)(u64 words);

// names
u32 (*table_find)(const char *name, u32 len);
u32 (*name_from_str)(const char *name, u32 len);
// book / names
u32 (*table_find)(const char *name, u32 len);
u32 (*name_from_str)(const char *name, u32 len);
char *(*table_get)(u32 id);
u64 (*book_get)(u32 id);
void (*book_set)(u32 id, u64 loc);

// errors
void (*runtime_error)(const char *msg);
Expand Down