diff options
author | Sascha Schumann <sas@php.net> | 2002-04-21 01:17:49 +0000 |
---|---|---|
committer | Sascha Schumann <sas@php.net> | 2002-04-21 01:17:49 +0000 |
commit | d30fc27e5afeda9a548150adb46a557dd554ceca (patch) | |
tree | 479e039697add507e83ead498a21012fee37453b /ext/standard/var.c | |
parent | 5db5498f9041f3a51f8d26ccd478ba2ecb6cff13 (diff) | |
download | php-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.c | 12 |
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; } |