[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