48 lines
1.4 KiB
C
48 lines
1.4 KiB
C
#include "core.h"
|
|
#include "h.h"
|
|
#include "nfns.h"
|
|
|
|
STATIC_GLOBAL u32 nfn_curr;
|
|
STATIC_GLOBAL B nfn_list;
|
|
|
|
NFnDesc* registerNFn(B name, FC1 c1, FC2 c2) {
|
|
u32 id = nfn_curr++;
|
|
NFnDesc* r = mm_alloc(sizeof(NFnDesc), t_nfnDesc);
|
|
r->id = id;
|
|
r->c1 = c1;
|
|
r->c2 = c2;
|
|
r->name = name;
|
|
nfn_list = vec_addN(nfn_list, tag(r,OBJ_TAG));
|
|
return r;
|
|
}
|
|
B m_nfn(NFnDesc* desc, B obj) {
|
|
NFn* r = mm_alloc(sizeof(NFn), t_nfn);
|
|
r->id = desc->id;
|
|
r->c1 = desc->c1;
|
|
r->c2 = desc->c2;
|
|
r->obj = obj;
|
|
return tag(r,FUN_TAG);
|
|
}
|
|
B nfn_name(B x) { VTY(x, t_nfn);
|
|
return incG(c(NFnDesc,IGetU(nfn_list,c(NFn,x)->id))->name);
|
|
}
|
|
|
|
DEF_FREE(nfn) { dec(((NFn*)x)->obj); }
|
|
void nfn_visit(Value* x) { mm_visit(((NFn*)x)->obj); }
|
|
void nfn_print(FILE* f, B x) { fprintsB(f, c(NFnDesc,IGetU(nfn_list,c(NFn,x)->id))->name); }
|
|
DEF_FREE(nfnDesc) { fatal("nfnDesc shouldn't be freed!"); }
|
|
void nfnDesc_visit(Value* x) { mm_visit(((NFnDesc*)x)->name); }
|
|
void nfnDesc_print(FILE* f, B x) { fprintf(f, "(native function description)"); }
|
|
|
|
B block_decompose(B x);
|
|
void nfn_init(void) {
|
|
nfn_list = emptyHVec();
|
|
TIi(t_nfn,freeO) = nfn_freeO; TIi(t_nfnDesc,freeO) = nfnDesc_freeO;
|
|
TIi(t_nfn,freeF) = nfn_freeF; TIi(t_nfnDesc,freeF) = nfnDesc_freeF;
|
|
TIi(t_nfn,visit) = nfn_visit; TIi(t_nfnDesc,visit) = nfnDesc_visit;
|
|
TIi(t_nfn,print) = nfn_print; TIi(t_nfnDesc,print) = nfnDesc_print;
|
|
TIi(t_nfn,decompose) = block_decompose;
|
|
TIi(t_nfn,byRef) = true;
|
|
gc_add_ref(&nfn_list);
|
|
}
|