[pypy-svn] r15808 - in pypy/dist/pypy: lib module/__builtin__ objspace/std translator

pedronis at codespeak.net pedronis at codespeak.net
Tue Aug 9 13:50:28 CEST 2005


Author: pedronis
Date: Tue Aug  9 13:50:26 2005
New Revision: 15808

Modified:
   pypy/dist/pypy/lib/_formatting.py
   pypy/dist/pypy/module/__builtin__/__init__.py
   pypy/dist/pypy/module/__builtin__/special.py
   pypy/dist/pypy/objspace/std/strutil.py
   pypy/dist/pypy/translator/geninterplevel.py
Log:
do the deed: delegate float->string and string->float to the backend



Modified: pypy/dist/pypy/lib/_formatting.py
==============================================================================
--- pypy/dist/pypy/lib/_formatting.py	(original)
+++ pypy/dist/pypy/lib/_formatting.py	Tue Aug  9 13:50:26 2005
@@ -241,24 +241,31 @@
         r = self._format(v)
         return self.numeric_postprocess(r, sign)
 
+    def _formatd(self, kind, v):
+        fmt = '%' + (self.flags.f_alt and '#' or '') + '.' + str(self.prec) + kind
+        import __builtin__
+        return __builtin__._formatd(fmt, v)
 
 class FloatFFormatter(FloatFormatter):
     def _format(self, v):
         if v/1e25 > 1e25:
             return FloatGFormatter('g', self.flags, self.width,
                                    self.prec, self.value).format()
-        ds, k = flonum2digits(v)
-        digits = self.fDigits(ds, k)
-        if  not self.flags.f_alt:
-            digits = digits.rstrip('.')
-        return digits
+
+        return self._formatd('f', v)
+        #ds, k = flonum2digits(v)
+        #digits = self.fDigits(ds, k)
+        #if  not self.flags.f_alt:
+        #    digits = digits.rstrip('.')
+        #return digits
 
 
 class FloatEFormatter(FloatFormatter):
     def _format(self, v):
-        ds, k = flonum2digits(v)
-        digits = self.eDigits(ds)
-        return "%s%c%+03d"%(digits, self.char, k-1)
+        return self._formatd('e', v)
+        #ds, k = flonum2digits(v)
+        #digits = self.eDigits(ds)
+        #return "%s%c%+03d"%(digits, self.char, k-1)
 
 
 class FloatGFormatter(FloatFormatter):
@@ -267,19 +274,20 @@
     # Gah, this still isn't quite right in the f_alt case.
     # (One has to wonder who might care).
     def _format(self, v):
-        ds, k = flonum2digits(v)
-        ds = ds[:self.prec] # XXX rounding!
-        if -4 < k <= self.prec:
-            digits = self.fDigits(ds, k)
-            if not self.flags.f_alt:
-                digits = digits.rstrip('0').rstrip('.')
-            r = digits
-        else:
-            digits = self.eDigits(ds)
-            if not self.flags.f_alt:
-                digits = digits.rstrip('0').rstrip('.')
-            r = "%se%+03d"%(digits, k-1)
-        return r
+        return self._formatd('g', v)
+        #ds, k = flonum2digits(v)
+        #ds = ds[:self.prec] # XXX rounding!
+        #if -4 < k <= self.prec:
+        #    digits = self.fDigits(ds, k)
+        #    if not self.flags.f_alt:
+        #        digits = digits.rstrip('0').rstrip('.')
+        #    r = digits
+        #else:
+        #    digits = self.eDigits(ds)
+        #    if not self.flags.f_alt:
+        #        digits = digits.rstrip('0').rstrip('.')
+        #    r = "%se%+03d"%(digits, k-1)
+        #return r
 
 
 class HexFormatter(Formatter):

Modified: pypy/dist/pypy/module/__builtin__/__init__.py
==============================================================================
--- pypy/dist/pypy/module/__builtin__/__init__.py	(original)
+++ pypy/dist/pypy/module/__builtin__/__init__.py	Tue Aug  9 13:50:26 2005
@@ -107,6 +107,9 @@
         'eval'          : 'compiling.eval',
 
         '__import__'    : 'importing.importhook',
+
+        # float->string helper
+        '_formatd'      : 'special._formatd'
     }
 
     def pick_builtin(self, w_globals):

Modified: pypy/dist/pypy/module/__builtin__/special.py
==============================================================================
--- pypy/dist/pypy/module/__builtin__/special.py	(original)
+++ pypy/dist/pypy/module/__builtin__/special.py	Tue Aug  9 13:50:26 2005
@@ -1,4 +1,11 @@
+from pypy.interpreter import gateway
+from pypy.rpython import rarithmetic
 
 def _isfake(space, w_obj): 
     return space.wrap(bool(w_obj.typedef.fakedcpytype))
     #return space.wrap(bool(getattr(w_obj.typedef, 'fakedcpytype', None)))
+
+
+def _formatd(space, fmt, x):
+    return space.wrap(rarithmetic.formatd(fmt, x))
+_formatd.unwrap_spec = [gateway.ObjSpace, str, float]

Modified: pypy/dist/pypy/objspace/std/strutil.py
==============================================================================
--- pypy/dist/pypy/objspace/std/strutil.py	(original)
+++ pypy/dist/pypy/objspace/std/strutil.py	Tue Aug  9 13:50:26 2005
@@ -2,7 +2,7 @@
 Pure Python implementation of string utilities.
 """
 
-from pypy.rpython.rarithmetic import r_uint, ovfcheck, ovfcheck_float_to_int
+from pypy.rpython.rarithmetic import r_uint, ovfcheck, ovfcheck_float_to_int, parts_to_float
 
 # XXX factor more functions out of stringobject.py.
 # This module is independent from PyPy.
@@ -376,3 +376,28 @@
         r = -r
 
     return r
+
+disabled_string_to_float = string_to_float # not accurate enough
+
+def string_to_float(s):
+    """
+    Conversion of string to float.
+    This version tries to only raise on invalid literals.
+    Overflows should be converted to infinity whenever possible.
+    """
+
+    s = strip_spaces(s)
+
+    if not s:
+        raise ParseStringError("empty string for float()")
+
+    # 1) parse the string into pieces.
+    sign, before_point, after_point, exponent = break_up_float(s)
+    
+    if not before_point and not after_point:
+        raise ParseStringError("invalid string literal for float()")
+
+    try:
+        return parts_to_float(sign, before_point, after_point, exponent)
+    except ValueError:
+        raise ParseStringError("invalid string literal for float()")

Modified: pypy/dist/pypy/translator/geninterplevel.py
==============================================================================
--- pypy/dist/pypy/translator/geninterplevel.py	(original)
+++ pypy/dist/pypy/translator/geninterplevel.py	Tue Aug  9 13:50:26 2005
@@ -77,7 +77,7 @@
 import pypy # __path__
 import py.path
 
-GI_VERSION = '1.1.8'  # bump this for substantial changes
+GI_VERSION = '1.1.9'  # bump this for substantial changes
 # ____________________________________________________________
 
 try:



More information about the Pypy-commit mailing list