summaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2026-05-23 09:59:25 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2026-05-23 19:18:53 -0700
commit2e91ed5f129a4c03f7345d15d61232bd15028a4e (patch)
treec0e4eb4ba15603ba56762a3b23c77162284d5121 /src/json.c
parent82ad01b631a4ff4508bb3d37d32925d0cc6771ee (diff)
Prefer ptrdiff_t to size_t when either will do
Signed types are a bit safer, as they avoid some comparison confusion and -fsanitize=undefined can check more misuses of them. * src/alloc.c (lisp_malloc, lisp_align_malloc) (allocate_string_data, allocate_vector_from_block, object_bytes): * src/coding.c (from_unicode_buffer): * src/decompress.c (acc_size, accumulate_and_process_md5): * src/emacs.c (load_seccomp, shut_down_emacs): * src/fns.c (sxhash_bignum): * src/ftfont.c (get_adstyle_property): * src/image.c (lookup_image, xpm_init_color_cache) (xpm_cache_color): * src/json.c (json_out_str, struct json_parser) (json_make_object_workspace_for_slow_path) (json_make_object_workspace_for, json_parse_array) (json_parse_object): * src/sysdep.c (get_current_dir_name_or_unreachable) (init_sys_modes, convert_speed): * src/termchar.h (struct tty_display_info): * src/textconv.h (struct textconv_conversion_text): * src/xfns.c (struct x_xim_text_conversion_data) (x_encode_xim_text): * src/xselect.c (struct transfer, c_size_for_format) (x_size_for_format, selection_data_for_offset) (selection_data_size, x_start_selection_transfer) (x_continue_selection_transfer): Prefer ptrdiff_t to size_t when either will do. * src/term.c (Ftty__set_output_buffer_size): Limit output buffer size to PTRDIFF_MAX as well as to SIZE_MAX.
Diffstat (limited to 'src/json.c')
-rw-r--r--src/json.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/src/json.c b/src/json.c
index 720654bac43..5186667a9d2 100644
--- a/src/json.c
+++ b/src/json.c
@@ -273,7 +273,7 @@ json_make_room (json_out_t *jo, ptrdiff_t bytes)
/* Add `bytes` bytes from `str` to the buffer. */
static void
-json_out_str (json_out_t *jo, const char *str, size_t bytes)
+json_out_str (json_out_t *jo, const char *str, ptrdiff_t bytes)
{
json_make_room (jo, bytes);
memcpy (jo->buf + jo->size, str, bytes);
@@ -693,7 +693,7 @@ struct json_parser
struct json_configuration conf;
- size_t additional_bytes_count;
+ ptrdiff_t additional_bytes_count;
/* Lisp_Objects are collected in this area during object/array
parsing. To avoid allocations, initially
@@ -704,8 +704,8 @@ struct json_parser
Lisp_Object internal_object_workspace
[JSON_PARSER_INTERNAL_OBJECT_WORKSPACE_SIZE];
Lisp_Object *object_workspace;
- size_t object_workspace_size;
- size_t object_workspace_current;
+ ptrdiff_t object_workspace_size;
+ ptrdiff_t object_workspace_current;
/* String and number parsing uses this workspace. The idea behind
internal_byte_workspace is the same as the idea behind
@@ -805,10 +805,9 @@ json_make_object_workspace_for_slow_path (struct json_parser *parser,
{
bool internal = (parser->object_workspace_size
== JSON_PARSER_INTERNAL_OBJECT_WORKSPACE_SIZE);
- ptrdiff_t new_workspace_size = parser->object_workspace_size;
Lisp_Object *new_workspace_ptr
= xpalloc (internal ? NULL : parser->object_workspace,
- &new_workspace_size,
+ &parser->object_workspace_size,
size - (parser->object_workspace_size
- parser->object_workspace_current),
-1, sizeof (Lisp_Object));
@@ -816,12 +815,11 @@ json_make_object_workspace_for_slow_path (struct json_parser *parser,
memcpy (new_workspace_ptr, parser->object_workspace,
sizeof (Lisp_Object) * parser->object_workspace_current);
parser->object_workspace = new_workspace_ptr;
- parser->object_workspace_size = new_workspace_size;
}
INLINE void
json_make_object_workspace_for (struct json_parser *parser,
- size_t size)
+ ptrdiff_t size)
{
if (parser->object_workspace_size - parser->object_workspace_current
< size)
@@ -1350,7 +1348,7 @@ json_parse_array (struct json_parser *parser)
{
int c = json_skip_whitespace (parser);
- const size_t first = parser->object_workspace_current;
+ const ptrdiff_t first = parser->object_workspace_current;
Lisp_Object result = Qnil;
if (c != ']')
@@ -1402,10 +1400,10 @@ json_parse_array (struct json_parser *parser)
{
case json_array_array:
{
- size_t number_of_elements
+ ptrdiff_t number_of_elements
= parser->object_workspace_current - first;
result = make_vector (number_of_elements, Qnil);
- for (size_t i = 0; i < number_of_elements; i++)
+ for (ptrdiff_t i = 0; i < number_of_elements; i++)
{
rarely_quit (i);
ASET (result, i, parser->object_workspace[first + i]);
@@ -1441,7 +1439,7 @@ json_parse_object (struct json_parser *parser)
{
int c = json_skip_whitespace (parser);
- const size_t first = parser->object_workspace_current;
+ const ptrdiff_t first = parser->object_workspace_current;
Lisp_Object result = Qnil;
if (c != '}')
@@ -1517,10 +1515,10 @@ json_parse_object (struct json_parser *parser)
{
case json_object_hashtable:
{
- EMACS_INT value = (parser->object_workspace_current - first) / 2;
+ EMACS_INT value = (parser->object_workspace_current - first) >> 1;
result = make_hash_table (&hashtest_equal, value, Weak_None);
struct Lisp_Hash_Table *h = XHASH_TABLE (result);
- for (size_t i = first; i < parser->object_workspace_current; i += 2)
+ for (ptrdiff_t i = first; i < parser->object_workspace_current; i += 2)
{
hash_hash_t hash;
Lisp_Object key = parser->object_workspace[i];