[template-glib] eval: add null comparison support
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [template-glib] eval: add null comparison support
- Date: Thu, 5 May 2022 23:07:04 +0000 (UTC)
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]