From b2b9ee88ce9885af175cf7bd51898a6cfb519fe4 Mon Sep 17 00:00:00 2001
From: Martin Teichmann <martin.teichmann@xfel.eu>
Date: Thu, 24 Dec 2020 13:56:50 +0000
Subject: [PATCH] factor out at SimpleComparison

---
 ebpf.py | 67 +++++++++++++++++++++++++++++++--------------------------
 1 file changed, 36 insertions(+), 31 deletions(-)

diff --git a/ebpf.py b/ebpf.py
index a95d5d6..bd219c2 100644
--- a/ebpf.py
+++ b/ebpf.py
@@ -26,37 +26,12 @@ def comparison(uposop, unegop, sposop=None, snegop=None):
         sposop = uposop
         snegop = unegop
     def ret(self, value):
-        return Comparison(self.ebpf, self, value,
-                          (uposop, unegop, sposop, snegop))
+        return SimpleComparison(self.ebpf, self, value,
+                                (uposop, unegop, sposop, snegop))
     return ret
 
 
 class Comparison:
-    def __init__(self, ebpf, left, right, opcode):
-        self.ebpf = ebpf
-        self.left = left
-        self.right = right
-        self.opcode = opcode
-        self.invert = None
-
-    def compare(self, negative):
-        self.dst, _, lsigned, lfree = self.left.calculate(None, None, None)
-        if not isinstance(self.right, int):
-            self.src, _, rsigned, rfree = \
-                    self.right.calculate(None, None, None)
-            if rsigned != rsigned:
-                raise AssembleError("need same signedness for comparison")
-        else:
-            rfree = False
-        self.origin = len(self.ebpf.opcodes)
-        self.ebpf.opcodes.append(None)
-        self.opcode = self.opcode[negative + 2 * lsigned]
-        if lfree:
-            self.ebpf.owners.discard(self.dst)
-        if rfree:
-            self.ebpf.owners.discard(self.src)
-        self.owners = self.ebpf.owners.copy()
-
     def target(self):
         assert self.ebpf.opcodes[self.origin] is None
         if isinstance(self.right, int):
@@ -101,11 +76,41 @@ class Comparison:
         return self
 
 
-class OrComparison(Comparison):
+class SimpleComparison(Comparison):
+    def __init__(self, ebpf, left, right, opcode):
+        self.ebpf = ebpf
+        self.left = left
+        self.right = right
+        self.opcode = opcode
+        self.invert = None
+
+    def compare(self, negative):
+        self.dst, _, lsigned, lfree = self.left.calculate(None, None, None)
+        if not isinstance(self.right, int):
+            self.src, _, rsigned, rfree = \
+                    self.right.calculate(None, None, None)
+            if rsigned != rsigned:
+                raise AssembleError("need same signedness for comparison")
+        else:
+            rfree = False
+        self.origin = len(self.ebpf.opcodes)
+        self.ebpf.opcodes.append(None)
+        self.opcode = self.opcode[negative + 2 * lsigned]
+        if lfree:
+            self.ebpf.owners.discard(self.dst)
+        if rfree:
+            self.ebpf.owners.discard(self.src)
+        self.owners = self.ebpf.owners.copy()
+
+class AndOrComparison(Comparison):
     def compare(self, negative):
         self.left.compare(negative)
         self.right.compare(negative)
 
+    def target(self):
+        self.left.target()
+        self.right.target()
+
 
 def binary(opcode, symetric=False):
     def ret(self, value):
@@ -186,13 +191,13 @@ class Sum(Binary):
             return super().__sub__(value)
 
 
-class AndExpression(Binary, Comparison):
+class AndExpression(Binary, SimpleComparison):
     __and__ = __rand__ = comparison(0x45, None)
     __rand__ = __and__ = binary(0x54, True)
 
     def __init__(self, ebpf, left, right):
         Binary.__init__(self, ebpf, left, right, 0x54)
-        Comparison.__init__(self, ebpf, left, right, 0x45)
+        SimpleComparison.__init__(self, ebpf, left, right, 0x45)
         self.opcode = (0x45, None, 0x45, None)
 
     def compare(self, negative):
@@ -392,7 +397,7 @@ class EBPF:
         return comp
 
     def jump(self):
-        comp = Comparison(self, None, 0, 5)
+        comp = SimpleComparison(self, None, 0, 5)
         comp.origin = len(self.opcodes)
         comp.dst = 0
         comp.owners = self.owners.copy()
-- 
GitLab