Question on return_value

php.internals

Bob Silva

20 years ago
Hi, I have an internal function defined that returns an array zval: zval *pow_zstring_internal_split(Z_STRVAL_P(ivalue), separator, count, 0 TSRMLS_DC); When I call it like this, return_value is NULL in userland. return_value = pow_zstring_internal_split(Z_STRVAL_P(ivalue), separator, count, 0 TSRMLS_CC); But when I call it like this, it works as expected and an array is returned to userland array = pow_zstring_internal_split(Z_STRVAL_P(ivalue), separator, count, 0 TSRMLS_CC); *return_value = *array; I'm sure there is an obvious answer, but given my background (or lack thereof) in C, I can't figure it out. How does the temporary assignment change things inside the engine? Bob

Michael Wallner

20 years ago
Bob Silva wrote:
> Hi, > > I have an internal function defined that returns an array zval: > zval *pow_zstring_internal_split(Z_STRVAL_P(ivalue), separator, count, 0 > TSRMLS_DC); > > > When I call it like this, return_value is NULL in userland. > > return_value = pow_zstring_internal_split(Z_STRVAL_P(ivalue), separator, > count, 0 TSRMLS_CC);
The outta world doesn't care if you let return_value point else where in your function. Look up the chapter pointers in your book. Short version: You need a pointer to a pointer so that the caller gets another pointer.
> But when I call it like this, it works as expected and an array is returned > to userland > > array = pow_zstring_internal_split(Z_STRVAL_P(ivalue), separator, count, 0 > TSRMLS_CC); > > *return_value = *array;
Yes, because you change the members of the struct the pointer points at and the pointer is still the same of that of the "outta world".
> I'm sure there is an obvious answer, but given my background (or lack > thereof) in C, I can't figure it out. > > How does the temporary assignment change things inside the engine?
Hä? :) Regards,
-- Michael - <mike(@)php.net> http://dev.iworks.at/ext-http/http-functions.html.gz

Marcus Börger

20 years ago
Hello Bob, look at RETURN_ZVAL() again. Tuesday, November 1, 2005, 7:47:45 AM, you wrote:
> Hi,
>
> I have an internal function defined that returns an array zval:
>
> zval *pow_zstring_internal_split(Z_STRVAL_P(ivalue), separator, count, 0 > TSRMLS_DC);
>
>
>
> When I call it like this, return_value is NULL in userland.
> return_value = pow_zstring_internal_split(Z_STRVAL_P(ivalue), separator, > count, 0 TSRMLS_CC);
>
>
> But when I call it like this, it works as expected and an array is returned > to userland
> array = pow_zstring_internal_split(Z_STRVAL_P(ivalue), separator, count, 0 > TSRMLS_CC);
> *return_value = *array;
>
>
> I'm sure there is an obvious answer, but given my background (or lack > thereof) in C, I can't figure it out.
> How does the temporary assignment change things inside the engine?
>
> Bob
Best regards, Marcus