From: Zhou Qiankang Date: Tue, 12 Mar 2024 06:38:08 +0000 (+0800) Subject: vala, codegen: Add `o` modifier to regex literal X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=e42c1ee62d0ebc85e4e219455e9b494adf19fc17;p=thirdparty%2Fvala.git vala, codegen: Add `o` modifier to regex literal Use compile flag `G_REGEX_OPTIMIZE` to make use of JIT optimization --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index ea9a6454c..ae812ad73 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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*"); diff --git a/tests/Makefile.am b/tests/Makefile.am index 9932c40e4..600e69977 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..9eee54ed9 --- /dev/null +++ b/tests/scanner/regex-modifier-o.c-expected @@ -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 + +#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 index 000000000..81d41cd4f --- /dev/null +++ b/tests/scanner/regex-modifier-o.vala @@ -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 index 000000000..2f5ef7139 --- /dev/null +++ b/tests/scanner/regex-multiple-o.test @@ -0,0 +1,5 @@ +Invalid Code + +void main () { + Regex foo = /foo(.*)/oo; +} diff --git a/vala/valascanner.vala b/vala/valascanner.vala index a198ed72a..f96066a2b 100644 --- a/vala/valascanner.vala +++ b/vala/valascanner.vala @@ -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++;