[template-glib] expr: add basic support for null constant
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [template-glib] expr: add basic support for null constant
- Date: Thu, 5 May 2022 22:44:09 +0000 (UTC)
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]