Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fc6406e97 | ||
|
|
d09b4f2761 |
@@ -169,6 +169,7 @@ if (NOT FZL_SKIP_VM)
|
||||
src/vm/reader/vm_rd_sections_sz.c
|
||||
src/vm/fzl_vm.c
|
||||
src/vm/fzl_vm_env.c
|
||||
src/vm/fzl_vm_extern.c
|
||||
src/vm/fzl_vm_reader.c
|
||||
src/vm/fzl_vm_debug.c
|
||||
src/vm/main.c)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <string.h>
|
||||
#include <vm/fzl_vm.h>
|
||||
#include <vm/fzl_vm_env.h>
|
||||
#include <vm/fzl_vm_extern.h>
|
||||
#include <vm/fzl_vm_object.h>
|
||||
#include <vm/fzl_vm_reader.h>
|
||||
#include <vm/internals/opcode.h>
|
||||
|
||||
+36
-3
@@ -45,6 +45,12 @@ ffi_type *resolve_type(fzl_vm_reader_t *reader, fzl_extern_type_ref_t *ref)
|
||||
case FZL_TYPE_UINT64:
|
||||
return &ffi_type_uint64;
|
||||
|
||||
case FZL_TYPE_INT:
|
||||
return &ffi_type_sint;
|
||||
|
||||
case FZL_TYPE_UINT:
|
||||
return &ffi_type_uint;
|
||||
|
||||
case FZL_TYPE_CHAR:
|
||||
return &ffi_type_schar;
|
||||
|
||||
@@ -87,10 +93,37 @@ bool prepare_sym(fzl_vm_reader_t *reader, void *sym, fzl_extern_fn_t *fn,
|
||||
"specified");
|
||||
return false;
|
||||
}
|
||||
memset(out, 0, sizeof(fzl_vm_sym_t));
|
||||
|
||||
out->func_ptr = sym;
|
||||
// TODO: fill the FFI CIF struct values
|
||||
return false;
|
||||
out->func_ptr = sym;
|
||||
out->arg_types = malloc(sizeof(ffi_type *) * fn->args_count);
|
||||
if (!out->arg_types)
|
||||
{
|
||||
snprintf(ex_err, sizeof(ex_err), "out of memory");
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(out->arg_types, 0, sizeof(ffi_type *) * fn->args_count);
|
||||
for (size_t i = 0; i < fn->args_count; i++)
|
||||
{
|
||||
fzl_extern_arg_t *arg = &fn->args[i];
|
||||
if (arg->is_out)
|
||||
out->arg_types[i] = &ffi_type_pointer;
|
||||
else
|
||||
out->arg_types[i] = resolve_type(reader, &arg->type);
|
||||
}
|
||||
|
||||
ffi_type *ret =
|
||||
fn->has_return ? resolve_type(reader, &fn->ret_type) : &ffi_type_void;
|
||||
ffi_status res = ffi_prep_cif(&out->cif, FFI_DEFAULT_ABI, fn->args_count, ret,
|
||||
out->arg_types);
|
||||
if (res != FFI_OK)
|
||||
{
|
||||
snprintf(ex_err, sizeof(ex_err), "failed to prepare FFI");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
fzl_vm_extern_t *fzl_vm_init_externs(fzl_vm_reader_t *reader)
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#include <common/fzl_value.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <vm/fzl_vm.h>
|
||||
#include <vm/fzl_vm_extern.h>
|
||||
#include <vm/internals/opcode.h>
|
||||
|
||||
// Call function (store return address and jump into function init)
|
||||
@@ -28,7 +31,31 @@ int op_ret(fzl_vm_t *vm)
|
||||
// Call externally defined function
|
||||
int op_call_extern(fzl_vm_t *vm)
|
||||
{
|
||||
(void)vm;
|
||||
// TODO: implement
|
||||
size_t fn_n = vm->reader->ops[++vm->ip];
|
||||
if (fn_n >= vm->reader->extern_fns_count)
|
||||
{
|
||||
snprintf(last_err, sizeof(last_err),
|
||||
"runtime error - unknown external function");
|
||||
print_err_data(vm);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fzl_vm_sym_t *fn = &vm->prep_fns->syms[fn_n];
|
||||
if (!fn)
|
||||
{
|
||||
snprintf(last_err, sizeof(last_err),
|
||||
"runtime error - failed to load extern function");
|
||||
print_err_data(vm);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (vm->dtop < fn->cif.nargs)
|
||||
{
|
||||
snprintf(last_err, sizeof(last_err),
|
||||
"runtime error - expected %u valued on dstack", fn->cif.nargs);
|
||||
print_err_data(vm);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -145,6 +145,11 @@ int main(int argc, char **argv)
|
||||
if (!vm->prep_fns)
|
||||
{
|
||||
printf("%sError%s: %s\n", FZL_CERROR, FZL_CRST, fzl_vm_externs_geterror());
|
||||
|
||||
free(args);
|
||||
fzl_vm_free_externs(vm->prep_fns);
|
||||
fzl_vm_freereader(reader);
|
||||
fzl_freevm(vm);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -163,6 +168,7 @@ int main(int argc, char **argv)
|
||||
printf("%sError%s: %s\n", FZL_CERROR, FZL_CRST, err);
|
||||
|
||||
free(args);
|
||||
fzl_vm_free_externs(vm->prep_fns);
|
||||
fzl_vm_freereader(reader);
|
||||
fzl_freevm(vm);
|
||||
return -1;
|
||||
@@ -170,6 +176,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
free(args);
|
||||
fzl_vm_free_externs(vm->prep_fns);
|
||||
fzl_vm_freereader(reader);
|
||||
fzl_freevm(vm);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
extern "math" {
|
||||
extern "libmath" {
|
||||
fn double_num(int num) int;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user