[PHP-DEV] zend_call_method with arguments passed by reference

2020-01-08 Thread mdolezal.noctuint.cz via internals
Hello,

I hope this is the appropriate mailing list, please redirect me to better
please if required.

 

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,
such as:

public function FuncWithRef(array &$changeThis)

 

if values are changed in the PHP code then zval values back in C part after
zend_call_function call are not influenced.

With PHP5 the value was overwritten 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(¶ms[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. 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.

Sorry if I missed something obvious and thank you for your help.



Re: [PHP-DEV] zend_call_method with arguments passed by reference

2020-01-08 Thread Nikita Popov
On Wed, Jan 8, 2020 at 3:59 PM mdolezal.noctuint.cz via internals <
internals@lists.php.net> wrote:

> Hello,
>
> I hope this is the appropriate mailing list, please redirect me to better
> please if required.
>
>
>
> 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,
> such as:
>
> public function FuncWithRef(array &$changeThis)
>
>
>
> if values are changed in the PHP code then zval values back in C part after
> zend_call_function call are not influenced.
>
> With PHP5 the value was overwritten 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(¶ms[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. 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.
>
> Sorry if I missed something obvious and thank you for your help.
>

It looks like the implementation of zend_call_method() does not support
this, as it does not copy parameters back after the call. I'd suggest to
use the lower level zend_call_function() for the cases where you need this
for now.

Nikita


RE: [PHP-DEV] zend_call_method with arguments passed by reference

2020-01-08 Thread mdolezal.noctuint.cz via internals
Thank you for your answer Nikita.
Can you please give me more details what you mean? I can try that approach.
zend_call_method copies the args to params array which is assigned to 
zend_fcall_info fci. 
I can pass there for example "test" zval string.
Then the mentioned lower level zend_call_function() is called with fci as 
parameter, that's what I do.
In PHP code "test" is changed to "changed".
But after the call the fci.params are not changed, still "test", so I have 
nothing to copy back manually.


-Original Message-
From: Nikita Popov  
Sent: Wednesday, January 8, 2020 4:06 PM
To: mdole...@noctuint.cz
Cc: PHP internals 
Subject: Re: [PHP-DEV] zend_call_method with arguments passed by reference

On Wed, Jan 8, 2020 at 3:59 PM mdolezal.noctuint.cz via internals < 
internals@lists.php.net> wrote:

> Hello,
>
> I hope this is the appropriate mailing list, please redirect me to 
> better please if required.
>
>
>
> 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, such as:
>
> public function FuncWithRef(array &$changeThis)
>
>
>
> if values are changed in the PHP code then zval values back in C part 
> after zend_call_function call are not influenced.
>
> With PHP5 the value was overwritten 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(¶ms[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. 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.
>
> Sorry if I missed something obvious and thank you for your help.
>

It looks like the implementation of zend_call_method() does not support this, 
as it does not copy parameters back after the call. I'd suggest to use the 
lower level zend_call_function() for the cases where you need this for now.

Nikita

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DEV] zend_call_method with arguments passed by reference

2020-01-09 Thread Nikita Popov
On Wed, Jan 8, 2020 at 4:18 PM  wrote:

> Thank you for your answer Nikita.
> Can you please give me more details what you mean? I can try that approach.
> zend_call_method copies the args to params array which is assigned to
> zend_fcall_info fci.
> I can pass there for example "test" zval string.
> Then the mentioned lower level zend_call_function() is called with fci as
> parameter, that's what I do.
> In PHP code "test" is changed to "changed".
> But after the call the fci.params are not changed, still "test", so I have
> nothing to copy back manually.
>

fci.params *should* contain the changed parameters after the call, at least
assuming no_separation=0. It's not clear to me under what circumstances
that wouldn't work.

Nikita


> -Original Message-
> From: Nikita Popov 
> Sent: Wednesday, January 8, 2020 4:06 PM
> To: mdole...@noctuint.cz
> Cc: PHP internals 
> Subject: Re: [PHP-DEV] zend_call_method with arguments passed by reference
>
> On Wed, Jan 8, 2020 at 3:59 PM mdolezal.noctuint.cz via internals <
> internals@lists.php.net> wrote:
>
> > Hello,
> >
> > I hope this is the appropriate mailing list, please redirect me to
> > better please if required.
> >
> >
> >
> > 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, such as:
> >
> > public function FuncWithRef(array &$changeThis)
> >
> >
> >
> > if values are changed in the PHP code then zval values back in C part
> > after zend_call_function call are not influenced.
> >
> > With PHP5 the value was overwritten 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(¶ms[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. 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.
> >
> > Sorry if I missed something obvious and thank you for your help.
> >
>
> It looks like the implementation of zend_call_method() does not support
> this, as it does not copy parameters back after the call. I'd suggest to
> use the lower level zend_call_function() for the cases where you need this
> for now.
>
> Nikita
>
>
>
>


RE: [PHP-DEV] zend_call_method with arguments passed by reference

2020-01-09 Thread mdolezal.noctuint.cz via internals
Thanks a lot Nikita,
that’s it. I was not aware of no_separation influence, it was set to 1 in 
zend_call_method both in PHP5 and PHP7 so I didn't touch it during migration. I 
need to copy the arguments properly back now but basically it's working. Thanks 
again,
Martin
 

-Original Message-
From: Nikita Popov  
Sent: Thursday, January 9, 2020 1:17 PM
To: mdole...@noctuint.cz
Cc: PHP internals 
Subject: Re: [PHP-DEV] zend_call_method with arguments passed by reference

On Wed, Jan 8, 2020 at 4:18 PM  wrote:

> Thank you for your answer Nikita.
> Can you please give me more details what you mean? I can try that approach.
> zend_call_method copies the args to params array which is assigned to 
> zend_fcall_info fci.
> I can pass there for example "test" zval string.
> Then the mentioned lower level zend_call_function() is called with fci 
> as parameter, that's what I do.
> In PHP code "test" is changed to "changed".
> But after the call the fci.params are not changed, still "test", so I 
> have nothing to copy back manually.
>

fci.params *should* contain the changed parameters after the call, at least 
assuming no_separation=0. It's not clear to me under what circumstances that 
wouldn't work.

Nikita


> -Original Message-
> From: Nikita Popov 
> Sent: Wednesday, January 8, 2020 4:06 PM
> To: mdole...@noctuint.cz
> Cc: PHP internals 
> Subject: Re: [PHP-DEV] zend_call_method with arguments passed by 
> reference
>
> On Wed, Jan 8, 2020 at 3:59 PM mdolezal.noctuint.cz via internals < 
> internals@lists.php.net> wrote:
>
> > Hello,
> >
> > I hope this is the appropriate mailing list, please redirect me to 
> > better please if required.
> >
> >
> >
> > 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, such as:
> >
> > public function FuncWithRef(array &$changeThis)
> >
> >
> >
> > if values are changed in the PHP code then zval values back in C 
> > part after zend_call_function call are not influenced.
> >
> > With PHP5 the value was overwritten 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(¶ms[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. 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.
> >
> > Sorry if I missed something obvious and thank you for your help.
> >
>
> It looks like the implementation of zend_call_method() does not 
> support this, as it does not copy parameters back after the call. I'd 
> suggest to use the lower level zend_call_function() for the cases 
> where you need this for now.
>
> Nikita
>
>
>
>

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php