[pypy-svn] r15452 - in pypy/dist/pypy/lib: _stablecompiler test2

arigo at codespeak.net arigo at codespeak.net
Sun Jul 31 11:53:40 CEST 2005


Author: arigo
Date: Sun Jul 31 11:53:37 2005
New Revision: 15452

Added:
   pypy/dist/pypy/lib/test2/test_stablecompiler.py   (contents, props changed)
Modified:
   pypy/dist/pypy/lib/_stablecompiler/transformer.py
Log:
Decoding numeric literals needs more care and some tests...


Modified: pypy/dist/pypy/lib/_stablecompiler/transformer.py
==============================================================================
--- pypy/dist/pypy/lib/_stablecompiler/transformer.py	(original)
+++ pypy/dist/pypy/lib/_stablecompiler/transformer.py	Sun Jul 31 11:53:37 2005
@@ -714,14 +714,7 @@
     def atom_number(self, nodelist):
         ### need to verify this matches compile.c
         s = nodelist[0][1]
-        if 'j' in s or 'J' in s:
-            k = complex(s)
-        elif '.' in s or 'e' in s or 'E' in s:
-            k = float(s)
-        elif 'l' in s or 'L' in s:
-            k = long(s)
-        else:
-            k = int(s)
+        k = decode_numeric_literal(s)
         return Const(k, lineno=nodelist[0][2])
 
     def decode_literal(self, lit):
@@ -1437,3 +1430,23 @@
         else:
             l.append(debug_tree(elt))
     return l
+
+
+def decode_numeric_literal(s):
+    base = 10
+    if len(s) >= 2 and s[0] == '0':
+        if s[1] in ('x', 'X'):
+            if s[-1] in ('l', 'L'):
+                return long(s[2:], 16)
+            else:
+                return int(s[2:], 16)
+        else:
+            base = 8
+    if s[-1] in ('j', 'J'):
+        return complex(s)
+    if '.' in s or 'e' in s or 'E' in s:
+        return float(s)
+    if s[-1] in ('l', 'L'):
+        return long(s, base)
+    else:
+        return int(s, base)

Added: pypy/dist/pypy/lib/test2/test_stablecompiler.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lib/test2/test_stablecompiler.py	Sun Jul 31 11:53:37 2005
@@ -0,0 +1,73 @@
+import autopath
+from pypy.lib._stablecompiler.transformer import decode_numeric_literal
+
+
+def test_decode_numeric_literal():
+    # decimal integer
+    numeric_decode('0', 0)
+    numeric_decode('1', 1)
+    numeric_decode('9', 9)
+    numeric_decode('10', 10)
+    numeric_decode('2117', 2117)
+    # octal integer
+    numeric_decode('03', 3)
+    numeric_decode('010', 8)
+    numeric_decode('002117', 1103)
+    # hexadecimal integer
+    numeric_decode('0x0', 0)
+    numeric_decode('0XE', 14)
+    numeric_decode('0x002117', 8471)
+    # decimal long
+    numeric_decode('0l', 0L)
+    numeric_decode('1L', 1L)
+    numeric_decode('9l', 9L)
+    numeric_decode('10L', 10L)
+    numeric_decode('2117l', 2117L)
+    # octal long
+    numeric_decode('03L', 3L)
+    numeric_decode('010l', 8L)
+    numeric_decode('002117L', 1103L)
+    # hexadecimal long
+    numeric_decode('0x0l', 0L)
+    numeric_decode('0XEL', 14L)
+    numeric_decode('0x002117l', 8471L)
+    # automatic long results for ints that are too large
+    numeric_decode('99999999999999999999999999999999999999999999999999999',
+                    99999999999999999999999999999999999999999999999999999)
+    numeric_decode('0xdeadbeef', int('deadbeef', 16))
+    numeric_decode('01236417564174623643237641763',
+                    01236417564174623643237641763)
+    # floating point
+    numeric_decode('3.25', 3.25)
+    numeric_decode('10.', 10.0)
+    numeric_decode('.015625', 0.015625)
+    numeric_decode('0.015625', 0.015625)
+    numeric_decode('00.015625', 0.015625)
+    numeric_decode('1e100', 1e100)
+    numeric_decode('1.5625E-2', 0.015625)
+    numeric_decode('1.5625e-000000000002', 0.015625)
+    numeric_decode('0e0', 0.0)
+    # imaginary number
+    numeric_decode('0j', 0.0j)
+    numeric_decode('1J', 1.0j)
+    numeric_decode('9j', 9.0j)
+    numeric_decode('10J', 10.0j)
+    numeric_decode('2117j', 2117.0j)
+    numeric_decode('03J', 3.0j)
+    numeric_decode('010j', 10.0j)
+    numeric_decode('002117J', 2117.0j)
+    numeric_decode('3.25j', 3.25j)
+    numeric_decode('10.J', 10.0j)
+    numeric_decode('.015625j', 0.015625j)
+    numeric_decode('0.015625J', 0.015625j)
+    numeric_decode('00.015625j', 0.015625j)
+    numeric_decode('1e100J', 1e100j)
+    numeric_decode('1.5625E-2j', 0.015625j)
+    numeric_decode('1.5625e-000000000002J', 0.015625j)
+    numeric_decode('0e0j', 0.0j)
+
+
+def numeric_decode(string, expected):
+    result = decode_numeric_literal(string)
+    assert result == expected
+    assert type(result) == type(expected)



More information about the Pypy-commit mailing list