Monday, 6 January 2020

PHP zend_call_method with arguments passed by reference

I am currently rewriting our PHP extension from PHP5 to PHP7. To call PHP methods from our C/C++ code we use slightly modified zend_call_method from Zend/zend_interfaces.c (to use more arguments than 2). Now I found out that it does not work with arguments passed by reference,

public function FuncWithRef(array &$changeThis)

if they are changed in the PHP code then zval values in C part are not influenced. In PHP5 the value was overwritten as expected and could be used later in C code.

Previously the zend_fcall_info struct for function call was filled with params simply by

params[0] = &arg1;

In PHP7 this is changed to

ZVAL_COPY_VALUE(&params[0], arg1);

After function is executed (zend_call_function) both fci.params and arg1 contain still the original zval values, changes made in PHP code are not available. I tried things like using DUP instead of COPY but with no result. Is there any way how to solve this? I am mainly searching for and comparing code snippets in PHP/ext folder to see how things were rewritten from PHP5 to PHP7 and this seems to be hopefully the last part missing for me.



from PHP zend_call_method with arguments passed by reference

No comments:

Post a Comment