From e678ddc6eb9b4ae6a558b64f636a1139b35b83ff Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Thu, 26 Jul 2012 23:55:51 -0400
Subject: [PATCH] Save source code to temp file in case of compile error.

---
 pyopencl/__init__.py | 35 ++++++++++++++++++++++++++++++++---
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/pyopencl/__init__.py b/pyopencl/__init__.py
index 1fb68cb2..48a09351 100644
--- a/pyopencl/__init__.py
+++ b/pyopencl/__init__.py
@@ -123,9 +123,38 @@ class Program(object):
             self._prg._build(options, devices)
         else:
             from pyopencl.cache import create_built_program_from_source_cached
-            self._prg = create_built_program_from_source_cached(
-                    self._context, self._source, options, devices,
-                    cache_dir=cache_dir)
+
+            err = None
+            try:
+                self._prg = create_built_program_from_source_cached(
+                        self._context, self._source, options, devices,
+                        cache_dir=cache_dir)
+            except _cl.RuntimeError, e:
+                from pytools import Record
+                class ErrorRecord(Record):
+                    pass
+
+                from tempfile import NamedTemporaryFile
+                srcfile = NamedTemporaryFile(mode="wt", delete=False, suffix=".cl")
+                try:
+                    srcfile.write(self._source)
+                finally:
+                    srcfile.close()
+
+                what = e.what + "\n(source saved as %s)" % srcfile.name
+                code = e.code
+                routine = e.routine
+
+                err = _cl.RuntimeError(
+                        ErrorRecord(
+                            what=lambda : what,
+                            code=lambda : code,
+                            routine=lambda : routine))
+
+            if err is not None:
+                # Python 3.2 outputs the whole list of currently active exceptions
+                # This serves to remove one (redundant) level from that nesting.
+                raise err
 
             del self._context
             del self._source
-- 
GitLab