At 03:44 01/08/2003, Ken Spencer wrote:
>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