klisp

an open source interpreter for the Kernel Programming Language.
git clone http://git.hanabi.in/repos/klisp.git
Log | Files | Refs | README

commit c0be33b518d21934447b6afbd81b1a6351974675
parent 046abd03047ddd31203727bd71244770f0928f49
Author: Andres Navarro <canavarro82@gmail.com>
Date:   Sat,  5 Mar 2011 14:33:40 -0300

Slightly modified the underlying functions of operatives and continuations.

Diffstat:
Msrc/kcontinuation.c | 2+-
Msrc/kcontinuation.h | 2+-
Msrc/kobject.h | 12++----------
Msrc/koperative.c | 2+-
Msrc/koperative.h | 2+-
Msrc/kstate.c | 4+++-
Msrc/kstate.h | 19++++++++++++++++++-
7 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/src/kcontinuation.c b/src/kcontinuation.c @@ -12,7 +12,7 @@ #include "kmem.h" TValue kmake_continuation(klisp_State *K, TValue parent, TValue name, - TValue si, klisp_Ifunc fn, int32_t xcount, ...) + TValue si, klisp_Cfunc fn, int32_t xcount, ...) { va_list argp; Continuation *new_cont = (Continuation *) diff --git a/src/kcontinuation.h b/src/kcontinuation.h @@ -12,6 +12,6 @@ /* TODO: make some specialized constructors for 0, 1 and 2 parameters */ TValue kmake_continuation(klisp_State *K, TValue parent, TValue name, - TValue si, klisp_Ifunc fn, int xcount, ...); + TValue si, klisp_Cfunc fn, int xcount, ...); #endif diff --git a/src/kobject.h b/src/kobject.h @@ -236,21 +236,13 @@ typedef struct __attribute__ ((__packed__)) { TValue bindings; /* TEMP: for now alist of (binding . value) */ } Environment; -/* -** prototype for callable c functions from the interpreter main loop: -** -** TEMP: Has to be here because it uses TValue type -** ideally it should be in klisp.h -*/ -typedef void (*klisp_Ifunc) (TValue *ud, TValue val, TValue env); - typedef struct __attribute__ ((__packed__)) { CommonHeader; TValue mark; /* for guarding continuation */ TValue name; /* cont name/type */ TValue si; /* source code info (either () or (filename line col) */ TValue parent; /* may be () for root continuation */ - klisp_Ifunc fn; /* the function that does the work */ + void *fn; /* the function that does the work */ int32_t extra_size; TValue extra[]; } Continuation; @@ -259,7 +251,7 @@ typedef struct __attribute__ ((__packed__)) { CommonHeader; TValue name; TValue si; /* source code info (either () or (filename line col) */ - klisp_Ifunc fn; /* the function that does the work */ + void *fn; /* the function that does the work */ int32_t extra_size; TValue extra[]; } Operative; diff --git a/src/koperative.c b/src/koperative.c @@ -12,7 +12,7 @@ #include "kmem.h" TValue kmake_operative(klisp_State *K, TValue name, TValue si, - klisp_Ifunc fn, int32_t xcount, ...) + klisp_Ofunc fn, int32_t xcount, ...) { va_list argp; Operative *new_op = (Operative *) diff --git a/src/koperative.h b/src/koperative.h @@ -12,6 +12,6 @@ /* TODO: make some specialized constructors for 0, 1 and 2 parameters */ TValue kmake_operative(klisp_State *K, TValue name, TValue si, - klisp_Ifunc fn, int xcount, ...); + klisp_Ofunc fn, int xcount, ...); #endif diff --git a/src/kstate.c b/src/kstate.c @@ -40,7 +40,9 @@ klisp_State *klisp_newstate (klisp_Alloc f, void *ud) { K->symbol_table = KNIL; /* TODO: create a continuation */ K->curr_cont = NULL; - K->ret_value = KINERT; + + K->next_value = KINERT; + K->next_value = KINERT; K->frealloc = f; K->ud = ud; diff --git a/src/kstate.h b/src/kstate.h @@ -40,7 +40,14 @@ struct klisp_State { TValue symbol_table; Continuation *curr_cont; - TValue ret_value; /* the value to be passed to the next function */ + /* + ** If next_env is NIL, then the next_func is of type klisp_Cfunc + ** (from a continuation) and otherwise next_func is of type + ** klisp_Ofunc (from an operative) + */ + void *next_func; /* the next function to call (operative or cont) */ + TValue next_value; /* the value to be passed to the next function */ + TValue next_env; /* either NIL or an environment for next operative */ klisp_Alloc frealloc; /* function to reallocate memory */ void *ud; /* auxiliary data to `frealloc' */ @@ -204,4 +211,14 @@ inline bool ks_tbisempty(klisp_State *K) return ks_tbidx(K) == 0; } + +/* +** prototypes for underlying c functions of continuations & +** operatives +*/ +typedef void (*klisp_Cfunc) (klisp_State*K, TValue *ud, TValue val); +typedef void (*klisp_Ofunc) (klisp_State *K, TValue *ud, TValue ptree, + TValue env); + #endif +