Hi Александр

On Thu, 24 Apr 2025 at 03:30, Александр Ушаков <ausha...@astralinux.ru>
wrote:

> #define current_delimiter(ds) \
>   (ds.delimiter_depth && !(ds.delimiter_depth - 1 < 0) ?
> ds.delimiters[ds.delimiter_depth - 1] : 0)


This seems unnecessarily complex; why not simply

#define current_delimiter(ds) (ds.delimiter_depth > 0 ?
> ds.delimiters[ds.delimiter_depth - 1] : 0)


However this would seem to be looking in the wrong place.

ds.delimiter_depth should never be negative; so I would focus on tracking
down how it gets that way, and in particular why pop_delimiter() might get
called too often.

In the meantime I would put a guard in it to stop it underflowing:

#define pop_delimiter(D) pop_delimiter_checked (&(D))
static inline void
pop_delimiter_checked (struct dstack *ds)
{
  assert (ds->delimiter_depth > 0);
  ds->delimiter_depth--;
}

-Martin

Reply via email to