[pypy-svn] r13732 - in pypy/dist/pypy/rpython: . test
mwh at codespeak.net
mwh at codespeak.net
Thu Jun 23 19:17:22 CEST 2005
Author: mwh
Date: Thu Jun 23 19:17:21 2005
New Revision: 13732
Modified:
pypy/dist/pypy/rpython/rstr.py
pypy/dist/pypy/rpython/test/test_rstr.py
Log:
rpython string formatting with non-tuple right hand sides.
tests.
(mwh, samuele)
Modified: pypy/dist/pypy/rpython/rstr.py
==============================================================================
--- pypy/dist/pypy/rpython/rstr.py (original)
+++ pypy/dist/pypy/rpython/rstr.py Thu Jun 23 19:17:21 2005
@@ -115,6 +115,9 @@
llfn = ll_stritem
return hop.gendirectcall(llfn, v_str, v_index)
+ def rtype_mod(_, hop):
+ return do_stringformat(hop, [(hop.args_v[1], hop.args_r[1])])
+
class __extend__(pairtype(StringRepr, StringRepr)):
def rtype_add(_, hop):
@@ -155,6 +158,9 @@
return hop.genop('int_gt', [vres, hop.inputconst(Signed, 0)],
resulttype=Bool)
+ def rtype_mod(_, hop):
+ return do_stringformat(hop, [(hop.args_v[1], hop.args_r[1])])
+
def parse_fmt_string(fmt):
# we support x, d, s, [r]
@@ -181,49 +187,59 @@
return r
+def do_stringformat(hop, sourcevarsrepr):
+ s_str = hop.args_s[0]
+ assert s_str.is_constant()
+ s = s_str.const
+ things = parse_fmt_string(s)
+ size = inputconst(Void, len(things))
+ TEMP = GcArray(Ptr(STR))
+ cTEMP = inputconst(Void, TEMP)
+ vtemp = hop.genop("malloc_varsize", [cTEMP, size],
+ resulttype=Ptr(TEMP))
+ r_tuple = hop.args_r[1]
+ v_tuple = hop.args_v[1]
+
+ argsiter = iter(sourcevarsrepr)
+
+ for i, thing in enumerate(things):
+ if isinstance(thing, tuple):
+ code = thing[0]
+ vitem, r_arg = argsiter.next()
+ if code == 's':
+ assert isinstance(r_arg, StringRepr)
+ vchunk = hop.llops.convertvar(vitem, r_arg, string_repr)
+ elif code == 'd':
+ assert isinstance(r_arg, IntegerRepr)
+ vchunk = hop.gendirectcall(rint.ll_int2str, vitem)
+ elif code == 'x':
+ assert isinstance(r_arg, IntegerRepr)
+ vchunk = hop.gendirectcall(rint.ll_int2hex, vitem,
+ inputconst(Bool, False))
+ else:
+ assert 0
+ else:
+ vchunk = inputconst(string_repr, thing)
+ i = inputconst(Signed, i)
+ hop.genop('setarrayitem', [vtemp, i, vchunk])
+
+ return hop.gendirectcall(ll_join, inputconst(string_repr, ""), vtemp)
+
class __extend__(pairtype(StringRepr, TupleRepr)):
def rtype_mod(_, hop):
- s_str = hop.args_s[0]
- assert s_str.is_constant()
- s = s_str.const
- things = parse_fmt_string(s)
- size = inputconst(Void, len(things))
- TEMP = GcArray(Ptr(STR))
- cTEMP = inputconst(Void, TEMP)
- vtemp = hop.genop("malloc_varsize", [cTEMP, size],
- resulttype=Ptr(TEMP))
r_tuple = hop.args_r[1]
v_tuple = hop.args_v[1]
-
- argsiter = iter(enumerate(r_tuple.items_r))
- for i, thing in enumerate(things):
- if isinstance(thing, tuple):
- code = thing[0]
- argi, r_arg = argsiter.next()
- fname = r_tuple.fieldnames[argi]
- cname = hop.inputconst(Void, fname)
- vitem = hop.genop("getfield", [v_tuple, cname],
- resulttype=r_arg.lowleveltype)
- if code == 's':
- assert isinstance(r_arg, StringRepr)
- vchunk = hop.llops.convertvar(vitem, r_arg, string_repr)
- elif code == 'd':
- assert isinstance(r_arg, IntegerRepr)
- vchunk = hop.gendirectcall(rint.ll_int2str, vitem)
- elif code == 'x':
- assert isinstance(r_arg, IntegerRepr)
- vchunk = hop.gendirectcall(rint.ll_int2hex, vitem,
- inputconst(Bool, False))
- else:
- assert 0
- else:
- vchunk = inputconst(string_repr, thing)
- i = inputconst(Signed, i)
- hop.genop('setarrayitem', [vtemp, i, vchunk])
- return hop.gendirectcall(ll_join, inputconst(string_repr, ""), vtemp)
-
+ sourcevars = []
+ for fname, r_arg in zip(r_tuple.fieldnames, r_tuple.items_r):
+ cname = hop.inputconst(Void, fname)
+ vitem = hop.genop("getfield", [v_tuple, cname],
+ resulttype=r_arg)
+ sourcevars.append((vitem, r_arg))
+
+ return do_stringformat(hop, sourcevars)
+
class __extend__(CharRepr):
Modified: pypy/dist/pypy/rpython/test/test_rstr.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rstr.py (original)
+++ pypy/dist/pypy/rpython/test/test_rstr.py Thu Jun 23 19:17:21 2005
@@ -224,4 +224,15 @@
assert ''.join(res.chars) == moreThanOne(*args)
-
+def test_strformat_nontuple():
+ def percentD(i):
+ return "before %d after" % i
+
+ res = interpret(percentD, [1])
+ assert ''.join(res.chars) == 'before 1 after'
+
+ def percentS(i):
+ return "before %s after" % i
+
+ res = interpret(percentS, ['D'])
+ assert ''.join(res.chars) == 'before D after'
More information about the Pypy-commit
mailing list