mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-07-05 12:16:37 +02:00
Replacing eval opcode with compile + normal application.
This commit is contained in:
parent
c3e1d41601
commit
c01721e110
6 changed files with 34 additions and 19 deletions
27
eval.c
27
eval.c
|
@ -1743,22 +1743,27 @@ sexp sexp_env_copy_op (sexp ctx sexp_api_params(self, n), sexp to, sexp from, se
|
||||||
|
|
||||||
/************************** eval interface ****************************/
|
/************************** eval interface ****************************/
|
||||||
|
|
||||||
sexp sexp_compile (sexp ctx, sexp x) {
|
sexp sexp_compile_op (sexp ctx sexp_api_params(self, n), sexp obj, sexp env) {
|
||||||
sexp_gc_var3(ast, vec, res);
|
sexp_gc_var3(ast, vec, res);
|
||||||
sexp_gc_preserve3(ctx, ast, vec, res);
|
sexp_gc_preserve3(ctx, ast, vec, res);
|
||||||
ast = sexp_analyze(ctx, x);
|
sexp ctx2;
|
||||||
|
if (! env) env = sexp_context_env(ctx);
|
||||||
|
sexp_assert_type(ctx, sexp_envp, SEXP_ENV, env);
|
||||||
|
ctx2 = sexp_make_eval_context(ctx, sexp_context_stack(ctx), env, 0);
|
||||||
|
sexp_context_child(ctx) = ctx2;
|
||||||
|
ast = sexp_analyze(ctx2, obj);
|
||||||
if (sexp_exceptionp(ast)) {
|
if (sexp_exceptionp(ast)) {
|
||||||
res = ast;
|
res = ast;
|
||||||
} else {
|
} else {
|
||||||
res = sexp_global(ctx, SEXP_G_OPTIMIZATIONS);
|
res = sexp_global(ctx2, SEXP_G_OPTIMIZATIONS);
|
||||||
for ( ; sexp_pairp(res); res=sexp_cdr(res))
|
for ( ; sexp_pairp(res); res=sexp_cdr(res))
|
||||||
ast = sexp_apply1(ctx, sexp_cdar(res), ast);
|
ast = sexp_apply1(ctx2, sexp_cdar(res), ast);
|
||||||
sexp_free_vars(ctx, ast, SEXP_NULL); /* should return SEXP_NULL */
|
sexp_free_vars(ctx2, ast, SEXP_NULL); /* should return SEXP_NULL */
|
||||||
emit_enter(ctx);
|
emit_enter(ctx2);
|
||||||
generate(ctx, ast);
|
generate(ctx2, ast);
|
||||||
res = finalize_bytecode(ctx);
|
res = finalize_bytecode(ctx2);
|
||||||
vec = sexp_make_vector(ctx, 0, SEXP_VOID);
|
vec = sexp_make_vector(ctx2, 0, SEXP_VOID);
|
||||||
res = sexp_make_procedure(ctx, SEXP_ZERO, SEXP_ZERO, res, vec);
|
res = sexp_make_procedure(ctx2, SEXP_ZERO, SEXP_ZERO, res, vec);
|
||||||
}
|
}
|
||||||
sexp_gc_release3(ctx);
|
sexp_gc_release3(ctx);
|
||||||
return res;
|
return res;
|
||||||
|
@ -1776,7 +1781,7 @@ sexp sexp_eval_op (sexp ctx sexp_api_params(self, n), sexp obj, sexp env) {
|
||||||
sexp_context_params(ctx) = SEXP_NULL;
|
sexp_context_params(ctx) = SEXP_NULL;
|
||||||
ctx2 = sexp_make_eval_context(ctx, sexp_context_stack(ctx), env, 0);
|
ctx2 = sexp_make_eval_context(ctx, sexp_context_stack(ctx), env, 0);
|
||||||
sexp_context_child(ctx) = ctx2;
|
sexp_context_child(ctx) = ctx2;
|
||||||
res = sexp_compile(ctx2, obj);
|
res = sexp_compile_op(ctx2, self, n, obj, env);
|
||||||
if (! sexp_exceptionp(res))
|
if (! sexp_exceptionp(res))
|
||||||
res = sexp_apply(ctx2, res, SEXP_NULL);
|
res = sexp_apply(ctx2, res, SEXP_NULL);
|
||||||
sexp_context_child(ctx) = SEXP_FALSE;
|
sexp_context_child(ctx) = SEXP_FALSE;
|
||||||
|
|
|
@ -140,6 +140,7 @@ SEXP_API sexp sexp_apply (sexp context, sexp proc, sexp args);
|
||||||
SEXP_API sexp sexp_apply1 (sexp ctx, sexp f, sexp x);
|
SEXP_API sexp sexp_apply1 (sexp ctx, sexp f, sexp x);
|
||||||
SEXP_API sexp sexp_free_vars (sexp context, sexp x, sexp fv);
|
SEXP_API sexp sexp_free_vars (sexp context, sexp x, sexp fv);
|
||||||
SEXP_API int sexp_param_index (sexp lambda, sexp name);
|
SEXP_API int sexp_param_index (sexp lambda, sexp name);
|
||||||
|
SEXP_API sexp sexp_compile_op (sexp context sexp_api_params(self, n), sexp obj, sexp env);
|
||||||
SEXP_API sexp sexp_eval_op (sexp context sexp_api_params(self, n), sexp obj, sexp env);
|
SEXP_API sexp sexp_eval_op (sexp context sexp_api_params(self, n), sexp obj, sexp env);
|
||||||
SEXP_API sexp sexp_eval_string (sexp context, const char *str, sexp_sint_t len, sexp env);
|
SEXP_API sexp sexp_eval_string (sexp context, const char *str, sexp_sint_t len, sexp env);
|
||||||
SEXP_API sexp sexp_load_op (sexp context sexp_api_params(self, n), sexp expr, sexp env);
|
SEXP_API sexp sexp_load_op (sexp context sexp_api_params(self, n), sexp expr, sexp env);
|
||||||
|
|
|
@ -37,13 +37,19 @@
|
||||||
(let* ((expr (call-with-input-string line read/ss))
|
(let* ((expr (call-with-input-string line read/ss))
|
||||||
(thread (make-thread
|
(thread (make-thread
|
||||||
(lambda ()
|
(lambda ()
|
||||||
|
(handle-exceptions
|
||||||
|
exn
|
||||||
|
(print-exception exn (current-error-port))
|
||||||
(let ((res (eval expr env)))
|
(let ((res (eval expr env)))
|
||||||
(if (not (eq? res (if #f #f)))
|
(cond
|
||||||
(write/ss res))
|
((not (eq? res (if #f #f)))
|
||||||
(newline))))))
|
(write/ss res)
|
||||||
|
(newline)))))))))
|
||||||
(with-signal-handler
|
(with-signal-handler
|
||||||
signal/interrupt
|
signal/interrupt
|
||||||
(lambda (n) (thread-terminate! thread))
|
(lambda (n)
|
||||||
|
(display "Interrupt\n" (current-error-port))
|
||||||
|
(thread-terminate! thread))
|
||||||
(lambda () (thread-join! (thread-start! thread))))))
|
(lambda () (thread-join! (thread-start! thread))))))
|
||||||
(lp module env)))))))
|
(lp module env)))))))
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,9 @@
|
||||||
(apply1 proc (append2 (reverse (cdr lol)) (car lol))))
|
(apply1 proc (append2 (reverse (cdr lol)) (car lol))))
|
||||||
(reverse args))))
|
(reverse args))))
|
||||||
|
|
||||||
|
(define (eval x . o)
|
||||||
|
((compile x (if (pair? o) (car o) (interaction-environment)))))
|
||||||
|
|
||||||
;; map with a fast-path for single lists
|
;; map with a fast-path for single lists
|
||||||
|
|
||||||
(define (map proc ls . lol)
|
(define (map proc ls . lol)
|
||||||
|
|
|
@ -111,7 +111,7 @@ _FN1(SEXP_VOID, _I(SEXP_OPORT), "close-output-port", 0, sexp_close_port_op),
|
||||||
_FN0(_I(SEXP_ENV), "make-environment", 0, sexp_make_env_op),
|
_FN0(_I(SEXP_ENV), "make-environment", 0, sexp_make_env_op),
|
||||||
_FN1(_I(SEXP_ENV), _I(SEXP_FIXNUM), "null-environment", 0, sexp_make_null_env_op),
|
_FN1(_I(SEXP_ENV), _I(SEXP_FIXNUM), "null-environment", 0, sexp_make_null_env_op),
|
||||||
_FN1(_I(SEXP_ENV), _I(SEXP_FIXNUM), "scheme-report-environment", 0, sexp_make_standard_env_op),
|
_FN1(_I(SEXP_ENV), _I(SEXP_FIXNUM), "scheme-report-environment", 0, sexp_make_standard_env_op),
|
||||||
_FN2OPTP(_I(SEXP_OBJECT), _I(SEXP_OBJECT), _I(SEXP_ENV), "eval", (sexp)"interaction-environment", sexp_eval_op),
|
_FN2OPTP(_I(SEXP_OBJECT), _I(SEXP_OBJECT), _I(SEXP_ENV), "compile", (sexp)"interaction-environment", sexp_compile_op),
|
||||||
_FN2OPTP(SEXP_VOID, _I(SEXP_STRING), _I(SEXP_ENV), "load", (sexp)"interaction-environment", sexp_load_op),
|
_FN2OPTP(SEXP_VOID, _I(SEXP_STRING), _I(SEXP_ENV), "load", (sexp)"interaction-environment", sexp_load_op),
|
||||||
_FN4(SEXP_VOID, _I(SEXP_ENV), _I(SEXP_ENV), _I(SEXP_OBJECT), "%env-copy!", 0, sexp_env_copy_op),
|
_FN4(SEXP_VOID, _I(SEXP_ENV), _I(SEXP_ENV), _I(SEXP_OBJECT), "%env-copy!", 0, sexp_env_copy_op),
|
||||||
_FN2(SEXP_VOID, _I(SEXP_EXCEPTION), _I(SEXP_OPORT), "print-exception", 0, sexp_print_exception_op),
|
_FN2(SEXP_VOID, _I(SEXP_EXCEPTION), _I(SEXP_OPORT), "print-exception", 0, sexp_print_exception_op),
|
||||||
|
|
2
vm.c
2
vm.c
|
@ -734,8 +734,8 @@ sexp sexp_vm (sexp ctx, sexp proc) {
|
||||||
fp = top-4;
|
fp = top-4;
|
||||||
break;
|
break;
|
||||||
case SEXP_OP_FCALL0:
|
case SEXP_OP_FCALL0:
|
||||||
tmp1 = _WORD0;
|
|
||||||
_ALIGN_IP();
|
_ALIGN_IP();
|
||||||
|
tmp1 = _WORD0;
|
||||||
sexp_context_top(ctx) = top;
|
sexp_context_top(ctx) = top;
|
||||||
sexp_context_last_fp(ctx) = fp;
|
sexp_context_last_fp(ctx) = fp;
|
||||||
_PUSH(((sexp_proc1)sexp_opcode_func(_WORD0))(ctx sexp_api_pass(_WORD0, 0)));
|
_PUSH(((sexp_proc1)sexp_opcode_func(_WORD0))(ctx sexp_api_pass(_WORD0, 0)));
|
||||||
|
|
Loading…
Add table
Reference in a new issue