forked from xxq250/Nasal-Interpreter
✨ improve function of ghost_register_table
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
// module for test
|
||||
|
||||
#include <iostream>
|
||||
#include "../nasal.h"
|
||||
|
||||
namespace nasal_fib_module {
|
||||
|
||||
double fibonaci(double x) {
|
||||
if (x<=2) {
|
||||
return x;
|
||||
@@ -33,12 +37,56 @@ var quick_fib(var* args, usize size, gc* ngc) {
|
||||
return var::num(res);
|
||||
}
|
||||
|
||||
mod_func func_tbl[]={
|
||||
{"fib",fib},
|
||||
{"quick_fib",quick_fib},
|
||||
{nullptr, nullptr},
|
||||
u32 ghost_for_test;
|
||||
|
||||
void ghost_for_test_destructor(void* ptr) {
|
||||
std::cout<<"delete "<<ptr<<"\n";
|
||||
delete (u32*)ptr;
|
||||
}
|
||||
|
||||
var create_new_ghost(var* args, usize size, gc* ngc) {
|
||||
var res=ngc->alloc(vm_obj);
|
||||
res.obj().set(ghost_for_test, new u32);
|
||||
return res;
|
||||
}
|
||||
|
||||
var set_new_ghost(var* args, usize size, gc* ngc) {
|
||||
var res=args[0];
|
||||
if (!res.objchk(ghost_for_test)) {
|
||||
std::cout<<"set_new_ghost: not ghost for test type.\n";
|
||||
return nil;
|
||||
}
|
||||
std::cout<<"set_new_ghost: successfully set ghost.\n";
|
||||
f64 num=args[1].num();
|
||||
*((u32*)res.obj().ptr)=static_cast<u32>(num);
|
||||
return nil;
|
||||
}
|
||||
|
||||
var print_new_ghost(var* args, usize size, gc* ngc) {
|
||||
var res=args[0];
|
||||
if (!res.objchk(ghost_for_test)) {
|
||||
std::cout<<"print_new_ghost: not ghost for test type.\n";
|
||||
return nil;
|
||||
}
|
||||
std::cout<<"print_new_ghost: result = "<<*((u32*)res.obj().ptr)<<"\n";
|
||||
return nil;
|
||||
}
|
||||
|
||||
module_func_info func_tbl[]={
|
||||
{"fib", fib},
|
||||
{"quick_fib", quick_fib},
|
||||
{"create_ghost", create_new_ghost},
|
||||
{"set_ghost", set_new_ghost},
|
||||
{"print_ghost", print_new_ghost},
|
||||
{nullptr, nullptr}
|
||||
};
|
||||
|
||||
extern "C" mod_func* get(ghost_register_table* table) {
|
||||
return func_tbl;
|
||||
}
|
||||
|
||||
extern "C" module_func_info* get(ghost_register_table* table) {
|
||||
nasal_fib_module::ghost_for_test=table->register_ghost_type(
|
||||
"fib_for_test",
|
||||
nasal_fib_module::ghost_for_test_destructor
|
||||
);
|
||||
return nasal_fib_module::func_tbl;
|
||||
}
|
||||
Reference in New Issue
Block a user