summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2015-03-08 00:15:55 +0800
committerXinchen Hui <laruence@php.net>2015-03-08 00:21:02 +0800
commit95b4aa529336ede207dbd2d114521c60ec4f2ccb (patch)
tree9259774da4268a4dffc2efe040b72e0273045f66
parentafad979c60e4b54b65a6fd7345d476076a7a9a03 (diff)
downloadphp-git-95b4aa529336ede207dbd2d114521c60ec4f2ccb.tar.gz
Fixed zend_hash_append result duplicated key
actually, maybe we should precalculate before calling zend_hash_appen when we are not sure whether the hash is caclculated(prop_info->name). but it looks a little ugly.. (also for zend_string_copy)
-rw-r--r--Zend/zend.h2
-rw-r--r--Zend/zend_execute_API.c1
-rw-r--r--Zend/zend_hash.h12
-rw-r--r--Zend/zend_inheritance.c3
-rw-r--r--Zend/zend_object_handlers.c1
5 files changed, 7 insertions, 12 deletions
diff --git a/Zend/zend.h b/Zend/zend.h
index 4cf73225b7..94cab74af1 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -31,9 +31,9 @@
#include "zend_types.h"
#include "zend_errors.h"
#include "zend_alloc.h"
-#include "zend_hash.h"
#include "zend_llist.h"
#include "zend_string.h"
+#include "zend_hash.h"
#include "zend_ast.h"
#include "zend_gc.h"
#include "zend_variables.h"
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 6dda9effa0..7cee3ba73d 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1473,7 +1473,6 @@ ZEND_API zend_array *zend_rebuild_symbol_table(void) /* {{{ */
/*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/
}
for (i = 0; i < ex->func->op_array.last_var; i++) {
- zend_string_addref(ex->func->op_array.vars[i]);
_zend_hash_append_ind(symbol_table, ex->func->op_array.vars[i],
ZEND_CALL_VAR_NUM(ex, i));
}
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 1e166ac8c3..02991a643b 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -818,8 +818,8 @@ static zend_always_inline void _zend_hash_append(HashTable *ht, zend_string *key
Bucket *p = ht->arData + idx;
ZVAL_COPY_VALUE(&p->val, zv);
- p->key = key;
- p->h = key->h;
+ p->key = zend_string_copy(key);
+ p->h = zend_string_hash_val(key);
nIndex = p->h & ht->nTableMask;
Z_NEXT(p->val) = ht->arHash[nIndex];
ht->arHash[nIndex] = idx;
@@ -834,8 +834,8 @@ static zend_always_inline void _zend_hash_append_ptr(HashTable *ht, zend_string
Bucket *p = ht->arData + idx;
ZVAL_PTR(&p->val, ptr);
- p->key = key;
- p->h = key->h;
+ p->key = zend_string_copy(key);
+ p->h = zend_string_hash_val(key);
nIndex = p->h & ht->nTableMask;
Z_NEXT(p->val) = ht->arHash[nIndex];
ht->arHash[nIndex] = idx;
@@ -850,8 +850,8 @@ static zend_always_inline void _zend_hash_append_ind(HashTable *ht, zend_string
Bucket *p = ht->arData + idx;
ZVAL_INDIRECT(&p->val, ptr);
- p->key = key;
- p->h = key->h;
+ p->key = zend_string_copy(key);
+ p->h = zend_string_hash_val(key);
nIndex = p->h & ht->nTableMask;
Z_NEXT(p->val) = ht->arHash[nIndex];
ht->arHash[nIndex] = idx;
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index c48718c46c..e3ef17cc90 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -636,7 +636,6 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke
child_info = parent_info;
}
}
- zend_string_addref(key);
_zend_hash_append_ptr(&ce->properties_info, key, child_info);
}
}
@@ -704,7 +703,6 @@ static void do_inherit_class_constant(zend_string *name, zval *zv, zend_class_en
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
Z_ADDREF_P(zv);
- zend_string_addref(name);
_zend_hash_append(&ce->constants_table, name, zv);
}
}
@@ -857,7 +855,6 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
zend_function *new_func = do_inherit_method(key, func, ce);
if (new_func) {
- zend_string_addref(key);
_zend_hash_append_ptr(&ce->function_table, key, new_func);
}
} ZEND_HASH_FOREACH_END();
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index af604e2675..a5c0bf0a03 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -84,7 +84,6 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
(prop_info->flags & ZEND_ACC_STATIC) == 0 &&
Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) != IS_UNDEF) {
- zend_string_addref(prop_info->name);
_zend_hash_append_ind(zobj->properties, prop_info->name,
OBJ_PROP(zobj, prop_info->offset));
}