Author: Armin Rigo <[email protected]>
Branch:
Changeset: r44053:2e36d562269a
Date: 2011-05-10 13:52 +0200
http://bitbucket.org/pypy/pypy/changeset/2e36d562269a/
Log: Initial test about accessing the codecs from pypy.
diff --git a/pypy/module/_multibytecodec/__init__.py
b/pypy/module/_multibytecodec/__init__.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/__init__.py
@@ -0,0 +1,10 @@
+from pypy.interpreter.mixedmodule import MixedModule
+
+
+class Module(MixedModule):
+
+ interpleveldefs = {
+ }
+
+ appleveldefs = {
+ }
diff --git a/pypy/module/_multibytecodec/c_codecs.py
b/pypy/module/_multibytecodec/c_codecs.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/c_codecs.py
@@ -0,0 +1,58 @@
+import py
+from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.translator.tool.cbuild import ExternalCompilationInfo
+from pypy.tool.autopath import pypydir
+
+
+srcdir = py.path.local(pypydir).join('module', '_multibytecodec', 'cjkcodecs')
+
+eci = ExternalCompilationInfo(
+ separate_module_files = [
+ srcdir.join('_codecs_cn.c'),
+ srcdir.join('_codecs_hk.c'),
+ srcdir.join('_codecs_iso2022.c'),
+ srcdir.join('_codecs_jp.c'),
+ srcdir.join('_codecs_kr.c'),
+ srcdir.join('_codecs_tw.c'),
+ ],
+)
+
+
+MULTIBYTECODEC_PTR = rffi.VOIDP
+
+codecs = [
+ # _codecs_cn
+ 'gb2312', 'gbk', 'gb18030', 'hz',
+
+ # _codecs_hk
+ 'big5hkscs',
+
+ # _codecs_iso2022
+ 'iso2022_kr', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2',
+ 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext',
+
+ # _codecs_jp
+ 'shift_jis', 'cp932', 'euc_jp', 'shift_jis_2004',
+ 'euc_jis_2004', 'euc_jisx0213', 'shift_jisx0213',
+
+ # _codecs_kr
+ 'euc_kr', 'cp949', 'johab',
+
+ # _codecs_tw
+ 'big5', 'cp950',
+ ]
+
+def getter_for(name):
+ return rffi.llexternal('pypy_cjkcodec_%s' % name, [], MULTIBYTECODEC_PTR,
+ compilation_info=eci, sandboxsafe=True,
+ _nowrapper=True)
+
+_codecs_getters = dict([(name, getter_for(name)) for name in codecs])
+
+def getcodec(name):
+ try:
+ getter = _codecs_getters[name]
+ except KeyError:
+ return lltype.nullptr(MULTIBYTECODEC_PTR.TO)
+ else:
+ return getter()
diff --git a/pypy/module/_multibytecodec/cjkcodecs/_codecs_iso2022.c
b/pypy/module/_multibytecodec/cjkcodecs/_codecs_iso2022.c
--- a/pypy/module/_multibytecodec/cjkcodecs/_codecs_iso2022.c
+++ b/pypy/module/_multibytecodec/cjkcodecs/_codecs_iso2022.c
@@ -1094,12 +1094,10 @@
/* no mapping table here */
END_MAPPINGS_LIST
-#define ISO2022_CODEC(variation) { \
- "iso2022_" #variation, \
- &iso2022_##variation##_config, \
- iso2022_codec_init, \
- _STATEFUL_METHODS(iso2022) \
-},
+#define ISO2022_CODEC(variation) \
+ CODEC_STATEFUL_CONFIG(iso2022, \
+ variation, \
+ &iso2022_##variation##_config)
BEGIN_CODECS_LIST
ISO2022_CODEC(kr)
diff --git a/pypy/module/_multibytecodec/cjkcodecs/_codecs_jp.c
b/pypy/module/_multibytecodec/cjkcodecs/_codecs_jp.c
--- a/pypy/module/_multibytecodec/cjkcodecs/_codecs_jp.c
+++ b/pypy/module/_multibytecodec/cjkcodecs/_codecs_jp.c
@@ -724,8 +724,8 @@
CODEC_STATELESS(euc_jp)
CODEC_STATELESS(shift_jis_2004)
CODEC_STATELESS(euc_jis_2004)
- { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) },
- { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) },
+ CODEC_STATELESS_CONFIG(euc_jisx0213, (void *)2000, euc_jis_2004)
+ CODEC_STATELESS_CONFIG(shift_jisx0213, (void *)2000, shift_jis_2004)
END_CODECS_LIST
I_AM_A_MODULE_FOR(jp)
diff --git a/pypy/module/_multibytecodec/cjkcodecs/cjkcodecs.h
b/pypy/module/_multibytecodec/cjkcodecs/cjkcodecs.h
--- a/pypy/module/_multibytecodec/cjkcodecs/cjkcodecs.h
+++ b/pypy/module/_multibytecodec/cjkcodecs/cjkcodecs.h
@@ -200,15 +200,21 @@
#define BEGIN_MAPPINGS_LIST /* empty */
#define MAPPING_ENCONLY(enc) \
- const struct dbcs_map _pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, NULL};
+ const struct dbcs_map pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, NULL};
#define MAPPING_DECONLY(enc) \
- const struct dbcs_map _pypy_cjkmap_##enc = {#enc, NULL, (void*)enc##_decmap};
+ const struct dbcs_map pypy_cjkmap_##enc = {#enc, NULL, (void*)enc##_decmap};
#define MAPPING_ENCDEC(enc) \
- const struct dbcs_map _pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, \
- (void*)enc##_decmap};
+ const struct dbcs_map pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, \
+ (void*)enc##_decmap};
#define END_MAPPINGS_LIST /* empty */
-#define BEGIN_CODECS_LIST static const MultibyteCodec _codec_list[] = {
+#define BEGIN_CODECS_LIST /* empty */
+#define _CODEC(name) \
+ const MultibyteCodec _pypy_cjkcodec_##name; \
+ void *pypy_cjkcodec_##name(void) { \
+ return (void *)&_pypy_cjkcodec_##name; \
+ } \
+ const MultibyteCodec _pypy_cjkcodec_##name
#define _STATEFUL_METHODS(enc) \
enc##_encode, \
enc##_encode_init, \
@@ -219,21 +225,31 @@
#define _STATELESS_METHODS(enc) \
enc##_encode, NULL, NULL, \
enc##_decode, NULL, NULL,
-#define CODEC_STATEFUL(enc) { \
- #enc, NULL, NULL, \
- _STATEFUL_METHODS(enc) \
-},
-#define CODEC_STATELESS(enc) { \
- #enc, NULL, NULL, \
- _STATELESS_METHODS(enc) \
-},
-#define CODEC_STATELESS_WINIT(enc) { \
- #enc, NULL, \
- enc##_codec_init, \
- _STATELESS_METHODS(enc) \
-},
-#define END_CODECS_LIST \
- {"", NULL,} };
+#define CODEC_STATEFUL(enc) _CODEC(enc) = { \
+ #enc, NULL, NULL, \
+ _STATEFUL_METHODS(enc) \
+ };
+#define CODEC_STATELESS(enc) _CODEC(enc) = { \
+ #enc, NULL, NULL, \
+ _STATELESS_METHODS(enc) \
+ };
+#define CODEC_STATELESS_WINIT(enc) _CODEC(enc) = { \
+ #enc, NULL, \
+ enc##_codec_init, \
+ _STATELESS_METHODS(enc) \
+ };
+#define CODEC_STATELESS_CONFIG(enc, config, baseenc) _CODEC(enc) = { \
+ #enc, config, NULL, \
+ _STATELESS_METHODS(baseenc) \
+ };
+#define CODEC_STATEFUL_CONFIG(enc, variation, config) \
+ _CODEC(enc##_##variation) = { \
+ #enc "_" #variation, \
+ config, \
+ enc##_codec_init, \
+ _STATEFUL_METHODS(enc) \
+ };
+#define END_CODECS_LIST /* empty */
#ifdef USING_BINARY_PAIR_SEARCH
@@ -269,10 +285,10 @@
#ifdef USING_IMPORTED_MAPS
#define USING_IMPORTED_MAP(charset) \
- extern const struct dbcs_map _pypy_cjkmap_##charset;
+ extern const struct dbcs_map pypy_cjkmap_##charset;
#define IMPORT_MAP(locale, charset, encmap, decmap) \
- importmap(&_pypy_cjkmap_##charset, encmap, decmap)
+ importmap(&pypy_cjkmap_##charset, encmap, decmap)
static void importmap(const struct dbcs_map *src, void *encmp,
void *decmp)
@@ -283,8 +299,7 @@
#endif
-#define I_AM_A_MODULE_FOR(loc) \
- const MultibyteCodec *pypy_codec_list_##loc = _codec_list;
+#define I_AM_A_MODULE_FOR(loc) /* empty */
#endif
diff --git a/pypy/module/_multibytecodec/test/__init__.py
b/pypy/module/_multibytecodec/test/__init__.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/test/__init__.py
@@ -0,0 +1,1 @@
+#
diff --git a/pypy/module/_multibytecodec/test/test_c_codecs.py
b/pypy/module/_multibytecodec/test/test_c_codecs.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/test/test_c_codecs.py
@@ -0,0 +1,9 @@
+from pypy.module._multibytecodec.c_codecs import getcodec, codecs
+
+
+def test_codecs_existence():
+ for name in codecs:
+ c = getcodec(name)
+ assert c
+ c = getcodec("foobar")
+ assert not c
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit