internal_function->arg_info = ptr->arg_info+1;
internal_function->num_args = ptr->num_args;
internal_function->pass_rest_by_reference = ptr->arg_info[0].pass_by_reference;
+ internal_function->return_reference = ptr->arg_info[0].return_reference;
} else {
internal_function->arg_info = NULL;
internal_function->num_args = 0;
internal_function->pass_rest_by_reference = 0;
+ internal_function->return_reference = 0;
}
if (ptr->flags) {
if (!(ptr->flags & ZEND_ACC_PPP_MASK)) {
ZEND_FENTRY(name, ZEND_FN(classname##_##alias), arg_info, flags)
#define ZEND_ME_MAPPING(name, func_name, arg_types) ZEND_NAMED_FE(name, ZEND_FN(func_name), arg_types)
-#define ZEND_ARG_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, pass_by_ref },
-#define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, 0, NULL, 0, 0, pass_by_ref },
-#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, sizeof(#name)-1, #classname, sizeof(#classname)-1, allow_null, pass_by_ref },
-#define ZEND_BEGIN_ARG_INFO(name, pass_rest_by_reference) \
- zend_arg_info name[] = { \
- ZEND_ARG_PASS_INFO(pass_rest_by_reference)
+#define ZEND_ARG_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, pass_by_ref, 0 },
+#define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, 0, NULL, 0, 0, pass_by_ref, 0 },
+#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, sizeof(#name)-1, #classname, sizeof(#classname)-1, allow_null, pass_by_ref, 0 },
+#define ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference) \
+ zend_arg_info name[] = { \
+ { NULL, 0, NULL, 0, 0, pass_rest_by_reference, return_reference },
+#define ZEND_BEGIN_ARG_INFO(name, pass_rest_by_reference) \
+ ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, ZEND_RETURN_REFERENCE_AGNOSTIC)
#define ZEND_END_ARG_INFO() };
/* Name macros */
zend_uint class_name_len;
zend_bool allow_null;
zend_bool pass_by_reference;
+ zend_bool return_reference;
} zend_arg_info;
struct _zend_op_array {
zend_uint num_args;
zend_arg_info *arg_info;
zend_bool pass_rest_by_reference;
+ unsigned char return_reference;
/* END of common elements */
zend_uint *refcount;
zend_op *start_op;
int backpatch_count;
- zend_bool return_reference;
zend_bool done_pass_two;
zend_bool uses_this;
};
+#define ZEND_RETURN_VALUE 0
+#define ZEND_RETURN_REFERENCE 1
+#define ZEND_RETURN_REFERENCE_AGNOSTIC 2
+
typedef struct _zend_internal_function {
/* Common elements */
zend_uchar type;
zend_uint num_args;
zend_arg_info *arg_info;
zend_bool pass_rest_by_reference;
+ unsigned char return_reference;
/* END of common elements */
void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
zend_uint num_args;
zend_arg_info *arg_info;
zend_bool pass_rest_by_reference;
+ unsigned char return_reference;
} common;
zend_op_array op_array;