[IronPython] Users Digest, Vol 80, Issue 31

David Welden dwoogle at gmail.com
Fri Mar 18 07:15:36 PDT 2011


After parsing through all of the #Defines, here is what I come up with for
the signature of MaxLColumnDefine:

unsigned long
MaxLColumnDefine(unsigned short    SsnId,
                 unsigned long     ColumnNo,
                 void              *pBuffAddr,
                 unsigned long     BuffSize,
                 unsigned long     ExtType,
                 unsigned short    ArraySize,
                 unsigned long    (*TypeConv) (void *FromBuff,
                                              void *ToBuff,
                                              unsigned long ToBuffLen,
                                              void *pArgs),
                 void             *pTypeConvArgs);


> ---------- Forwarded message ----------
> From: Dino Viehland <dinov at microsoft.com>
> To: Discussion of IronPython <users at lists.ironpython.com>
> Date: Fri, 18 Mar 2011 01:53:11 +0000
> Subject: Re: [IronPython] Issue with ctypes arrays of c_ubyte
>
> Thanks for the report.  I’ll try and take a  look at this over the weekend
> – feel free to open a bug though so it doesn’t get lost.
>
>
>
> I’d guess that we’re (IronPython) doing something wrong with the signature
> of MaxLColumnDefine which probably defines its parameter types.  Either that
> or we’ve got the signature right but we should support passing the
> ubyte_array (ubyte*) (and it looks like any other array) by ref to the
> c_char_array_array (char**).  It’s possible that maybe we support passing a
> char* by ref to a char** but the difference between ubyte (or double) and
> char is preventing it when it shouldn’t – maybe char* gets treated like a
> universal buffer type, or maybe pointers just easily coerce no matter what
> they are.
>
>
>
> If you could look at the different types used in the parameters or in the
> fields of your Union and compare them between CPython and IronPython that’d
> probably be useful.  Or even just how MaxLColumnDefine is created would be
> useful.
>
>
>
> *From:* users-bounces at lists.ironpython.com [mailto:
> users-bounces at lists.ironpython.com] *On Behalf Of *David Welden
> *Sent:* Thursday, March 17, 2011 2:41 PM
> *To:* Users at lists.ironpython.com
> *Subject:* Re: [IronPython] Issue with ctypes arrays of c_ubyte
>
>
>
> OK. Looks like arrays of doubles and ubytes are not processed by IronPython
> ctypes as they are in CPython. The error always come back as:
>
>  "expected c_char_Array_1025_Array_1, got c_ubyte_Array_1" or "expected
> c_char_Array_1025_Array_1, c_double_Array_1".
>
>
>
> If I ignore the 'error' as follows:
>
>
>
> try:
>     sts = maxl.MaxLColumnDefine(sid, c_ulong(index + 1), pInBuff, c_ushort(Size), c_ulong(Type), c_ushort(MAX_REC), None, None)
>
> except ArgumentError, e:
>     pass
>
>  then the output is the same as on CPython. The other deviation I notice
> is extracting the value of pBuffer.pszVal. With CPython the correct code is:
>
> print pBuffer.pszVal[0].value
>
> which results in an error in IronPython:
>
> 'str' object has no attribute 'value'
>
> IronPython ctypes wants this line to be:
>
> print pBuffer.pszVal[0]
>
>  On Tue, Mar 15, 2011 at 1:27 PM, David Welden <dwoogle at gmail.com> wrote:
>
> I have a ctypes module that is failing under Iron Python. The module is
> hosted at http://essbasepy.googlecode.com if anyone wants to view the
> source.
>
>
>
> I have a union defined as:
>
> class output_buffer(Union):
>     _fields_ = [('pdVal', c_double * MAX_REC),
>
>
>
>                 ('pbVal', c_ubyte * MAX_REC),
>
>
>
>                 ('pszVal', col_t * MAX_REC)]
>
> When attempting to use the pbVal field as follows:
>
> elif pDescr.IntTyp == MAXL_DTINT_BOOL:
>
>
>
>     pInBuff = pBuffer.pbVal
>     Type = MAXL_DTEXT_UCHAR
>     Size = 0
>
> ...
>
> sts = maxl.MaxLColumnDefine(sid, c_ulong(index + 1), pInBuff, c_ushort(Size), c_ulong(Type), c_ushort(MAX_REC), None, None)
>
> the called c module fails with the following exception:
>
> clsException in System.Collections.ListDictionaryInternal
> e {*expected c_char_Array_1025_Array_1, got c_ubyte_Array_1*} object {IronPython.Runtime.Exceptions.PythonExceptions.BaseException}
> Data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
> Message "expected c_char_Array_1025_Array_1, got c_ubyte_Array_1" string
> Source "IronPython.Modules" string
> StackTrace " at IronPython.Modules.ModuleOps.CheckCDataType(Object o, Object type)\r\n at InteropInvoker(IntPtr , Object , Object , Object , Object , Object , Object , Object , Object , Object[] )\r\n at CallSite.Target(Closure , CallSite , Object , Object , Object , Object , Object , Object , Object , Object , Object )\r\n at Microsoft.Scripting.Interpreter.DynamicInstruction`10.Run(InterpretedFrame frame)\r\n at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)\r\n at Microsoft.Scripting.Interpreter.LightLambda.Run11[T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10)\r\n at Essbase$2._MaxlOutputNextRecord$70(PythonFunction $function, Object self, Object sid, Object ssnInit, Object numFlds) in C:\\Program Files\\IronPython 2.7\\lib\\site-packages\\Essbase.py:line 376" string
> TargetSite {CData CheckCDataType(System.Object, System.Object)} System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
>
>
>
> I am a little out of my depth here, so hoping someone understands ctypes in general and the Iron Python implementation in particular.
>
>
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ironpython.com/pipermail/users-ironpython.com/attachments/20110318/e9eb18d1/attachment.htm>


More information about the Users mailing list