I am trying to make a function for my extension that makes a predefined variable global
I have tried something along the lines of:
if(zend_hash_find(&EG(symbol_table), var, strlen(var)+1, (void **) &vars_data)!=FAILURE) { ZEND_SET_SYMBOL(EG(active_symbol_table), var, *vars_data); }
You're messing with the reference count here. ZEND_SET_SYMBOL() 'takes over' this zval, and the original copy becomes corrupted. That's probably why it fails the second time you try it. You need to use ZEND_SET_SYMBOL_WITH_LENGTH() instead, and take care of the reference count manually.
When touching a zval coming back from an engine-controlled symbol table, you must take care of the reference count (in this case, increment it). If you want the two variables to be references, that is, changing one would change the other - you should also turn on the is_ref bit, and not forget to first separate it. It should look something like this:
if(zend_hash_find(&EG(symbol_table), var, strlen(var)+1, (void **) &vars_data)!=FAILURE) {
SEPARATE_ZVAL_IF_NOT_REF(vars_data);
(*vars_data)->refcount++;
ZEND_SET_SYMBOL_WITH_LENGTH(EG(active_symbol_table), var, strlen(var)+1, *vars_data, (*vars_data)->refcount, 1);
}
Zeev
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php