summaryrefslogtreecommitdiff
path: root/zend/callable.cpp
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-04-06 21:53:24 +0200
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-04-06 21:53:24 +0200
commit35fd3ccbeb4def71b4d8a59dfbb5c31201b099b9 (patch)
tree915223360aed4743aa6127fde4836aa413a260e5 /zend/callable.cpp
parentda4710512865e6816585ac4ab8edab2fa125e2d8 (diff)
renamed src directory to zend directory, disabled TSRM debug code
Diffstat (limited to 'zend/callable.cpp')
-rw-r--r--zend/callable.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/zend/callable.cpp b/zend/callable.cpp
new file mode 100644
index 0000000..737b85b
--- /dev/null
+++ b/zend/callable.cpp
@@ -0,0 +1,133 @@
+/**
+ * Function.cpp
+ *
+ * Implementation for the function class
+ *
+ * @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
+ * @copyright 2013 Copernica BV
+ */
+#include "includes.h"
+
+/**
+ * Set up namespace
+ */
+namespace Php {
+
+/**
+ * Function that is called by the Zend engine every time that a function gets called
+ * @param ht
+ * @param return_value
+ * @param return_value_ptr
+ * @param this_ptr
+ * @param return_value_used
+ * @param tsrm_ls
+ * @return integer
+ */
+static void invoke_callable(INTERNAL_FUNCTION_PARAMETERS)
+{
+ // find the function name
+ const char *name = get_active_function_name(TSRMLS_C);
+
+ // uncover the hidden pointer inside the function name
+ Callable *callable = HiddenPointer<Callable>(name);
+
+ // wrap the return value
+ Value result(return_value, true);
+
+ // construct parameters
+ ParametersImpl params(this_ptr, ZEND_NUM_ARGS() TSRMLS_CC);
+
+ // the function could throw an exception
+ try
+ {
+ // get the result
+ result = callable->invoke(params);
+ }
+ catch (Exception &exception)
+ {
+ // process the exception
+ process(exception TSRMLS_CC);
+ }
+}
+
+/**
+ * Fill a function entry
+ *
+ * This method is called when the extension is registering itself, when the
+ * function or method introces himself
+ *
+ * @param entry Entry to be filled
+ * @param classname Optional class name
+ * @param flags Is this a public property?
+ */
+void Callable::initialize(zend_function_entry *entry, const char *classname, int flags) const
+{
+ // fill the members of the entity, and hide a pointer to the current object in the name
+ entry->fname = (const char *)_ptr;
+ entry->handler = invoke_callable;
+ entry->arg_info = _argv;
+ entry->num_args = _argc;
+ entry->flags = flags;
+
+ // we should fill the first argument as well
+ initialize((zend_arg_info *)entry->arg_info, classname);
+}
+
+/**
+ * Fill a function entry
+ * @param info Info to be filled
+ * @param classname Optional classname
+ */
+void Callable::initialize(zend_arg_info *info, const char *classname) const
+{
+#if PHP_VERSION_ID >= 50400
+ // up until php 5.3, the first info object is filled with alternative information,
+ // later it is casted to a zend_internal_function object
+ auto *finfo = (zend_internal_function_info *)info;
+
+ // fill in all the members, note that return reference is false by default,
+ // because we do not support returning references in PHP-CPP, although Zend
+ // engine allows it. Inside the name we hide a pointer to the current object
+ finfo->_name = _ptr;
+ finfo->_name_len = strlen(_ptr);
+ finfo->_class_name = classname;
+
+ // number of required arguments, and the expected return type
+ finfo->required_num_args = _required;
+ finfo->_type_hint = (unsigned char)_return;
+
+ // we do not support return-by-reference
+ finfo->return_reference = false;
+
+# if PHP_VERSION_ID >= 50600
+ // since php 5.6 there are _allow_null and _is_variadic properties. It's
+ // not exactly clear what they do (@todo find this out) so for now we set
+ // them to false
+ finfo->_allow_null = false;
+ finfo->_is_variadic = false;
+
+# else
+ // passing by reference is not used (only for php 5.4 and php 5.5)
+ finfo->pass_rest_by_reference = false;
+# endif
+
+#else
+ // php 5.3 code
+ info->name = nullptr;
+ info->name_len = 0;
+ info->class_name = nullptr;
+ info->class_name_len = 0;
+ info->array_type_hint = false;
+ info->allow_null = false;
+ info->pass_by_reference = false;
+ info->return_reference = false;
+ info->required_num_args = _required;
+#endif
+}
+
+/**
+ * End of namespace
+ */
+}
+
+