[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