[pypy-svn] r61853 - in pypy/trunk/pypy/module/_locale: . test

jlg at codespeak.net jlg at codespeak.net
Fri Feb 13 21:59:10 CET 2009


Author: jlg
Date: Fri Feb 13 21:59:10 2009
New Revision: 61853

Modified:
   pypy/trunk/pypy/module/_locale/interp_locale.py
   pypy/trunk/pypy/module/_locale/test/test_locale.py
Log:
(getxsick, jlg) localeconv() implemented, but test_localeconv raises BytecodeCorruption


Modified: pypy/trunk/pypy/module/_locale/interp_locale.py
==============================================================================
--- pypy/trunk/pypy/module/_locale/interp_locale.py	(original)
+++ pypy/trunk/pypy/module/_locale/interp_locale.py	Fri Feb 13 21:59:10 2009
@@ -35,15 +35,15 @@
             ("negative_sign", rffi.CCHARP),     # Sign for negative values.
             ("int_frac_digits", rffi.UCHAR),    # Int'l fractional digits.
 
-            ("frac_digits", rffi.CHAR),        # Local fractional digits.
+            ("frac_digits", rffi.UCHAR),        # Local fractional digits.
             ## 1 if currency_symbol precedes a positive value, 0 if succeeds.
-            ("p_cs_precedes", rffi.CHAR),
+            ("p_cs_precedes", rffi.UCHAR),
             ## 1 iff a space separates currency_symbol from a positive value.
-            ("p_sep_by_space", rffi.CHAR),
+            ("p_sep_by_space", rffi.UCHAR),
             ## 1 if currency_symbol precedes a negative value, 0 if succeeds.
-            ("n_cs_precedes", rffi.CHAR),
+            ("n_cs_precedes", rffi.UCHAR),
             ## 1 iff a space separates currency_symbol from a negative value.
-            ("n_sep_by_space", rffi.CHAR),
+            ("n_sep_by_space", rffi.UCHAR),
 
             ## Positive and negative sign positions:
             ## 0 Parentheses surround the quantity and currency_symbol.
@@ -51,8 +51,8 @@
             ## 2 The sign string follows the quantity and currency_symbol.
             ## 3 The sign string immediately precedes the currency_symbol.
             ## 4 The sign string immediately follows the currency_symbol.
-            ("p_sign_posn", rffi.CHAR),
-            ("n_sign_posn", rffi.CHAR),
+            ("p_sign_posn", rffi.UCHAR),
+            ("n_sign_posn", rffi.UCHAR),
             ])
 
 
@@ -128,32 +128,36 @@
 _lconv = lltype.Ptr(cConfig.lconv)
 _localeconv = external('localeconv', [], _lconv)
 
+def _copy_grouping(text):
+    groups = [ ord(group) for group in text ]
+    if groups:
+        groups.append(0)
+    return groups
+
 def localeconv(space):
+    "() -> dict. Returns numeric and monetary locale-specific parameters."
     lp = _localeconv()
 
-    # hopefully, the localeconv result survives the C library calls
-    # involved herein
-
     # Numeric information
     result = {
         "decimal_point": rffi.charp2str(lp.c_decimal_point),
-        #"thousands_sep": rffi.getintfield(lp, "c_thousands_sep"),
-        #"grouping": rffi.getintfield(lp, "c_grouping"), #_copy_grouping(l.grouping)),
-        #"int_curr_symbol": rffi.getintfield(lp, "c_int_curr_symbol"),
-        #"currency_symbol": rffi.getintfield(lp, "c_currency_symbol"),
-        #"mon_decimal_point": rffi.getintfield(lp, "c_mon_decimal_point"),
-        #"mon_thousands_sep": rffi.getintfield(lp, "c_mon_thousands_sep"),
-        #"mon_grouping": rffi.getintfield(lp, "c_mon_grouping"), #_copy_grouping(l.mon_grouping)),
-        #"positive_sign": rffi.getintfield(lp, "c_positive_sign"),
-        #"negative_sign": rffi.getintfield(lp, "c_negative_sign"),
-        #"int_frac_digits": rffi.getintfield(lp, "c_int_frac_digits"),
-        #"frac_digits": rffi.getintfield(lp, "c_frac_digits"),
-        #"p_cs_precedes": rffi.getintfield(lp, "c_p_cs_precedes"),
-        #"p_sep_by_space": rffi.getintfield(lp, "c_p_sep_by_space"),
-        #"n_cs_precedes": rffi.getintfield(lp, "c_n_cs_precedes"),
-        #"n_sep_by_space": rffi.getintfield(lp, "c_n_sep_by_space"),
-        #"p_sign_posn": rffi.getintfield(lp, "c_p_sign_posn"),
-        #"n_sign_posn": rffi.getintfield(lp, "c_n_sign_posn"),
+        "thousands_sep": rffi.charp2str(lp.c_thousands_sep),
+        "grouping": _copy_grouping(rffi.charp2str(lp.c_grouping)), # XXX
+        "int_curr_symbol": rffi.charp2str(lp.c_int_curr_symbol),
+        "currency_symbol": rffi.charp2str(lp.c_currency_symbol),
+        "mon_decimal_point": rffi.charp2str(lp.c_mon_decimal_point),
+        "mon_thousands_sep": rffi.charp2str(lp.c_mon_thousands_sep),
+        "mon_grouping": _copy_grouping(rffi.charp2str(lp.c_mon_grouping)), # XXX
+        "positive_sign": rffi.charp2str(lp.c_positive_sign),
+        "negative_sign": rffi.charp2str(lp.c_negative_sign),
+        "int_frac_digits": lp.c_int_frac_digits,
+        "frac_digits": lp.c_frac_digits,
+        "p_cs_precedes": lp.c_p_cs_precedes,
+        "p_sep_by_space": lp.c_p_sep_by_space,
+        "n_cs_precedes": lp.c_n_cs_precedes,
+        "n_sep_by_space": lp.c_n_sep_by_space,
+        "p_sign_posn": lp.c_p_sign_posn,
+        "n_sign_posn": lp.c_n_sign_posn,
     }
     return space.wrap(result)
 

Modified: pypy/trunk/pypy/module/_locale/test/test_locale.py
==============================================================================
--- pypy/trunk/pypy/module/_locale/test/test_locale.py	(original)
+++ pypy/trunk/pypy/module/_locale/test/test_locale.py	Fri Feb 13 21:59:10 2009
@@ -63,6 +63,36 @@
         assert string.lowercase != lcase
         assert string.uppercase != ucase
 
+    def test_localeconv(self):
+        skip("raise BytecodeCorruption - wtf?")
+        import _locale
+
+        lconv_c = {
+            "currency_symbol": "",
+            "decimal_point": ".",
+            "frac_digits": 127,
+            "grouping": [],
+            "int_curr_symbol": "",
+            "int_frac_digits": 127,
+            "mon_decimal_point": "",
+            "mon_grouping": [],
+            "mon_thousands_sep": "",
+            "n_cs_precedes": 127,
+            "n_sep_by_space": 127,
+            "n_sign_posn": 127,
+            "negative_sign": "",
+            "p_cs_precedes": 127,
+            "p_sep_by_space": 127,
+            "p_sign_posn": 127,
+            "positive_sign": "",
+            "thousands_sep": "" }
+
+        _locale.setlocale(_locale.LC_ALL, "C")
+
+        lconv = _locale.localeconv()
+        for k, v in lconv_c.items():
+            assert lconv[k] == v
+
     def test_str_float(self):
         import _locale
         import locale



More information about the Pypy-commit mailing list