emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problems with syntax-ppss: Was [... Apply `comment-depth' text prope


From: Alan Mackenzie
Subject: Re: Problems with syntax-ppss: Was [... Apply `comment-depth' text properties when calling `back_comment'.]
Date: Fri, 11 Mar 2016 20:48:17 +0000
User-agent: Mutt/1.5.24 (2015-08-30)

Hello, Stefan.

On Thu, Mar 10, 2016 at 06:10:58PM -0500, Stefan Monnier wrote:

[ .... ]

> or replace my previous patch with this one below, which is almost
> identical to the previous one, tho a bit cleaner and with a fix to make
> comment-use-syntax-ppss override open-paren-in-column-0-is-defun-start,
> as it should.

OK.  It wouldn't compile, so I had to correct it a little bit.

Anyhow, what is going on at the indicated lines, where the input values
of the end of comment are simply returned as the beginning of defun?

Perhaps more seriously, the scheme won't work if point-min is inside a
string.  In that case, strings and non-strings get swapped.  syntax-ppss
will return what it thinks is the beginning of the string enclosing POS,
but which in reality is the end " of the previous actual string.  This
could easily be inside an actual comment:

............"   "...." /*  "...."   */   /*  */   /*               */
|                               |                           |
point-min           return value of syntax-ppss            pos

This is not a valid position to return as a safe place.

> diff --git a/src/syntax.c b/src/syntax.c
> index 249d0d5..f2268da 100644
> --- a/src/syntax.c
> +++ b/src/syntax.c
> @@ -597,6 +597,26 @@ find_defun_start (ptrdiff_t pos, ptrdiff_t pos_byte)
>        && MODIFF == find_start_modiff)
>      return find_start_value;
 
> +  if (!NILP (Vcomment_use_syntax_ppss))
> +    {
> +      EMACS_INT modiffs = CHARS_MODIFF;
> +      Lisp_Object ppss = call1 (Qsyntax_ppss, make_number (pos));
> +      if (modiffs != CHARS_MODIFF)
> +     error ("syntax-ppss modified the buffer!");
> +      TEMP_SET_PT_BOTH (opoint, opoint_byte);
> +      Lisp_Object boc = Fnth (make_number (8), ppss);
> +      if (NUMBERP (boc))
> +        {
> +          find_start_value = XINT (boc);
> +          find_start_value_byte = CHAR_TO_BYTE (find_start_value);
> +        }
> +      else
> +        {
> +          find_start_value = pos;              <=====================
> +          find_start_value_byte = pos_byte;    <=====================
> +        }
> +      goto found;
> +    }
>    if (!open_paren_in_column_0_is_defun_start)
>      {
>        find_start_value = BEGV;
> @@ -864,6 +884,7 @@ back_comment (ptrdiff_t from, ptrdiff_t from_byte, 
> ptrdiff_t stop,
>       case Sopen:
>         /* Assume a defun-start point is outside of strings.  */
>         if (open_paren_in_column_0_is_defun_start
> +              && NILP (Vcomment_use_syntax_ppss))
>             && (from == stop
>                 || (temp_byte = dec_bytepos (from_byte),
>                     FETCH_CHAR (temp_byte) == '\n')))
> @@ -3647,6 +3668,11 @@ void
>  syms_of_syntax (void)
>  {
>    DEFSYM (Qsyntax_table_p, "syntax-table-p");
> +  DEFSYM (Qsyntax_ppss, "syntax-ppss-for-syntax.c");
> +  DEFVAR_LISP ("comment-use-syntax-ppss",
> +            Vcomment_use_syntax_ppss,
> +            doc: /* Non-nil means `forward-comment' can use `syntax-ppss' 
> internally.  */);
> +  Vcomment_use_syntax_ppss = Qt;
 
>    staticpro (&Vsyntax_code_object);
 

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



reply via email to

[Prev in Thread] Current Thread [Next in Thread]