1
from pypy.rpython.rctypes.rmodel import CTypesValueRepr, C_ZERO
2
from pypy.rpython.rctypes.rstringbuf import StringBufRepr
3
from pypy.annotation.pairtype import pairtype
4
from pypy.rpython.rstr import AbstractStringRepr
5
from pypy.rpython.lltypesystem.rstr import string_repr
6
from pypy.rpython.rctypes.rchar_p import CCharPRepr
7
from pypy.rpython.lltypesystem import lltype, llmemory
8
from pypy.rpython.rctypes.rpointer import PointerRepr
9
from pypy.rpython.rctypes.rarray import ArrayRepr
11
class CVoidPRepr(CTypesValueRepr):
12
def convert_const(self, value):
13
if isinstance(value, self.ctype):
14
return super(CVoidPRepr, self).convert_const(value)
15
raise NotImplementedError("XXX constant pointer passed to void* arg")
17
def rtype_getattr(self, hop):
18
s_attr = hop.args_s[1]
19
assert s_attr.is_constant()
20
assert s_attr.const == 'value'
21
v_box = hop.inputarg(self, 0)
22
v_c_adr = self.getvalue(hop.llops, v_box)
23
hop.exception_cannot_occur()
24
return hop.genop('cast_adr_to_int', [v_c_adr],
25
resulttype = lltype.Signed)
28
class __extend__(pairtype(CCharPRepr, CVoidPRepr),
29
pairtype(PointerRepr, CVoidPRepr)):
30
def convert_from_to((r_from, r_to), v, llops):
31
v_ptr = r_from.getvalue(llops, v)
32
v_adr = llops.genop('cast_ptr_to_adr', [v_ptr],
33
resulttype = llmemory.Address)
35
return r_to.return_value(llops, v_adr)
37
class __extend__(pairtype(StringBufRepr, CVoidPRepr),
38
pairtype(ArrayRepr, CVoidPRepr)):
39
def convert_from_to((r_from, r_to), v, llops):
40
v_ptr = r_from.get_c_data_of_item(llops, v, C_ZERO)
41
v_adr = llops.genop('cast_ptr_to_adr', [v_ptr],
42
resulttype = llmemory.Address)
44
return r_to.return_value(llops, v_adr)
46
class __extend__(pairtype(AbstractStringRepr, CVoidPRepr)):
47
def convert_from_to((r_from, r_to), v, llops):
48
# warning: no keepalives, only for short-lived conversions like
50
# r_from could be char_repr: first convert it to string_repr
51
v = llops.convertvar(v, r_from, string_repr)
52
v_adr = llops.gendirectcall(ll_string2addr, v)
53
return r_to.return_value(llops, v_adr)
55
def ll_string2addr(s):
57
ptr = lltype.direct_arrayitems(s.chars)
58
return llmemory.cast_ptr_to_adr(ptr)