emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] comment-cache 298a0e2 1/3: First steps in cacheing comment


From: Alan Mackenzie
Subject: [Emacs-diffs] comment-cache 298a0e2 1/3: First steps in cacheing comments in a text property.
Date: Tue, 08 Mar 2016 13:25:30 +0000

branch: comment-cache
commit 298a0e24abba950bf62edd5c4975f387134a9f9a
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>

    First steps in cacheing comments in a text property.
    
    * src/syntax.c (internalize_parse_state): New function.
    (scan_sexps_forward): Remove stuff now done in the above.  Adapt parameter
    list.  Add code conditionally to apply `comment-depth' text properties.
    (Fparse_partial_sexp, back_comment): Call internalize_parse_state.
    (comment-depth, comment-depth-hwm, comment-cacheing-flag): New symbol,
    variables.
---
 src/syntax.c |  175 ++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 108 insertions(+), 67 deletions(-)

diff --git a/src/syntax.c b/src/syntax.c
index 249d0d5..0998453 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -176,7 +176,8 @@ static Lisp_Object skip_syntaxes (bool, Lisp_Object, 
Lisp_Object);
 static Lisp_Object scan_lists (EMACS_INT, EMACS_INT, EMACS_INT, bool);
 static void scan_sexps_forward (struct lisp_parse_state *,
                                 ptrdiff_t, ptrdiff_t, ptrdiff_t, EMACS_INT,
-                                bool, Lisp_Object, int);
+                                bool, int, bool);
+static void internalize_parse_state (Lisp_Object, struct lisp_parse_state *);
 static bool in_classes (int, Lisp_Object);
 static void parse_sexp_propertize (ptrdiff_t charpos);
 
@@ -911,10 +912,11 @@ back_comment (ptrdiff_t from, ptrdiff_t from_byte, 
ptrdiff_t stop,
        }
       do
        {
+          internalize_parse_state (Qnil, &state);
          scan_sexps_forward (&state,
                              defun_start, defun_start_byte,
                              comment_end, TYPE_MINIMUM (EMACS_INT),
-                             0, Qnil, 0);
+                             0, 0, false);
          defun_start = comment_end;
          if (!adjusted)
            {
@@ -3124,13 +3126,16 @@ the prefix syntax flag (p).  */)
    If STOPBEFORE, stop at the start of an atom.
    If COMMENTSTOP is 1, stop at the start of a comment.
    If COMMENTSTOP is -1, stop at the start or end of a comment,
-   after the beginning of a string, or after the end of a string.  */
+   after the beginning of a string, or after the end of a string.
+   If PROPERTIZE is true, apply a `comment-depth' property to the region
+   just scanned over.  This should only be done when COMMENTSTOP is -1 and
+   TARGETDEPTH is ???? and STOPBEFORE is false.  */
 
 static void
 scan_sexps_forward (struct lisp_parse_state *stateptr,
                    ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t end,
                    EMACS_INT targetdepth, bool stopbefore,
-                   Lisp_Object oldstate, int commentstop)
+                   int commentstop, bool propertize)
 {
   struct lisp_parse_state state;
   enum syntaxcode code;
@@ -3153,6 +3158,8 @@ scan_sexps_forward (struct lisp_parse_state *stateptr,
   bool nofence;
   bool found;
   ptrdiff_t out_bytepos, out_charpos;
+  Lisp_Object comment_depth_value;
+  ptrdiff_t orig_from = from;
   int temp;
 
   prev_from = from;
@@ -3174,70 +3181,26 @@ do { prev_from = from;                          \
   immediate_quit = 1;
   QUIT;
 
-  if (NILP (oldstate))
+  state = *stateptr;
+  depth = state.depth;
+  start_quoted = state.quoted;
+
+  tem = state.levelstarts;
+  while (!NILP (tem))          /* >= second enclosing sexps.  */
     {
-      depth = 0;
-      state.instring = -1;
-      state.incomment = 0;
-      state.comstyle = 0;      /* comment style a by default.  */
-      state.comstr_start = -1; /* no comment/string seen.  */
+      Lisp_Object temhd = Fcar (tem);
+      if (RANGED_INTEGERP (PTRDIFF_MIN, temhd, PTRDIFF_MAX))
+        curlevel->last = XINT (temhd);
+      if (++curlevel == endlevel)
+        curlevel--; /* error ("Nesting too deep for parser"); */
+      curlevel->prev = -1;
+      curlevel->last = -1;
+      tem = Fcdr (tem);
     }
-  else
-    {
-      tem = Fcar (oldstate);
-      if (!NILP (tem))
-       depth = XINT (tem);
-      else
-       depth = 0;
 
-      oldstate = Fcdr (oldstate);
-      oldstate = Fcdr (oldstate);
-      oldstate = Fcdr (oldstate);
-      tem = Fcar (oldstate);
-      /* Check whether we are inside string_fence-style string: */
-      state.instring = (!NILP (tem)
-                       ? (CHARACTERP (tem) ? XFASTINT (tem) : ST_STRING_STYLE)
-                       : -1);
-
-      oldstate = Fcdr (oldstate);
-      tem = Fcar (oldstate);
-      state.incomment = (!NILP (tem)
-                        ? (INTEGERP (tem) ? XINT (tem) : -1)
-                        : 0);
-
-      oldstate = Fcdr (oldstate);
-      tem = Fcar (oldstate);
-      start_quoted = !NILP (tem);
-
-      /* if the eighth element of the list is nil, we are in comment
-        style a.  If it is non-nil, we are in comment style b */
-      oldstate = Fcdr (oldstate);
-      oldstate = Fcdr (oldstate);
-      tem = Fcar (oldstate);
-      state.comstyle = (NILP (tem)
-                       ? 0
-                       : (RANGED_INTEGERP (0, tem, ST_COMMENT_STYLE)
-                          ? XINT (tem)
-                          : ST_COMMENT_STYLE));
-
-      oldstate = Fcdr (oldstate);
-      tem = Fcar (oldstate);
-      state.comstr_start =
-       RANGED_INTEGERP (PTRDIFF_MIN, tem, PTRDIFF_MAX) ? XINT (tem) : -1;
-      oldstate = Fcdr (oldstate);
-      tem = Fcar (oldstate);
-      while (!NILP (tem))              /* >= second enclosing sexps.  */
-       {
-         Lisp_Object temhd = Fcar (tem);
-         if (RANGED_INTEGERP (PTRDIFF_MIN, temhd, PTRDIFF_MAX))
-           curlevel->last = XINT (temhd);
-         if (++curlevel == endlevel)
-           curlevel--; /* error ("Nesting too deep for parser"); */
-         curlevel->prev = -1;
-         curlevel->last = -1;
-         tem = Fcdr (tem);
-       }
-    }
+  comment_depth_value = (state.instring != -1)
+    ? Qstring
+    : make_number (state.incomment);
   state.quoted = 0;
   mindepth = depth;
 
@@ -3477,11 +3440,78 @@ do { prev_from = from;                          \
   while (curlevel > levelstart)
     state.levelstarts = Fcons (make_number ((--curlevel)->last),
                               state.levelstarts);
+  if (propertize && commentstop == -1)
+      Fput_text_property (orig_from, from, Qcomment_depth,
+                          comment_depth_value, Qnil);
+
   immediate_quit = 0;
 
   *stateptr = state;
 }
 
+static void
+internalize_parse_state (Lisp_Object external, struct lisp_parse_state *state)
+{
+  Lisp_Object tem;
+
+  if (NILP (external))
+    {
+      state->depth = 0;
+      state->instring = -1;
+      state->incomment = 0;
+      state->quoted = 0;
+      state->comstyle = 0;     /* comment style a by default.  */
+      state->comstr_start = -1;        /* no comment/string seen.  */
+      state->levelstarts = Qnil;
+    }
+  else
+    {
+      tem = Fcar (external);
+      if (!NILP (tem))
+       state->depth = XINT (tem);
+      else
+       state->depth = 0;
+
+      external = Fcdr (external);
+      external = Fcdr (external);
+      external = Fcdr (external);
+      tem = Fcar (external);
+      /* Check whether we are inside string_fence-style string: */
+      state->instring = (!NILP (tem)
+                         ? (CHARACTERP (tem) ? XFASTINT (tem) : 
ST_STRING_STYLE)
+                         : -1);
+
+      external = Fcdr (external);
+      tem = Fcar (external);
+      state->incomment = (!NILP (tem)
+                          ? (INTEGERP (tem) ? XINT (tem) : -1)
+                          : 0);
+
+      external = Fcdr (external);
+      tem = Fcar (external);
+      state->quoted = !NILP (tem);
+
+      /* if the eighth element of the list is nil, we are in comment
+        style a.  If it is non-nil, we are in comment style b */
+      external = Fcdr (external);
+      external = Fcdr (external);
+      tem = Fcar (external);
+      state->comstyle = (NILP (tem)
+                         ? 0
+                         : (RANGED_INTEGERP (0, tem, ST_COMMENT_STYLE)
+                            ? XINT (tem)
+                            : ST_COMMENT_STYLE));
+
+      external = Fcdr (external);
+      tem = Fcar (external);
+      state->comstr_start =
+       RANGED_INTEGERP (PTRDIFF_MIN, tem, PTRDIFF_MAX) ? XINT (tem) : -1;
+      external = Fcdr (external);
+      tem = Fcar (external);
+      state->levelstarts = tem;
+    }
+}
+
 DEFUN ("parse-partial-sexp", Fparse_partial_sexp, Sparse_partial_sexp, 2, 6, 0,
        doc: /* Parse Lisp syntax starting at FROM until TO; return status of 
parse at TO.
 Parsing stops at TO or when certain criteria are met;
@@ -3527,11 +3557,13 @@ Sixth arg COMMENTSTOP non-nil means stop at the start 
of a comment.
     target = TYPE_MINIMUM (EMACS_INT); /* We won't reach this depth.  */
 
   validate_region (&from, &to);
+  internalize_parse_state (oldstate, &state);
   scan_sexps_forward (&state, XINT (from), CHAR_TO_BYTE (XINT (from)),
                      XINT (to),
-                     target, !NILP (stopbefore), oldstate,
+                     target, !NILP (stopbefore),
                      (NILP (commentstop)
-                      ? 0 : (EQ (commentstop, Qsyntax_table) ? -1 : 1)));
+                      ? 0 : (EQ (commentstop, Qsyntax_table) ? -1 : 1)),
+                      false);
 
   SET_PT_BOTH (state.location, state.location_byte);
 
@@ -3664,6 +3696,15 @@ syms_of_syntax (void)
   Fput (Qscan_error, Qerror_message,
        build_pure_c_string ("Scan error"));
 
+  DEFSYM (Qcomment_depth, "comment-depth");
+  DEFVAR_BOOL ("comment-cacheing-flag", comment_cacheing_flag,
+               doc: /* Non-nil means use new style comment handling.  */);
+  comment_cacheing_flag = 0;
+  DEFVAR_LISP ("comment-depth-hwm", Vcomment_depth_hwm,
+               doc: /* Buffer position below which the `comment-depth' 
property is valid.  */);
+  Vcomment_depth_hwm = make_number (1);
+  Fmake_variable_buffer_local (intern ("comment-depth-hwm"));
+
   DEFVAR_BOOL ("parse-sexp-ignore-comments", parse_sexp_ignore_comments,
               doc: /* Non-nil means `forward-sexp', etc., should treat 
comments as whitespace.  */);
 



reply via email to

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