~ubuntu-branches/ubuntu/karmic/pypy/karmic

« back to all changes in this revision

Viewing changes to pypy/rpython/rctypes/rvoid_p.py

  • Committer: Bazaar Package Importer
  • Author(s): Alexandre Fayolle
  • Date: 2007-04-13 09:33:09 UTC
  • Revision ID: james.westby@ubuntu.com-20070413093309-yoojh4jcoocu2krz
Tags: upstream-1.0.0
ImportĀ upstreamĀ versionĀ 1.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
10
 
 
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")
 
16
 
 
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)
 
26
 
 
27
 
 
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)
 
34
                            
 
35
        return r_to.return_value(llops, v_adr)
 
36
 
 
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)
 
43
                            
 
44
        return r_to.return_value(llops, v_adr)
 
45
 
 
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
 
49
        # in argument passing
 
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)
 
54
 
 
55
def ll_string2addr(s):
 
56
    if s:
 
57
        ptr = lltype.direct_arrayitems(s.chars)
 
58
        return llmemory.cast_ptr_to_adr(ptr)
 
59
    else:
 
60
        return llmemory.NULL