|
|
|
@ -1567,9 +1567,8 @@ ZEND_METHOD(reflection_function, getStaticVariables) |
|
|
|
ZEND_METHOD(reflection_function, invoke) |
|
|
|
{ |
|
|
|
zval *retval_ptr; |
|
|
|
zval ***params; |
|
|
|
int result; |
|
|
|
int argc = ZEND_NUM_ARGS(); |
|
|
|
zval ***params = NULL; |
|
|
|
int result, num_args = 0; |
|
|
|
zend_fcall_info fci; |
|
|
|
zend_fcall_info_cache fcc; |
|
|
|
reflection_object *intern; |
|
|
|
@ -1578,10 +1577,8 @@ ZEND_METHOD(reflection_function, invoke) |
|
|
|
METHOD_NOTSTATIC(reflection_function_ptr); |
|
|
|
GET_REFLECTION_OBJECT_PTR(fptr); |
|
|
|
|
|
|
|
params = safe_emalloc(sizeof(zval **), argc, 0); |
|
|
|
if (zend_get_parameters_array_ex(argc, params) == FAILURE) { |
|
|
|
efree(params); |
|
|
|
RETURN_FALSE; |
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", ¶ms, &num_args) == FAILURE) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
fci.size = sizeof(fci); |
|
|
|
@ -1590,7 +1587,7 @@ ZEND_METHOD(reflection_function, invoke) |
|
|
|
fci.symbol_table = NULL; |
|
|
|
fci.object_pp = NULL; |
|
|
|
fci.retval_ptr_ptr = &retval_ptr; |
|
|
|
fci.param_count = argc; |
|
|
|
fci.param_count = num_args; |
|
|
|
fci.params = params; |
|
|
|
fci.no_separation = 1; |
|
|
|
|
|
|
|
@ -2298,23 +2295,17 @@ ZEND_METHOD(reflection_method, __toString) |
|
|
|
ZEND_METHOD(reflection_method, invoke) |
|
|
|
{ |
|
|
|
zval *retval_ptr; |
|
|
|
zval ***params; |
|
|
|
zval ***params = NULL; |
|
|
|
zval **object_pp; |
|
|
|
reflection_object *intern; |
|
|
|
zend_function *mptr; |
|
|
|
int argc = ZEND_NUM_ARGS(); |
|
|
|
int result; |
|
|
|
int result, num_args = 0; |
|
|
|
zend_fcall_info fci; |
|
|
|
zend_fcall_info_cache fcc; |
|
|
|
zend_class_entry *obj_ce; |
|
|
|
|
|
|
|
METHOD_NOTSTATIC(reflection_method_ptr); |
|
|
|
|
|
|
|
if (argc < 1) { |
|
|
|
zend_error(E_WARNING, "Invoke() expects at least one parameter, none given"); |
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
GET_REFLECTION_OBJECT_PTR(mptr); |
|
|
|
|
|
|
|
if (!(mptr->common.fn_flags & ZEND_ACC_PUBLIC) || |
|
|
|
@ -2333,10 +2324,8 @@ ZEND_METHOD(reflection_method, invoke) |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
params = safe_emalloc(sizeof(zval **), argc, 0); |
|
|
|
if (zend_get_parameters_array_ex(argc, params) == FAILURE) { |
|
|
|
efree(params); |
|
|
|
RETURN_FALSE; |
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", ¶ms, &num_args) == FAILURE) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
/* In case this is a static method, we should'nt pass an object_pp |
|
|
|
@ -2349,15 +2338,18 @@ ZEND_METHOD(reflection_method, invoke) |
|
|
|
object_pp = NULL; |
|
|
|
obj_ce = NULL; |
|
|
|
} else { |
|
|
|
if ((Z_TYPE_PP(params[0]) != IS_OBJECT)) { |
|
|
|
if (Z_TYPE_PP(params[0]) != IS_OBJECT) { |
|
|
|
efree(params); |
|
|
|
_DO_THROW("Non-object passed to Invoke()"); |
|
|
|
/* Returns from this function */ |
|
|
|
} |
|
|
|
|
|
|
|
obj_ce = Z_OBJCE_PP(params[0]); |
|
|
|
|
|
|
|
if (!instanceof_function(obj_ce, mptr->common.scope TSRMLS_CC)) { |
|
|
|
efree(params); |
|
|
|
if (params) { |
|
|
|
efree(params); |
|
|
|
} |
|
|
|
_DO_THROW("Given object is not an instance of the class this method was declared in"); |
|
|
|
/* Returns from this function */ |
|
|
|
} |
|
|
|
@ -2371,8 +2363,8 @@ ZEND_METHOD(reflection_method, invoke) |
|
|
|
fci.symbol_table = NULL; |
|
|
|
fci.object_pp = object_pp; |
|
|
|
fci.retval_ptr_ptr = &retval_ptr; |
|
|
|
fci.param_count = argc-1; |
|
|
|
fci.params = params+1; |
|
|
|
fci.param_count = num_args - 1; |
|
|
|
fci.params = params + 1; |
|
|
|
fci.no_separation = 1; |
|
|
|
|
|
|
|
fcc.initialized = 1; |
|
|
|
@ -2382,7 +2374,9 @@ ZEND_METHOD(reflection_method, invoke) |
|
|
|
|
|
|
|
result = zend_call_function(&fci, &fcc TSRMLS_CC); |
|
|
|
|
|
|
|
efree(params); |
|
|
|
if (params) { |
|
|
|
efree(params); |
|
|
|
} |
|
|
|
|
|
|
|
if (result == FAILURE) { |
|
|
|
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, |
|
|
|
@ -3416,14 +3410,14 @@ ZEND_METHOD(reflection_class, newInstance) |
|
|
|
zval *retval_ptr = NULL; |
|
|
|
reflection_object *intern; |
|
|
|
zend_class_entry *ce; |
|
|
|
int argc = ZEND_NUM_ARGS(); |
|
|
|
|
|
|
|
METHOD_NOTSTATIC(reflection_class_ptr); |
|
|
|
GET_REFLECTION_OBJECT_PTR(ce); |
|
|
|
|
|
|
|
/* Run the constructor if there is one */ |
|
|
|
if (ce->constructor) { |
|
|
|
zval ***params; |
|
|
|
zval ***params = NULL; |
|
|
|
int num_args = 0; |
|
|
|
zend_fcall_info fci; |
|
|
|
zend_fcall_info_cache fcc; |
|
|
|
|
|
|
|
@ -3432,9 +3426,10 @@ ZEND_METHOD(reflection_class, newInstance) |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
params = safe_emalloc(sizeof(zval **), argc, 0); |
|
|
|
if (zend_get_parameters_array_ex(argc, params) == FAILURE) { |
|
|
|
efree(params); |
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "*", ¶ms, &num_args) == FAILURE) { |
|
|
|
if (params) { |
|
|
|
efree(params); |
|
|
|
} |
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
@ -3446,7 +3441,7 @@ ZEND_METHOD(reflection_class, newInstance) |
|
|
|
fci.symbol_table = NULL; |
|
|
|
fci.object_pp = &return_value; |
|
|
|
fci.retval_ptr_ptr = &retval_ptr; |
|
|
|
fci.param_count = argc; |
|
|
|
fci.param_count = num_args; |
|
|
|
fci.params = params; |
|
|
|
fci.no_separation = 1; |
|
|
|
|
|
|
|
@ -3456,7 +3451,9 @@ ZEND_METHOD(reflection_class, newInstance) |
|
|
|
fcc.object_pp = &return_value; |
|
|
|
|
|
|
|
if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) { |
|
|
|
efree(params); |
|
|
|
if (params) { |
|
|
|
efree(params); |
|
|
|
} |
|
|
|
if (retval_ptr) { |
|
|
|
zval_ptr_dtor(&retval_ptr); |
|
|
|
} |
|
|
|
@ -3466,7 +3463,9 @@ ZEND_METHOD(reflection_class, newInstance) |
|
|
|
if (retval_ptr) { |
|
|
|
zval_ptr_dtor(&retval_ptr); |
|
|
|
} |
|
|
|
efree(params); |
|
|
|
if (params) { |
|
|
|
efree(params); |
|
|
|
} |
|
|
|
} else if (!ZEND_NUM_ARGS()) { |
|
|
|
object_init_ex(return_value, ce); |
|
|
|
} else { |
|
|
|
|