summaryrefslogtreecommitdiff
path: root/zend/exception_handler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'zend/exception_handler.cpp')
-rw-r--r--zend/exception_handler.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/zend/exception_handler.cpp b/zend/exception_handler.cpp
new file mode 100644
index 0000000..51874a4
--- /dev/null
+++ b/zend/exception_handler.cpp
@@ -0,0 +1,49 @@
+/**
+ * Exception_handler.cpp
+ *
+ * Set the exception handler
+ *
+ * @author Toon Schoenmakers <toon.schoenmakers@copernica.com>
+ */
+
+/**
+ * Dependencies
+ */
+#include "includes.h"
+
+/**
+ * Open the PHP namespace
+ */
+namespace Php {
+
+/**
+ * Set a std::function as a php exception handler
+ */
+Value set_exception_handler(const std::function<Value(Parameters &params)> &handler)
+{
+ // create a functor which wraps our callback
+ Function functor(handler);
+
+ // initialize our output value
+ Value output;
+
+ // turn our user_exception_handler into a Value so we can return the original one later on
+ if (EG(user_exception_handler)) output = EG(user_exception_handler);
+
+ // detach so we have the zval
+ auto value = functor.detach(true);
+
+ // allocate the user_exception_handler
+ ALLOC_ZVAL(EG(user_exception_handler));
+
+ // copy our zval into the user_exception_handler
+ MAKE_COPY_ZVAL(&value, EG(user_exception_handler));
+
+ // return the original handler
+ return output;
+}
+
+/**
+ * End of namespace
+ */
+}