]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala, codegen: Add `o` modifier to regex literal
authorZhou Qiankang <wszqkzqk@qq.com>
Tue, 12 Mar 2024 06:38:08 +0000 (14:38 +0800)
committerRico Tzschichholz <ricotz@ubuntu.com>
Fri, 22 Mar 2024 11:56:34 +0000 (12:56 +0100)
Use compile flag `G_REGEX_OPTIMIZE` to make use of JIT optimization

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/scanner/regex-modifier-o.c-expected [new file with mode: 0644]
tests/scanner/regex-modifier-o.vala [new file with mode: 0644]
tests/scanner/regex-multiple-o.test [new file with mode: 0644]
vala/valascanner.vala

index ea9a6454c77a45d4c62a67ab6ad51678d2c81037..ae812ad7303c2f84b9ee20d457fc95dcef7c22b1 100644 (file)
@@ -4494,6 +4494,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                if (parts[1].contains ("x")) {
                        flags += " | G_REGEX_EXTENDED";
                }
+               if (parts[1].contains ("o")) {
+                       flags += " | G_REGEX_OPTIMIZE";
+               }
 
                var cdecl = new CCodeDeclaration ("GRegex*");
 
index 9932c40e400e15d0645b380ce8b9d2d3891f387d..600e69977a2d7820a4ef9c45f7ff13a0df8390e9 100644 (file)
@@ -963,8 +963,10 @@ TESTS = \
        scanner/regex-escape-x-digit-length.test \
        scanner/regex-escape-x-empty.test \
        scanner/regex-escape-x.vala \
+       scanner/regex-modifier-o.vala \
        scanner/regex-multiple-i.test \
        scanner/regex-multiple-m.test \
+       scanner/regex-multiple-o.test \
        scanner/regex-multiple-s.test \
        scanner/regex-multiple-x.test \
        scanner/string-escape-u-digit-length.test \
diff --git a/tests/scanner/regex-modifier-o.c-expected b/tests/scanner/regex-modifier-o.c-expected
new file mode 100644 (file)
index 0000000..9eee54e
--- /dev/null
@@ -0,0 +1,56 @@
+/* scanner_regex_modifier_o.c generated by valac, the Vala compiler
+ * generated from scanner_regex_modifier_o.vala, do not modify */
+
+#include <glib.h>
+
+#if !defined(VALA_STRICT_C)
+#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 14)
+#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
+#elif defined(__clang__) && (__clang_major__ >= 16)
+#pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
+#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
+#endif
+#endif
+
+#define _g_regex_unref0(var) ((var == NULL) ? NULL : (var = (g_regex_unref (var), NULL)))
+
+static void _vala_main (void);
+
+static GRegex* _tmp_regex_0 = NULL;
+
+static inline GRegex*
+_thread_safe_regex_init (GRegex** re,
+                         const gchar * pattern,
+                         GRegexCompileFlags compile_flags)
+{
+       if (g_once_init_enter ((volatile gsize*) re)) {
+               GRegex* val = g_regex_new (pattern, compile_flags, 0, NULL);
+               g_once_init_leave ((volatile gsize*) re, (gsize) val);
+       }
+       return *re;
+}
+
+static gpointer
+_g_regex_ref0 (gpointer self)
+{
+       return self ? g_regex_ref (self) : NULL;
+}
+
+static void
+_vala_main (void)
+{
+       GRegex* foo = NULL;
+       GRegex* _tmp0_;
+       _tmp0_ = _g_regex_ref0 (_thread_safe_regex_init (&_tmp_regex_0, "foo(.*)", 0 | G_REGEX_OPTIMIZE));
+       foo = _tmp0_;
+       _g_regex_unref0 (foo);
+}
+
+int
+main (int argc,
+      char ** argv)
+{
+       _vala_main ();
+       return 0;
+}
+
diff --git a/tests/scanner/regex-modifier-o.vala b/tests/scanner/regex-modifier-o.vala
new file mode 100644 (file)
index 0000000..81d41cd
--- /dev/null
@@ -0,0 +1,3 @@
+void main () {
+       Regex foo = /foo(.*)/o;
+}
diff --git a/tests/scanner/regex-multiple-o.test b/tests/scanner/regex-multiple-o.test
new file mode 100644 (file)
index 0000000..2f5ef71
--- /dev/null
@@ -0,0 +1,5 @@
+Invalid Code
+
+void main () {
+       Regex foo = /foo(.*)/oo;
+}
index a198ed72a5aab0f30ce71ac9660ca29281aa7c23..f96066a2bafca91708c99c3a8ffa1b0371b931a8 100644 (file)
@@ -122,7 +122,8 @@ public class Vala.Scanner {
                                var fl_s = false;
                                var fl_m = false;
                                var fl_x = false;
-                               while (current[0] == 'i' || current[0] == 's' || current[0] == 'm' || current[0] == 'x') {
+                               var fl_o = false;
+                               while (current[0] == 'i' || current[0] == 's' || current[0] == 'm' || current[0] == 'x' || current[0] == 'o') {
                                        switch (current[0]) {
                                        case 'i':
                                                if (fl_i) {
@@ -148,6 +149,12 @@ public class Vala.Scanner {
                                                }
                                                fl_x = true;
                                                break;
+                                       case 'o':
+                                               if (fl_o) {
+                                                       Report.error (get_source_reference (token_length_in_chars), "modifier 'o' used more than once");
+                                               }
+                                               fl_o = true;
+                                               break;
                                        }
                                        current++;
                                        token_length_in_chars++;