[template-glib] expr: add basic support for null constant



commit a9d5e27f38182dfaac4cc66fe4e93719d4dda979
Author: Christian Hergert <chergert redhat com>
Date:   Thu May 5 15:22:23 2022 -0700

    expr: add basic support for null constant
    
    We will probably run into additional things to fix with this, particularly
    around comparisons/etc but this is a start.

 src/tmpl-expr-eval.c    | 5 +++++
 src/tmpl-expr-parser.y  | 4 ++++
 src/tmpl-expr-scanner.l | 4 ++++
 src/tmpl-expr-types.h   | 1 +
 src/tmpl-expr.c         | 8 ++++++++
 src/tmpl-expr.h         | 2 ++
 tests/test1.script      | 5 +++++
 7 files changed, 29 insertions(+)
---
diff --git a/src/tmpl-expr-eval.c b/src/tmpl-expr-eval.c
index 8d29934..23b65ed 100644
--- a/src/tmpl-expr-eval.c
+++ b/src/tmpl-expr-eval.c
@@ -1507,6 +1507,11 @@ tmpl_expr_eval_internal (TmplExpr   *node,
     case TMPL_EXPR_NOP:
       return TRUE;
 
+    case TMPL_EXPR_NULL:
+      g_value_init (return_value, G_TYPE_POINTER);
+      g_value_set_pointer (return_value, NULL);
+      return TRUE;
+
     default:
       break;
     }
diff --git a/src/tmpl-expr-parser.y b/src/tmpl-expr-parser.y
index 9a8efd2..8ca3dca 100644
--- a/src/tmpl-expr-parser.y
+++ b/src/tmpl-expr-parser.y
@@ -115,6 +115,7 @@ add_to_list (TmplExpr *stmt,
 %}
 
 %token <b> BOOL
+%token CONSTANT_NULL
 %token <d> NUMBER
 %token <s> NAME STRING_LITERAL
 %token <fn> BUILTIN
@@ -225,6 +226,9 @@ exp: exp CMP exp {
   | BOOL {
     $$ = tmpl_expr_new_boolean ($1);
   }
+  | CONSTANT_NULL {
+    $$ = tmpl_expr_new_null ();
+  }
   | STRING_LITERAL {
     $$ = tmpl_expr_new_string ($1, -1);
     g_free ($1);
diff --git a/src/tmpl-expr-scanner.l b/src/tmpl-expr-scanner.l
index 0fa0bee..8abcfcb 100644
--- a/src/tmpl-expr-scanner.l
+++ b/src/tmpl-expr-scanner.l
@@ -80,6 +80,7 @@ TmplExprParser *parser = yyextra;
 "version"  { return VERSION; }
 "pass"     { return NOP; }
 
+ /* booleans */
 "true"     { yylval->b = 1; return BOOL; }
 "false"    { yylval->b = 0; return BOOL; }
 "True"     { yylval->b = 1; return BOOL; }
@@ -87,6 +88,9 @@ TmplExprParser *parser = yyextra;
 "TRUE"     { yylval->b = 1; return BOOL; }
 "FALSE"    { yylval->b = 0; return BOOL; }
 
+ /* constants */
+"null"     { return CONSTANT_NULL; }
+
  /* builtin functions */
 "assert"   { yylval->fn = TMPL_EXPR_BUILTIN_ASSERT; return BUILTIN; }
 "abs"      { yylval->fn = TMPL_EXPR_BUILTIN_ABS; return BUILTIN; }
diff --git a/src/tmpl-expr-types.h b/src/tmpl-expr-types.h
index 4e4ad97..9ecccb0 100644
--- a/src/tmpl-expr-types.h
+++ b/src/tmpl-expr-types.h
@@ -79,6 +79,7 @@ typedef enum
   TMPL_EXPR_ARGS,
   TMPL_EXPR_FUNC,
   TMPL_EXPR_NOP,
+  TMPL_EXPR_NULL,
 } TmplExprType;
 
 typedef enum
diff --git a/src/tmpl-expr.c b/src/tmpl-expr.c
index 3903802..921d1fe 100644
--- a/src/tmpl-expr.c
+++ b/src/tmpl-expr.c
@@ -158,6 +158,7 @@ tmpl_expr_destroy (TmplExpr *self)
       break;
 
     case TMPL_EXPR_NOP:
+    case TMPL_EXPR_NULL:
       /* This should never happen,
        * but just log it if it does */
       g_return_if_reached ();
@@ -441,3 +442,10 @@ tmpl_expr_new_nop (void)
   static TmplExpr interned = { .any.type = TMPL_EXPR_NOP, .any.ref_count = 1 };
   return tmpl_expr_ref (&interned);
 }
+
+TmplExpr *
+tmpl_expr_new_null (void)
+{
+  static TmplExpr interned = { .any.type = TMPL_EXPR_NULL, .any.ref_count = 1 };
+  return tmpl_expr_ref (&interned);
+}
diff --git a/src/tmpl-expr.h b/src/tmpl-expr.h
index b9951e6..4deea9a 100644
--- a/src/tmpl-expr.h
+++ b/src/tmpl-expr.h
@@ -95,6 +95,8 @@ TmplExpr *tmpl_expr_new_anon_call     (TmplExpr         *func,
                                        TmplExpr         *params);
 TMPL_AVAILABLE_IN_3_36
 TmplExpr *tmpl_expr_new_nop           (void);
+TMPL_AVAILABLE_IN_3_36
+TmplExpr *tmpl_expr_new_null          (void);
 
 G_DEFINE_AUTOPTR_CLEANUP_FUNC (TmplExpr, tmpl_expr_unref)
 
diff --git a/tests/test1.script b/tests/test1.script
index 1a68b14..8d13ee2 100644
--- a/tests/test1.script
+++ b/tests/test1.script
@@ -66,4 +66,9 @@ assert(t1)
 assert(t2)
 assert(t1 == t2)
 
+action = Gio.SimpleAction.new("myaction", null)
+assert(action)
+assert(typeof(action) == typeof(Gio.SimpleAction))
+assert(typeof(action) != typeof(Gio.SimpleActionGroup))
+
 1234;


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