[PATCH][win32] problems compiling bzrlib/_dirstate_helpers_c.pyx with MSVC

Lukáš Lalinský lalinsky at gmail.com
Wed Aug 1 12:14:47 BST 2007


On St, 2007-08-01 at 12:49 +0200, Lukáš Lalinský wrote:
> On St, 2007-08-01 at 13:39 +0300, Alexander Belchenko wrote:
> > Lukáš Lalinský пишет:
> > > On Ut, 2007-07-31 at 12:13 +0300, Alexander Belchenko wrote: 
> > >> I don't know is it bug in Pyrex or in our usage of Pyrex, but I repeat
> > >> one more time:
> > >>
> > >> 	Pyrex substitute intptr_t with int in
> > >> 	generated C-code, so actually nor stdint.h nor intptr_t
> > >> 	is not used at all.
> > >>
> > >> intptr_t is not present in generated C-code. So, it's already
> > >> breaks compatibility with 64-bit platform.
> > > 
> > > If the ctypedef statement appears in a 'cdef extern from' section it
> > > will not be replaced. This happens only if it's moved to the top-level
> > > block.
> > > 
> > > For example my compiled _dirstate_helpers_c.c contains:
> > > 
> > >   __pyx_r = ((((intptr_t )__pyx_v_ptr) & ((sizeof(int )) - 1)) == 0);
> > 
> > Lukáš, what version of Pyrex you are using?
> 
> 0.9.3.1 on Windows, 0.9.4.1 on Linux. But I've just noticed that the
> newer version on Linux indeed replaces intptr_t with int. I personally
> think this behavior is wrong, but I'm really not sure if it's a
> regression or a new feature.

After some experiments, it seems to be a bug. For example for this Pyrex
code:

cdef extern from "stdint.h":
    ctypedef char intptr_t

cdef int test():
    cdef intptr_t a
    a = 1
    return <intptr_t>a == 0

It generates this C code:

static int __pyx_f_4test_test(void) {
  intptr_t __pyx_v_a;
  int __pyx_r;

  /* "/home/lukas/projects/bzr/bzr/bzr.dev/bzrlib/test.pyx":6 */
  __pyx_v_a = 1;

  /* "/home/lukas/projects/bzr/bzr/bzr.dev/bzrlib/test.pyx":7 */
  __pyx_r = (((char )__pyx_v_a) == 0);
  goto __pyx_L0;

  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1:;
  __Pyx_WriteUnraisable("test.test");
  __pyx_L0:;
  return __pyx_r;
}

The intptr_t ctypedef is obviously wrong, but according to the change
log for Pyrex 0.9.3 [1], this shouldn't matter. So, newer versions of
Pyrex use the right type for variable declarations, but a wrong type in
type casting. I'll submit a bug report for it (if I find a bug tracker).

[1]
http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/CHANGES.txt

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Toto je =?ISO-8859-1?Q?digit=E1lne?=
	=?ISO-8859-1?Q?_podp=EDsan=E1?= =?UTF-8?Q?_=C4=8Das=C5=A5?=
	=?ISO-8859-1?Q?_spr=E1vy?=
Url : https://lists.ubuntu.com/archives/bazaar/attachments/20070801/b5f854bb/attachment.pgp 


More information about the bazaar mailing list