Change PRESERVING-MATCH-DATA to save permanent marks instead of
authorChris Hanson <org/chris-hanson/cph>
Fri, 10 May 1991 22:05:42 +0000 (22:05 +0000)
committerChris Hanson <org/chris-hanson/cph>
Fri, 10 May 1991 22:05:42 +0000 (22:05 +0000)
indexes.

v7/src/edwin/regexp.scm

index 45a87caeafcb4c53bd5469a6294c595290db20d7..a3f0cd8bde2eb4550dd507df1ca3d8e19401f72a 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/regexp.scm,v 1.55 1991/05/06 00:59:09 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/regexp.scm,v 1.56 1991/05/10 22:05:42 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
     group))
 
 (define (preserving-match-data thunk)
-  (fluid-let ((registers (vector-copy registers))
-             (match-group match-group))
-    (thunk)))
+  (let ((group unspecific)
+       (marks unspecific))
+    (dynamic-wind
+     (lambda ()
+       (set! group (object-unhash match-group))
+       (set! marks
+            (if group
+                (let ((v (make-vector 20 false)))
+                  (do ((i 0 (+ i 1)))
+                      ((< i 20))
+                    (let ((index (vector-ref registers i)))
+                      (if index
+                          (vector-set!
+                           v i
+                           ;; Start marks are right-inserting,
+                           ;; end marks are left-inserting.
+                           (make-permanent-mark group index (>= i 10))))))
+                  v)
+                (vector-copy registers)))
+       unspecific)
+     thunk
+     (lambda ()
+       (set! match-group (object-hash group))
+       (set! registers
+            (if group
+                (vector-map marks
+                  (lambda (mark)
+                    (and mark
+                         (let ((index (mark-index mark)))
+                           (mark-temporary! mark)
+                           index))))
+                marks))
+       (set! group unspecific)
+       (set! marks unspecific)
+       unspecific))))
 
 (define-integrable (syntax-table-argument syntax-table)
   (syntax-table/entries (or syntax-table standard-syntax-table)))