]> code.delx.au - gnu-emacs/blobdiff - src/search.c
Merge from emacs-24; up to 2012-04-24T08:35:02Z!lekktu@gmail.com
[gnu-emacs] / src / search.c
index a9542a2ed97f2e18e91bb563b09f30bde0cfc689..5608e344e75ff84767c53b53eef67c75460bb6b2 100644 (file)
@@ -1159,12 +1159,25 @@ search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte,
       while (n < 0)
        {
          ptrdiff_t val;
+
+#ifdef REL_ALLOC
+         /* re_search_2 below is passed C pointers to buffer text.
+            If some code called by it causes memory (re)allocation,
+            buffer text could be relocated on platforms that use
+            REL_ALLOC, which invalidates those C pointers.  So we
+            inhibit relocation of buffer text for as long as
+            re_search_2 runs.  */
+         r_alloc_inhibit_buffer_relocation (1);
+#endif
          val = re_search_2 (bufp, (char *) p1, s1, (char *) p2, s2,
                             pos_byte - BEGV_BYTE, lim_byte - pos_byte,
                             (NILP (Vinhibit_changing_match_data)
                              ? &search_regs : &search_regs_1),
                             /* Don't allow match past current point */
                             pos_byte - BEGV_BYTE);
+#ifdef REL_ALLOC
+         r_alloc_inhibit_buffer_relocation (0);
+#endif
          if (val == -2)
            {
              matcher_overflow ();
@@ -1203,11 +1216,20 @@ search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte,
       while (n > 0)
        {
          ptrdiff_t val;
+
+#ifdef REL_ALLOC
+         /* See commentary above for the reasons for inhibiting
+            buffer text relocation here.  */
+         r_alloc_inhibit_buffer_relocation (1);
+#endif
          val = re_search_2 (bufp, (char *) p1, s1, (char *) p2, s2,
                             pos_byte - BEGV_BYTE, lim_byte - pos_byte,
                             (NILP (Vinhibit_changing_match_data)
                              ? &search_regs : &search_regs_1),
                             lim_byte - BEGV_BYTE);
+#ifdef REL_ALLOC
+         r_alloc_inhibit_buffer_relocation (0);
+#endif
          if (val == -2)
            {
              matcher_overflow ();