summaryrefslogtreecommitdiff
path: root/zend/callable.h
diff options
context:
space:
mode:
Diffstat (limited to 'zend/callable.h')
-rw-r--r--zend/callable.h46
1 files changed, 16 insertions, 30 deletions
diff --git a/zend/callable.h b/zend/callable.h
index bd74f27..272b22e 100644
--- a/zend/callable.h
+++ b/zend/callable.h
@@ -1,7 +1,7 @@
/**
* Callable.h
*
- * Object represents a callable function or method that is defined with the CPP
+ * Object represents a callable function or method that is defined with the CPP
* API.
*
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
@@ -13,7 +13,7 @@
*/
namespace Php {
-/**
+/**
* Class definition
*/
class Callable
@@ -29,22 +29,22 @@ public:
// construct vector for arguments
_argc = arguments.size();
_argv = new zend_arg_info[_argc+1];
-
+
// the first record is initialized with information about the function,
// so we skip that here
int i=1;
-
+
// loop through the arguments
for (auto it = arguments.begin(); it != arguments.end(); it++)
{
// increment counter with number of required parameters
if (it->required()) _required++;
-
+
// fill the arg info
fill(&_argv[i++], *it);
}
}
-
+
/**
* Copy constructor
* @param that
@@ -55,7 +55,7 @@ public:
_required(that._required),
_argc(that._argc),
_argv(nullptr) {}
-
+
/**
* Move constructor
* @param that
@@ -65,7 +65,7 @@ public:
_return(that._return),
_required(that._required),
_argc(that._argc),
- _argv(that._argv)
+ _argv(that._argv)
{
// invalidate other object
that._argv = nullptr;
@@ -78,14 +78,14 @@ public:
{
if (_argv) delete[] _argv;
}
-
+
/**
* Method that gets called every time the function is executed
* @param params The parameters that were passed
* @return Variable Return value
*/
virtual Value invoke(Parameters &params) = 0;
-
+
/**
* Fill a function entry
* @param entry Entry to be filled
@@ -134,7 +134,7 @@ protected:
* @var zend_arg_info[]
*/
zend_arg_info *_argv = nullptr;
-
+
/**
* Private helper method to fill an argument object
* @param info object from the zend engine
@@ -143,10 +143,11 @@ protected:
void fill(zend_arg_info *info, const Argument &arg) const
{
// fill members
- info->name = arg.name();
- info->name_len = ::strlen(arg.name());
+ info->name = zend_string_init(arg.name(), ::strlen(arg.name()), 1);
-#if PHP_VERSION_ID >= 50400
+ // are we filling an object
+ if (arg.type() == Type::Object) info->class_name = zend_string_init(arg.classname(), ::strlen(arg.classname()), 1);
+ else info->class_name = nullptr;
// since php 5.4 there is a type-hint, but we only support arrays, objects and callables
switch (arg.type()) {
@@ -155,29 +156,14 @@ protected:
case Type::Object: info->type_hint = IS_OBJECT; break;
default: info->type_hint = IS_NULL; break;
}
-
-# if PHP_VERSION_ID >= 50600
- // from PHP 5.6 and onwards, an is_variadic property can be set, this
+ // from PHP 5.6 and onwards, an is_variadic property can be set, this
// specifies whether this argument is the first argument that specifies
// the type for a variable length list of arguments. For now we only
// support methods and functions with a fixed number of arguments.
info->is_variadic = false;
-# endif
-
-#else
-
- // php 5.3 code
- info->array_type_hint = arg.type() == Type::Array;
- info->return_reference = false;
- info->required_num_args = 0; // @todo is this correct?
-
-#endif
-
// this parameter is a regular type
- info->class_name = arg.type() == Type::Object ? arg.classname() : nullptr;
- info->class_name_len = arg.type() == Type::Object && arg.classname() ? ::strlen(arg.classname()) : 0;
info->allow_null = arg.allowNull();
info->pass_by_reference = arg.byReference();
}