71 lines
1.8 KiB
C
71 lines
1.8 KiB
C
#include"value.h"
|
|
#include"table.h"
|
|
#include"parse.h"
|
|
#include"vm.h"
|
|
#include"lexer.h"
|
|
#include"str.h"
|
|
#include"dump.h"
|
|
|
|
static size_t native_print(LVM *lvm, void *ud, size_t argn, LRegSet *regset) {
|
|
if(lvalue_tag(regset->regs[0]) == LTAG_STRING) {
|
|
LString *lstr = (void*) (regset->regs[0].u & ~LTAG_MASK);
|
|
printf("%.*s\n", (int) lstr->length, lstr->data);
|
|
} else if(lvalue_tag(regset->regs[0]) == LTAG_I32) {
|
|
printf("%i\n", lvalue_to_int32(regset->regs[0]));
|
|
} else if(regset->regs[0].u == LTAG_NIL) {
|
|
printf("nil\n");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static char* read_full_file(const char *fn) {
|
|
FILE *f = fopen(fn, "rb");
|
|
fseek(f, 0, SEEK_END);
|
|
size_t filesize = ftell(f);
|
|
fseek(f, 0, SEEK_SET);
|
|
char *buf = malloc(filesize + 1);
|
|
fread(buf, 1, filesize, f);
|
|
buf[filesize] = '\0';
|
|
fclose(f);
|
|
return buf;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
LTable *env = ltable_new(128);
|
|
|
|
LString *key = lstring_newz("print");
|
|
LFunc *func = lvm_func_from_native(native_print, NULL);
|
|
|
|
ltable_set(env, lvalue_from_string(key), lvalue_from_func(func));
|
|
|
|
//const char *bufs = "for i = 1, 10000 do print(i) if i % 3 == 0 then print(\"Fizz\") end if i % 5 == 0 then print(\"Buzz\") end end";
|
|
//const char *bufs = "local t = {a = 9} print(t.a)";
|
|
//const char *bufs = "z = 5 print(z)";
|
|
//const char *bufs = "local i = 0 while i ~= 1500000 do print(i) i = i + 1 end";
|
|
//const char *bufs = "for i = 1, 1000 do print(print) end";
|
|
|
|
char *bufs = read_full_file(argv[1]);
|
|
|
|
vec_Token toks = ltokenize(bufs, strlen(bufs));
|
|
|
|
free(bufs);
|
|
|
|
LUnit *unit = lparse(toks.size, toks.data, env);
|
|
|
|
lfreetoks(&toks);
|
|
|
|
//dump(unit->funcs[0].lua_instrs);
|
|
|
|
LVM lvm = {};
|
|
lvm_init(&lvm);
|
|
|
|
//#pragma omp parallel for
|
|
for(int i = 0; i < 1; i++) {
|
|
LRegSet regset = {.parent = NULL};
|
|
lvm_reset_regs(®set);
|
|
lvm_run(&lvm, &unit->funcs[0], 0, ®set);
|
|
}
|
|
|
|
lvm_destroy(&lvm);
|
|
}
|