From: Zeev Suraski Date: Fri, 30 Jul 1999 02:49:12 +0000 (+0000) Subject: * Setting variables in the global scope wasn't handling is_ref's properly X-Git-Tag: php-4.0b2~80 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=48ffdd79f726a40ed1c330436aa8c8dad224cc6a;p=php * Setting variables in the global scope wasn't handling is_ref's properly --- diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 89e6180e76..00d271d6fc 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -182,52 +182,80 @@ ZEND_API int add_property_stringl(zval *arg, char *key, char *str, uint length, #define RETURN_FALSE { RETVAL_FALSE; return; } #define RETURN_TRUE { RETVAL_TRUE; return; } -#define SET_VAR_STRING(n,v) { \ - { \ - zval *var = (zval *) emalloc(sizeof(zval)); \ - \ - char *str=v; /* prevent 'v' from being evaluated more than once */ \ - var->value.str.val = (str); \ - var->value.str.len = strlen((str)); \ - var->type = IS_STRING; \ - INIT_PZVAL(var); \ - zend_hash_update(&EG(symbol_table), (n), strlen((n))+1, &var, sizeof(zval *), NULL); \ - } \ +#define SET_VAR_STRING(n,v) { \ + { \ + zval *var = (zval *) emalloc(sizeof(zval)); \ + char *str=(v); /* prevent 'v' from being evaluated more than once */ \ + \ + var->value.str.val = (str); \ + var->value.str.len = strlen((str)); \ + var->type = IS_STRING; \ + ZEND_SET_GLOBAL_VAR(name, var); \ + } \ } -#define SET_VAR_STRINGL(n,v,l) { \ - { \ - zval *var = (zval *) emalloc(sizeof(zval)); \ - \ - char *name=(n); \ - var->value.str.val = (v); \ - var->value.str.len = (l); \ - var->type = IS_STRING; \ - INIT_PZVAL(var); \ - zend_hash_update(&EG(symbol_table), name, strlen(name)+1, &var, sizeof(zval *), NULL); \ - } \ + +#define SET_VAR_STRINGL(n,v,l) { \ + { \ + zval *var = (zval *) emalloc(sizeof(zval)); \ + \ + var->value.str.val = (v); \ + var->value.str.len = (l); \ + var->type = IS_STRING; \ + ZEND_SET_GLOBAL_VAR(n, var); \ + } \ } -#define SET_VAR_LONG(n,v) { \ - { \ - zval *var = (zval *) emalloc(sizeof(zval)); \ - \ - var->value.lval = (v); \ - var->type = IS_LONG; \ - INIT_PZVAL(var); \ - zend_hash_update(&EG(symbol_table), (n), strlen((n))+1, &var, sizeof(zval *), NULL); \ - } \ + +#define SET_VAR_LONG(n,v) { \ + { \ + zval *var = (zval *) emalloc(sizeof(zval)); \ + \ + var->value.lval = (v); \ + var->type = IS_LONG; \ + ZEND_SET_GLOBAL_VAR(n, var); \ + } \ } -#define SET_VAR_DOUBLE(n,v) { \ - { \ - zval *var = (zval *) emalloc(sizeof(zval)); \ - \ - var->value.dval = (v); \ - var->type = IS_DOUBLE; \ - INIT_PZVAL(var); \ - zend_hash_update(&EG(symbol_table)), (n), strlen((n))+1, &var, sizeof(zval *), NULL); \ - } \ + +#define SET_VAR_DOUBLE(n,v) { \ + { \ + zval *var = (zval *) emalloc(sizeof(zval)); \ + \ + var->value.dval = (v); \ + var->type = IS_DOUBLE; \ + ZEND_SET_GLOBAL_VAR(n, var); \ + } \ } +#define ZEND_SET_GLOBAL_VAR(name, var) \ + { \ + char *_name = (name); \ + \ + ZEND_SET_GLOBAL_VAR_WITH_LENGTH(_name, strlen(_name)+1, var); \ + } + + +#define ZEND_SET_GLOBAL_VAR_WITH_LENGTH(name, name_length, var) \ + { \ + zval **orig_var; \ + \ + if (zend_hash_find(&EG(symbol_table), (name), (name_length), (void **) &orig_var)==SUCCESS \ + && PZVAL_IS_REF(*orig_var)) { \ + int locks = (*orig_var)->EA.locks; \ + int refcount = (*orig_var)->refcount; \ + \ + var->refcount = (*orig_var)->refcount; \ + var->EA.locks = (*orig_var)->EA.locks; \ + var->EA.is_ref = 1; \ + \ + zval_dtor(*orig_var); \ + **orig_var = *var; \ + efree(var); \ + } else { \ + INIT_PZVAL(var); \ + zend_hash_update(&EG(symbol_table), (name), (name_length), &var, sizeof(zval *), NULL); \ + } \ + } + #endif /* _ZEND_API_H */ /*