Zval type flags are incorrect for IS_CALLABLE / IS_INDIRECT
Closed this issue · 0 comments
While trying to working with ExecutorGlobals::get().symbol_table
where the PHP global variables can be INDIRECT
Zvals. (See https://wiki.php.net/phpng-int for a description of INDIRECT Zvals, specifically around their use in symbol tables.
ext-php-rs is detecting the type of INDIRECT
zval's as Callable
, which is not correct. Looking at the PHP src at https://github.com/php/php-src/blob/master/Zend/zend_types.h#L562-L575 there is overlap in IS_CALLABLE
and IS_INDIRECT
(similarly IS_PTR
and IS_ITERABLE
). For some reason ext-php-rs has chosen to take the flag IS_CALLABLE
in https://github.com/davidcole1340/ext-php-rs/blob/master/src/flags.rs#L254, when it should actually be checking IS_INDIRECT
and treating it like a pointer to another Zval.
I don't believe Zval's type flag can actually be IS_CALLABLE
, as is suggested by the php-src link above, that is a "fake" type.
Switching this out would probably break the current implementation of Zval::is_callable()
though, so I'm not sure what the correct solution here is exactly.