1
0
mirror of https://github.com/janet-lang/janet synced 2024-12-27 00:40:26 +00:00

Add call function pointer to abstract types.

This will allow better JITs, FFIs, DSLs, etc.
This commit is contained in:
Calvin Rose 2020-01-21 18:22:24 -06:00
parent 8db68c04c4
commit e179f26d50
2 changed files with 14 additions and 3 deletions

View File

@ -208,9 +208,18 @@ static void vm_do_trace(JanetFunction *func) {
static Janet call_nonfn(JanetFiber *fiber, Janet callee) {
int32_t argn = fiber->stacktop - fiber->stackstart;
Janet ds, key;
JanetType t = janet_type(callee);
if (t == JANET_ABSTRACT) {
JanetAbstract abst = janet_unwrap_abstract(callee);
const JanetAbstractType *at = janet_abstract_type(abst);
if (NULL != at->call) {
fiber->stacktop = fiber->stackstart;
return at->call(abst, argn, fiber->data + fiber->stackstart);
}
}
if (argn != 1) janet_panicf("%v called with %d arguments, possibly expected 1", callee, argn);
if (janet_checktypes(callee, JANET_TFLAG_INDEXED | JANET_TFLAG_DICTIONARY |
JANET_TFLAG_STRING | JANET_TFLAG_BUFFER | JANET_TFLAG_ABSTRACT)) {
if ((1 << t) & (JANET_TFLAG_INDEXED | JANET_TFLAG_DICTIONARY |
JANET_TFLAG_STRING | JANET_TFLAG_BUFFER | JANET_TFLAG_ABSTRACT)) {
ds = callee;
key = fiber->data[fiber->stackstart];
} else {

View File

@ -908,6 +908,7 @@ struct JanetAbstractType {
int (*compare)(void *lhs, void *rhs);
int32_t (*hash)(void *p, size_t len);
Janet(*next)(void *p, Janet key);
Janet(*call)(void *p, int32_t argc, Janet *argv);
};
/* Some macros to let us add extra types to JanetAbstract types without
@ -924,7 +925,8 @@ struct JanetAbstractType {
#define JANET_ATEND_TOSTRING NULL,JANET_ATEND_COMPARE
#define JANET_ATEND_COMPARE NULL,JANET_ATEND_HASH
#define JANET_ATEND_HASH NULL,JANET_ATEND_NEXT
#define JANET_ATEND_NEXT
#define JANET_ATEND_NEXT NULL,JANET_ATEND_CALL
#define JANET_ATEND_CALL
struct JanetReg {
const char *name;