Sync ruby/json

Fix: https://github.com/ruby/json/issues/796
This commit is contained in:
Jean Boussier 2025-05-01 09:34:35 +02:00
parent e8ad728209
commit de6e59e5ba
Notes: git 2025-05-01 08:06:19 +00:00
3 changed files with 19 additions and 21 deletions

View File

@ -18,7 +18,7 @@ else
return 0; return 0;
} }
SRC SRC
$defs.push("-DENABLE_SIMD") $defs.push("-DJSON_ENABLE_SIMD")
end end
end end
@ -29,7 +29,7 @@ else
return 0; return 0;
} }
SRC SRC
$defs.push("-DENABLE_SIMD") $defs.push("-DJSON_ENABLE_SIMD")
end end
have_header('cpuid.h') have_header('cpuid.h')

View File

@ -112,7 +112,7 @@ typedef struct _search_state {
const char *cursor; const char *cursor;
FBuffer *buffer; FBuffer *buffer;
#ifdef ENABLE_SIMD #ifdef HAVE_SIMD
const char *chunk_base; const char *chunk_base;
const char *chunk_end; const char *chunk_end;
bool has_matches; bool has_matches;
@ -124,7 +124,7 @@ typedef struct _search_state {
#else #else
#error "Unknown SIMD Implementation." #error "Unknown SIMD Implementation."
#endif /* HAVE_SIMD_NEON */ #endif /* HAVE_SIMD_NEON */
#endif /* ENABLE_SIMD */ #endif /* HAVE_SIMD */
} search_state; } search_state;
#if (defined(__GNUC__ ) || defined(__clang__)) #if (defined(__GNUC__ ) || defined(__clang__))
@ -189,15 +189,11 @@ static inline FORCE_INLINE void escape_UTF8_char_basic(search_state *search)
case '\r': fbuffer_append(search->buffer, "\\r", 2); break; case '\r': fbuffer_append(search->buffer, "\\r", 2); break;
case '\t': fbuffer_append(search->buffer, "\\t", 2); break; case '\t': fbuffer_append(search->buffer, "\\t", 2); break;
default: { default: {
if (ch < ' ') { const char *hexdig = "0123456789abcdef";
const char *hexdig = "0123456789abcdef"; char scratch[6] = { '\\', 'u', '0', '0', 0, 0 };
char scratch[6] = { '\\', 'u', '0', '0', 0, 0 }; scratch[4] = hexdig[(ch >> 4) & 0xf];
scratch[4] = hexdig[(ch >> 4) & 0xf]; scratch[5] = hexdig[ch & 0xf];
scratch[5] = hexdig[ch & 0xf]; fbuffer_append(search->buffer, scratch, 6);
fbuffer_append(search->buffer, scratch, 6);
} else {
fbuffer_append_char(search->buffer, ch);
}
break; break;
} }
} }
@ -265,7 +261,7 @@ static inline void escape_UTF8_char(search_state *search, unsigned char ch_len)
search->cursor = (search->ptr += ch_len); search->cursor = (search->ptr += ch_len);
} }
#ifdef ENABLE_SIMD #ifdef HAVE_SIMD
static inline FORCE_INLINE char *copy_remaining_bytes(search_state *search, unsigned long vec_len, unsigned long len) static inline FORCE_INLINE char *copy_remaining_bytes(search_state *search, unsigned long vec_len, unsigned long len)
{ {
@ -537,7 +533,7 @@ static inline TARGET_SSE2 FORCE_INLINE unsigned char search_escape_basic_sse2(se
#endif /* HAVE_SIMD_SSE2 */ #endif /* HAVE_SIMD_SSE2 */
#endif /* ENABLE_SIMD */ #endif /* HAVE_SIMD */
static const unsigned char script_safe_escape_table[256] = { static const unsigned char script_safe_escape_table[256] = {
// ASCII Control Characters // ASCII Control Characters
@ -1302,11 +1298,11 @@ static void generate_json_string(FBuffer *buffer, struct generate_json_data *dat
search.cursor = search.ptr; search.cursor = search.ptr;
search.end = search.ptr + len; search.end = search.ptr + len;
#ifdef ENABLE_SIMD #ifdef HAVE_SIMD
search.matches_mask = 0; search.matches_mask = 0;
search.has_matches = false; search.has_matches = false;
search.chunk_base = NULL; search.chunk_base = NULL;
#endif /* ENABLE_SIMD */ #endif /* HAVE_SIMD */
switch(rb_enc_str_coderange(obj)) { switch(rb_enc_str_coderange(obj)) {
case ENC_CODERANGE_7BIT: case ENC_CODERANGE_7BIT:
@ -2174,7 +2170,7 @@ void Init_generator(void)
switch(find_simd_implementation()) { switch(find_simd_implementation()) {
#ifdef ENABLE_SIMD #ifdef HAVE_SIMD
#ifdef HAVE_SIMD_NEON #ifdef HAVE_SIMD_NEON
case SIMD_NEON: case SIMD_NEON:
search_escape_basic_impl = search_escape_basic_neon; search_escape_basic_impl = search_escape_basic_neon;
@ -2185,7 +2181,7 @@ void Init_generator(void)
search_escape_basic_impl = search_escape_basic_sse2; search_escape_basic_impl = search_escape_basic_sse2;
break; break;
#endif /* HAVE_SIMD_SSE2 */ #endif /* HAVE_SIMD_SSE2 */
#endif /* ENABLE_SIMD */ #endif /* HAVE_SIMD */
default: default:
search_escape_basic_impl = search_escape_basic; search_escape_basic_impl = search_escape_basic;
break; break;

View File

@ -4,7 +4,7 @@ typedef enum {
SIMD_SSE2 SIMD_SSE2
} SIMD_Implementation; } SIMD_Implementation;
#ifdef ENABLE_SIMD #ifdef JSON_ENABLE_SIMD
#ifdef __clang__ #ifdef __clang__
#if __has_builtin(__builtin_ctzll) #if __has_builtin(__builtin_ctzll)
@ -56,6 +56,7 @@ static SIMD_Implementation find_simd_implementation(void) {
return SIMD_NEON; return SIMD_NEON;
} }
#define HAVE_SIMD 1
#define HAVE_SIMD_NEON 1 #define HAVE_SIMD_NEON 1
uint8x16x4_t load_uint8x16_4(const unsigned char *table) { uint8x16x4_t load_uint8x16_4(const unsigned char *table) {
@ -74,6 +75,7 @@ uint8x16x4_t load_uint8x16_4(const unsigned char *table) {
#ifdef HAVE_X86INTRIN_H #ifdef HAVE_X86INTRIN_H
#include <x86intrin.h> #include <x86intrin.h>
#define HAVE_SIMD 1
#define HAVE_SIMD_SSE2 1 #define HAVE_SIMD_SSE2 1
#ifdef HAVE_CPUID_H #ifdef HAVE_CPUID_H
@ -101,7 +103,7 @@ static SIMD_Implementation find_simd_implementation(void) {
#endif /* HAVE_X86INTRIN_H */ #endif /* HAVE_X86INTRIN_H */
#endif /* X86_64 Support */ #endif /* X86_64 Support */
#endif /* ENABLE_SIMD */ #endif /* JSON_ENABLE_SIMD */
#ifndef FIND_SIMD_IMPLEMENTATION_DEFINED #ifndef FIND_SIMD_IMPLEMENTATION_DEFINED
static SIMD_Implementation find_simd_implementation(void) { static SIMD_Implementation find_simd_implementation(void) {