Michael Hudson <mwh@python.net> writes:
This is the same problem as in CPython. Most failing internal operations call PyErr_SetString(), which causes a string to be used as the exception value. The hack is that when the user code reaches an 'except' clauses the exception is "normalized", which translates the pair "TypeError class + string" into the pair "TypeError class + TypeError instance".
I think I now have code that does this, after modifying decode_code_arguments to not try to catch IndexError (that one was fun to find!).
I've checked my code in. I'm not totally certain of it, but I was able to reenable a few tests of the exception machinery in test_interpreter.py, so I'm going to pronounce it "good enough for now". Incidentally, on this machine Plain Old Python does something like 5-6000 pystones a sec PyPy/TrivialObjSpace does ~ 7 PyPy/StdObjSpace does ~ 0.2 (this is in the battery-saving reduced processor performance mode, & with some hacks to let pyston import time.clock) Cheers, M. -- Worryingly, DEFUN appears to be a function that removes all the fun from something: after using it all your code is converted to C++. -- Tim Bradshaw, comp.lang.lisp