[pypy-svn] r27774 - in pypy/dist/pypy/translator/cli: . src test

antocuni at codespeak.net antocuni at codespeak.net
Sat May 27 21:10:43 CEST 2006


Author: antocuni
Date: Sat May 27 21:10:23 2006
New Revision: 27774

Modified:
   pypy/dist/pypy/translator/cli/cts.py
   pypy/dist/pypy/translator/cli/database.py
   pypy/dist/pypy/translator/cli/metavm.py
   pypy/dist/pypy/translator/cli/src/pypylib.cs
   pypy/dist/pypy/translator/cli/test/runtest.py
   pypy/dist/pypy/translator/cli/test/test_runtest.py
Log:
Added basic string support.



Modified: pypy/dist/pypy/translator/cli/cts.py
==============================================================================
--- pypy/dist/pypy/translator/cli/cts.py	(original)
+++ pypy/dist/pypy/translator/cli/cts.py	Sat May 27 21:10:23 2006
@@ -29,6 +29,7 @@
     ootype.Char: 'char',
     ootype.UniChar: 'char',
     ootype.Class: 'class [mscorlib]System.Type',
+    ootype.String: 'string',
 
     # maps generic types to their ordinal
     ootype.List.SELFTYPE_T: 'class ' + (PYPY_LIST % '!0'),

Modified: pypy/dist/pypy/translator/cli/database.py
==============================================================================
--- pypy/dist/pypy/translator/cli/database.py	(original)
+++ pypy/dist/pypy/translator/cli/database.py	Sat May 27 21:10:23 2006
@@ -132,6 +132,8 @@
             return RecordConst(db, const)
         elif isinstance(const, ootype._list):
             return ListConst(db, const)
+        elif isinstance(const, ootype._string):
+            return StringConst(db, const)
         else:
             assert False, 'Unknown constant: %s' % const
     make = staticmethod(make)
@@ -165,6 +167,27 @@
     def init(self, ilasm):
         pass
 
+class StringConst(AbstractConst):
+    def __init__(self, db, string):
+        self.db = db
+        self.cts = CTS(db)
+        self.string = string
+
+    def __hash__(self):
+        return hash(self.string)
+
+    def __eq__(self, other):
+        return self.string == other.string
+
+    def get_name(self):
+        return 'string_literal'
+
+    def get_type(self, include_class=True):
+        return self.cts.lltype_to_cts(ootype.String, include_class)
+
+    def init(self, ilasm):
+        ilasm.opcode('ldstr', '"%s"' % self.string._str)
+
 class RecordConst(AbstractConst):
     def __init__(self, db, record):
         self.db = db

Modified: pypy/dist/pypy/translator/cli/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/cli/metavm.py	(original)
+++ pypy/dist/pypy/translator/cli/metavm.py	Sat May 27 21:10:23 2006
@@ -73,7 +73,7 @@
         for arg in args: # push parametes
             generator.load(arg)
         generator.call_method(this.concretetype, method_name)
-        
+
 
 class _CallMethod(_Call):
     def render(self, generator, op):

Modified: pypy/dist/pypy/translator/cli/src/pypylib.cs
==============================================================================
--- pypy/dist/pypy/translator/cli/src/pypylib.cs	(original)
+++ pypy/dist/pypy/translator/cli/src/pypylib.cs	Sat May 27 21:10:23 2006
@@ -12,6 +12,8 @@
         public static string ToPython(uint x)   { return x.ToString(); }
         public static string ToPython(long x)   { return x.ToString(); }
         public static string ToPython(ulong x)  { return x.ToString(); }
+        // XXX: it does not support strings containing "'".
+        public static string ToPython(string x) { return string.Format("'{0}'", x); }
 
         public static string ToPython(object obj) 
         { 
@@ -33,7 +35,6 @@
         {
             return t.GetConstructor(new Type[0]).Invoke(new object[0]);
         }
-            
     }
 
     //The public interface List must implement is defined in

Modified: pypy/dist/pypy/translator/cli/test/runtest.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/runtest.py	(original)
+++ pypy/dist/pypy/translator/cli/test/runtest.py	Sat May 27 21:10:23 2006
@@ -34,7 +34,7 @@
         assert res1 == res2
 
 def format_object(TYPE, ilasm):
-    if isinstance(TYPE, (ootype.BuiltinType, ootype.Instance)):
+    if isinstance(TYPE, (ootype.BuiltinType, ootype.Instance)) and TYPE is not ootype.String:
         ilasm.call_method('string object::ToString()', virtual=True)
     elif TYPE is ootype.Void:
         ilasm.opcode('ldstr "None"')
@@ -224,7 +224,7 @@
         assert issubclass(eval(res.class_name), exception)
 
     def ll_to_string(self, s):
-        py.test.skip('ll_to_string not supported, yet')
+        return s
 
     def ll_to_list(self, l):
         return l

Modified: pypy/dist/pypy/translator/cli/test/test_runtest.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/test_runtest.py	(original)
+++ pypy/dist/pypy/translator/cli/test/test_runtest.py	Sat May 27 21:10:23 2006
@@ -31,6 +31,12 @@
             return 1, 2
         assert self.interpret(fn, []) == (1, 2)
 
+    def test_string(self):
+        def fn():
+            return 'foo'
+        res = self.interpret(fn, [])
+        assert self.ll_to_string(res) == 'foo'
+
     def test_exception(self):
         def fn():
             raise ValueError



More information about the Pypy-commit mailing list