Sorry, this list does not claim completeness.  If I fixed a bug
immediately upon receiving the first complaint I usually did not
nother to make an entry in this file, unless it was a serious bug
(core dump or infinite loop).

==> Status indicators: (-) not fixed; (*) fixed; (?) not sure.

======================================================================
Known BUGS in 1.1.1 and 1.2
---------------------------

(-) C-level coerce() doesn't call __coerce__ when it should (and
similar for __cmp__)

(-) tkinter seems to leave an exception around sometime which breaks
unmarshalling code objects [hard to reproduce, have added a trap to
catch it]

(-) destroying all modules may destroy __builtin__ (or other modules)
while destructors of other modules may still need it [hard to fix --
could maintain a list of all modules in order of importation so we can
destroy them in reverse order???  really hopeless -- would have to
destroy objects in a module in reverse order too...]

(-) [X]DECREF can cause the interpreter to be called recursively (for
__del__ disciplines) -- so list and dict implementation calls doing
DECREF can cause recursive calls to methods of the object being
modified.  Other files too.  [Only partially fixed -- listobject.c is
still suspect.]

(-) struct module aligns doubles wrongly when compiled with -DDEBUG on
sparc

(-) if __getattr__ prints something, calling repr(x) from cmd line
forgets a newline

(-) doneimport() should be called *before* the Py_AtExit code is called

Environmental bugs
------------------

(-) tkinter doesn't seem to see any declaration of malloc on sunos 4.1.3

(-) arraymodule doesn't compile under Ultrix (FPROTO macro)

(-) Linux uses GNU getopt by default which is broken

(-) makesetup assumes CCC is the C++ compiler -- not portable

(-) "make depend" assumes mkdep exists -- not portable

(-) regen calls h2py which isn't defined by default

(-) make libinstall (or similar) references to machdep directory but
doesn't create it

(-) HP doesn't compile out of the box (needs LIBS=-ldld or
LIBS=/usr/lib/libdld.sl)

======================================================================
BUGS present in 1.1.1 and fixed in 1.2
--------------------------------------

(*) memory leak (namebuf) in initmodule2

(*) hash() of float values returns bogus values

(*) pow(int, int, long) does wrong series of DECREF() calls.

(*) flushline() may clear the exception condition so shouldn't be
called before print_error()

(*) Everything else that uses err_get() should use err_fetch()

(*) sockets aren't thread safe (address of static struct returned,
some calls aren't thread safe)

(*) threadmodule.c leaks LOTS of memory at thread exit

(*) shared install in Modules still doesn't work for empty list

(*) threadmodule.c leaks 'res' in t_bootstrap

(*) errors.c shouldn't declare strerror() on NT

(*) DECREF can cause the interpreter to be called recursively (for
__del__ disciplines) -- so list and dict implementation calls doing
DECREF can cause recursive calls to methods of the object being
modified.  Other files too.  (Only partially fixed.)

(*) tkinter dereferences NULL if timer callback raises an exception

(*) must link with -lieee for linux

(*) if a timer handler routine raises an exception, the interpreter
dereferences NULL

(*) __getattr__ doesn't clear error

(*) '%s' % a, where a is a class instance, fails

(*) "make test" won't find freshly built dynamically loaded modules --
should add ./Modules to TESTPATH

(*) lshift calls __rshift__ instead of __rlshift__

(*) memory leak in creation of sys.builtin_module_names

(*) Bugs in instance_dealloc(): (a) memory leak for exception
type+value; (2) should save+restore traceback as well

(*) modsupport.c(vmkvalue): on systems where va_list is an array, the
calls to do_mkvalue and do_mktuple don't want an "&" before va.

======================================================================
BUGS found in 1.1 and fixed in 1.1.1
------------------------------------

(*) printing name of lambda in traceback dereferences NULL

(*) A built-in function using getargs() and expecting >= 1 argument
may dump core when called without arguments

(*) newgetargs() dumps core in compat mode when NULL is passed in but
max is >0

(*) pow() should be declared varargs since it uses newgetargs

(*) newmodule.c doesn't compile on SunOS 4.1.3 due to non-K&R backslashes

(*) some typos in tut.tex

(*) test for broken static forward is not strong enough

(*) Doc/Makefile assumes . is in $PATH in call to whichlibs

(*) math module misses hypot() function

(*) structmember.h should include stddef.h (for offsetof macro)

(*) gdbmmodule.c frees the wrong structures

(*) makesetup script misses some dollars and backslashes

(*) getargs.obj missing from NT makefile

(*) sorting class instances broken if no __cmp__ defined

======================================================================
BUGS found in 1.0.3 and fixed in 1.1
------------------------------------

(*) 2 specific leaks: 1 PYTHONPATH; 2 reading code from .pyc

(*) If class C doesn't define __cmp__, cmp(a,b) will return -2 and
[a,b].sort() will fail

(*) Syntax errors are reported in a silly way if multi-line tokens are
involved.

(*) SyntaxError exception for compile('...') are reported wrongly
(lineno is always zero and offset is offset into the whole string).

(*) freeze script needs major rewrite to cope with multiple extensions
(Jack seems to have fixed it now -- where is it?)

(*) unwanted entries in stack trace if err_clear() clears an error
that also set a stack trace

(*) i, x[i] = a, b assigns b to x[a] rather than to x[i] as expected
(documented with a warning in ref6.tex!)

(*) etags no longer supports -t flag

(*) compile.c:com_argdefs() references unalloc'ed memory for def
f(a=1,): ...

(*) If you have a python binary in your path like
/ufs/guido/bin/sgi/python then the default prefix option computed by
the configure script is bogus!

(*) Make rule for making lib*.a should remove the lib*.a file first.

(*) vars() error message is wrong (copied from dir() obviously).

(*) socket.gethostname() is undocumented.

(*) rfc822.py: getfirst* dies when multiple headers occur

(*) urllib caching is wrong (should use date from Expires header)

(*) On a related matter: regexpr.c still has two malloc()s the results
of which are not tested for being NULL (lines 1253 and 1530).  There
are also some in rgbimagemodule.c.  Am I overlooking something or is
this a crasher?

(*) strop.rindex('abc', '') returns 0 instead of 3

(*) sunaudiodevmodule.o is too long!

(*) toplevel README needs new text on PC and Mac builds

(*) long(0x80000000) has wrong value!

======================================================================
Bugs found in 1.0.2 and not yet fixed
-------------------------------------

(?) compiler warnings about argument type of uname() on ULTRIX
machines (don't know what to do about it)

(?) syntax error for interactive input prints garbage instead of last
source line on some systems (e.g. AIX) (impossible to test/reproduce)
!!! I think I've found this one -- a missing INCREF in print_error!

(?) (maybe) a bad .pyc file (with old magic number) causes the .py
file to be ignored

(?) Sunos4.0.2 / 386 configure bugs:
	- timelocal instead of mktime
	- unistd.h doesn't declare some functions
(don't know what to do about this)

Bugs found in 1.0.2 and fixed in 1.0.3
--------------------------------------

(*) nasty bug in string formatting (see test_types.py, search for %)

(*) if a triple-quoted string ends in a quote followed by a newline
(followed immediately by the terminating 3 quotes) then a syntax error
or system error ensues

(*) bug in socket.listen: clipping backlog to >= 1 doesn't work

(*) two bogus XDEL's in Modules/regexmodule.reg_dealloc()

(*) Parser/myreadline.my_fgets: #endif EINTR misplaced

(*) new IP address for ftp.cwi.nl !!!

(*) typing vars() to interactive prompt runs into infinite loop
because of '_'

(*) tokenizer/tok_nextc() runs into infinite loop when file does not
end in linefeed

(*) Sunos4.0.2 / 386 configure bugs:
(*)	- use size_t at some places without including sys/types.h
(*)	- missing clock_t
(*)	- uses SEEK_SET in some places that don't include unistd.h

======================================================================
Bugs found in 1.0.1 and not yet fixed
-------------------------------------

(?) threads are slow on Solaris 2
(so what?)

(*) threads cause myreadline.c's readline() to think it sees an EOF.
(I *think* I've fixed this, by testing for EINTR)

(?) min() on PC version generates wrong result (i.e. same as max())
    [this happens on SoftPC -- don't know about other systems]
(can't find the reason -- may be SoftPC bug)

(*) flp.py cache bug: if the cache only contains one form, asking for
all forms returns only the cached form

Bugs found in 1.0.1 and fixed in 1.0.2
--------------------------------------

(*) core dump when parser.parsefile() called

(*) man page contains a mess before -d option

(*) threads don't work on IRIX 4

(*) wrong cast of svideo_getattr in svmodule.c

(*) bad return value in runpython.c's run_tty_1()

(*) creating dict of 100,000 objects gets MemoryError or dumps core

(*) freeze script doesn't work

======================================================================
BUGS found in 1.0.0 and not yet fixed
-------------------------------------

(?) On NeXT, need to define _POSIX_SOURCE.

(?) there appears to be something wrong with gcc and -ldl on some
SunOS 4.1.3 systems

(?) jredfords reports core dump with float literals

BUGS found in 1.0.0 and fixed in 1.0.1
--------------------------------------

(*) On SGI IRIX 4 using cc, compilation errors in md5module.c.

(*) In cdmodule.c, getattr initialized with (destructor)!

(*) Lib/tzparse.py runs test() on import

(*) Lib/filewin.py belongs in Lib/stdwin

(*) lib and man install targets don't use $(srcdir)

(*) Modules/rgbimgmodule.c: exception name contains comma instead of dot

(*) The FAQ still references misc/EXTENDING and misc/DYNLOAD etc

(*) The FAQ still describes how to work around a problem in 0.9.9 exec()

(*) Lib/aifc.py, returns float rate, should be int

(*) Lib/sunau.py, incorrectly cumputes byte count from frame rate

(*) README should mention possibility of passing OPT=-g to make

(*) dynamic loading on sunos 4.1.3 must call dlopen(..., 1)

(*) use of <varargs.h> vs. <stdarg.h> should depend on
    HAVE_STDARG_PROTOTYPES, not on HAVE_STDARG_H

(*) Doc/README refers to Misc/FTP which in fact does not exist any more

(*) filter(None, 'abcdefg') dumps core

(*) once you interrupt time.sleep(), there is no interrupt handler!

======================================================================
end of file
