Files
thesis-lisp/compiler/include/unit.h
T

58 lines
1.1 KiB
C

#pragma once
#include "hash.h"
#include "vector.h"
#define NAME_GLOBAL 1
#define NAME_LOCAL 2
#define NAME_EXTERNAL 3
#define NAME_ARGUMENT 4
struct unit;
struct context {
struct unit *root;
struct context *parent;
struct function *owner;
size_t var_counter;
struct hash vars;
};
struct ext_ref {
size_t unit_index;
size_t entry_index;
char name[64];
};
struct ext_unit_entry {
char name[64];
};
struct ext_unit {
size_t entry_count;
struct ext_unit_entry *entries;
char name[64];
};
struct function {
size_t index;
size_t local_count;
struct node *args, *body;
struct vector bytecode;
};
struct unit {
struct context global;
struct vector functions;
struct vector ext_refs;
struct vector ext_units;
};
void unit_init(struct unit *u);
void ctx_init(struct context *c, struct context *p);
struct function *unit_lambda(struct unit *u);
int unit_ext_load(struct unit *self, const char *unit);
int ctx_lookup_name(struct context *ctx, const char *name, int *kind, size_t *index);
void emit_insn(struct function *fn, uint32_t insn);