[Python-Dev] Preserving the blamelist
Tim Peters
tim.peters at gmail.com
Wed Apr 12 09:00:11 CEST 2006
[Neal]
>> ...
>> I'm concerned about the negative ref leak in test_contextlib. I
>> wonder if this was a result of PJE's fix for generators?
[Tim]
> I don't know, but if you do
>
> while 1:
> test_contextlib.test_main()
> gc.collect()
>
> under a debug build it eventually (> 500 iterations) crashes with
>
> Fatal Python error: deallocating None
> ...
OK, I fixed that (incorrect decref in gen_throw()).
Neal, that should also repair test_contextlib's ref leak oddities.
The reason you didn't see this before is that test_contextlib didn't
actually run any tests until recently.
Phillip, when eyeballing gen_dealloc(), I didn't understand two things:
1. Why doesn't
if (gen->gi_frame->f_stacktop!=NULL) {
check first to be sure that gen->gi_frame != Py_None? Is that impossible
here for some reason?
2. It _looks_ like "gi_frame != NULL" is an (undocumented) invariant.
Right? If so,
Py_XDECREF(gen->gi_frame);
sends a confusing message (because of the "X", implying that NULL is OK).
Regardless, it would be good to add comments to genobject.h explaining
the possible values gi_frame can hold. For example, what does it mean
when gi_frame is Py_None? Can it ever be NULL? It's very hard to reverse-
engineer invariants and "special value" intents from staring at code. Not to
say that isn't fun ;-)
More information about the Python-Dev
mailing list