]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filter refactoring: Converted condition to three-args instruction
authorMaria Matejka <mq@ucw.cz>
Thu, 20 Dec 2018 13:34:35 +0000 (14:34 +0100)
committerMaria Matejka <mq@ucw.cz>
Wed, 20 Feb 2019 21:30:54 +0000 (22:30 +0100)
filter/config.Y
filter/f-inst.c
filter/filter.c

index 200c1f4163d867d174439f9be00ad51f58ee9b96..05c6f8993b7ac705f2248758400fb6f241983b55 100644 (file)
@@ -559,7 +559,7 @@ filter:
 
 where_filter:
    WHERE term {
-     /* Construct 'IF term THEN ACCEPT; REJECT;' */
+     /* Construct 'IF term THEN { ACCEPT; } ELSE { REJECT; }' */
      struct filter *f = cfg_alloc(sizeof(struct filter));
      struct f_inst *i, *acc, *rej;
      acc = f_new_inst(FI_PRINT_AND_DIE);       /* ACCEPT */
@@ -571,7 +571,7 @@ where_filter:
      i = f_new_inst(FI_CONDITION);                     /* IF */
      i->a1.p = $2;
      i->a2.p = acc;
-     i->next = rej;
+     i->a3.p = rej;
      f->name = NULL;
      f->root = i;
      $$ = f;
@@ -1005,12 +1005,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 cee5b8e7687314b1c28c239fad8517a3d5a44720..fc960198bcc08945201b83f5546ee418d52dc687 100644 (file)
     ARG_ANY(1);
     val_format(v1, &fs->buf);
     break;
-  case FI_CONDITION:   /* ? has really strange error value, so we can implement if ... else nicely :-) */
-    ARG(1, T_BOOL);
-    if (v1.val.i) {
-      ARG_ANY(2);
-      res.val.i = 0;
-    } else
-      res.val.i = 1;
-    res.type = T_BOOL;
+  case FI_CONDITION:
+    ARG_T(1, 0, T_BOOL);
+    if (res.val.i)
+      ARG_ANY_T(2,0);
+    else
+      ARG_ANY_T(3,0);
     break;
   case FI_NOP:
     debug( "No operation\n" );
index a1bb741579e7776fe5af2049b96ff1973026d184..3b3102574b73e6eade3f21a72aaca78ba84ac68c 100644 (file)
@@ -793,7 +793,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: