diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2014-08-11 15:53:41 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2014-08-11 15:53:41 +0000 |
| commit | c30e2df228fc42653149752b56e50e77bae03b9f (patch) | |
| tree | 582a3a4fcac1e65b39968506208a466df3ed486f /src/runtime/c/pgf/evaluator.c | |
| parent | d3b9652b81e3d43bfb0de9faf4aea578c60e5cc4 (diff) | |
pattern matching in def rules is now supported
Diffstat (limited to 'src/runtime/c/pgf/evaluator.c')
| -rw-r--r-- | src/runtime/c/pgf/evaluator.c | 44 |
1 files changed, 11 insertions, 33 deletions
diff --git a/src/runtime/c/pgf/evaluator.c b/src/runtime/c/pgf/evaluator.c index ee2bd8511..fca499a98 100644 --- a/src/runtime/c/pgf/evaluator.c +++ b/src/runtime/c/pgf/evaluator.c @@ -9,12 +9,6 @@ struct PgfEnv { PgfClosure* closure; }; -typedef PgfClosure* (*PgfFunction)(PgfEvalState* state, PgfClosure* val); - -struct PgfClosure { - PgfFunction code; -}; - typedef struct { PgfClosure header; PgfEnv* env; @@ -28,12 +22,6 @@ typedef struct { typedef struct { PgfClosure header; - PgfAbsFun* absfun; - PgfClosure* args[]; -} PgfValue; - -typedef struct { - PgfClosure header; int level; size_t n_args; PgfClosure* args[]; @@ -62,26 +50,7 @@ pgf_evaluate_indirection(PgfEvalState* state, PgfClosure* closure) PgfClosure* pgf_evaluate_value(PgfEvalState* state, PgfClosure* closure) { - PgfValue* val = (PgfValue*) closure; - - size_t n_args = gu_seq_length(val->absfun->type->hypos) + - gu_buf_length(state->stack); - PgfValue* new_val = - gu_new_flex(state->pool, PgfValue, args, n_args); - new_val->header.code = pgf_evaluate_value; - new_val->absfun = val->absfun; - - size_t i = 0; - while (i < gu_seq_length(val->absfun->type->hypos)) { - new_val->args[i] = val->args[i]; - i++; - } - while (i < n_args) { - val->args[i] = gu_buf_pop(state->stack, PgfClosure*); - i++; - } - - return &new_val->header; + return closure; } static PgfClosure* @@ -233,7 +202,7 @@ pgf_evaluate_expr_thunk(PgfEvalState* state, PgfClosure* closure) if (absfun->function != NULL) { val = (PgfValue*) ((PgfFunction) absfun->function)(state, closure); } else { - size_t n_args = gu_buf_length(state->stack); + size_t n_args = absfun->arity; val = gu_new_flex(state->pool, PgfValue, args, n_args); val->header.code = pgf_evaluate_value; @@ -290,6 +259,15 @@ pgf_evaluate_expr_thunk(PgfEvalState* state, PgfClosure* closure) } } +void +pgf_evaluate_save_variables(PgfEvalState* state, PgfValue* val) +{ + size_t n_args = val->absfun->arity; + for (size_t i = 0; i < n_args; i++) { + gu_buf_push(state->stack, PgfClosure*, val->args[i]); + } +} + static PgfExpr pgf_value2expr(PgfEvalState* state, int level, PgfClosure* clos, GuPool* pool) { |
