diff options
author | Armin Rigo <arigo@tunes.org> | 2012-11-30 10:43:48 -0800 |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2012-11-30 10:43:48 -0800 |
commit | 028481ce249188a07980e043d5eaeedf5e51ba5b (patch) | |
tree | ac9d9b82163a0ace54b960c866dd269f41495a51 | |
parent | 23a31ac5fc863223791ca8d9818ec62ef2df2e25 (diff) | |
download | cffi-028481ce249188a07980e043d5eaeedf5e51ba5b.tar.gz |
We need to take all **kwds and stick them into the hash too.
-rw-r--r-- | cffi/ffiplatform.py | 32 | ||||
-rw-r--r-- | cffi/verifier.py | 4 | ||||
-rw-r--r-- | testing/test_platform.py | 8 |
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" |