summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2012-11-30 10:43:48 -0800
committerArmin Rigo <arigo@tunes.org>2012-11-30 10:43:48 -0800
commit028481ce249188a07980e043d5eaeedf5e51ba5b (patch)
treeac9d9b82163a0ace54b960c866dd269f41495a51
parent23a31ac5fc863223791ca8d9818ec62ef2df2e25 (diff)
downloadcffi-028481ce249188a07980e043d5eaeedf5e51ba5b.tar.gz
We need to take all **kwds and stick them into the hash too.
-rw-r--r--cffi/ffiplatform.py32
-rw-r--r--cffi/verifier.py4
-rw-r--r--testing/test_platform.py8
3 files changed, 43 insertions, 1 deletions
diff --git a/cffi/ffiplatform.py b/cffi/ffiplatform.py
index 19cabf6..eab8598 100644
--- a/cffi/ffiplatform.py
+++ b/cffi/ffiplatform.py
@@ -76,3 +76,35 @@ def maybe_relative_path(path):
return os.path.join(*names)
except OSError:
pass
+
+# ____________________________________________________________
+
+try:
+ int_or_long = (int, long)
+except NameError:
+ int_or_long = int # Python 3
+
+def _flatten(x, f):
+ if isinstance(x, str):
+ f.write('%ds%s' % (len(x), x))
+ elif isinstance(x, dict):
+ keys = sorted(x.keys())
+ f.write('%dd' % len(keys))
+ for key in keys:
+ _flatten(key, f)
+ _flatten(x[key], f)
+ elif isinstance(x, (list, tuple)):
+ f.write('%dl' % len(x))
+ for value in x:
+ _flatten(value, f)
+ elif isinstance(x, int_or_long):
+ f.write('%di' % (x,))
+ else:
+ raise TypeError(
+ "the keywords to verify() contains unsupported object %r" % (x,))
+
+def flatten(x):
+ import cStringIO
+ f = cStringIO.StringIO()
+ _flatten(x, f)
+ return f.getvalue()
diff --git a/cffi/verifier.py b/cffi/verifier.py
index be01406..3215e94 100644
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -9,12 +9,14 @@ class Verifier(object):
tag='', force_generic_engine=False, **kwds):
self.ffi = ffi
self.preamble = preamble
+ flattened_kwds = ffiplatform.flatten(kwds)
vengine_class = _locate_engine_class(ffi, force_generic_engine)
self._vengine = vengine_class(self)
self._vengine.patch_extension_kwds(kwds)
self.kwds = kwds
#
- key = '\x00'.join(['1', sys.version[:3], __version__, preamble] +
+ key = '\x00'.join([sys.version[:3], __version__, preamble,
+ flattened_kwds] +
ffi._cdefsources)
if sys.version_info >= (3,):
key = key.encode('utf-8')
diff --git a/testing/test_platform.py b/testing/test_platform.py
index 4c9e1b5..55446ec 100644
--- a/testing/test_platform.py
+++ b/testing/test_platform.py
@@ -15,3 +15,11 @@ def test_absolute_mapping():
assert maybe_relative_path(p) == 'baz.py'
foobaz = os.path.join('foo', 'baz.py')
assert maybe_relative_path(os.path.abspath(foobaz)) == foobaz
+
+def test_flatten():
+ assert flatten("foo") == "3sfoo"
+ assert flatten(-10000000000000000000000000000) == \
+ "-10000000000000000000000000000i"
+ assert flatten([4, 5]) == "2l4i5i"
+ assert flatten({4: 5}) == "1d4i5i"
+ assert flatten({"foo": ("bar", "baaz")}) == "1d3sfoo2l3sbar4sbaaz"