summaryrefslogtreecommitdiff
path: root/ext/standard/var_unserializer.re
diff options
context:
space:
mode:
authorKalle Sommer Nielsen <kalle@php.net>2010-09-18 16:09:28 +0000
committerKalle Sommer Nielsen <kalle@php.net>2010-09-18 16:09:28 +0000
commit208aa1025d0316b517383bd1e102d39c919636a3 (patch)
tree96b326dceca0bbcc957100d87a17cde60618bbfd /ext/standard/var_unserializer.re
parent1c9e784985a9f9194ac2b5854c48d13c0e75d3a7 (diff)
downloadphp-git-208aa1025d0316b517383bd1e102d39c919636a3.tar.gz
Improved performance of unserialize(), original patch by galaxy dot mipt at gmail dot com
Diffstat (limited to 'ext/standard/var_unserializer.re')
-rw-r--r--ext/standard/var_unserializer.re36
1 files changed, 16 insertions, 20 deletions
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re
index b1b5d34efe..6ccf8a3b63 100644
--- a/ext/standard/var_unserializer.re
+++ b/ext/standard/var_unserializer.re
@@ -33,25 +33,23 @@ typedef struct {
static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval)
{
- var_entries *var_hash = (*var_hashx)->first, *prev = NULL;
+ var_entries *var_hash = (*var_hashx)->last;
#if 0
fprintf(stderr, "var_push(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval));
#endif
-
- while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) {
- prev = var_hash;
- var_hash = var_hash->next;
- }
- if (!var_hash) {
+ if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
var_hash = emalloc(sizeof(var_entries));
var_hash->used_slots = 0;
var_hash->next = 0;
- if (!(*var_hashx)->first)
+ if (!(*var_hashx)->first) {
(*var_hashx)->first = var_hash;
- else
- prev->next = var_hash;
+ } else {
+ ((var_entries *) (*var_hashx)->last)->next = var_hash;
+ }
+
+ (*var_hashx)->last = var_hash;
}
var_hash->data[var_hash->used_slots++] = *rval;
@@ -59,25 +57,23 @@ static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval)
PHPAPI void var_push_dtor(php_unserialize_data_t *var_hashx, zval **rval)
{
- var_entries *var_hash = (*var_hashx)->first_dtor, *prev = NULL;
+ var_entries *var_hash = (*var_hashx)->last_dtor;
#if 0
fprintf(stderr, "var_push_dtor(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval));
#endif
-
- while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) {
- prev = var_hash;
- var_hash = var_hash->next;
- }
- if (!var_hash) {
+ if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
var_hash = emalloc(sizeof(var_entries));
var_hash->used_slots = 0;
var_hash->next = 0;
- if (!(*var_hashx)->first_dtor)
+ if (!(*var_hashx)->first_dtor) {
(*var_hashx)->first_dtor = var_hash;
- else
- prev->next = var_hash;
+ } else {
+ ((var_entries *) (*var_hashx)->last_dtor)->next = var_hash;
+ }
+
+ (*var_hashx)->last_dtor = var_hash;
}
Z_ADDREF_PP(rval);