GNU bug report logs -
#30626
26.0.91; Crash when traversing a `stream-of-directory-files'
Previous Next
Reported by: Michael Heerdegen <michael_heerdegen <at> web.de>
Date: Tue, 27 Feb 2018 09:23:01 UTC
Severity: normal
Tags: fixed, patch
Found in version 26.0.91
Done: Noam Postavsky <npostavs <at> gmail.com>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
Eli Zaretskii <eliz <at> gnu.org> writes:
>> The goal was to find out which variable holds a reference to the
>> entire long stream, right? So it sounds like a pointer to it is kept
>> in an automatic variable on the stack of exec_byte_code, right? Which
>> kinda makes sense, since the stream is still being processed, I
>> think.
Yeah, but which variable exactly? I'd like to find it and add 'X =
Qnil;' to confirm we've found where it is.
> Actually, there's still some mystery: if this object is a 7-element
> vector, where do all the other GC frame come from? Hmm... how
> long/deep is each of the cons cells in elements 1 through 4 of the
> vector? If they are deeply nested, then that's the answer we've been
> looking for, I think.
It's a bit confusing because of the indirection: stream-range uses the
stream-cons macro, which uses the stream-make macro, which uses the
thunk-delay macro. I believe the end result is that the lexical
environment of the resulting closure has access to the next
stream-element in the chain, so the nesting depth is the length of the
stream (i.e., 100000 in the example). Perhaps this example makes it
clearer:
(setq print-circle t)
(let* ((s0 (stream-range 1 2))
(s1 (stream-rest s0)))
(list s0 s1))
;=>
((--stream--
#[256 "\211\203..."
[(1) 2 (1) (t)
((1 . #1=(--stream--
#[256 "\211\203..."
[(nil) (nil) nil t]
3 "\n\n(fn &optional CHECK)"])))
stream-range t]
7 "\n\n(fn &optional CHECK)"])
#1#)
This bug report was last modified 6 years and 44 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.