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