summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/evaluator.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2014-08-11 15:53:41 +0000
committerkr.angelov <kr.angelov@gmail.com>2014-08-11 15:53:41 +0000
commitc30e2df228fc42653149752b56e50e77bae03b9f (patch)
tree582a3a4fcac1e65b39968506208a466df3ed486f /src/runtime/c/pgf/evaluator.c
parentd3b9652b81e3d43bfb0de9faf4aea578c60e5cc4 (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.c44
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)
{