On Fri, 1 Aug 2003, Rasmus Lerdorf wrote: My apologies, my explanation wasn't very clear. my initialization function needs to both parse the argument stack, but it also declars a few user defined variables to be global.
I did not include the portion of code in my snippet that ensures the function is only called from within a user defined function. Ken > Your code doesn't make much sense to me. This is your code, right? > > 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); > } > > So you look for a global variable named whatever the contents of 'var' is. > If you find it, you put it in the function-local symbol table. This is > not at all what you said you wanted to do. And you don't check to see if > the active_symbol_table is the same as the symbol_table which it would be > if you were to call this function from the global scope. > > -Rasmus > > On Fri, 1 Aug 2003, Ken Spencer wrote: > > > On Fri, 1 Aug 2003, Mark Spruiell wrote: > > > > > > Mark, thanks for your reply. The situation is, is that I am writing a > > large piece of software with several hundred functions. At the beginning > > of each function I have som initialization code that allows me to do > > several thing. > > > > Parse through the variables in a non standard way, and define a few > > variables to be global within the function. > > > > The only way I was able to accomplish this in the past was to call an > > include from the beginning of each function (as there is no way to write a > > function that uses func_get_args()). Calling this include however is quite > > inneficient, and I have replaced most of what it does with my C extension. > > > > I have also tried using the zend_register_auto_global function, but this > > appears to cause a great deal of unpredictable behaviour. > > > > Cheers, > > > > Ken > > > > > > > > > Hi Ken, > > > > > > I'm fairly new to PHP extension programming, so forgive me if I'm > > > missing the obvious, but your code appears to be trying to copy a > > > global variable to a local scope. Is that your intent? > > > > > > If so, why can't the script do this itself by using a "global" > > > declaration for the variable? For example: > > > > > > <? > > > $v = "foo"; > > > > > > function bar() > > > { > > > global $v; > > > echo "v = $v\n"; > > > } > > > ?> > > > > > > As for why you're getting a segfault, I suspect it's a reference > > > counting issue. Have a look at the definition of > > > ZEND_SET_SYMBOL_WITH_LENGTH in zend_API.h and you'll see it is > > > modifying the container you retrieved from EG(symbol_table). > > > > > > Good luck, > > > - Mark > > > > > > > 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); > > > > } > > > > > > > > but it seg faults upon second execution. > > > > > > > > Can someone reccomend a more successful method of accomplishing this? > > > > > > > > > > > > Chhers, > > > > > > > > Ken > > > > > > > > > > > > > > > > -- > > > > PHP Internals - PHP Runtime Development Mailing List > > > > To unsubscribe, visit: http://www.php.net/unsub.php > > > > > > > > > > > > > > > > > > > > > > > -- > > PHP Internals - PHP Runtime Development Mailing List > > To unsubscribe, visit: http://www.php.net/unsub.php > > > > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php