[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