Author: Alex Gaynor <[email protected]>
Branch: add-statvfs
Changeset: r65566:daa8f7d9b0c2
Date: 2013-07-23 11:04 -0700
http://bitbucket.org/pypy/pypy/changeset/daa8f7d9b0c2/

Log:    Translates!

diff --git a/pypy/module/posix/interp_posix.py 
b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -331,7 +331,7 @@
 @unwrap_spec(fd=c_int)
 def fstatvfs(space, fd):
     try:
-        st = os.fstat(fd)
+        st = os.fstatvfs(fd)
     except OSError as e:
         raise wrap_oserror(space, e)
     else:
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -1703,6 +1703,11 @@
         from rpython.rtyper.module import ll_os_stat
         return ll_os_stat.register_statvfs_variant('fstatvfs', StringTraits())
 
+    @registering_str_unicode(os.statvfs)
+    def register_os_statvfs(self, traits):
+        from rpython.rtyper.module import ll_os_stat
+        return ll_os_stat.register_statvfs_variant('statvfs', traits)
+
 
     # ------------------------------- os.W* ---------------------------------
 
diff --git a/rpython/rtyper/module/ll_os_stat.py 
b/rpython/rtyper/module/ll_os_stat.py
--- a/rpython/rtyper/module/ll_os_stat.py
+++ b/rpython/rtyper/module/ll_os_stat.py
@@ -137,6 +137,7 @@
 
 
 s_StatResult = SomeStatResult()
+s_StatvfsResult = SomeStatvfsResult()
 
 
 def make_stat_result(tup):
@@ -162,6 +163,17 @@
         from rpython.rtyper.module import r_os_stat
         return r_os_stat.specialize_make_stat_result(hop)
 
+
+class MakeStatvfsResultEntry(extregistry.ExtRegistryEntry):
+    _about_ = make_statvfs_result
+
+    def compute_result_annotation(self, s_tup):
+        return s_StatvfsResult
+
+    def specialize_call(self, hop):
+        from rpython.rtyper.module import r_os_stat
+        return r_os_stat.specialize_make_statvfs_result(hop)
+
 # ____________________________________________________________
 #
 # RFFI support
@@ -410,16 +422,11 @@
         ll_tup = lltype.malloc(TP.TO)
         for i, (fieldname, TYPE) in enumerate(STATVFS_FIELDS):
             val = getattr(st, fieldname)
-            if isinstance(TYPE, lltype.Number):
-                rffi.setintfield(ll_tup, 'item%d' % i, int(val))
-            elif TYPE is lltype.Float:
-                setattr(ll_tup, 'item%d' % i, float(val))
-            else:
-                setattr(ll_tup, 'item%d' % i, val)
+            rffi.setintfield(ll_tup, 'item%d' % i, int(val))
         return ll_tup
 
     return extdef(
-        [s_arg], s_StatResult, "ll_os.ll_os_%s" % (name,),
+        [s_arg], s_StatvfsResult, "ll_os.ll_os_%s" % (name,),
         llimpl=posix_statvfs_llimpl, llfakeimpl=posix_fakeimpl
     )
 
diff --git a/rpython/rtyper/module/r_os_stat.py 
b/rpython/rtyper/module/r_os_stat.py
--- a/rpython/rtyper/module/r_os_stat.py
+++ b/rpython/rtyper/module/r_os_stat.py
@@ -67,3 +67,52 @@
     # no-op conversion from r_StatResult.r_tuple to r_StatResult
     hop.exception_cannot_occur()
     return v_result
+
+
+class StatvfsResultRepr(Repr):
+
+    def __init__(self, rtyper):
+        self.rtyper = rtyper
+        self.statvfs_fields = ll_os_stat.STATVFS_FIELDS
+
+        self.statvfs_field_indexes = {}
+        for i, (name, TYPE) in enumerate(self.statvfs_fields):
+            self.statvfs_field_indexes[name] = i
+
+        self.s_tuple = annmodel.SomeTuple([annmodel.lltype_to_annotation(TYPE)
+                                           for name, TYPE in 
self.statvfs_fields])
+        self.r_tuple = rtyper.getrepr(self.s_tuple)
+        self.lowleveltype = self.r_tuple.lowleveltype
+
+    def redispatch_getfield(self, hop, index):
+        rtyper = self.rtyper
+        s_index = rtyper.annotator.bookkeeper.immutablevalue(index)
+        hop2 = hop.copy()
+        hop2.forced_opname = 'getitem'
+        hop2.args_v = [hop2.args_v[0], Constant(index)]
+        hop2.args_s = [self.s_tuple, s_index]
+        hop2.args_r = [self.r_tuple, rtyper.getrepr(s_index)]
+        return hop2.dispatch()
+
+    def rtype_getattr(self, hop):
+        s_attr = hop.args_s[1]
+        attr = s_attr.const
+        try:
+            index = self.statvfs_field_indexes[attr]
+        except KeyError:
+            raise TyperError("os.statvfs().%s: field not available" % (attr,))
+        return self.redispatch_getfield(hop, index)
+
+
+class __extend__(pairtype(StatvfsResultRepr, IntegerRepr)):
+    def rtype_getitem((r_sta, r_int), hop):
+        s_int = hop.args_s[1]
+        index = s_int.const
+        return r_sta.redispatch_getfield(hop, index)
+
+
+def specialize_make_statvfs_result(hop):
+    r_StatvfsResult = hop.rtyper.getrepr(ll_os_stat.s_StatvfsResult)
+    [v_result] = hop.inputargs(r_StatvfsResult.r_tuple)
+    hop.exception_cannot_occur()
+    return v_result
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to