[template-glib] eval: add null comparison support



commit 037671737de1f1f5276738b0798dc01bdb775549
Author: Christian Hergert <chergert redhat com>
Date:   Thu May 5 16:06:55 2022 -0700

    eval: add null comparison support

 src/tmpl-expr-eval.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/test1.script   | 10 ++++++---
 2 files changed, 66 insertions(+), 3 deletions(-)
---
diff --git a/src/tmpl-expr-eval.c b/src/tmpl-expr-eval.c
index c2797d0..d39e060 100644
--- a/src/tmpl-expr-eval.c
+++ b/src/tmpl-expr-eval.c
@@ -160,6 +160,57 @@ ne_gtype_gtype (const GValue  *left,
   return FALSE;
 }
 
+static gboolean
+eq_null (const GValue  *left,
+         const GValue  *right,
+         GValue        *return_value,
+         GError       **error)
+{
+  const GValue *val;
+
+  g_value_init (return_value, G_TYPE_BOOLEAN);
+
+  if (G_VALUE_HOLDS_POINTER (left) && g_value_get_pointer (left) == NULL)
+    val = right;
+  else
+    val = left;
+
+  if (val->g_type == G_TYPE_INVALID ||
+      G_VALUE_HOLDS_POINTER (val) ||
+      G_VALUE_HOLDS_STRING (val) ||
+      G_VALUE_HOLDS_OBJECT (val) ||
+      G_VALUE_HOLDS_BOXED (val) ||
+      G_VALUE_HOLDS_GTYPE (val) ||
+      G_VALUE_HOLDS_VARIANT (val))
+    {
+      g_value_set_boolean (return_value, val->data[0].v_pointer == NULL);
+      return TRUE;
+    }
+
+  g_set_error (error,
+               TMPL_ERROR,
+               TMPL_ERROR_TYPE_MISMATCH,
+               "Cannot compare %s for null equality",
+               G_VALUE_TYPE_NAME (val));
+
+  return FALSE;
+}
+
+static gboolean
+ne_null (const GValue  *left,
+         const GValue  *right,
+         GValue        *return_value,
+         GError       **error)
+{
+  if (eq_null (left, right, return_value, error))
+    {
+      g_value_set_boolean (return_value, !g_value_get_boolean (return_value));
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 static gboolean
 throw_type_mismatch (GError       **error,
                      const GValue  *left,
@@ -213,6 +264,10 @@ find_dispatch_slow (TmplExprSimple *node,
 
       if (G_VALUE_HOLDS_GTYPE (left) && G_VALUE_HOLDS_GTYPE (right))
         return eq_gtype_gtype;
+
+      if ((G_VALUE_HOLDS_POINTER (left) && g_value_get_pointer (left) == NULL) ||
+          (G_VALUE_HOLDS_POINTER (right) && g_value_get_pointer (right) == NULL))
+        return eq_null;
     }
 
   if (node->type == TMPL_EXPR_NE)
@@ -223,6 +278,10 @@ find_dispatch_slow (TmplExprSimple *node,
 
       if (G_VALUE_HOLDS_GTYPE (left) && G_VALUE_HOLDS_GTYPE (right))
         return ne_gtype_gtype;
+
+      if ((G_VALUE_HOLDS_POINTER (left) && g_value_get_pointer (left) == NULL) ||
+          (G_VALUE_HOLDS_POINTER (right) && g_value_get_pointer (right) == NULL))
+        return ne_null;
     }
 
   if (node->type == TMPL_EXPR_ADD)
diff --git a/tests/test1.script b/tests/test1.script
index 83b9cdc..e079290 100644
--- a/tests/test1.script
+++ b/tests/test1.script
@@ -66,11 +66,15 @@ assert(t1)
 assert(t2)
 assert(t1 == t2)
 
+Nil = null
+assert(Nil == null)
+assert(null == null)
+assert(group != null)
+
 action = Gio.SimpleAction.new("myaction", null)
-assert(action)
+assert(action != null)
+assert(typeof(action) != null)
 assert(typeof(action) == typeof(Gio.SimpleAction))
 assert(typeof(action) != typeof(Gio.SimpleActionGroup))
 
-assert(null == null)
-
 1234;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]