]> code.delx.au - gnu-emacs/commitdiff
(compilation-gcpro): New var
authorStefan Monnier <monnier@iro.umontreal.ca>
Sun, 2 May 2004 20:44:55 +0000 (20:44 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sun, 2 May 2004 20:44:55 +0000 (20:44 +0000)
(compilation-fake-loc): Use it.
(compilation-forget-errors): Reset it.

lisp/progmodes/compile.el

index da05a7ff8bb0ed89d7562da2b9443f4126906016..e2d3e94e80af6169e2a3a2a9a4ffe304cf2120b0 100644 (file)
@@ -1457,6 +1457,10 @@ Use this command in a compilation log buffer.  Sets the mark at point there."
     (compilation-goto-locus marker (nth 3 loc) (nth 3 end-loc))
     (setcdr (nthcdr 3 loc) t)))                ; Set this one as visited.
 
+(defvar compilation-gcpro nil
+  "Internal variable used to keep some values from being GC'd.")
+(make-variable-buffer-local 'compilation-gcpro)
+
 (defun compilation-fake-loc (marker file &optional line col)
   "Preassociate MARKER with FILE.
 FILE should be ABSOLUTE-FILENAME or (RELATIVE-FILENAME . DIRNAME).
@@ -1476,6 +1480,11 @@ call this several times, once each for the last line of one
 region and the first line of the next region."
   (or (consp file) (setq file (list file)))
   (setq file (compilation-get-file-structure file))
+  ;; Between the current call to compilation-fake-loc and the first occurrence
+  ;; of an error message referring to `file', the data is only kept is the
+  ;; weak hash-table compilation-locs, so we need to prevent this entry
+  ;; in compilation-locs from being GC'd away.  --Stef
+  (push file compilation-gcpro)
   (let ((loc (compilation-assq (or line 1) (cdr file))))
     (setq loc (compilation-assq col loc))
     (if (cdr loc)
@@ -1730,6 +1739,7 @@ FILE should be (ABSOLUTE-FILENAME) or (RELATIVE-FILENAME . DIRNAME)."
   ;; In case we hit the same file/line specs, we want to recompute a new
   ;; marker for them, so flush our cache.
   (setq compilation-locs (make-hash-table :test 'equal :weakness 'value))
+  (setq compilation-gcpro nil)
   ;; FIXME: the old code reset the directory-stack, so maybe we should
   ;; put a `directory change' marker of some sort, but where?  -stef
   ;;