summaryrefslogtreecommitdiff
path: root/Zend/zend_API.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_API.h')
-rw-r--r--Zend/zend_API.h17
1 files changed, 10 insertions, 7 deletions
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 23278abc6e..b54942df0a 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -243,25 +243,28 @@ ZEND_API int add_property_stringl(zval *arg, char *key, char *str, uint length,
{ \
char *_name = (name); \
\
- ZEND_SET_SYMBOL_WITH_LENGTH(symtable, _name, strlen(_name)+1, var); \
+ ZEND_SET_SYMBOL_WITH_LENGTH(symtable, _name, strlen(_name)+1, var, 0); \
}
-#define ZEND_SET_SYMBOL_WITH_LENGTH(symtable, name, name_length, var) \
+#define ZEND_SET_SYMBOL_WITH_LENGTH(symtable, name, name_length, var, _refcount) \
{ \
zval **orig_var; \
\
if (zend_hash_find(symtable, (name), (name_length), (void **) &orig_var)==SUCCESS \
&& PZVAL_IS_REF(*orig_var)) { \
- (var)->refcount = (*orig_var)->refcount; \
+ (var)->refcount = (*orig_var)->refcount; \
(var)->is_ref = 1; \
\
zval_dtor(*orig_var); \
- **orig_var = *(var); \
+ **orig_var = *(var); \
efree(var); \
} else { \
INIT_PZVAL((var)); \
- zend_hash_update(symtable, (name), (name_length), &(var), sizeof(zval *), NULL); \
+ if (_refcount) { \
+ (var)->refcount = _refcount; \
+ } \
+ zend_hash_update(symtable, (name), (name_length), &(var), sizeof(zval *), NULL); \
} \
}
@@ -269,8 +272,8 @@ ZEND_API int add_property_stringl(zval *arg, char *key, char *str, uint length,
#define ZEND_SET_GLOBAL_VAR(name, var) \
ZEND_SET_SYMBOL(&EG(symbol_table), name, var)
-#define ZEND_SET_GLOBAL_VAR_WITH_LENGTH(name, name_length, var) \
- ZEND_SET_SYMBOL_WITH_LENGTH(&EG(symbol_table), name, name_length, var)
+#define ZEND_SET_GLOBAL_VAR_WITH_LENGTH(name, name_length, var, _refcount) \
+ ZEND_SET_SYMBOL_WITH_LENGTH(&EG(symbol_table), name, name_length, var, _refcount)
#define HASH_OF(p) ((p)->type==IS_ARRAY ? (p)->value.ht : (((p)->type==IS_OBJECT ? (p)->value.obj.properties : NULL)))