summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Myron <samyron@gmail.com>2026-01-12 18:57:09 -0600
committergit <svn-admin@ruby-lang.org>2026-01-14 07:59:32 +0000
commit24ad90d3e06ee9bcfc56d91358eb3d4792912a46 (patch)
treee49f5291898574d11a338671a522d1741a5e91a7
parent875dce2f5989c67b93e420d08939a74aa11d6199 (diff)
[ruby/json] use a conditional to select SIMD implementation rather than pointer
https://github.com/ruby/json/commit/86a5cce405
-rw-r--r--ext/json/generator/generator.c53
1 files changed, 32 insertions, 21 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index d202e97ea1..fdf832f86c 100644
--- a/ext/json/generator/generator.c
+++ b/ext/json/generator/generator.c
@@ -63,6 +63,8 @@ struct generate_json_data {
long depth;
};
+static SIMD_Implementation simd_impl;
+
static VALUE cState_from_state_s(VALUE self, VALUE opts);
static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func, VALUE io);
static void generate_json(FBuffer *buffer, struct generate_json_data *data, VALUE obj);
@@ -155,8 +157,6 @@ static const unsigned char escape_table_basic[256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
-static unsigned char (*search_escape_basic_impl)(search_state *);
-
static inline unsigned char search_escape_basic(search_state *search)
{
while (search->ptr < search->end) {
@@ -212,11 +212,39 @@ ALWAYS_INLINE(static) void escape_UTF8_char_basic(search_state *search)
* Everything else (should be UTF-8) is just passed through and
* appended to the result.
*/
+
+
+#if defined(HAVE_SIMD_NEON)
+static inline unsigned char search_escape_basic_neon(search_state *search);
+#elif defined(HAVE_SIMD_SSE2)
+static inline unsigned char search_escape_basic_sse2(search_state *search);
+#endif
+
+static inline unsigned char search_escape_basic(search_state *search);
+
static inline void convert_UTF8_to_JSON(search_state *search)
{
- while (search_escape_basic_impl(search)) {
+#ifdef HAVE_SIMD
+#if defined(HAVE_SIMD_NEON)
+ while (search_escape_basic_neon(search)) {
+ escape_UTF8_char_basic(search);
+ }
+#elif defined(HAVE_SIMD_SSE2)
+ if (simd_impl == SIMD_SSE2) {
+ while (search_escape_basic_sse2(search)) {
+ escape_UTF8_char_basic(search);
+ }
+ return;
+ }
+ while (search_escape_basic(search)) {
+ escape_UTF8_char_basic(search);
+ }
+#endif
+#else
+ while (search_escape_basic(search)) {
escape_UTF8_char_basic(search);
}
+#endif /* HAVE_SIMD */
}
static inline void escape_UTF8_char(search_state *search, unsigned char ch_len)
@@ -2181,22 +2209,5 @@ void Init_generator(void)
rb_require("json/ext/generator/state");
-
- switch (find_simd_implementation()) {
-#ifdef HAVE_SIMD
-#ifdef HAVE_SIMD_NEON
- case SIMD_NEON:
- search_escape_basic_impl = search_escape_basic_neon;
- break;
-#endif /* HAVE_SIMD_NEON */
-#ifdef HAVE_SIMD_SSE2
- case SIMD_SSE2:
- search_escape_basic_impl = search_escape_basic_sse2;
- break;
-#endif /* HAVE_SIMD_SSE2 */
-#endif /* HAVE_SIMD */
- default:
- search_escape_basic_impl = search_escape_basic;
- break;
- }
+ simd_impl = find_simd_implementation();
}