From de1b372ef7b412a4fdd35bff382d816403404cf3 Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Tue, 7 Oct 2014 07:12:40 +0000 Subject: [PATCH] the indirection should be done in the evaluate_expr_thunk gate instead of in the pgf_evaluate_expr_thunk function. this ensures lazyness --- src/runtime/c/pgf/evaluator.c | 12 ------------ src/runtime/c/pgf/jit.c | 28 +++++++++++++++++----------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/src/runtime/c/pgf/evaluator.c b/src/runtime/c/pgf/evaluator.c index a53279cb3..eebaefd98 100644 --- a/src/runtime/c/pgf/evaluator.c +++ b/src/runtime/c/pgf/evaluator.c @@ -72,10 +72,6 @@ repeat:; val->args[i] = args[n_args-i-1]; } - PgfIndirection* indir = (PgfIndirection*) thunk; - indir->header.code = state->eval_gates->evaluate_indirection; - indir->val = &val->header; - res = &val->header; break; } @@ -165,10 +161,6 @@ repeat:; lambda->expr = expr; } - - PgfIndirection* indir = (PgfIndirection*) thunk; - indir->header.code = state->eval_gates->evaluate_indirection; - indir->val = res; } break; } @@ -190,10 +182,6 @@ repeat:; res = tmp_env->closure; - PgfIndirection* indir = (PgfIndirection*) thunk; - indir->header.code = state->eval_gates->evaluate_indirection; - indir->val = res; - if (n_args > 0) { PgfValuePAP* val = gu_new_flex(state->pool, PgfValuePAP, args, n_args); val->header.code = state->eval_gates->evaluate_value_pap; diff --git a/src/runtime/c/pgf/jit.c b/src/runtime/c/pgf/jit.c index 3e538a6f4..5c8afddb9 100644 --- a/src/runtime/c/pgf/jit.c +++ b/src/runtime/c/pgf/jit.c @@ -444,17 +444,6 @@ pgf_jit_gates(PgfReader* rdr) pgf_jit_make_space(rdr, JIT_CODE_WINDOW); - gates->evaluate_expr_thunk = jit_get_ip().ptr; - jit_prepare(2); - jit_pusharg_p(JIT_VCLOS); - jit_pusharg_p(JIT_VSTATE); - jit_finish(pgf_evaluate_expr_thunk); - jit_retval(JIT_VCLOS); - jit_ldr_p(JIT_R0, JIT_VCLOS); - jit_jmpr(JIT_R0); - - pgf_jit_make_space(rdr, JIT_CODE_WINDOW); - gates->evaluate_value_lit = jit_get_ip().ptr; jit_movr_p(JIT_VHEAP, JIT_VCLOS); jit_prepare(1); @@ -566,6 +555,23 @@ pgf_jit_gates(PgfReader* rdr) pgf_jit_make_space(rdr, JIT_CODE_WINDOW); + gates->evaluate_expr_thunk = jit_get_ip().ptr; + jit_prepare(2); + jit_pusharg_p(JIT_VCLOS); + jit_pusharg_p(JIT_VSTATE); + jit_finish(pgf_evaluate_expr_thunk); + ref = jit_beqr_p(jit_forward(), JIT_VCLOS, JIT_RET); + jit_pushr_p(JIT_VCLOS); + jit_pushr_p(JIT_FP); + jit_movi_p(JIT_R1, gates->update_closure); + jit_pushr_p(JIT_R1); + jit_retval(JIT_VCLOS); + jit_patch(ref); + jit_ldr_p(JIT_R0, JIT_VCLOS); + jit_jmpr(JIT_R0); + + pgf_jit_make_space(rdr, JIT_CODE_WINDOW); + gates->evaluate_value_lambda = jit_get_ip().ptr; jit_subr_p(JIT_R0, JIT_FP, JIT_SP); jit_blti_i(gates->update_pap, JIT_R0, 2*sizeof(PgfClosure*));