<br><br><div><span class="gmail_quote">On 6/8/06, <b class="gmail_sendername">Thomas Heller</b> &lt;<a href="mailto:theller@python.net">theller@python.net</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Brett Cannon wrote:<br>&gt; I fixed the crasher for ``int(buffer(array.array('c')))`` by making<br>&gt; buffer objects operate properly.&nbsp;&nbsp;Problem is that by doing so I broke<br>&gt; the ctypes tests with a bunch of similar errors::
<br><br>You have not yet committed this fix, right?</blockquote><div><br>Nope; I was waiting to hear back on all of this; no committing of code that knowingly breaks tests and all.<br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
&gt; ======================================================================<br>&gt; ERROR: test_endian_double (ctypes.test.test_byteswap.Test)<br>&gt; ----------------------------------------------------------------------
<br>&gt; Traceback (most recent call last):<br>&gt;&nbsp;&nbsp; File &quot;/code/python/trunk/Lib/ctypes/test/test_byteswap.py&quot;, line<br>&gt; 134, in test_endian_double<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; self.failUnlessEqual(bin(struct.pack(&quot;d&quot;, 
math.pi)), bin(s))<br>&gt;&nbsp;&nbsp; File &quot;/code/python/trunk/Lib/ctypes/test/test_byteswap.py&quot;, line 7, in bin<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return hexlify(buffer(s)).upper()<br>&gt; TypeError: requested buffer type not available<br>&gt;
<br>&gt; Turns out the test does the following::<br>&gt;<br>&gt;&nbsp;&nbsp; binascii.hexlify(buffer(ctypes.c_double(math.pi)))<br>&gt;<br>&gt; This is a problem because binascii.hexlify() uses &quot;t#&quot; as its argument<br>&gt; format string to PyArg_ParseTuple() and that fails now with a
<br>&gt; TypeError since ctypes.c_double (which subclasses ctypes._SimpleCData<br>&gt; which defines the buffer interface) does not have a char buffer<br>&gt; defined.<br>&gt;<br>&gt; Now this used to pass since buffer objects just used the read or write
<br>&gt; buffer in place of the char buffer, regardless if the wrapped object<br>&gt; had a char buffer function defined.<br>&gt;<br>&gt; But in checking out what &quot;t#&quot; did, I found a slight ambiguity in the<br>&gt; docs.&nbsp;&nbsp;The docs say &quot;read-only character buffer&quot; for the short
<br>&gt; description, but &quot;read-only buffer&quot; for the longer description.&nbsp;&nbsp;Which<br>&gt; is it?<br><br>I am using binascii.hexlify(buffer(obj)) as a simple way to look at the bytes of<br>the memory block.<br><br>
I think that hexlify should be able to use any buffer object that has<br>a readable memory block, not only those with charbuffers.<br><br>The docs say that the binascii methods are used to &quot;convert between binary<br>
and various ASCII-encoded binary representations&quot;.</blockquote><div><br><br>Perhaps s# should be used instead since the docs say a read buffer can be used for that.</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
&gt; Plus, Thomas, you might want to change _SimpleCData if you want it to<br>&gt; truly suport char buffers.<br><br>I did not implement that because the memory block contains binary data,<br>not text.</blockquote><div><br>
<br>OK.<br><br>-Brett<br></div><br></div><br>