You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(25) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(51) |
Feb
(71) |
Mar
(24) |
Apr
(4) |
May
|
Jun
(5) |
Jul
|
Aug
(25) |
Sep
(15) |
Oct
(13) |
Nov
|
Dec
|
2003 |
Jan
(20) |
Feb
(11) |
Mar
(22) |
Apr
(18) |
May
(25) |
Jun
(13) |
Jul
(4) |
Aug
(17) |
Sep
(34) |
Oct
(4) |
Nov
|
Dec
(2) |
2004 |
Jan
(4) |
Feb
|
Mar
(30) |
Apr
|
May
(3) |
Jun
(3) |
Jul
(7) |
Aug
(19) |
Sep
(2) |
Oct
(12) |
Nov
|
Dec
(60) |
2005 |
Jan
(13) |
Feb
(9) |
Mar
(1) |
Apr
(6) |
May
|
Jun
(4) |
Jul
|
Aug
(1) |
Sep
(7) |
Oct
(4) |
Nov
(9) |
Dec
|
2006 |
Jan
(4) |
Feb
(15) |
Mar
(8) |
Apr
(13) |
May
(28) |
Jun
|
Jul
|
Aug
|
Sep
(5) |
Oct
(9) |
Nov
(9) |
Dec
(2) |
2007 |
Jan
(3) |
Feb
|
Mar
(1) |
Apr
|
May
(4) |
Jun
(3) |
Jul
|
Aug
(2) |
Sep
(2) |
Oct
|
Nov
|
Dec
(14) |
2008 |
Jan
(3) |
Feb
(4) |
Mar
|
Apr
(4) |
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
(13) |
Nov
(2) |
Dec
(7) |
2009 |
Jan
(23) |
Feb
(15) |
Mar
(8) |
Apr
|
May
|
Jun
|
Jul
(22) |
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
(4) |
2010 |
Jan
|
Feb
(17) |
Mar
(2) |
Apr
(7) |
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <ar...@co...> - 2010-05-18 08:04:42
|
Author: arigo Date: Tue May 18 10:04:30 2010 New Revision: 74538 Modified: psyco/www/content/index.rst psyco/www/last-updated Log: Reference to compile a Linux 32-bit python. Modified: psyco/www/content/index.rst ============================================================================== --- psyco/www/content/index.rst (original) +++ psyco/www/content/index.rst Tue May 18 10:04:30 2010 @@ -24,7 +24,9 @@ This fact is worth being noted again, now that the latest Mac OS/X 10.6 "Snow Leopart" comes with a default Python that is 64-bit on 64-bit machines. The only way to use Psyco on OS/X 10.6 is by - recompiling a custom Python in 32-bit mode. + recompiling a custom Python in 32-bit mode (on Linux, see + `here@http://bruynooghe.blogspot.com/2009/02/compiling-32-bit-python-on-amd64.html` + or `here@http://pypy.org/download.html#here-are-hints` for example). 20 January 2009 Modified: psyco/www/last-updated ============================================================================== --- psyco/www/last-updated (original) +++ psyco/www/last-updated Tue May 18 10:04:30 2010 @@ -1 +1 @@ -Mon, 8 Mar 2010 +Tue, 18 May 2010 |
From: <ti...@co...> - 2010-04-22 21:10:23
|
Author: tismer Date: Thu Apr 22 23:10:13 2010 New Revision: 73996 Modified: psyco/v2/private/norman/c/Python/slpinterface.h Log: Improved version of stackless compatibility. This will break now with all versions of stackless, because Stackless is changed. Those changes are visible first in release26-maint. Modified: psyco/v2/private/norman/c/Python/slpinterface.h ============================================================================== --- psyco/v2/private/norman/c/Python/slpinterface.h (original) +++ psyco/v2/private/norman/c/Python/slpinterface.h Thu Apr 22 23:10:13 2010 @@ -7,77 +7,36 @@ * ********************************************************************/ -/* rebirth of software stack avoidance */ - -typedef struct { - PyObject_HEAD - PyObject *tempval; -} PyUnwindObject; - -PyAPI_DATA(PyUnwindObject *) Py_UnwindToken; +/* the frame dispatcher */ +PyAPI_FUNC(PyObject *) slp_frame_dispatch(PyFrameObject *f, + PyFrameObject *stopframe, int exc, + PyObject *retval); /*** access to system-wide globals from stacklesseval.c ***/ -PyAPI_DATA(int) slp_enable_softswitch; -PyAPI_DATA(int) slp_try_stackless; - -#define STACKLESS_RETRACT() slp_try_stackless = 0; - -/* fast (release) and safe (debug) access to the unwind token and retval */ - -#ifdef Py_DEBUG - -#define STACKLESS_PACK(retval) \ - (assert(Py_UnwindToken->tempval == NULL), \ - Py_UnwindToken->tempval = (retval), \ - (PyObject *) Py_UnwindToken) - -#define STACKLESS_UNPACK(retval) \ - (assert(STACKLESS_UNWINDING(retval)), \ - retval = Py_UnwindToken->tempval, \ - Py_UnwindToken->tempval = NULL, retval) - -#else - -#define STACKLESS_PACK(retval) \ - (Py_UnwindToken->tempval = (retval), \ - (PyObject *) Py_UnwindToken) - -#define STACKLESS_UNPACK(retval) \ - (retval = Py_UnwindToken->tempval, retval) - -#endif - -#define STACKLESS_UNWINDING(obj) \ - ((PyObject *) (obj) == (PyObject *) Py_UnwindToken) +PyAPI_DATA(int) slp_in_psyco; #define BEGIN_FORCE_HARDSWITCHING() \ - { \ - int softswitch; \ - /* we retract, and temporarily disable soft switching */ \ - STACKLESS_RETRACT(); \ - softswitch = slp_enable_softswitch; \ - slp_enable_softswitch = 0; + slp_in_psyco++; \ #define END_FORCE_HARDSWITCHING() \ - slp_enable_softswitch = softswitch; \ - } + slp_in_psyco--; #ifndef STACKLESS_INTERFACE_FIXED # define PyEval_EvalFrameEx(f, throwflag) PyEval_EvalFrameEx_FIX(f, throwflag) -PSY_INLINE PyObject * +static PyObject * PyEval_EvalFrameEx_FIX(PyFrameObject *f, int throwflag) { PyObject *retval = Py_None; PyThreadState *ts = PyThreadState_GET(); + PyFrameObject *stopframe = f->f_back; Py_INCREF(f); Py_INCREF(retval); - BEGIN_FORCE_HARDSWITCHING(); - retval = PyEval_EvalFrameEx_slp(f, throwflag, Py_None); - END_FORCE_HARDSWITCHING(); + f->f_execute = PyEval_EvalFrameEx_slp; + retval = slp_frame_dispatch(f, stopframe, throwflag, retval); return retval; } |
From: <ti...@co...> - 2010-04-22 12:50:52
|
Author: tismer Date: Thu Apr 22 14:50:43 2010 New Revision: 73974 Modified: psyco/v2/private/norman/c/gensupp.c Log: Fixed a long-time hiding bug in genstate_dealloc. Thanks to CCP/Kristján Valur Jonsson for finding this. This removes the dependency from obmalloc, works with all malloc options now. Modified: psyco/v2/private/norman/c/gensupp.c ============================================================================== --- psyco/v2/private/norman/c/gensupp.c (original) +++ psyco/v2/private/norman/c/gensupp.c Thu Apr 22 14:50:43 2010 @@ -97,9 +97,10 @@ static void genstate_dealloc(PyGenStateObject* gs) { + PsycoObject *po = gs->po; /* frame is no longer a reference */; _compact_dealloc((PyObject *) gs); - if (gs->po != NULL) { + if (po != NULL) { /* destroy the saved compilation state */ PsycoObject_Delete(gs->po); } |
From: <ti...@co...> - 2010-04-16 00:44:32
|
Author: tismer Date: Fri Apr 16 02:23:08 2010 New Revision: 73801 Modified: psyco/v2/private/norman/c/Objects/pdescrobject.c psyco/v2/private/norman/c/Objects/ptypeobject.c psyco/v2/private/norman/c/Python/frames.c psyco/v2/private/norman/c/Python/slpinterface.h psyco/v2/private/norman/c/gensupp.c psyco/v2/private/norman/c/psyco.c psyco/v2/private/norman/c/psyfunc.c psyco/v2/private/norman/py-utils/win32/ (props changed) Log: Compatibility of Psyco with Stackless! This is the first approach, works for all stackless tests. Some more testing is needed. The approach is right now to disable softswitching when a function gets compiled. Well, and quite a number of subleties ;-) You can use the (right now) inofficial version at psyco/v2/private and run it with stackless maintenance version 2.5 and 2.6. Modified: psyco/v2/private/norman/c/Objects/pdescrobject.c ============================================================================== --- psyco/v2/private/norman/c/Objects/pdescrobject.c (original) +++ psyco/v2/private/norman/c/Objects/pdescrobject.c Fri Apr 16 02:23:08 2010 @@ -202,7 +202,8 @@ d = PyDict_New(); if (d != NULL) { char* expr = "type(property())"; - tmp = PyRun_String(expr, Py_eval_input, PyEval_GetBuiltins(), d); + PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins()); + tmp = PyRun_String(expr, Py_eval_input, d, d); if (tmp && PyType_Check(tmp)) { property_descr_get = ((PyTypeObject*) tmp)->tp_descr_get; Psyco_DefineMeta(property_descr_get, pproperty_descr_get); @@ -221,7 +222,8 @@ d = PyDict_New(); if (d != NULL) { char *expr = "iter(list((1,2))).next"; - tmp = PyRun_String(expr, Py_eval_input, PyEval_GetBuiltins(), d); + PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins()); + tmp = PyRun_String(expr, Py_eval_input, d, d); if (tmp && strcmp(tmp->ob_type->tp_name, "method-wrapper") == 0) { pwrappertype = tmp->ob_type; wrapper_call = pwrappertype->tp_call; Modified: psyco/v2/private/norman/c/Objects/ptypeobject.c ============================================================================== --- psyco/v2/private/norman/c/Objects/ptypeobject.c (original) +++ psyco/v2/private/norman/c/Objects/ptypeobject.c Fri Apr 16 02:23:08 2010 @@ -538,7 +538,8 @@ "'__iter__' : lambda self: 0," "'next' : lambda self: 0," "})"; - tmp = PyRun_String(expr, Py_eval_input, PyEval_GetBuiltins(), d); + PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins()); + tmp = PyRun_String(expr, Py_eval_input, d, d); if (tmp && PyType_Check(tmp)) { tp = (PyTypeObject *) tmp; slot_tp_new = tp->tp_new; @@ -557,7 +558,8 @@ Py_XDECREF(tmp); expr = "iter(list((1,2))).next"; - tmp = PyRun_String(expr, Py_eval_input, PyEval_GetBuiltins(), d); + PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins()); + tmp = PyRun_String(expr, Py_eval_input, d, d); if (tmp && strcmp(tmp->ob_type->tp_name, "method-wrapper") == 0) { wrapperobject2 *wp = (wrapperobject2 *) tmp; wrap_next = wp->descr->d_base->wrapper; Modified: psyco/v2/private/norman/c/Python/frames.c ============================================================================== --- psyco/v2/private/norman/c/Python/frames.c (original) +++ psyco/v2/private/norman/c/Python/frames.c Fri Apr 16 02:23:08 2010 @@ -283,13 +283,17 @@ #ifdef STACKLESS /* make sure not to try any soft switching */ - STACKLESS_RETRACT(); + BEGIN_FORCE_HARDSWITCHING(); #endif /* run! */ Py_INCREF(codebuf); result = psyco_processor_run((CodeBufferObject*) codebuf, initial_stack, &finfo, tdict); Py_DECREF(codebuf); +#ifdef STACKLESS + /* make sure not to try any soft switching */ + END_FORCE_HARDSWITCHING(); +#endif psyco_trash_object(NULL); /* free any trashed object now */ #if CODE_DUMP >= 2 @@ -422,7 +426,7 @@ #ifdef STACKLESS /* make sure not to try any soft switching */ - STACKLESS_RETRACT(); + BEGIN_FORCE_HARDSWITCHING(); #endif /* run! */ /* the codeptr might have been updated, so we fake a codebuf */ @@ -430,6 +434,10 @@ fakecb.snapshot = codebuf->snapshot; fakecb.ob_type = codebuf->ob_type; result = psyco_processor_run(&fakecb, initial_stack, &finfo, tdict); +#ifdef STACKLESS + /* make sure not to try any soft switching */ + END_FORCE_HARDSWITCHING(); +#endif psyco_trash_object(NULL); /* free any trashed object now */ #if CODE_DUMP >= 2 Modified: psyco/v2/private/norman/c/Python/slpinterface.h ============================================================================== --- psyco/v2/private/norman/c/Python/slpinterface.h (original) +++ psyco/v2/private/norman/c/Python/slpinterface.h Fri Apr 16 02:23:08 2010 @@ -51,6 +51,18 @@ #define STACKLESS_UNWINDING(obj) \ ((PyObject *) (obj) == (PyObject *) Py_UnwindToken) +#define BEGIN_FORCE_HARDSWITCHING() \ + { \ + int softswitch; \ + /* we retract, and temporarily disable soft switching */ \ + STACKLESS_RETRACT(); \ + softswitch = slp_enable_softswitch; \ + slp_enable_softswitch = 0; + +#define END_FORCE_HARDSWITCHING() \ + slp_enable_softswitch = softswitch; \ + } + #ifndef STACKLESS_INTERFACE_FIXED # define PyEval_EvalFrameEx(f, throwflag) PyEval_EvalFrameEx_FIX(f, throwflag) @@ -58,18 +70,15 @@ PSY_INLINE PyObject * PyEval_EvalFrameEx_FIX(PyFrameObject *f, int throwflag) { - PyObject *retval; + PyObject *retval = Py_None; + PyThreadState *ts = PyThreadState_GET(); - /* XXX correct? */ Py_INCREF(f); - Py_INCREF(Py_None); - /* XXX */ - STACKLESS_RETRACT(); + Py_INCREF(retval); + BEGIN_FORCE_HARDSWITCHING(); retval = PyEval_EvalFrameEx_slp(f, throwflag, Py_None); - if (STACKLESS_UNWINDING(retval)) - STACKLESS_UNPACK(retval); + END_FORCE_HARDSWITCHING(); return retval; - /* XXX maybe iterate until done? */ } #endif /* STACKLESS_INTERFACE_FIXED */ Modified: psyco/v2/private/norman/c/gensupp.c ============================================================================== --- psyco/v2/private/norman/c/gensupp.c (original) +++ psyco/v2/private/norman/c/gensupp.c Fri Apr 16 02:23:08 2010 @@ -436,7 +436,12 @@ /* Generators always return to their most recent caller, not * necessarily their creator. */ Py_XINCREF(tstate->frame); +#ifdef STACKLESS + /* stackless' policy is a bit different */ + assert(f->f_back == NULL || PyCFrame_Check(f->f_back)); +#else assert(f->f_back == NULL); +#endif f->f_back = tstate->frame; gen->gi_running |= 1; /* changed */ @@ -767,6 +772,8 @@ { PyObject *d = PyDict_New(); + if (d) + PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins()); _compact_new = PyCompact_Type.tp_new; _compact_clear = PyCompact_Type.tp_clear; _compact_dealloc = PyCompact_Type.tp_dealloc; @@ -782,8 +789,7 @@ /* patching the generator type */ if (d != NULL) { char *expr = "def g(): yield 42"; - PyObject *tmp = PyRun_String(expr, Py_file_input, - PyEval_GetBuiltins(), d); + PyObject *tmp = PyRun_String(expr, Py_file_input, d, d); PyObject *gen = tmp? PyDict_GetItemString(d, "g") : NULL; PyObject *args = PyTuple_New(0); PyObject *gob = gen? PyObject_Call(gen, args, NULL) : NULL; Modified: psyco/v2/private/norman/c/psyco.c ============================================================================== --- psyco/v2/private/norman/c/psyco.c (original) +++ psyco/v2/private/norman/c/psyco.c Fri Apr 16 02:23:08 2010 @@ -1011,6 +1011,34 @@ PyObject *Psyco_Builtin2PurePython_Dict; /* Initialization */ + +#ifdef STACKLESS +/* we remove become and capture if they still exist. + These functions are really hard to emulate and should go away. */ +void remove_become_capture(void) +{ + PyObject *tmp, *t; + PyObject *d = PyDict_New(); + PyTypeObject *tp; + char *expr = "import stackless; tt = stackless.tasklet"; + PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins()); + tmp = PyRun_String(expr, Py_file_input, d, d); + t = tmp? PyDict_GetItemString(d, "tt") : NULL; + tp = (PyTypeObject *) t; + /* unfortunately the methods are no slot entries, see flextype. + We can only override them with something */ + if (t && PyObject_HasAttrString(t, "become")) { + PyDict_SetItemString(tp->tp_dict, "become", Py_NotImplemented); + } + if (t && PyObject_HasAttrString(t, "capture")) { + PyDict_SetItemString(tp->tp_dict, "capture", Py_NotImplemented); + } + Py_XDECREF(tmp); + Py_XDECREF(d); +} + +#endif + PyMODINIT_FUNC init_psyco(void) { PsyFunction_Type.ob_type = &PyType_Type; @@ -1053,7 +1081,14 @@ Psyco_Builtin2PurePython_Dict = PyDict_New(); if (Psyco_Builtin2PurePython_Dict == NULL) return; - +#ifdef STACKLESS + remove_become_capture(); + if (PyModule_AddObject(CPsycoModule, "stackless_compatible", Py_True)) + return; +#else + if (PyModule_AddObject(CPsycoModule, "stackless_compatible", Py_False)) + return; +#endif initialize_all_files(); } Modified: psyco/v2/private/norman/c/psyfunc.c ============================================================================== --- psyco/v2/private/norman/c/psyfunc.c (original) +++ psyco/v2/private/norman/c/psyfunc.c Fri Apr 16 02:23:08 2010 @@ -756,7 +756,7 @@ #ifdef STACKLESS /* make sure not to try any soft switching */ - STACKLESS_RETRACT(); + BEGIN_FORCE_HARDSWITCHING(); #endif /* run! */ @@ -764,6 +764,10 @@ result = psyco_processor_run((CodeBufferObject*) codebuf, initial_stack, &finfo, tdict); Py_DECREF(codebuf); +#ifdef STACKLESS + /* make sure not to try any soft switching */ + END_FORCE_HARDSWITCHING(); +#endif psyco_trash_object(NULL); /* free any trashed object now */ #if CODE_DUMP >= 2 |
From: <ti...@co...> - 2010-04-15 21:34:27
|
Author: tismer Date: Thu Apr 15 23:34:18 2010 New Revision: 73798 Removed: psyco/v2/private/norman/psyco/ Log: this folder was just a local convenience copy. should be identical to py_support and not checked in |
From: Armin R. <ar...@tu...> - 2010-04-13 08:01:26
|
Added: psyco/v2/private/ psyco/v2/private/norman/ ... Content truncated, e-mail was too large. |
From: <ti...@co...> - 2010-04-13 02:26:25
|
Author: tismer Date: Tue Apr 13 04:26:16 2010 New Revision: 73705 Removed: psyco/v2/branches/ Log: |
From: <ti...@co...> - 2010-04-13 02:16:49
|
Author: tismer Date: Tue Apr 13 04:16:40 2010 New Revision: 73703 Added: psyco/v2/branches/ Log: |
From: <ar...@co...> - 2010-03-08 16:52:11
|
Author: arigo Date: Mon Mar 8 17:51:32 2010 New Revision: 71896 Modified: psyco/www/content/links.rst psyco/www/last-updated Log: Fix the link to Weave. Modified: psyco/www/content/links.rst ============================================================================== --- psyco/www/content/links.rst (original) +++ psyco/www/content/links.rst Mon Mar 8 17:51:32 2010 @@ -25,7 +25,7 @@ - `Pyrex@http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/` lets you write code that mixes Python and C data types any way you want, and compiles it into a C extension for Python. This is a *compile-time* tool that uses programmer annotations in the Python source to produce a more efficient C version of your code, which you then compile with a regular C compiler. -- `Weave@http://www.scipy.org/site_content/weave/` is a tool for inline C/C++ in Python. The basic functionality lets you write C or C++ code in the middle of your Python program. It calls (and thus requires) a C/C++ compiler at run-time. On top of this you will also find functions that directly accept Python Numeric expression, or that build a regular C extension module for static compilation. +- `Weave@http://www.scipy.org/Weave` is a tool for inline C/C++ in Python. The basic functionality lets you write C or C++ code in the middle of your Python program. It calls (and thus requires) a C/C++ compiler at run-time. On top of this you will also find functions that directly accept Python Numeric expression, or that build a regular C extension module for static compilation. Dynamic compiler back-ends ========================== Modified: psyco/www/last-updated ============================================================================== --- psyco/www/last-updated (original) +++ psyco/www/last-updated Mon Mar 8 17:51:32 2010 @@ -1 +1 @@ -Thu, 4 Mar 2010 +Mon, 8 Mar 2010 |
From: <ar...@co...> - 2010-03-04 12:25:47
|
Author: arigo Date: Thu Mar 4 12:55:36 2010 New Revision: 71723 Modified: psyco/www/content/index.rst psyco/www/last-updated Log: Update. Modified: psyco/www/content/index.rst ============================================================================== --- psyco/www/content/index.rst (original) +++ psyco/www/content/index.rst Thu Mar 4 12:55:36 2010 @@ -10,6 +10,14 @@ News ==== +4 March 2010 + + On Mac OS/X "Snow Leopart" you don't actually need to recompile + Python yourself, but just use the following command line + (thanks Elvis Pfeuter):: + + defaults write com.apple.versioner.python Prefer-32-Bit -bool yes + 8 December 2009 Just for reference, Psyco does not work on any 64-bit systems at all. Modified: psyco/www/last-updated ============================================================================== --- psyco/www/last-updated (original) +++ psyco/www/last-updated Thu Mar 4 12:55:36 2010 @@ -1 +1 @@ -Tue, 8 Dec 2009 +Thu, 4 Mar 2010 |
From: <ar...@co...> - 2010-02-22 14:23:19
|
Author: arigo Date: Mon Feb 22 15:23:10 2010 New Revision: 71410 Modified: psyco/branch/py27/test/regrtester.py Log: Skip this test. Modified: psyco/branch/py27/test/regrtester.py ============================================================================== --- psyco/branch/py27/test/regrtester.py (original) +++ psyco/branch/py27/test/regrtester.py Mon Feb 22 15:23:10 2010 @@ -72,6 +72,7 @@ ERR = 'gets confused by Psyco debugging output to stderr' SKIP['test_popen2'] = ERR SKIP['test_unittest'] = ERR # probably + SKIP['test_pty'] = ERR if os.path.exists('regrtester.skip'): execfile('regrtester.skip') |
From: <ar...@co...> - 2010-02-22 14:17:23
|
Author: arigo Date: Mon Feb 22 15:17:11 2010 New Revision: 71409 Modified: psyco/branch/py27/test/regrtester.py Log: Add a skipped test. Modified: psyco/branch/py27/test/regrtester.py ============================================================================== --- psyco/branch/py27/test/regrtester.py (original) +++ psyco/branch/py27/test/regrtester.py Mon Feb 22 15:17:11 2010 @@ -58,6 +58,7 @@ 'test_tuple': 'gc.is_tracked() on tuples', 'test_pdb': 'pdb stuff', 'test_lib2to3': 'mutates a new-style class to install another method', + 'test_cprofile': 'exits psyco', } # SKIP['test_operator'] = NO_SYS_EXC # SKIP['test_strop'] = NO_SYS_EXC |
From: <ar...@co...> - 2010-02-22 14:04:36
|
Author: arigo Date: Mon Feb 22 14:46:36 2010 New Revision: 71408 Modified: psyco/branch/py27/test/regrtester.py Log: Skip another test. Modified: psyco/branch/py27/test/regrtester.py ============================================================================== --- psyco/branch/py27/test/regrtester.py (original) +++ psyco/branch/py27/test/regrtester.py Mon Feb 22 14:46:36 2010 @@ -57,6 +57,7 @@ 'test_deque': 'uses too much memory: "pop=d.pop" keeps d alive forever', 'test_tuple': 'gc.is_tracked() on tuples', 'test_pdb': 'pdb stuff', + 'test_lib2to3': 'mutates a new-style class to install another method', } # SKIP['test_operator'] = NO_SYS_EXC # SKIP['test_strop'] = NO_SYS_EXC |
From: <ar...@co...> - 2010-02-22 13:29:28
|
Author: arigo Date: Mon Feb 22 14:29:18 2010 New Revision: 71407 Modified: psyco/branch/py27/test/regrtester.py Log: Skip one test that is probably showing a bug with stderr. Modified: psyco/branch/py27/test/regrtester.py ============================================================================== --- psyco/branch/py27/test/regrtester.py (original) +++ psyco/branch/py27/test/regrtester.py Mon Feb 22 14:29:18 2010 @@ -67,7 +67,9 @@ SKIP['test_distutils'] = 'distutils/tests/* not copied by the installer' if hasattr(psyco._psyco, 'VERBOSE_LEVEL'): - SKIP['test_popen2'] = 'gets confused by Psyco debugging output to stderr' + ERR = 'gets confused by Psyco debugging output to stderr' + SKIP['test_popen2'] = ERR + SKIP['test_unittest'] = ERR # probably if os.path.exists('regrtester.skip'): execfile('regrtester.skip') |
From: <ar...@co...> - 2010-02-22 13:17:04
|
Author: arigo Date: Mon Feb 22 14:16:45 2010 New Revision: 71406 Modified: psyco/branch/py27/test/regrtester.py Log: Skip pdb test. Modified: psyco/branch/py27/test/regrtester.py ============================================================================== --- psyco/branch/py27/test/regrtester.py (original) +++ psyco/branch/py27/test/regrtester.py Mon Feb 22 14:16:45 2010 @@ -56,6 +56,7 @@ 'test_zipimport_support': 'sees psyco.profiler.go() in pdb', 'test_deque': 'uses too much memory: "pop=d.pop" keeps d alive forever', 'test_tuple': 'gc.is_tracked() on tuples', + 'test_pdb': 'pdb stuff', } # SKIP['test_operator'] = NO_SYS_EXC # SKIP['test_strop'] = NO_SYS_EXC |
From: <ar...@co...> - 2010-02-22 13:16:47
|
Author: arigo Date: Mon Feb 22 14:16:33 2010 New Revision: 71405 Modified: psyco/branch/py27/c/Python/pycompiler.c psyco/branch/py27/test/btrun.py psyco/branch/py27/test/test5.py Log: Detect duplicate keyword arguments. Fix a bug about it ("break" instead of "goto fail"). Test. Modified: psyco/branch/py27/c/Python/pycompiler.c ============================================================================== --- psyco/branch/py27/c/Python/pycompiler.c (original) +++ psyco/branch/py27/c/Python/pycompiler.c Mon Feb 22 14:16:33 2010 @@ -1288,6 +1288,23 @@ } } +static int +cimpl_pydict_setitem_new(PyObject *mp, PyObject *key, PyObject *item) +{ + if (PyDict_GetItem(mp, key) != NULL) { + char *argname; + if (PyString_Check(key)) + argname = PyString_AS_STRING(key); + else + argname = "?"; + PyErr_Format(PyExc_TypeError, + "got multiple values for keyword argument '%s'", + argname); + return -1; + } + return PyDict_SetItem(mp, key, item); +} + #define CALL_FLAG_VAR 1 #define CALL_FLAG_KW 2 static vinfo_t* psyco_ext_do_calls(PsycoObject* po, int opcode, int oparg, @@ -1332,6 +1349,8 @@ wdict = psyco_vi_Zero(); /* no keyword arguments */ else { int i; + int(*setter)(PyObject*, PyObject*, PyObject*); + setter = PyDict_SetItem; if (flags & CALL_FLAG_KW) { /* '**kw' call syntax */ vinfo_t* w = args[--n]; /* pop keyword dictionary */ /* check that it is a dictionary */ @@ -1351,6 +1370,7 @@ /* make a copy of the dictionary; the original one must not be modified */ wdict = PsycoDict_Copy(po, w); + setter = cimpl_pydict_setitem_new; } else { wdict = w; @@ -1369,10 +1389,10 @@ check for duplicate keywords */ for (i = na + 2*nk; i > na; ) { i -= 2; - if (!psyco_generic_call(po, PyDict_SetItem, + if (!psyco_generic_call(po, setter, CfNoReturnValue|CfPyErrIfNonNull, "vvv", wdict, args[i], args[i+1])) - break; + goto fail; } } Modified: psyco/branch/py27/test/btrun.py ============================================================================== --- psyco/branch/py27/test/btrun.py (original) +++ psyco/branch/py27/test/btrun.py Mon Feb 22 14:16:33 2010 @@ -715,6 +715,9 @@ >>> test5.negintpow(8) 0.015625 +>>> test5.duplicatekwarg() +correctly detected + ########################### #### COMPACTOBJECT #### ########################### Modified: psyco/branch/py27/test/test5.py ============================================================================== --- psyco/branch/py27/test/test5.py (original) +++ psyco/branch/py27/test/test5.py Mon Feb 22 14:16:33 2010 @@ -430,12 +430,24 @@ return key x = X(["Ok"]) print x["foobar"] + count = 0 for item in x: print item + count += 1 + if count > 10: + break def negintpow(x): print x ** -2 +def duplicatekwarg(): + try: + double2(x=5, **{'x': 6}) + except TypeError: + print 'correctly detected' + else: + print 'missing TypeError!' + if __name__ == '__main__': from test1 import go, print_results import time |
From: <ar...@co...> - 2010-02-22 13:14:51
|
Author: arigo Date: Mon Feb 22 13:15:27 2010 New Revision: 71402 Modified: psyco/branch/py27/c/mergepoints.c psyco/branch/py27/test/fulltester.py psyco/branch/py27/test/regrtester.py Log: Fix tests. Modified: psyco/branch/py27/c/mergepoints.c ============================================================================== --- psyco/branch/py27/c/mergepoints.c (original) +++ psyco/branch/py27/c/mergepoints.c Mon Feb 22 13:15:27 2010 @@ -524,7 +524,7 @@ unsigned char* source = (unsigned char*) PyString_AS_STRING(co->co_code); size_t ibytes = (length+1) * sizeof(struct instrnode_s); struct instrnode_s* instrnodes; - int i, lasti, count; + int i, lasti, count, op1; bool modif; PyTryBlock blockstack[CO_MAXBLOCKS]; int iblock, bytecodeweight, iblockmax = 0; @@ -610,7 +610,7 @@ #ifdef SETUP_WITH case SETUP_WITH: i = i0; - /* op = SETUP_WITH; */ + op1 = SETUP_WITH; goto unsupported_instruction; #endif @@ -685,19 +685,15 @@ if (flags == 0) if (op != COMPARE_OP || !SUPPORTED_COMPARE_ARG(oparg)) { - unsupported_instruction: - debug_printf(1 + (strcmp(PyCodeObject_NAME(co), "?")==0), - ("unsupported opcode %d at %s:%d\n", - (int) op, PyCodeObject_NAME(co), i)); - s = Py_None; - Py_INCREF(s); - goto done; + op1 = op; + goto unsupported_instruction; } if (flags & (MP_HAS_JREL|MP_HAS_JABS)) { int jtarget = oparg; if (flags & MP_HAS_JREL) jtarget += nextinstr; + psyco_assert(jtarget < length); if (flags & MP_HAS_J_MULTIPLE || !++instrnodes[jtarget].inpaths) instrnodes[jtarget].inpaths = 99; instrnodes[i].next2 = instrnodes + jtarget; @@ -723,7 +719,10 @@ if (flags & MP_IS_MODULE) { if ( /*!module*/ 1) /* disabled, currently buggy */ - goto unsupported_instruction; + { + op1 = op; + goto unsupported_instruction; + } mp_flags |= MP_FLAGS_MODULE; } @@ -941,6 +940,15 @@ PyMem_FREE(instrnodes); PyErr_Restore(etype, evalue, etb); return s; + + unsupported_instruction: + debug_printf(1 + (strcmp(PyCodeObject_NAME(co), "?")==0), + ("unsupported opcode %d at %s:%d\n", + op1, PyCodeObject_NAME(co), i)); + psyco_assert(op1 != 0); + s = Py_None; + Py_INCREF(s); + goto done; } DEFINEFN Modified: psyco/branch/py27/test/fulltester.py ============================================================================== --- psyco/branch/py27/test/fulltester.py (original) +++ psyco/branch/py27/test/fulltester.py Mon Feb 22 13:15:27 2010 @@ -36,7 +36,7 @@ PSYCO_MODES = [ # debugging mode, static compiling -## {'PSYCO_DEBUG': 1, 'VERBOSE_LEVEL': 1, 'CODE_DUMP': 1, 'ALL_STATIC': 1}, + {'PSYCO_DEBUG': 1, 'VERBOSE_LEVEL': 1, 'CODE_DUMP': 1, 'ALL_STATIC': 1}, # optimized mode, static compiling {'PSYCO_DEBUG': 0, 'VERBOSE_LEVEL': 0, 'CODE_DUMP': 0, 'ALL_STATIC': 1}, ## # debugging mode, IVM virtual processor Modified: psyco/branch/py27/test/regrtester.py ============================================================================== --- psyco/branch/py27/test/regrtester.py (original) +++ psyco/branch/py27/test/regrtester.py Mon Feb 22 13:15:27 2010 @@ -52,6 +52,9 @@ 'test_warnings': 'stackdepth no longer work in 2.6 because it was rewritten in C', 'test_signal': 'contains tight loops where Psyco does not handle signals', 'test_collections': 'namedtuple() gets the wrong __module__', + 'test_capi': 'threads with a busy loop', + 'test_zipimport_support': 'sees psyco.profiler.go() in pdb', + 'test_deque': 'uses too much memory: "pop=d.pop" keeps d alive forever', } # SKIP['test_operator'] = NO_SYS_EXC # SKIP['test_strop'] = NO_SYS_EXC |
From: <ar...@co...> - 2010-02-22 12:58:36
|
Author: arigo Date: Mon Feb 22 13:27:30 2010 New Revision: 71403 Modified: psyco/branch/py27/doc/Makefile psyco/branch/py27/doc/psycoguide.tex Log: Document the missing opcodes of Python 2.7. Modified: psyco/branch/py27/doc/Makefile ============================================================================== --- psyco/branch/py27/doc/Makefile (original) +++ psyco/branch/py27/doc/Makefile Mon Feb 22 13:27:30 2010 @@ -2,6 +2,8 @@ # Makefile.local should define MKHOWTO to point to the Python # distribution's Doc/tools/mkhowto, e.g. # MKHOWTO = ${HOME}/cvs/python/dist/src/Doc/tools/mkhowto +# (note that you may have to point to a Python repository +# containing the branch 2.4 or 2.5, as mkhowto was then removed) include Makefile.local PAPER=a4 Modified: psyco/branch/py27/doc/psycoguide.tex ============================================================================== --- psyco/branch/py27/doc/psycoguide.tex (original) +++ psyco/branch/py27/doc/psycoguide.tex Mon Feb 22 13:27:30 2010 @@ -996,6 +996,7 @@ In addition, inside a function, some syntactic constructs are not supported by Psyco. It does not mean that a function using them will fail; it merely means that the whole function will not be accelerated. The following table lists the unsupported constructs, along with the corresponding bytecode instruction name and number. Log files only report the bytecode instruction number, which you need to look up here. \begin{tableiii}{cl|l}{code}{Bytecode}{Instruction name}{Appears in} + \lineiii{ 81}{\code{WITH_CLEANUP }}{(6) with statements} \lineiii{ 82}{\code{LOAD_LOCALS }}{(1) class definitions} \lineiii{ 84}{\code{IMPORT_STAR }}{(5) \code{from xx import *}} \lineiii{ 85}{\code{EXEC_STMT }}{(2) \code{exec xx}} @@ -1003,10 +1004,13 @@ \lineiii{ 90}{\code{STORE_NAME }}{(5) outside functions} \lineiii{ 91}{\code{DELETE_NAME }}{(5) outside functions} \lineiii{101}{\code{LOAD_NAME }}{(5) outside functions} + \lineiii{104}{\code{BUILD_SET }}{(7) sets syntax} \lineiii{134}{\code{MAKE_CLOSURE }}{(4) nested scopes} \lineiii{135}{\code{LOAD_CLOSURE }}{(4) nested scopes} \lineiii{136}{\code{LOAD_DEREF }}{(4) nested scopes} \lineiii{137}{\code{STORE_DEREF }}{(4) nested scopes} + \lineiii{143}{\code{SETUP_WITH }}{(6) with statements} + \lineiii{146}{\code{SET_ADD }}{(7) sets syntax} \end{tableiii} \noindent @@ -1023,6 +1027,10 @@ Using nested scopes (i.e.\ variables shared by a function and an inner sub-function) will prevent both the outer and the inner function to be accelerated. This too could be worked around if there is enough interest, at least for accelerating the unrelated parts of the functions -- the accesses to the shared variables themselves might be difficult to optimize. \item[(5)] These constructs can appear in class definitions (see (1)) or at the module top-level. It is possible to enable support for module top-level code, but not recommended; instead, try to put all the code you want accelerated in function bodies. +\item[(6)] + The \code{with} statement is not supported. +\item[(7)] + The syntax for sets is not supported. Note that you can still use sets and have them accelerated as long as you don't use the special syntax to make them, introduced in Python 2.7. \end{description} |
From: <ar...@co...> - 2010-02-22 12:58:06
|
Author: arigo Date: Mon Feb 22 13:31:45 2010 New Revision: 71404 Modified: psyco/branch/py27/test/regrtester.py Log: Add another skip. Modified: psyco/branch/py27/test/regrtester.py ============================================================================== --- psyco/branch/py27/test/regrtester.py (original) +++ psyco/branch/py27/test/regrtester.py Mon Feb 22 13:31:45 2010 @@ -55,6 +55,7 @@ 'test_capi': 'threads with a busy loop', 'test_zipimport_support': 'sees psyco.profiler.go() in pdb', 'test_deque': 'uses too much memory: "pop=d.pop" keeps d alive forever', + 'test_tuple': 'gc.is_tracked() on tuples', } # SKIP['test_operator'] = NO_SYS_EXC # SKIP['test_strop'] = NO_SYS_EXC |
From: <ar...@co...> - 2010-02-22 11:16:17
|
Author: arigo Date: Mon Feb 22 12:16:09 2010 New Revision: 71401 Modified: psyco/branch/py27/c/mergepoints.c Log: Skip functions containing SETUP_WITH earlier. Modified: psyco/branch/py27/c/mergepoints.c ============================================================================== --- psyco/branch/py27/c/mergepoints.c (original) +++ psyco/branch/py27/c/mergepoints.c Mon Feb 22 12:16:09 2010 @@ -607,6 +607,13 @@ if (iblock > iblockmax) iblockmax = iblock; break; +#ifdef SETUP_WITH + case SETUP_WITH: + i = i0; + /* op = SETUP_WITH; */ + goto unsupported_instruction; +#endif + case POP_BLOCK: psyco_assert(iblock > 0); iblock--; |
From: <ar...@co...> - 2010-02-22 11:03:14
|
Author: arigo Date: Mon Feb 22 12:03:05 2010 New Revision: 71400 Modified: psyco/branch/py27/c/Python/pycompiler.c psyco/branch/py27/c/mergepoints.c Log: new opcode: MAP_ADD. Modified: psyco/branch/py27/c/Python/pycompiler.c ============================================================================== --- psyco/branch/py27/c/Python/pycompiler.c (original) +++ psyco/branch/py27/c/Python/pycompiler.c Mon Feb 22 12:03:05 2010 @@ -2710,6 +2710,21 @@ goto fine; #endif +#ifdef MAP_ADD + case MAP_ADD: + w = NTOP(1); /* key */ + u = NTOP(2); /* value */ + v = NTOP(2+oparg); /* dict */ + if (!PsycoDict_SetItem(po, v, w, u)) /* v[w] = u */ + break; + POP_DECREF(); + POP_DECREF(); + goto fine; +#endif + + /*MISSING_OPCODE(BUILD_SET); + MISSING_OPCODE(SET_ADD);*/ + case LOAD_ATTR: w = vinfo_new(CompileTime_New(((long) GETNAMEV(oparg)))); x = PsycoObject_GetAttr(po, TOP(), w); /* v.w */ @@ -2948,6 +2963,8 @@ STACK_LEVEL()); goto fine; + /*MISSING_OPCODE(SETUP_WITH);*/ + #ifdef SET_LINENO case SET_LINENO: /* trace machine code execution at each SET_LINENO opcode Modified: psyco/branch/py27/c/mergepoints.c ============================================================================== --- psyco/branch/py27/c/mergepoints.c (original) +++ psyco/branch/py27/c/mergepoints.c Mon Feb 22 12:03:05 2010 @@ -150,6 +150,7 @@ op == DELETE_SLICE+3 || \ op == STORE_SUBSCR || \ IS_STORE_MAP(op) || \ + IS_MAP_ADD(op) || \ op == DELETE_SUBSCR || \ op == PRINT_EXPR || \ op == PRINT_ITEM || \ @@ -221,6 +222,12 @@ # define IS_STORE_MAP(op) 0 #endif +#ifdef MAP_ADD +# define IS_MAP_ADD(op) (op == MAP_ADD) +#else +# define IS_MAP_ADD(op) 0 +#endif + #ifdef JUMP_IF_FALSE_OR_POP /* Python 2.7 */ # define IS_JCONDREL_INSTR(op) 0 # define IS_JCONDABS_INSTR(op) (op == JUMP_IF_FALSE_OR_POP || \ |
From: <ar...@co...> - 2010-02-22 10:57:57
|
Author: arigo Date: Mon Feb 22 11:57:19 2010 New Revision: 71399 Modified: psyco/branch/py27/c/Python/pycompiler.c psyco/branch/py27/c/Python/pyver.h Log: LIST_APPEND changed. Modified: psyco/branch/py27/c/Python/pycompiler.c ============================================================================== --- psyco/branch/py27/c/Python/pycompiler.c (original) +++ psyco/branch/py27/c/Python/pycompiler.c Mon Feb 22 11:57:19 2010 @@ -1959,9 +1959,8 @@ case of an opcode that cannot set run-time conditions */ - fprintf(stderr, "%s: %d [%x]\n", PyString_AS_STRING(co->co_name), - next_instr, - GETLOCAL(0)->source); + /*fprintf(stderr, "%s: %d\n", PyString_AS_STRING(co->co_name), + next_instr);*/ opcode = NEXTOP(); if (HAS_ARG(opcode)) oparg = NEXTARG(); @@ -2141,6 +2140,15 @@ BINARY_OPCODE(INPLACE_FLOOR_DIVIDE, PsycoNumber_InPlaceFloorDivide); #ifdef LIST_APPEND +# if HAVE_PEEK_LIST_APPEND + case LIST_APPEND: + w = NTOP(1); + v = NTOP(oparg+1); + if (!PsycoList_Append(po, v, w)) + break; + POP_DECREF(); + goto fine; +# else case LIST_APPEND: w = NTOP(1); v = NTOP(2); @@ -2149,6 +2157,7 @@ POP_DECREF(); POP_DECREF(); goto fine; +# endif #endif case INPLACE_POWER: Modified: psyco/branch/py27/c/Python/pyver.h ============================================================================== --- psyco/branch/py27/c/Python/pyver.h (original) +++ psyco/branch/py27/c/Python/pyver.h Mon Feb 22 11:57:19 2010 @@ -91,4 +91,6 @@ # define HAVE_NEXT_INSTR_POP 0 #endif +#define HAVE_PEEK_LIST_APPEND (PY_VERSION_HEX >= 0x02070000) /* Py >= 2.7 */ + #endif /* _PYVER_H */ |
From: <ar...@co...> - 2010-02-22 10:41:22
|
Author: arigo Date: Mon Feb 22 11:41:10 2010 New Revision: 71398 Modified: psyco/branch/py27/c/mergepoints.c Log: Also fix this file to account for the fact that the conditional jumps now have an absolute target instead of a relative one. Modified: psyco/branch/py27/c/mergepoints.c ============================================================================== --- psyco/branch/py27/c/mergepoints.c (original) +++ psyco/branch/py27/c/mergepoints.c Mon Feb 22 11:41:10 2010 @@ -47,13 +47,14 @@ /* instructions with a target: */ #define HAS_JREL_INSTR(op) (op == JUMP_FORWARD || \ - IS_JCOND_INSTR(op) || \ + IS_JCONDREL_INSTR(op) || \ op == FOR_ITER || \ /* SETUP_LOOP replaced by FOR_ITER */ \ op == SETUP_EXCEPT || \ op == SETUP_FINALLY) #define HAS_JABS_INSTR(op) (op == JUMP_ABSOLUTE || \ + IS_JCONDABS_INSTR(op) || \ op == CONTINUE_LOOP) /* instructions whose target may be jumped to several times: */ @@ -221,13 +222,15 @@ #endif #ifdef JUMP_IF_FALSE_OR_POP /* Python 2.7 */ -# define IS_JCOND_INSTR(op) (op == JUMP_IF_FALSE_OR_POP || \ - op == JUMP_IF_TRUE_OR_POP || \ - op == POP_JUMP_IF_FALSE || \ - op == POP_JUMP_IF_TRUE) +# define IS_JCONDREL_INSTR(op) 0 +# define IS_JCONDABS_INSTR(op) (op == JUMP_IF_FALSE_OR_POP || \ + op == JUMP_IF_TRUE_OR_POP || \ + op == POP_JUMP_IF_FALSE || \ + op == POP_JUMP_IF_TRUE) #else -# define IS_JCOND_INSTR(op) (op == JUMP_IF_FALSE || \ - op == JUMP_IF_TRUE) +# define IS_JCONDREL_INSTR(op) (op == JUMP_IF_FALSE || \ + op == JUMP_IF_TRUE) +# define IS_JCONDABS_INSTR(op) 0 #endif /***************************************************************/ |
From: <ar...@co...> - 2010-02-22 10:36:46
|
Author: arigo Date: Mon Feb 22 11:36:07 2010 New Revision: 71397 Modified: psyco/branch/py27/c/Python/pycheader.h psyco/branch/py27/c/Python/pycompiler.c psyco/branch/py27/c/Python/pyver.h psyco/branch/py27/c/mergepoints.c psyco/branch/py27/c/mergepoints.h Log: In-progress. Modified: psyco/branch/py27/c/Python/pycheader.h ============================================================================== --- psyco/branch/py27/c/Python/pycheader.h (original) +++ psyco/branch/py27/c/Python/pycheader.h Mon Feb 22 11:36:07 2010 @@ -48,7 +48,7 @@ typedef struct { PyCodeObject* co; /* code object we are compiling */ - int next_instr; /* next instruction to compile */ + int next_instr; /* next instruction to compile, maybe |NEXT_INSTR_POP */ short auto_recursion; /* # levels to auto-compile calls to Python functions */ char is_inlining; /* true when compiling a code inlined in a parent */ unsigned char iblock; /* index in blockstack */ Modified: psyco/branch/py27/c/Python/pycompiler.c ============================================================================== --- psyco/branch/py27/c/Python/pycompiler.c (original) +++ psyco/branch/py27/c/Python/pycompiler.c Mon Feb 22 11:36:07 2010 @@ -1920,7 +1920,15 @@ PyFrameObject::f_exc_xxx fields. */ psyco_emit_header(po, 3); } - + +#if HAVE_NEXT_INSTR_POP + if (po->pr.next_instr < -1) { + /* there is a pending POP operation to be done */ + POP_DECREF(); + po->pr.next_instr &= ~NEXT_INSTR_POP; + } +#endif + while (po->pr.next_instr != -1) { /* 'co' is the code object we are interpreting/compiling */ @@ -1950,7 +1958,10 @@ SAVE_NEXT_INSTR(next_instr); /* could be optimized, not needed in the case of an opcode that cannot set run-time conditions */ - + + fprintf(stderr, "%s: %d [%x]\n", PyString_AS_STRING(co->co_name), + next_instr, + GETLOCAL(0)->source); opcode = NEXTOP(); if (HAS_ARG(opcode)) oparg = NEXTARG(); @@ -2818,8 +2829,15 @@ mp = psyco_next_merge_point(po->pr.merge_points, next_instr); goto fine; +#if HAVE_NEXT_INSTR_POP /* Python >= 2.7 */ + case JUMP_IF_TRUE_OR_POP: + case JUMP_IF_FALSE_OR_POP: + case POP_JUMP_IF_FALSE: + case POP_JUMP_IF_TRUE: +#else case JUMP_IF_TRUE: case JUMP_IF_FALSE: +#endif /* This code is very different from the original interpreter's, because we generally do not know the outcome of PyObject_IsTrue(). In the case of JUMP_IF_xxx @@ -2828,12 +2846,25 @@ cc = integer_NON_NULL(po, PsycoObject_IsTrue(po, TOP())); if (cc == CC_ERROR) break; +#if HAVE_NEXT_INSTR_POP + if (opcode == JUMP_IF_FALSE_OR_POP || + opcode == POP_JUMP_IF_FALSE) +#else if (opcode == JUMP_IF_FALSE) +#endif cc = INVERT_CC(cc); if ((int)cc < CC_TOTAL) { /* compile the beginning of the "if true" path */ int current_instr = next_instr; +#if HAVE_NEXT_INSTR_POP + JUMPTO(oparg); + /* this is the case where we jump */ + if (opcode == POP_JUMP_IF_FALSE || + opcode == POP_JUMP_IF_TRUE) + next_instr |= NEXT_INSTR_POP; +#else JUMPBY(oparg); +#endif SAVE_NEXT_INSTR(next_instr); psyco_compile_cond(po, psyco_exact_merge_point(po->pr.merge_points, @@ -2842,12 +2873,25 @@ next_instr = current_instr; } else if (cc == CC_ALWAYS_TRUE) { +#if HAVE_NEXT_INSTR_POP + JUMPTO(oparg); /* always jump */ + /* this is the case where we jump */ + if (opcode == POP_JUMP_IF_FALSE || + opcode == POP_JUMP_IF_TRUE) + POP_DECREF(); +#else JUMPBY(oparg); /* always jump */ +#endif mp = psyco_next_merge_point(po->pr.merge_points, next_instr); + goto fine; } else ; /* never jump */ +#if HAVE_NEXT_INSTR_POP + /* this is the case where we don't jump */ + POP_DECREF(); +#endif goto fine; case JUMP_ABSOLUTE: Modified: psyco/branch/py27/c/Python/pyver.h ============================================================================== --- psyco/branch/py27/c/Python/pyver.h (original) +++ psyco/branch/py27/c/Python/pyver.h Mon Feb 22 11:36:07 2010 @@ -84,4 +84,11 @@ #define HAVE_DICT_NEWPRESIZED (PY_VERSION_HEX >= 0x02060000) /* Py >= 2.6 */ +#if (PY_VERSION_HEX >= 0x02070000) /* Python >= 2.7 */ +# define HAVE_NEXT_INSTR_POP 1 +# define NEXT_INSTR_POP (-INT_MAX-1) +#else +# define HAVE_NEXT_INSTR_POP 0 +#endif + #endif /* _PYVER_H */ Modified: psyco/branch/py27/c/mergepoints.c ============================================================================== --- psyco/branch/py27/c/mergepoints.c (original) +++ psyco/branch/py27/c/mergepoints.c Mon Feb 22 11:36:07 2010 @@ -47,8 +47,7 @@ /* instructions with a target: */ #define HAS_JREL_INSTR(op) (op == JUMP_FORWARD || \ - op == JUMP_IF_FALSE || \ - op == JUMP_IF_TRUE || \ + IS_JCOND_INSTR(op) || \ op == FOR_ITER || \ /* SETUP_LOOP replaced by FOR_ITER */ \ op == SETUP_EXCEPT || \ @@ -221,6 +220,16 @@ # define IS_STORE_MAP(op) 0 #endif +#ifdef JUMP_IF_FALSE_OR_POP /* Python 2.7 */ +# define IS_JCOND_INSTR(op) (op == JUMP_IF_FALSE_OR_POP || \ + op == JUMP_IF_TRUE_OR_POP || \ + op == POP_JUMP_IF_FALSE || \ + op == POP_JUMP_IF_TRUE) +#else +# define IS_JCOND_INSTR(op) (op == JUMP_IF_FALSE || \ + op == JUMP_IF_TRUE) +#endif + /***************************************************************/ Modified: psyco/branch/py27/c/mergepoints.h ============================================================================== --- psyco/branch/py27/c/mergepoints.h (original) +++ psyco/branch/py27/c/mergepoints.h Mon Feb 22 11:36:07 2010 @@ -53,7 +53,10 @@ PSY_INLINE mergepoint_t* psyco_exact_merge_point(PyObject* mergepoints, int position) { - mergepoint_t* mp = psyco_next_merge_point(mergepoints, position); + mergepoint_t* mp; + if (position < 0) /* Python 2.7: position is |NEXT_INSTR_POP */ + return NULL; + mp = psyco_next_merge_point(mergepoints, position); if (mp->bytecode_position != position) mp = NULL; return mp; |
From: <ar...@co...> - 2010-02-22 10:35:07
|
Author: arigo Date: Mon Feb 22 11:34:29 2010 New Revision: 71396 Added: psyco/branch/py27/ - copied from r71395, psyco/dist/ Log: A branch in which to try to support Python 2.7. |