*** See the ChangeLog file for bugs fixed since 1.2 BETA 2 ***

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.

======================================================================

(-) "f()=0" generates syntax error msg without line number

======================================================================

Known BUGS in 1.2 BETA 1, fixed in 1.2 BETA 2
---------------------------------------------

(*) list slice assignment contains reantrancy bug

(*) range() and xrange() break on Alpha's

(*) interactive use of vars() gives barrage of output due to recursive
inclusion of '_'

(*) configure.in contains bogus name to check for inet library

Known BUGS in 1.1.1 and 1.2 BETA 3
----------------------------------

(-) still a memory leak in threads when thread.exit_thread() is used

Problems in 1.1.1 that are difficult to solve
---------------------------------------------

(-) tkinter seems to leave an exception around sometime which breaks
unmarshalling code objects [hard to reproduce, have added a trap to
marshal.c 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...]

(-) doneimport() should be called *before* the Py_AtExit code is
called [problem: what if other threads are still active?]

Known portability problems
--------------------------

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

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

(-) 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

(-) HP doesn't compile out of the box (needs LIBS=-ldld or
LIBS=/usr/lib/libdld.sl) [hard to test without a HP machine handy]

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

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

(*) make sharedinstall references to machdep directory but doesn't
create it

(*) a file with unmatched triple quotes causes a loop in the scanner

(*) [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.

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

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

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

(*) 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
