]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filter: Make the IF instruction three-args
authorJan Maria Matejka <mq@ucw.cz>
Wed, 30 May 2018 15:18:56 +0000 (17:18 +0200)
committerJan Maria Matejka <mq@ucw.cz>
Tue, 3 Jul 2018 15:24:17 +0000 (17:24 +0200)
Dropping another old quirk.

filter/config.Y
filter/filter.c

index bbb8a6405e0374b08fbdc1604dc4a7511161cdda..5d4372f6c4a862bc512b3bef862066838f9f005e 100644 (file)
@@ -989,12 +989,10 @@ cmd:
      $$->a2.p = $4;
    }
  | IF term THEN block ELSE block {
-     struct f_inst *i = f_new_inst(FI_CONDITION);
-     i->a1.p = $2;
-     i->a2.p = $4;
      $$ = f_new_inst(FI_CONDITION);
-     $$->a1.p = i;
-     $$->a2.p = $6;
+     $$->a1.p = $2;
+     $$->a2.p = $4;
+     $$->a3.p = $6;
    }
  | SYM '=' term ';' {
      DBG( "Ook, we'll set value\n" );
index 0a2c26b8b2b0a3ef033b02f30aba71554a0e5d53..745fcf710404921b303334b873ceae59f5884acf 100644 (file)
@@ -897,14 +897,13 @@ interpret(struct f_inst *what)
     ARG_ANY(1);
     val_format(v1, &f_buf);
     break;
-  case FI_CONDITION:   /* ? has really strange error value, so we can implement if ... else nicely :-) */
+  case FI_CONDITION:
     ARG(1, T_BOOL);
     if (v1.val.i) {
       ARG_ANY(2);
-      res.val.i = 0;
-    } else
-      res.val.i = 1;
-    res.type = T_BOOL;
+    } else {
+      ARG_ANY(3);
+    }
     break;
   case FI_NOP:
     debug( "No operation\n" );
@@ -1669,7 +1668,7 @@ i_same(struct f_inst *f1, struct f_inst *f2)
       return 0;
     break;
   case FI_PRINT: case FI_LENGTH: ONEARG; break;
-  case FI_CONDITION: TWOARGS; break;
+  case FI_CONDITION: THREEARGS; break;
   case FI_NOP: case FI_EMPTY: break;
   case FI_PRINT_AND_DIE: ONEARG; A2_SAME; break;
   case FI_PREF_GET: