Re: Migrating php extension from 5 to 7, ZVAL_STRINGL no value returned

From: Date: Mon, 12 Mar 2018 17:18:30 +0000
Subject: Re: Migrating php extension from 5 to 7, ZVAL_STRINGL no value returned
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-101972@lists.php.net to get a copy of this message
On Mon, Mar 12, 2018 at 12:16 PM, Richard Klingler <richard@klingler.net> 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

« previous php.internals (#101972) next »