This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2008年08月12日 16:20 by tim.maxwell, last changed 2022年04月11日 14:56 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| bitfields-3.patch | theller, 2008年09月18日 08:17 | |||
| bitfields-mingw.patch | theller, 2008年09月26日 18:59 | Additional patch for MingW | ||
| Messages (17) | |||
|---|---|---|---|
| msg71060 - (view) | Author: Tim Maxwell (tim.maxwell) | Date: 2008年08月12日 16:20 | |
Steps to reproduce:
Python 2.5.2 (r252:60911, Feb 22 2008, 07:57:53)
[GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> fields = [('a', c_short, 4), ('b', c_short, 4), ('c', c_long, 24)]
>>> class Foo(Structure):
... _fields_ = fields
...
>>> Foo.a
<Field type=c_short, ofs=0:0, bits=4>
>>> Foo.b
<Field type=c_short, ofs=0:4, bits=4>
>>> Foo.c
<Field type=c_long, ofs=-2:8, bits=24> # Wrong!
More about my machine:
>>> sizeof(c_short)
2
>>> sizeof(c_long)
4
This particular example comes from a 32-bit Mac OS X Intel machine. The
bug has been reproduced on Linux as well, but could not be reproduced on
Windows XP.
|
|||
| msg71196 - (view) | Author: Matt Giuca (mgiuca) | Date: 2008年08月16日 05:56 | |
Confirmed in HEAD for Python 2.6 and 3.0, on Linux.
Python 2.6b2+ (trunk:65708, Aug 16 2008, 15:04:13)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Python 3.0b2+ (py3k:65708, Aug 16 2008, 15:09:19)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
I was also able to simplify the test case. I get this issue just using
one c_short and one c_long, with nonstandard bit lengths. eg:
fields = [('a', c_short, 16), ('b', c_long, 16)]
(sizeof(c_short) == 2 and sizeof(c_long) == 4).
But it's somewhat sporadic under which conditions it happens and which
it doesn't.
One might imagine this was a simple calculation. But the _ctypes module
is so big (5000 lines of C); at an initial glance I can't find the code
responsible! Any hints? (Modules/_ctypes/ctypes.c presumably is where
this takes place).
|
|||
| msg73341 - (view) | Author: Thomas Heller (theller) * (Python committer) | Date: 2008年09月17日 18:48 | |
Here is a patch, with test, that fixes this problem. |
|||
| msg73361 - (view) | Author: Thomas Heller (theller) * (Python committer) | Date: 2008年09月18日 06:16 | |
Updated patch. |
|||
| msg73364 - (view) | Author: Thomas Heller (theller) * (Python committer) | Date: 2008年09月18日 08:17 | |
Updated the unittest so that it works on Windows, too. |
|||
| msg73629 - (view) | Author: Thomas Heller (theller) * (Python committer) | Date: 2008年09月23日 12:39 | |
Make this a release blocker so hopefully someone will review it. |
|||
| msg73735 - (view) | Author: Fredrik Lundh (effbot) * (Python committer) | Date: 2008年09月24日 17:30 | |
Looks fine to me, except for the comment in the test suite. Should + # MS compilers do NOT combine c_short and c_int into + # one field, gcc doesn't. perhaps be + # MS compilers do NOT combine c_short and c_int into + # one field, gcc do. ? Is using explicit tests for MSVC vs. GCC a good idea, btw? What about other compilers? Can the test be changed to accept either value? |
|||
| msg73736 - (view) | Author: Skip Montanaro (skip.montanaro) * (Python triager) | Date: 2008年09月24日 17:36 | |
Looks reasonable, though I'm no ctypes maven. Trivial little nit: In the comment just before the start of CField_FromDesc it says, in part: * Expects the size, index and offset for the current field in *psize and * *poffset, stores the total size so far in *psize, the offset for the next Note that it identifies three values (size, index, offset) as stored in two locations (*psize and *poffset). Seems like some sort of mismatch to me. |
|||
| msg73738 - (view) | Author: Thomas Heller (theller) * (Python committer) | Date: 2008年09月24日 18:00 | |
Fredrik Lundh schrieb: > Looks fine to me, except for the comment in the test suite. Should > > + # MS compilers do NOT combine c_short and c_int into > + # one field, gcc doesn't. > > perhaps be > > + # MS compilers do NOT combine c_short and c_int into > + # one field, gcc do. Sure. But isn't this correct (or better) english, instead? ^^^^ > Is using explicit tests for MSVC vs. GCC a good idea, btw? What about > other compilers? Can the test be changed to accept either value? Well, MSVC and GCC are the only compilers that I use (and that are tested on the buildbots, afaik). If a cygwin compiled Python, for example, fails this test then of course the test must be changed. Thanks. |
|||
| msg73739 - (view) | Author: Thomas Heller (theller) * (Python committer) | Date: 2008年09月24日 18:01 | |
Skip Montanaro schrieb: > Looks reasonable, though I'm no ctypes maven. Trivial little nit: > In the comment just before the start of CField_FromDesc it says, > in part: > > * Expects the size, index and offset for the current field in *psize and > * *poffset, stores the total size so far in *psize, the offset for the next > > Note that it identifies three values (size, index, offset) as stored > in two locations (*psize and *poffset). Seems like some sort of > mismatch to me. Unfortunately this is not the only comment that is out of date in the ctypes sources. I wanted to touch as little code as possible in this patch. Thanks. |
|||
| msg73740 - (view) | Author: Fredrik Lundh (effbot) * (Python committer) | Date: 2008年09月24日 18:02 | |
^^^^ "Do" should be "does", right. Not enough coffee today :) |
|||
| msg73802 - (view) | Author: Roumen Petrov (rpetrov) * | Date: 2008年09月25日 16:50 | |
test_mixed_4 fail on: Python 2.6rc2+ (trunk:66617M, Sep 25 2008, 16:32:44) [GCC 3.4.5 (mingw special)] on win32 Type "help", "copyright", "credits" or "license" for more information. sizeof(X) return 12. |
|||
| msg73808 - (view) | Author: Thomas Heller (theller) * (Python committer) | Date: 2008年09月25日 19:12 | |
Does the following patch fix the test failure with MingW? <patch> Index: cfield.c =================================================================== --- cfield.c (revision 66611) +++ cfield.c (working copy) @@ -65,10 +65,10 @@ } if (bitsize /* this is a bitfield request */ && *pfield_size /* we have a bitfield open */ -#if defined(MS_WIN32) && !defined(__MINGW32__) - && dict->size * 8 == *pfield_size /* MSVC */ +#if defined(MS_WIN32) + && dict->size * 8 == *pfield_size /* Windows */ #else - && dict->size * 8 <= *pfield_size /* GCC, MINGW */ + && dict->size * 8 <= *pfield_size /* GCC */ #endif && (*pbitofs + bitsize) <= *pfield_size) { /* continue bit field */ <end patch> Also, can you please post the output of the following code snippet? <test script> from ctypes import * class X(Structure): _fields_ = [("a", c_short, 4), ("b", c_short, 4), ("c", c_int, 24), ("d", c_short, 4), ("e", c_short, 4), ("f", c_int, 24)] print X.a print X.b print X.c print X.d print X.e print X.f <end test script> |
|||
| msg73824 - (view) | Author: Roumen Petrov (rpetrov) * | Date: 2008年09月25日 23:36 | |
Yes this extra define was the problem. Instead hint /* Windows */ what about /* MSVC, GCC(with -mms-bitfields) */ ? The option -mms-bitfields is available for GCC compiler on mingw and cygwin targets. About test_bitfields.py: - comment in test_mixed_4: if GCC compiler has option -mms-bitfields it will produce code compatible with MSVC. May be comment has to include this information. - may be method test_mixed_1 need similar comment as test_mixed_4, but even without comment is fine with me. |
|||
| msg73877 - (view) | Author: Thomas Heller (theller) * (Python committer) | Date: 2008年09月26日 18:59 | |
Ok, here is an additional patch bitfields-mingw.patch. It fixes the problem reported by rpetrov, and updates the comments. Please review again ;-). The previous patch bitfields-3.patch has already been applied. |
|||
| msg73892 - (view) | Author: Roumen Petrov (rpetrov) * | Date: 2008年09月26日 21:40 | |
Flag start only with one minus: -mms-bitfields Fine with me. |
|||
| msg74042 - (view) | Author: Thomas Heller (theller) * (Python committer) | Date: 2008年09月29日 20:05 | |
Committed as SVN rev 66683 (trunk), 66684 (py3k), and 66685 (release25-maint). |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:56:37 | admin | set | nosy:
+ barry github: 47797 |
| 2008年09月29日 20:05:07 | theller | set | status: open -> closed resolution: fixed messages: + msg74042 |
| 2008年09月26日 21:40:29 | rpetrov | set | messages: + msg73892 |
| 2008年09月26日 18:59:30 | theller | set | files:
+ bitfields-mingw.patch messages: + msg73877 |
| 2008年09月25日 23:36:23 | rpetrov | set | messages: + msg73824 |
| 2008年09月25日 19:12:55 | theller | set | messages: + msg73808 |
| 2008年09月25日 16:50:11 | rpetrov | set | nosy:
+ rpetrov messages: + msg73802 |
| 2008年09月24日 18:02:55 | effbot | set | messages: + msg73740 |
| 2008年09月24日 18:01:32 | theller | set | messages: + msg73739 |
| 2008年09月24日 18:00:27 | theller | set | messages: + msg73738 |
| 2008年09月24日 17:36:14 | skip.montanaro | set | nosy:
+ skip.montanaro messages: + msg73736 |
| 2008年09月24日 17:30:37 | effbot | set | nosy:
+ effbot messages: + msg73735 |
| 2008年09月23日 12:39:54 | theller | set | priority: release blocker messages: + msg73629 |
| 2008年09月18日 08:17:32 | theller | set | files: - bitfields-2.patch |
| 2008年09月18日 08:17:21 | theller | set | files:
+ bitfields-3.patch messages: + msg73364 |
| 2008年09月18日 06:16:57 | theller | set | files: - bitfields.patch |
| 2008年09月18日 06:16:39 | theller | set | files:
+ bitfields-2.patch messages: + msg73361 |
| 2008年09月17日 18:48:55 | theller | set | keywords:
+ patch, needs review files: + bitfields.patch messages: + msg73341 |
| 2008年08月16日 05:56:40 | mgiuca | set | nosy:
+ mgiuca messages: + msg71196 versions: + Python 2.6, Python 3.0 |
| 2008年08月12日 16:20:03 | tim.maxwell | create | |