klisp

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

commit 3236c00af124e4d040f87f8264bb46adb30faa20
parent 67be5f15acf3f21da992fbbb3d35cab597594003
Author: Andres Navarro <canavarro82@gmail.com>
Date:   Fri, 29 Apr 2011 17:17:26 -0300

Added source info to error & root continuations.

Diffstat:
Msrc/kcontinuation.c | 2++
Msrc/krepl.c | 27+++++++++++++++++++++++++++
2 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/src/kcontinuation.c b/src/kcontinuation.c @@ -45,6 +45,8 @@ TValue kmake_continuation(klisp_State *K, TValue parent, klisp_Cfunc fn, TValue res = gc2cont(new_cont); /* Add the current source info as source info (may be changed later) */ + /* TODO: find all the places where this should be changed (like $and?, + $sequence, and change it */ kset_source_info(K, res, kget_csi(K)); return res; } diff --git a/src/krepl.c b/src/krepl.c @@ -22,6 +22,8 @@ /* for names */ #include "ktable.h" +/* TODO add names & source info to the repl continuations */ + /* the exit continuation, it exits the loop */ void exit_fn(klisp_State *K, TValue *xparams, TValue obj) { @@ -208,10 +210,35 @@ void kinit_repl(klisp_State *K) symbol = ksymbol_new(K, "root-continuation"); /* GC: symbol should already be in root */ kadd_binding(K, K->ground_env, symbol, root_cont); + + /* TODO: find a cleaner way of doing this..., maybe disable gc */ + /* Add source info to the cont */ + TValue str = kstring_new_b_imm(K, __FILE__); + krooted_tvs_push(K, str); + TValue tail = kcons(K, i2tv(__LINE__), i2tv(0)); + krooted_tvs_push(K, tail); + TValue si = kcons(K, str, tail); + krooted_tvs_push(K, si); + kset_source_info(K, root_cont, si); + krooted_tvs_pop(K); + krooted_tvs_pop(K); + krooted_tvs_pop(K); + symbol = ksymbol_new(K, "error-continuation"); /* GC: symbol should already be in root */ kadd_binding(K, K->ground_env, symbol, error_cont); + str = kstring_new_b_imm(K, __FILE__); + krooted_tvs_push(K, str); + tail = kcons(K, i2tv(__LINE__), i2tv(0)); + krooted_tvs_push(K, tail); + si = kcons(K, str, tail); + krooted_tvs_push(K, si); + kset_source_info(K, error_cont, si); + krooted_tvs_pop(K); + krooted_tvs_pop(K); + krooted_tvs_pop(K); + /* and save them in the structure */ K->root_cont = root_cont; K->error_cont = error_cont;