diff --git a/gen_wrap.py b/gen_wrap.py
index 8deee91ca2fcdb165b690747e3214b6333e2b2cc..a439c86b9152decbedfc8d0dc16a603c21821103 100644
--- a/gen_wrap.py
+++ b/gen_wrap.py
@@ -1088,6 +1088,15 @@ def write_method_wrapper(gen, cls_name, meth):
     ret_vals = []
     ret_descrs = []
 
+    def emit_context_check(arg_idx, arg_name):
+        if arg_idx == 0:
+            pre_call("_ctx_data = {arg_name}._ctx_data".format(arg_name=arg_name))
+        else:
+            pre_call("""
+                if _ctx_data != {arg_name}._ctx_data:
+                    raise Error("mismatched context in {arg_name}")
+                """.format(arg_name=arg_name))
+
     arg_idx = 0
     while arg_idx < len(meth.args):
         arg = meth.args[arg_idx]
@@ -1178,11 +1187,18 @@ def write_method_wrapper(gen, cls_name, meth):
             # {{{ val input argument
 
             val_name = "_val_" + arg.name
+            fmt_args = dict(
+                    arg0_name=meth.args[0].name,
+                    name=arg.name,
+                    val_name=val_name)
 
-            pre_call("""
-                if isinstance({name}, Val):
-                    {val_name} = {name}._copy()
+            pre_call("if isinstance({name}, Val):".format(**fmt_args))
 
+            with Indentation(pre_call):
+                emit_context_check(arg_idx, arg.name)
+                pre_call("{val_name} = {name}._copy()".format(**fmt_args))
+
+            pre_call("""
                 elif isinstance({name}, six.integer_types):
                     _cdata_{name} = lib.isl_val_int_from_si(
                         {arg0_name}._get_ctx_data(), {name})
@@ -1196,10 +1212,7 @@ def write_method_wrapper(gen, cls_name, meth):
                     raise IslTypeError("{name} is a %s and cannot "
                         "be cast to a Val" % type({name}))
                 """
-                .format(
-                    arg0_name=meth.args[0].name,
-                    name=arg.name,
-                    val_name=val_name))
+                .format(**fmt_args))
 
             if arg.semantics is SEM_TAKE:
                 passed_args.append(val_name + "._release()")
@@ -1223,6 +1236,8 @@ def write_method_wrapper(gen, cls_name, meth):
                 """
                 .format(name=arg.name, py_cls=arg_py_cls))
 
+            emit_context_check(arg_idx, arg.name)
+
             arg_cls = arg.base_type[4:]
             arg_descr = ":param %s: :class:`%s`" % (
                     arg.name, isl_class_to_py_class(arg_cls))