dbfdg 3 MZf@sddlZddlZddlZddlZddlmZejdkr sr c@s eZdZdS) CTypesTypeN)__name__ __module__ __qualname__rrrrr sr c@seZdZeZdgZdZddZeddZe ddZ ed d Z ed d Z e d dZ ed5ddZeddZddZddZd6ddZddZeddZdd Zed!d"Zd#d$Zed%d&Zd'd(Zd)d*Zed+Zed,Zed-Zed.Zed/Zed0Z d1d2Z!d3d4Z"dS)7 CTypesData __weakref__zcGstd|jfdS)Nzcannot instantiate %r) TypeError __class__)selfargsrrr__init__szCTypesData.__init__cCstd|jfdS)Nz+expected a pointer or array ctype, got '%s')r _get_c_name)clsinitrrr_newpszCTypesData._newpcCstdS)N)r)valuerrr _to_ctypesszCTypesData._to_ctypesc Gs^y |j}Wn"tk r,td|fYnX|rR|j|}t||sZ|j|}n|j}|S)Nzcannot create an instance of %r)_ctypeAttributeErrorrr isinstance)rrctyperesrrr_arg_to_ctypes s    zCTypesData._arg_to_ctypescCs|dkr|jS|j|SdS)N)r )rrrrr_create_ctype_obj.szCTypesData._create_ctype_objcCstdS)N)r)Z ctypes_valuerrr _from_ctypes5szCTypesData._from_ctypescCs|jjd|S)Nz &) _reftypenamereplace)r replace_withrrrr9szCTypesData._get_c_namecCs*d|jf|_d|jf|_d|_dS)Nz CData<%s>ffi)rr r r )rrrr _fix_class=szCTypesData._fix_classcCstdS)N)NotImplementedError)rrrr _get_own_reprCszCTypesData._get_own_reprcCs8|dkr dS|dkr,|ddtjtj>7}d|SdS)NrZNULLrz0x%x)ctypessizeofc_void_p)raddressrrr _addr_reprFs zCTypesData._addr_reprNcCs|j}d|p|j|fS)Nz )r*r)rc_nameZownrrr__repr__NszCTypesData.__repr__cCs8|dkrtd|jfntd|j|jfdS)Nzcannot convert %r to an addresszcannot convert %r to %r)rr)rBClassrrr_convert_to_addressRs zCTypesData._convert_to_addresscCs tj|jS)N)r,r-r)rrrr _get_sizeZszCTypesData._get_sizecCs tj|jS)N)r,r-r)rrrr_get_size_of_instance^sz CTypesData._get_size_of_instancecCstd|jfdS)Nzcannot cast to %r)rr)rsourcerrr _cast_fromaszCTypesData._cast_fromcCs |jdS)N)r4)rrrr_cast_to_integereszCTypesData._cast_to_integercCs tj|jS)N)r,Z alignmentr)rrrr _alignmenthszCTypesData._alignmentcCstd|jdS)Nz#cdata %r does not support iteration)rr)rrrr__iter__lszCTypesData.__iter__cs tt|fdd}||_|S)Ncszt|t }t|to t|t }|r@|r@|jd|jdS|sH|rLtSt|tr\|j}t|trl|j}||SdS)N)rCTypesGenericPrimitiverr4NotImplemented_value)rotherZv_is_ptrZw_is_ptr)cmpfuncrrcmprs       z!CTypesData._make_cmp..cmp)getattroperatorZ func_name)namerAr)r@r _make_cmpps  zCTypesData._make_cmp__eq____ne____lt____le____gt____ge__cCst|jdS)N)hashr4)rrrr__hash__szCTypesData.__hash__cCstd|fdS)Nz string(): %r)r)rmaxlenrrr _to_stringszCTypesData._to_string)r#)N)#r r r r Z __metaclass__ __slots__r classmethodr staticmethodrr r!r"rr(r*r0r2r4r5r6r8r9r:r;rErFrGrHrIrJrKrMrOrrrrrs>           rc@s eZdZgZddZddZdS)r<cCs t|jS)N)rLr>)rrrrrMszCTypesGenericPrimitive.__hash__cCst|j|jS)N)reprr"r>)rrrrr*sz$CTypesGenericPrimitive._get_own_reprN)r r r rPrMr*rrrrr<sr<c@s,eZdZgZeddZddZddZdS)CTypesGenericArraycCs||S)Nr)rrrrrrszCTypesGenericArray._newpccs$xtt|D]}||VqWdS)N)xrangelen)rirrrr;szCTypesGenericArray.__iter__cCs|jtj|jS)N)r0r, addressof_blob)rrrrr*sz CTypesGenericArray._get_own_reprN)r r r rPrQrr;r*rrrrrTs rTc@seZdZddgZdZdZeddZeddZed d Z d d Z d dZ ddZ e Z eddZeddZeddZddZdS)CTypesGenericPtr_address _as_ctype_ptrFpointercCs||S)Nr)rrrrrrszCTypesGenericPtr._newpcCsV|dkrd}n>t|tr"|j}n*t|ttfr6|}ntd|t|jf|j|S)Nrzbad type for cast to %r: %r) rrr9intlongrtyper _new_pointer_at)rr7r/rrrr8s  zCTypesGenericPtr._cast_fromcCs$|j|}||_tj||j|_|S)N)__new__r[r,castrr\)rr/rrrrras z CTypesGenericPtr._new_pointer_atc Cs&y |j|jStk r dSXdS)Nz???)r0r[r)rrrrr*s zCTypesGenericPtr._get_own_reprcCs|jS)N)r[)rrrrr9sz!CTypesGenericPtr._cast_to_integercCs t|jS)N)boolr[)rrrr __nonzero__szCTypesGenericPtr.__nonzero__cCs4t|tstdt|j|j|}tj||jS)Nzunexpected %s object) rrrr`r r4r,rcr)rrr/rrrrs  zCTypesGenericPtr._to_ctypescCstj|tjjpd}|j|S)Nr)r,rcr.rra)r ctypes_ptrr/rrrr"szCTypesGenericPtr._from_ctypescCs|r|j|j|_dS)N)rcontents)rrfrrrr _initializeszCTypesGenericPtr._initializecCs0||jdfks|js|jr |jStj||SdS)N)r_automatic_castsr[rr4)rr3rrrr4sz$CTypesGenericPtr._convert_to_addressN)r r r rPrikindrQrr8rar*r9re__bool__rr"rhr4rrrrrZs     rZc@s\eZdZdgZeddZddZeddZdd Zed d Z ed d Z dddZ dS)CTypesBaseStructOrUnionrYcCstd|fdS)Nz!cannot instantiate opaque type %s)r)rrrrrr!sz)CTypesBaseStructOrUnion._create_ctype_objcCs|jtj|jS)N)r0r,rXrY)rrrrr*sz%CTypesBaseStructOrUnion._get_own_reprcCst|j|jS)N)rBroffset)r fieldnamerrr _offsetofsz!CTypesBaseStructOrUnion._offsetofcCs.t|dd|jkrtj|jStj||SdS)N_BItem)rBrr,rXrYrr4)rr3rrrr4s z+CTypesBaseStructOrUnion._convert_to_addresscCs|j|}||_|S)N)rbrY)rZctypes_struct_or_unionrrrrr"s z$CTypesBaseStructOrUnion._from_ctypescCs|jS)N)rY)rrrrrr sz"CTypesBaseStructOrUnion._to_ctypesNcCstj||p|jdS)Nz &)rr2r)rr1rrrr2 sz CTypesBaseStructOrUnion.__repr__)N) r r r rPrQr!r*ror4r"rr2rrrrrls    rlc@seZdZejejejejejej ej ej ej ej ejejejejdZxfdMD]^ZejeeZeeedde<eejejkreeed <eejejkrLeeed <qLWxtdND]lZejeeZeeedde<eejejkreeed<eeed<eejejkreeed<qWddZddZddZdOddZddZdd Zd!d"Zd#d$Zd%d&Z d'd(Z!d)d*Z"dRd,d-Z#d.d/Z$d0d1Z%d2d3Z&d4d5Z'dTd6d7Z(dVd8d9Z)d:d;Zdd?Z+d@dAZ,dBdCZ-dDZ.dWdEdFZ/e0Z1dGdHZ2dXdIdJZ3dYdKdLZ4dDS)Z CTypesBackend)charshortr^r_z long longz signed charz unsigned charzunsigned shortz unsigned intz unsigned longzunsigned long longfloatdouble_Boolunsigned long long unsigned long unsigned intunsigned short unsigned charzuint%d_tr+Z uintptr_tZsize_t long longr_r^rs signed charzint%d_tZintptr_tZ ptrdiff_tZssize_tcCs d|_d|_tj|_tj|_dS)Nr) RTLD_LAZYRTLD_NOWr, RTLD_GLOBAL RTLD_LOCAL)rrrrr7szCTypesBackend.__init__cCs ||_dS)N)r')rr'rrrset_ffi=szCTypesBackend.set_fficCsttfS)N)rr )rrrr _get_types@szCTypesBackend._get_typesrcCstj||}t||S)N)r,ZCDLL CTypesLibrary)rpathflagscdllrrr load_libraryCs zCTypesBackend.load_librarycCsGdddt}|j|S)Nc@s,eZdZgZdZeddZeddZdS)z/CTypesBackend.new_void_type..CTypesVoidzvoid &cSsdS)Nr)novaluerrrr"Ksz.CTypesVoid._from_ctypescSs |dk rtdt|jfdS)NzNone expected, got %s object)rr`r )rrrrrNsz:CTypesBackend.new_void_type..CTypesVoid._to_ctypesN)r r r rPr$rRr"rrrrr CTypesVoidHs r)rr()rrrrr new_void_typeGs zCTypesBackend.new_void_typecsdkrt|jdkr(d}n<dkr6d}n.dkrDd}ndkrRd }nd }djdkfd d |GfdddtjS)NZwchar_trrrtru signed char unsigned charbytervrdr^rcsjt|tttfrt|}nLt|tr.|j}n8t|trBt|}n$|dkrPd}ntdt |j f|S)Nrzbad type for cast to %r: %r) rr^r_rtrr9rordrr`r )r7)CTypesPrimitiverr_cast_source_to_inths     z=CTypesBackend.new_primitive_type.._cast_source_to_intcseZdZdgZZdZZddZefddZ edksHedkrbe fd d Z d d Z ed kre fdd Z dd Z edkre fdd Z dd Z edkre fdd Z dd Z ddZ e Zedksedksed krefddZedkr efddZddZnddZeZedkrFefddZedd Zefd!d"Zedkrtd#d$Zedkrd%d$Zd&S)'z9CTypesBackend.new_primitive_type..CTypesPrimitiver>z%s &cSs ||_dS)N)r>)rrrrrr}szBCTypesBackend.new_primitive_type..CTypesPrimitive.__init__cs|dkrSj|S)N)r)r)rrrrr!szKCTypesBackend.new_primitive_type..CTypesPrimitive._create_ctype_objr^rcs|}|j}||S)N)r)rr7)rrrrr8s zDCTypesBackend.new_primitive_type..CTypesPrimitive._cast_fromcSs|jS)N)r>)rrrr__int__szACTypesBackend.new_primitive_type..CTypesPrimitive.__int__rdcs$t|tttfs|}|t|S)N)rr^r_rtrd)rr7)rrrr8scSs|jS)N)r>)rrrrrsrrcs|}t|d@}||S)N)bytechr)rr7)rrrr8s cSs t|jS)N)rr>)rrrrrsrtcsNt|tr n0t|tr4t|dr*t|}q)rrrrrscSs|jS)N)r>)rrrrrszCCTypesBackend.new_primitive_type..CTypesPrimitive.__float__csnt|ttfs4t|tr"t|}ntdt|j|j|krj r^|dkr^tdn td|S)Nzinteger expected, got %srz%s: negative integerz%s: integer out of bounds) rr^r_rrr`r r OverflowError)x)r is_signedrDrrrs  zDCTypesBackend.new_primitive_type..CTypesPrimitive._to_ctypescs@t|trt|dkr|St|r*|jStdt|jdS)Nrzcharacter expected, got %s)rrrVr>rr`r )r)rrrrs  cSst|jdkS)Nr)rr>)rrrrreszECTypesBackend.new_primitive_type..CTypesPrimitive.__nonzero__cSs |jdkS)Nr)r>)rrrrrescs.t|ttttfs$tdt|j|jS)Nzfloat expected, got %s) rr^r_rtrrr`r r)r)rrrrscSs t|d|S)Nr)rB)rrrrr"szFCTypesBackend.new_primitive_type..CTypesPrimitive._from_ctypescsj||_dS)N)rr)blobr)rrrrhszECTypesBackend.new_primitive_type..CTypesPrimitive._initializecSs|jS)N)r>)rrNrrrrOszDCTypesBackend.new_primitive_type..CTypesPrimitive._to_stringcSst|jd@S)Nr)chrr>)rrNrrrrOsN)r r r rPrr$rjrrRr!rQr8rrr9rrerkr"rhrOr)rrrrkind1rDrrrwsF       r)rtru)rrr)r)PRIMITIVE_TYPESrr<r()rrDrjr)rrrrrrDrnew_primitive_typeWs$  wz CTypesBackend.new_primitive_typecs|jj}|tjdkr dn>|tjd|tjdfkrFdn|tjkrZdndGfdd d t|jjtjks|jjtjdkrd _jS) Nrrcharpz signed charz unsigned charbytepvoidpgenericcseZdZdgZdkr edg7ZZedrHejjZej jZ nej Ze e rdjdZn jdZfddZd d Zd d Zfd dZfddZdksdkrefddZdks֔dkrddZfddZZS)z1CTypesBackend.new_pointer_type..CTypesPtr_ownrZ __as_strbufrz(* &)z * &csbj|}dkr8tj|jd|_tj|j|j|_n tj||_tj|jtj j|_ d|_ dS)NrT) r!r,Zcreate_string_bufferrZ_CTypesPtr__as_strbufrcrr\r]r.r[r)rrZctypeobj)BItemrjrrr s   z:CTypesBackend.new_pointer_type..CTypesPtr.__init__cSs,t|ttfr$|j|j||jStSdS)N)rr^r_rar[ _bitem_sizer=)rr?rrr__add__sz9CTypesBackend.new_pointer_type..CTypesPtr.__add__cSsNt|ttfr$|j|j||jSt|t|krF|j|j|jStSdS)N)rr^r_rar[rr`r=)rr?rrr__sub__ s z9CTypesBackend.new_pointer_type..CTypesPtr.__sub__cs(t|ddr|dkrtj|j|S)NrFr)rB IndexErrorr"r\)rindex)rrr __getitem__)sz=CTypesBackend.new_pointer_type..CTypesPtr.__getitem__csj||j|<dS)N)rr\)rrr)rrr __setitem__.sz=CTypesBackend.new_pointer_type..CTypesPtr.__setitem__rcs4|r t|dtr tj|dSt|j|SdS)Nr)rrr,Zc_char_psuperr )rr) CTypesPtrrrrr 2sz@CTypesBackend.new_pointer_type..CTypesPtr._arg_to_ctypesrcsf|dkrtj}tj|jtjtjd}x ||krH|dkrH|d7}q*Wdjfddt|DS)Nrrrcsg|] }|qSrr).0rW)prr BszPCTypesBackend.new_pointer_type..CTypesPtr._to_string..) sysmaxsizer,rcr\POINTERc_charjoinrange)rrNnr)rrrO:s z.CTypesPtr._to_stringcs.t|ddr dtj|jjfSt|jS)NrFzowning %d bytes)rBr,r-r\rgrr*)r)rrrrr*Ds z?CTypesBackend.new_pointer_type..CTypesPtr._get_own_repr)r r r rPrprr,rrr-rr. issubclassrTrr$rrrrrrQr rOr* __classcell__r)rrrj)rrrs*          rT)r'_get_cached_btyper PrimitiveTypeZ void_typerZrir()rrgetbtyper)rrrjrnew_pointer_typesMzCTypesBackend.new_pointer_typecsdkrdndj|jj}|tjdkr.CTypesArrayrYrNrcsdkr\t|ttfr |}d}n0dkr@t|tr@t|d}nt|}t|}j||_|j|_d|_|dk r|j |j|dS)NrrrT) rr^r_rrVtuplerrYrrh)rrZlen1)rrjlengthrrrjs  z:CTypesBackend.new_array_type..CTypesArray.__init__csttr&fddttDnttt|krFtdtj|tjj }tj j }tj j }x6t D]*\}}tj||||}j|j|qxWdS)Ncsg|]}||dqS)rr)rrW)rrrr}szQCTypesBackend.new_array_type..CTypesArray._initialize..ztoo many initializers)rrrrVrrr,rcr.rrrr- enumeraterhrg)rraddrPTRitemsizerWrr)r)rrrhzs   z=CTypesBackend.new_array_type..CTypesArray._initializecSs t|jS)N)rVrY)rrrr__len__sz9CTypesBackend.new_array_type..CTypesArray.__len__cs2d|kot|jkns"tj|j|S)Nr)rVrYrr")rr)rrrrsz=CTypesBackend.new_array_type..CTypesArray.__getitem__cs6d|kot|jkns"tj||j|<dS)Nr)rVrYrr)rrr)rrrrsz=CTypesBackend.new_array_type..CTypesArray.__setitem__rrrcsj|dkrt|j}tj|jtjtjd}x ||krL|dkrL|d7}q.Wdjfddt|DS)Nrrrrcsg|] }|qSrr)rrW)rrrrszPCTypesBackend.new_array_type..CTypesArray._to_string..)rVrYr,rcrrrr)rrNrr)rrrOs  z.CTypesArray._to_stringcs,t|ddrdtj|jfSt|jS)NrFzowning %d bytes)rBr,r-rYrr*)r) CTypesArrayrrrr*s z?CTypesBackend.new_array_type..CTypesArray._get_own_reprcs.|dfks|jrtj|jStj||SdS)N)rir,rXrYrr4)rr3)rrrr4s zECTypesBackend.new_array_type..CTypesArray._convert_to_addresscsj}||_|S)N)rbrY)Z ctypes_arrayr)rrrr"s z>CTypesBackend.new_array_type..CTypesArray._from_ctypescs j|S)N)r )r)rrrr sz@CTypesBackend.new_array_type..CTypesArray._arg_to_ctypescs8t|ttfr0jtj|j|tjjSt SdS)N) rr^r_rar,rXrYr-rr=)rr?)rrrrrs  z9CTypesBackend.new_array_type..CTypesArray.__add__cSstd|jfdS)Nz casting to %r)r)r)rr7rrrr8sz.CTypesArray._cast_from)r r r rPrappendrr$_declared_length_CTPtrrrRrhrrrrOr*r4r"r rrQr8rr)rrrbracketsrjr)rrr`s(       r)rpr'rrrrTr()rrrrr)rrrrrjrrnew_array_typeQsczCTypesBackend.new_array_typecsFGddd|d|f_|Gfdddt}|j|S)Nc@s eZdZdS)z;CTypesBackend._new_struct_or_union..struct_or_unionN)r r r rrrrstruct_or_unionsrz%s_%scs(eZdZdgZZdfZZZdS)z?CTypesBackend._new_struct_or_union..CTypesStructOrUnionrYz%s &N)r r r rPrr$_kindrjr)rrDrrrCTypesStructOrUnions r)r rlr()rrjrDZbase_ctypes_classrr)rrDrr_new_struct_or_unions z"CTypesBackend._new_struct_or_unioncCs|jd|tjS)Nstruct)rr,Z Structure)rrDrrrnew_struct_typeszCTypesBackend.new_struct_typecCs|jd|tjS)Nunion)rr,ZUnion)rrDrrrnew_union_typeszCTypesBackend.new_union_typercsP|dks|dkrtdjdd|Ddd|D}dd|D}i} g} xN|D]F\} } } | dkr| j| | jf| | | <qV| j| | j| ft| | <qVW|d@rd_| _| _tfd d }|_fd d j d kt t t ||x|D]\} } } | dkr$tdt | r.cSsg|]\}}}|qSrr)rrrrrrrrscSsg|]\}}}|qSrr)rrrrrrrrsr+rcs}|dk r|||S)Nr)rresult) initializerrrr!s zACTypesBackend.complete_struct_or_union.._create_ctype_objc sr"t|dkr"tdt|ft|tsxt|ttfrBtdt|}t|tkrjtdjtt |}t j |}xd|j D]X\}}|\}}|dkst dj|}t j|j}t j|||} |j| j|qWdS)NrzPunion initializer: %d items given, but only one supported (use a dict if needed)zunion initializer: got a strz"too many values for %s initializerrz,not implemented: initializer with bit fields)rV ValueErrorrdictrunicoderrrzipr,rXitemsAssertionErrorrorrrcrhrg) rrrrrrrrmrr)rfnamesis_unionname2fieldtyperrrs*        z:CTypesBackend.complete_struct_or_union..initializerr#znested anonymous structs/unionsz1the field name %r conflicts in the ctypes backendcSs(tj|j}tj|||}|j|jS)N)r,rXrYrcr"rg)rrrrmrrrrrrgetters z6CTypesBackend.complete_struct_or_union..gettercSst|j||j|dS)N)setattrrYr)rrrrrrrsetter$sz6CTypesBackend.complete_struct_or_union..settercSs&tj|j}tj|||}|j|S)N)r,rXrYrcr")rrZ BFieldPtrrmrrrrrrr*s cSs|jt|j|S)N)r"rBrY)rrrrrrr2scSsN|j|}t|j|}t|j|||t|j|krJt|j||tddS)Nzvalue too large for bitfield)rrBrYrr)rrrrZoldvaluerrrr4s   cSst|d|S)Nr)rB)rrrrrrCscSst|d||dS)Nr)r)rrrrrrrEs)r)rrEllipsisZ_pack_Z_fields_ _bfield_typesrRr!rrrrrror,rrrTrrrpropertyr'rrZ PointerType)rrZfieldstpZ totalsizeZtotalalignmentZsflagsZbtypesZ bitfieldsZ bfield_typesZcfieldsrrrr!rrrr)rrrrrrrcomplete_struct_or_unionsf            z&CTypesBackend.complete_struct_or_unioncsNddDrjddjGfdddtjS)NcSsg|] }|jqSr)r)rBArgrrrrJsz3CTypesBackend.new_function_type..z...z, cseZdZddgZejeddfddDddiZjd fZ dfd d Z e d d Z ddZ fddZfddZZS)z:CTypesBackend.new_function_type..CTypesFunctionPtr _own_callback_namerNcSsg|] }|jqSr)r)rrrrrrRszECTypesBackend.new_function_type..CTypesFunctionPtr. use_errnoTz (* &)(%s)csddl stdtdddk r8jjndfdd}ttr~tjtj fddDdd i}nj }|||_ tj |j tj j |_|_dS) Nrz#varargs not supported for callbacksrc sg}x&t|D]\}}|j|j|qWy|}j|}Wnj}YnXttr|r|tj|tj j }nd}|S)N) rrr"r print_excrrZr,rcr.r)rZargs2argrZres2)BArgsBResulterrorr tracebackrrcallback_s  zUCTypesBackend.new_function_type..CTypesFunctionPtr.__init__..callbackcSsg|] }|jqSr)r)rrrrrrvszWCTypesBackend.new_function_type..CTypesFunctionPtr.__init__..rT)rrrBr"r!rrZr, CFUNCTYPEr.rr\rcrr[r)rrrrZcallback_ctype)rrCTypesFunctionPtr has_varargs)rrrrrVs"    zCCTypesBackend.new_function_type..CTypesFunctionPtr.__init__cSs|r tddS)NzActypes backend: not supported: initializers for function pointers)r))rfrrrrrhszFCTypesBackend.new_function_type..CTypesFunctionPtr._initializecSsPt|dd}|rD|jjd}|j|ddkr6d|}|jjd|}tj||S)Nrz(* &)rz )* )rBr$rr%rr2)rr1rWrrrr2s  zCCTypesBackend.new_function_type..CTypesFunctionPtr.__repr__cs*t|dddk rd|jfSt|jS)Nrz calling %r)rBrrr*)r)rrrrr*s zHCTypesBackend.new_function_type..CTypesFunctionPtr._get_own_reprcsr:t|tkst|td}|dt}nt|tksNtg}x&t|D]\}}|j|j|q^Wrxjt|D]^\}}|dkr|jtjdqt|t st ddt|t |j f|j|j|qW|j |}j|S)NrzKargument %d passed in the variadic part needs to be a cdata object (got %s)r)rVrrrr rr,r.rrrr`r r\r")rrZ extraargsZ ctypes_argsrrrWr)rrrrr__call__s(  zCCTypesBackend.new_function_type..CTypesFunctionPtr.__call__)N)r r r rPr,rrBrrr$rrRrhr2r*rrr)rrrrnameargs)rrrOs)  r)rrrZr()rrrrr)rrrrrrnew_function_typeIs  \zCTypesBackend.new_function_typecsFttstttt|t|Gfddd|}|j|S)Ncs0eZdZgZdZfddZfddZdS)z/CTypesBackend.new_enum_type..CTypesEnumz%s &c s4|j}yd||fStk r.t|SXdS)Nz%d: %s)r>KeyErrorstr)rr)reverse_mappingrrr*s z=CTypesBackend.new_enum_type..CTypesEnum._get_own_reprc s,|j}y|Stk r&t|SXdS)N)r>rr)rrNr)rrrrOs z:CTypesBackend.new_enum_type..CTypesEnum._to_stringN)r r r rPr$r*rOr)rDrrr CTypesEnums r)rrrrrreversedr()rrDZ enumeratorsZ enumvaluesZ CTypesIntrr)rDrr new_enum_types   zCTypesBackend.new_enum_typecCstjS)N)r, get_errno)rrrrrszCTypesBackend.get_errnocCstj|dS)N)r, set_errno)rrrrrrszCTypesBackend.set_errnocCs |j|S)N)rO)rbrNrrrstringszCTypesBackend.stringcCs tddS)Nzbuffer() with ctypes backend)r))rZbptrsizerrrbufferszCTypesBackend.buffercCs,t|tr|jSt|ts t|jSdS)N)rrr6rrr5)rZcdata_or_BTyperrrr-s zCTypesBackend.sizeofcCst|tst|jS)N)rrrr:)rBTyperrralignofszCTypesBackend.alignofcCst|tst|j|S)N)rrrr)rr r7rrrnewps zCTypesBackend.newpcCs |j|S)N)r8)rr r7rrrrcszCTypesBackend.castcCs|dks t|||S)N)r)rr r7ronerrorrrrrs zCTypesBackend.callbackNc s|jdkr.ddl}Gddd|j}i|f|_|j\}|dkrpy||=Wntk rjtdYnXdSfdd}|j|j||}||k st||f|||<|S)Nrc@s$eZdZddZddZddZdS)z CTypesBackend.gcp..MyRefcSs |}||kp|dk o||kS)Nr)rr?ZmyrefrrrrFsz'CTypesBackend.gcp..MyRef.__eq__cSs ||k S)Nr)rr?rrrrGsz'CTypesBackend.gcp..MyRef.__ne__c Ss.y|jStk r(t||_|jSXdS)N)_hashrrL)rrrrrMs  z)CTypesBackend.gcp..MyRef.__hash__N)r r r rFrGrMrrrrMyRefsrzFCan remove destructor only on a object previously returned by ffi.gc()cs$j|d\}}|dk r ||dS)N)NN)pop)kcdata destructor) weak_cacherrremovesz!CTypesBackend.gcp..remove)_weakref_cache_refweakrefrefrrrctypeofr)rrrrrrrZ new_cdatar)rrgcps      zCTypesBackend.gcpcCs |j|S)N)r)rr r&rrrgetcnameszCTypesBackend.getcnamecCst|tr\|dkr"t|tr"|j}t|ts4td|j|}|tkrNtd||j |fSt|t t frt|t rz|j }t|tstd|j}|j|}|tjkrt||fStt|dS)Nrz expected a struct or union ctypeznot supported for bitfieldszexpected an array or ptr ctype)rrrrZrprlrrrror^r_rTrr5rrrr`)rr rnrrrrmrrr typeoffsetofs(       zCTypesBackend.typeoffsetofcCst|tr tjt|j|}n^t|tr\|dksDtt|jt rLt dt|j|}n"t|t rvt|j|}nt d|rtj tj tj |tj j |t|}|j|S)Nzunexpected cdata typez$expected a )rrlr,r]r`rrZrrprrTrcr.rr")rZBTypePtrrrmZptrrrr rawaddressof.s     zCTypesBackend.rawaddressof)rwrxryrzr{)r|r_r^rsr})rrr)rrrr)rr)r)r)r)N)5r r r r,rZc_shortZc_intZc_longZ c_longlongZc_byteZc_ubyteZc_ushortZc_uintZc_ulongZ c_ulonglongZc_floatZc_doubleZc_boolrrr-Z_sizer.Zc_size_trrrrrrrrrrrrrrrrrr r r rcrrrr`rrrrrrrrrqsx      `u le   % rqc@s,eZdZddZddZddZddZd S) rcCs||_||_dS)N)backendr)rrrrrrrDszCTypesLibrary.__init__cCs t|j|}|j|}||_|S)N)rBrr"r)rr rDZc_funcfuncobjrrr load_functionHs  zCTypesLibrary.load_functioncCsJy|jj|j|}Wn*tk r>}zt|WYdd}~XnX|j|S)N)rin_dllrrr)r")rr rD ctypes_objerrr read_variableNs zCTypesLibrary.read_variablecCs@|j|}|jj|j|}tjtj|tj|tj|jdS)N)rrr!rr,ZmemmoverXr-)rr rDrZnew_ctypes_objr"rrrwrite_variableUs   zCTypesLibrary.write_variableN)r r r rr r$r%rrrrrBsr)r)r,Z ctypes.utilrCrr#r version_inforrrrr^r_rrUr`r objectrr<rTrZrlrqrrrrrs,    C#7