summaryrefslogtreecommitdiff
path: root/filter/filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'filter/filter.c')
-rw-r--r--filter/filter.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/filter/filter.c b/filter/filter.c
index 37cf16a3..88da05b4 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -610,7 +610,8 @@ static struct tbf rl_runtime_err = TBF_DEFAULT_LOG_LIMITS;
#define INTERPRET(val, what_) \
val = interpret(what_); \
- if (val.type & T_RETURN) \
+ debug("INTERPRET %d\n", val.type); \
+ if (val.type & T_RETURN) \
return val;
#define ACCESS_RTE \
@@ -886,8 +887,10 @@ interpret(struct f_inst *what)
res.val.t = what->a2.p;
else if (res.type == T_STRING)
res.val.s = what->a2.p;
- else
+ else {
res.val.i = what->a2.i;
+ debug("FI_CONSTANT %d\n", res.val.i);
+ }
break;
case FI_VARIABLE:
case FI_CONSTANT_INDIRECT:
@@ -1309,6 +1312,15 @@ interpret(struct f_inst *what)
return res;
res.type &= ~T_RETURN;
break;
+ case FI_CALL_NATIVE: /* CALL: this is special: if T_RETURN and returning some value, mask it out */
+ ARG_ANY(1);
+ debug("**********************foobar1**************************%d %x\n", v1.type, v1.val.s);
+ struct f_val (*f)(void) = what->a2.p;
+ res = f();
+ if (res.type == T_RETURN)
+ return res;
+ res.type &= ~T_RETURN;
+ break;
case FI_CLEAR_LOCAL_VARS: /* Clear local variables */
for (sym = what->a1.p; sym != NULL; sym = sym->aux2)
((struct f_val *) sym->def)->type = T_VOID;
@@ -1578,6 +1590,7 @@ interpret(struct f_inst *what)
default:
bug( "Unknown instruction %d (%c)", what->fi_code, what->fi_code & 0xff);
}}
+ debug("return %d\n", res.type);
return res;
}