summaryrefslogtreecommitdiff
path: root/ext/standard/var.c
diff options
context:
space:
mode:
authorSascha Schumann <sas@php.net>2002-04-21 01:17:49 +0000
committerSascha Schumann <sas@php.net>2002-04-21 01:17:49 +0000
commitd30fc27e5afeda9a548150adb46a557dd554ceca (patch)
tree479e039697add507e83ead498a21012fee37453b /ext/standard/var.c
parent5db5498f9041f3a51f8d26ccd478ba2ecb6cff13 (diff)
downloadphp-git-d30fc27e5afeda9a548150adb46a557dd554ceca.tar.gz
simplify and improve speed of smart_str_print_long.
also add a variant for unsigned numbers.
Diffstat (limited to 'ext/standard/var.c')
-rw-r--r--ext/standard/var.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/ext/standard/var.c b/ext/standard/var.c
index 82dc118167..4b8e661aae 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -379,11 +379,13 @@ static inline int php_add_var_hash(HashTable *var_hash, zval *var, void *var_old
{
ulong var_no;
char id[32], *p;
+ register int len;
- p = smart_str_print_long(id, (long) var);
- *p = '\0';
-
- if (var_old && zend_hash_find(var_hash, id, p - id, var_old) == SUCCESS) {
+ /* relies on "(long)" being a perfect hash function for data pointers */
+ p = smart_str_print_long(id + sizeof(id) - 1, (long) var);
+ len = id + sizeof(id) - 1 - p;
+
+ if (var_old && zend_hash_find(var_hash, p, len, var_old) == SUCCESS) {
if (!var->is_ref) {
/* we still need to bump up the counter, since non-refs will
be counted separately by unserializer */
@@ -395,7 +397,7 @@ static inline int php_add_var_hash(HashTable *var_hash, zval *var, void *var_old
/* +1 because otherwise hash will think we are trying to store NULL pointer */
var_no = zend_hash_num_elements(var_hash) + 1;
- zend_hash_add(var_hash, id, p - id, &var_no, sizeof(var_no), NULL);
+ zend_hash_add(var_hash, p, len, &var_no, sizeof(var_no), NULL);
return SUCCESS;
}