Changeset 292 for trunk/ext

Show
Ignore:
Timestamp:
10/24/2007 17:19:37 (13 months ago)
Author:
indeyets
Message:

optimization of dumping mixed arrays

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/ext/php/phpext.c

    r291 r292  
    703703                                for (zend_hash_internal_pointer_reset(tbl); zend_hash_has_more_elements(tbl) == SUCCESS; zend_hash_move_forward(tbl)) { 
    704704                                        zval **ppzval = NULL, kzval; 
    705                                         char *key = NULL; 
    706705                                        uint key_len; 
    707706                                        ulong idx; 
    708707                                        size_t key_type; 
    709708 
    710                                         zend_hash_get_current_key_ex(tbl, (char **)&key, &key_len, &idx, 0, NULL); 
     709                                        key_type = zend_hash_get_current_key_type_ex(tbl, NULL); 
     710 
     711                                        if (key_type == HASH_KEY_IS_LONG) { 
     712                                                zend_hash_get_current_key_ex(tbl, NULL, NULL, &idx, 0, NULL); 
     713                                                ZVAL_LONG(&kzval, idx); 
     714                                        } else { 
     715                                                char *skey = NULL; 
     716                                                zend_hash_get_current_key_ex(tbl, (char **)&skey, &key_len, NULL, 0, NULL); 
     717                                                ZVAL_STRINGL(&kzval, skey, key_len - 1, 1); 
     718                                        } 
     719 
    711720                                        zend_hash_get_current_data(tbl, (void **)&ppzval); 
    712                                         key_type = zend_hash_get_current_key_type_ex(tbl, NULL); 
    713  
    714                                         if (key_type == HASH_KEY_IS_LONG) { 
    715                                                 key_len = 1 + snprintf(key, 0, "%ld", idx); /* getting size ("0" doesn't let output) */ 
    716                                                 key = emalloc(key_len); 
    717                                                 snprintf(key, key_len, "%ld", idx); 
    718                                         } 
    719  
    720                                         ZVAL_STRINGL(&kzval, key, key_len - 1, 1); 
    721721 
    722722                                        if (psex_push_obj(bonus, &kzval)) { 
     
    731731 
    732732                                        zval_dtor(&kzval); 
    733  
    734                                         if (key_type == HASH_KEY_IS_LONG) { 
    735                                                 efree(key); 
    736                                         } 
    737733                                } 
    738734