From 597f7c9db0e990394a9eba4a080cd2b81eacc4ba Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Wed, 23 Nov 2016 15:39:10 +0100
Subject: [PATCH] Fix interplay of no_deco and context_tags

---
 python/dune/perftool/generation/cache.py      |  6 ++-
 .../dune/perftool/generation/test_cache.py    | 37 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/python/dune/perftool/generation/cache.py b/python/dune/perftool/generation/cache.py
index 2af48bd1..9f7aba9b 100644
--- a/python/dune/perftool/generation/cache.py
+++ b/python/dune/perftool/generation/cache.py
@@ -110,7 +110,11 @@ class _RegisteredFunction(object):
         return self._get_content(cache_key)
 
     def __call__(self, *args, **kwargs):
-        with global_context(**self.kwargs):
+        additional_kw = {k: kwargs[k] for k in kwargs if k in self.context_tags}
+        for k, v in self.kwargs.items():
+            additional_kw[k] = v
+        kwargs = {k: kwargs[k] for k in kwargs if k not in self.context_tags}
+        with global_context(**additional_kw):
             return self.call(*args, **kwargs)
 
 
diff --git a/python/test/dune/perftool/generation/test_cache.py b/python/test/dune/perftool/generation/test_cache.py
index fa86a9b5..47b9bc7f 100644
--- a/python/test/dune/perftool/generation/test_cache.py
+++ b/python/test/dune/perftool/generation/test_cache.py
@@ -290,3 +290,40 @@ def test_multiple_kernels_3():
     assert k4 == "bar"
 
     delete_cache_items()
+
+
+def test_multiple_kernels_4():
+    gen = generator_factory(item_tags=("tag",), context_tags=("kernel",), no_deco=True)
+
+    with global_context(kernel="k1"):
+        gen("foo")
+
+    with global_context(kernel="k2"):
+        gen("bar")
+
+    assert len([i for i in retrieve_cache_items("tag")]) == 2
+
+    k1, = retrieve_cache_items("k1")
+    assert k1 == "foo"
+
+    k2, = retrieve_cache_items("k2")
+    assert k2 == "bar"
+
+    delete_cache_items()
+
+
+def test_multiple_kernels_5():
+    gen = generator_factory(item_tags=("tag",), context_tags=("kernel",), no_deco=True)
+
+    gen("foo", kernel="k1")
+    gen("bar", kernel="k2")
+
+    assert len([i for i in retrieve_cache_items("tag")]) == 2
+
+    k1, = retrieve_cache_items("k1")
+    assert k1 == "foo"
+
+    k2, = retrieve_cache_items("k2")
+    assert k2 == "bar"
+
+    delete_cache_items()
-- 
GitLab