Hello Sara
Seems my post to news.php.net went somehow through though my NNTP client
complained about errors...anyway (o;
"mycount" is defined in here:
FUN_ACCESSOR(mycount)
Which is the updated by the read function.
The function macro itself is defined as:
ZEND_FE(readmydevice, NULL)
So would the arg_info go in here? There isn't any arg_info in the original code.
thanks in advance
richard
On Mon, 12 Mar 2018 13:18:30 -0400, Sara Golemon wrote:
> On Mon, Mar 12, 2018 at 12:16 PM, Richard Klingler
> <[email protected]> wrote:
>> ZEND_FUNCTION(readmydevice)
>> {
>> zend_long n;
>> zval *z;
>> size_t len;
>> char *p;
>> long r;
>>
>> if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lzl", &n,
>> &z, &len) == FAILURE) {
>> return;
>> }
>>
>> p = (char *) emalloc(len + 1);
>> memset(p,0,len+1);
>>
>> r = myread(n, p, len);
>> printf("Read %d bytes from device %d up to %d bytes\n", mycount,
>> n, len);
>> p[ibcnt] = '\0';
>> ZVAL_STRINGL(z, p, mycount);
>> printf("Returned %s\n", p);
>> efree(p);
>> RETURN_LONG(r);
>> }
>>
>>
>> Any ideas why ZVAL_STRINGL is not doing anything?
>> Or did I miss something?
>>
> Well, ZVAL_STRINGL is probably doing something, but there are two
> reasons there's no way to be certain:
>
> 1. What is 'mycount' and where does it come from / how is it set? If
> it's zero, then you'll be saving a zero length string. In any case, it
> doesn't seem to have any relationship to the data read into `p`. I'm
> guessing you wanted to use `r` rather than `mycount` both here and in
> your debug message.
>
> 2. I'm inferring that you want argument 2 to your function to be a
> pass-by-ref argument. Are you specifying any arg_info in the function
> entry list? (where you have your PHP_FE macro -- or perhaps ZEND_FE
> macro, since you seem to be using those versions). In order to pass
> by ref, you need that structure to specify that the argument is
> by-ref. This *might* have worked without it in PHP 5, but only by
> accident and would have probably failed in hard-to-diagnose ways.
>
> 2a. Also, when using by-ref args, you need to destruct any previously
> held value. In this case, with a zval_dtor(z); prior to the
> ZVAL_STRINGL() macro.
>
> -Sara
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php