From: scott s. <sn...@fn...> - 2004-06-22 02:13:16
|
hi - I'm using psyco 1.2 with python 2.2.2. If i compile psyco with checking on (PSYCO_DEBUG=1) then it crashes on the following script: --------------------------------------- import psyco psyco.full() from math import pow def foo(etasize): pow (1.0, etasize) foo (1.0) --------------------------------------- $ python initp2.py nonnull_refcount: item 2 nonnull_refcount: in array item 5 c/vcompiler.c:339: !err Fatal Python error: Psyco assertion failed Aborted (core dumped) $ The same problem happened with other two-argument math functions (like fmod) as well. The problem was in the PMATH_FUNC2 macro, where we have: PMATH_CONVERT_TO_DOUBLE(v1,a1,a2); \ PMATH_CONVERT_TO_DOUBLE(v2,b1,b2); \ result = array_new(2); \ x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ "vvvva",a1,a2,b1,b2,result); \ PMATH_RELEASE_DOUBLE(a1,a2); \ PMATH_RELEASE_DOUBLE(b1,b2); \ But the macro PMATH_CONVERT_TO_DOUBLE executes a `return' statement if the conversion fails. That means that we're in trouble if the first conversion succeeds but the second one does not: in that case, we never to the PMATH_RELEASE_DOUBLE for the one that succeeded. I fixed it the following ugly way. sss --- c/Modules/pmath.c-orig Mon Jun 21 19:48:22 2004 +++ c/Modules/pmath.c Mon Jun 21 19:50:52 2004 @@ -51,16 +51,16 @@ * version in pfloatobject.c. The error handling * on invalid args is different */ -#define PMATH_CONVERT_TO_DOUBLE(vobj, v1, v2) \ +#define PMATH_CONVERT_TO_DOUBLE(vobj, v1, v2, ERRORACTION) \ switch (psyco_convert_to_double(po, vobj, &v1, &v2)) { \ case true: \ break; /* fine */ \ case false: \ - return NULL; /* error or promotion */ \ + ERRORACTION; /* error or promotion */ \ default: \ PycException_SetString(po, PyExc_TypeError, \ "bad argument type for built-in operation"); \ - return NULL; \ + ERRORACTION; \ } #define PMATH_RELEASE_DOUBLE(v1, v2) \ @@ -80,7 +80,7 @@ return NULL; \ } \ v = PsycoTuple_GET_ITEM(varg, 0); \ - PMATH_CONVERT_TO_DOUBLE(v,a1,a2); \ + PMATH_CONVERT_TO_DOUBLE(v,a1,a2,return NULL); \ result = array_new(2); \ x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ "vva",a1,a2,result); \ @@ -106,8 +106,8 @@ } \ v1 = PsycoTuple_GET_ITEM(varg, 0); \ v2 = PsycoTuple_GET_ITEM(varg, 1); \ - PMATH_CONVERT_TO_DOUBLE(v1,a1,a2); \ - PMATH_CONVERT_TO_DOUBLE(v2,b1,b2); \ + PMATH_CONVERT_TO_DOUBLE(v1,a1,a2,return NULL); \ + PMATH_CONVERT_TO_DOUBLE(v2,b1,b2,goto cleanup); \ result = array_new(2); \ x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ "vvvva",a1,a2,b1,b2,result); \ @@ -117,6 +117,9 @@ x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); \ array_release(result); \ return x; \ + cleanup:\ + PMATH_RELEASE_DOUBLE(a1,a2); \ + return NULL; \ } /* the functions cimpl_math_sin() etc */ |
From: Tim H. <tim...@co...> - 2004-06-22 16:06:55
|
scott snyder wrote: >hi - > >I'm using psyco 1.2 with python 2.2.2. If i compile psyco with checking >on (PSYCO_DEBUG=1) then it crashes on the following script: > > [SNIP] >The problem was in the PMATH_FUNC2 macro, where we have: > > Ouch. pfloatobject.c appears to have the same problem. I don't suppose that you've seen problems related to that, have you? I guess I better compile psyco with checking and see what I can come up witha failing example. -tim > > PMATH_CONVERT_TO_DOUBLE(v1,a1,a2); \ > PMATH_CONVERT_TO_DOUBLE(v2,b1,b2); \ > result = array_new(2); \ > x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ > "vvvva",a1,a2,b1,b2,result); \ > PMATH_RELEASE_DOUBLE(a1,a2); \ > PMATH_RELEASE_DOUBLE(b1,b2); \ > >But the macro PMATH_CONVERT_TO_DOUBLE executes a `return' statement >if the conversion fails. That means that we're in trouble if the >first conversion succeeds but the second one does not: in that case, >we never to the PMATH_RELEASE_DOUBLE for the one that succeeded. > >I fixed it the following ugly way. >sss > >--- c/Modules/pmath.c-orig Mon Jun 21 19:48:22 2004 >+++ c/Modules/pmath.c Mon Jun 21 19:50:52 2004 >@@ -51,16 +51,16 @@ > * version in pfloatobject.c. The error handling > * on invalid args is different > */ >-#define PMATH_CONVERT_TO_DOUBLE(vobj, v1, v2) \ >+#define PMATH_CONVERT_TO_DOUBLE(vobj, v1, v2, ERRORACTION) \ > switch (psyco_convert_to_double(po, vobj, &v1, &v2)) { \ > case true: \ > break; /* fine */ \ > case false: \ >- return NULL; /* error or promotion */ \ >+ ERRORACTION; /* error or promotion */ \ > default: \ > PycException_SetString(po, PyExc_TypeError, \ > "bad argument type for built-in operation"); \ >- return NULL; \ >+ ERRORACTION; \ > } > > #define PMATH_RELEASE_DOUBLE(v1, v2) \ >@@ -80,7 +80,7 @@ > return NULL; \ > } \ > v = PsycoTuple_GET_ITEM(varg, 0); \ >- PMATH_CONVERT_TO_DOUBLE(v,a1,a2); \ >+ PMATH_CONVERT_TO_DOUBLE(v,a1,a2,return NULL); \ > result = array_new(2); \ > x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ > "vva",a1,a2,result); \ >@@ -106,8 +106,8 @@ > } \ > v1 = PsycoTuple_GET_ITEM(varg, 0); \ > v2 = PsycoTuple_GET_ITEM(varg, 1); \ >- PMATH_CONVERT_TO_DOUBLE(v1,a1,a2); \ >- PMATH_CONVERT_TO_DOUBLE(v2,b1,b2); \ >+ PMATH_CONVERT_TO_DOUBLE(v1,a1,a2,return NULL); \ >+ PMATH_CONVERT_TO_DOUBLE(v2,b1,b2,goto cleanup); \ > result = array_new(2); \ > x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ > "vvvva",a1,a2,b1,b2,result); \ >@@ -117,6 +117,9 @@ > x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); \ > array_release(result); \ > return x; \ >+ cleanup:\ >+ PMATH_RELEASE_DOUBLE(a1,a2); \ >+ return NULL; \ > } > > /* the functions cimpl_math_sin() etc */ > > >------------------------------------------------------- >This SF.Net email sponsored by Black Hat Briefings & Training. >Attend Black Hat Briefings & Training, Las Vegas July 24-29 - >digital self defense, top technical experts, no vendor pitches, >unmatched networking opportunities. Visit www.blackhat.com >_______________________________________________ >Psyco-devel mailing list >Psy...@li... >https://lists.sourceforge.net/lists/listinfo/psyco-devel > > > |
From: Tim H. <tim...@co...> - 2004-06-22 17:53:29
|
Tim Hochberg wrote: > scott snyder wrote: > >> hi - >> >> I'm using psyco 1.2 with python 2.2.2. If i compile psyco with checking >> on (PSYCO_DEBUG=1) then it crashes on the following script: >> >> > [SNIP] > >> The problem was in the PMATH_FUNC2 macro, where we have: >> >> > Ouch. pfloatobject.c appears to have the same problem. I don't suppose > that you've seen problems related to that, have you? I guess I better > compile psyco with checking and see what I can come up witha failing > example. I'm replying to myself again; I need to get out more! I modified Scott's test program to get pfloat object to break. The modified program is: import psyco psyco.full() from math import pow #~ def foo(etasize): #~ pow (1.0, etasize) def foo(etasize): return 5.0 + etasize foo ("1") I've gone ahead and submitted a bug report as well as a patch that appears to fix this to sourceforge. -tim |
From: Armin R. <ar...@tu...> - 2004-06-22 18:47:48
|
Hello Scott, On Mon, Jun 21, 2004 at 09:12:31PM -0500, scott snyder wrote: > I'm using psyco 1.2 with python 2.2.2. If i compile psyco with checking > on (PSYCO_DEBUG=1) then it crashes on the following script: Thanks for the report and the patch. It is a bit messy, but C macros always are. I checked it in together Tim's pfloatobject.c patch. Thanks to both of you, Armin |