mirror of
https://github.com/php-gnupg/php-gnupg.git
synced 2026-02-05 13:51:34 +00:00
various memory optimizations
This commit is contained in:
parent
95ed1d656f
commit
1bf61c6980
3 changed files with 127 additions and 48 deletions
|
|
@ -37,31 +37,29 @@ static int le_gnupg_keylistiterator;
|
|||
static zend_object_handlers gnupg_keylistiterator_object_handlers;
|
||||
|
||||
/* {{{ defs */
|
||||
|
||||
#define GNUPG_GET_ITERATOR() \
|
||||
zval *this = getThis(); \
|
||||
gnupg_keylistiterator_object *intern; \
|
||||
ze_gnupg_keylistiterator_object *obj = (ze_gnupg_keylistiterator_object*) zend_object_store_get_object(getThis() TSRMLS_CC); \
|
||||
intern = obj->gnupg_keylistiterator_ptr; \
|
||||
if(!intern){ \
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or unitialized gnupg iterator object"); \
|
||||
RETURN_FALSE; \
|
||||
}
|
||||
|
||||
if(this){ \
|
||||
intern = (gnupg_keylistiterator_object*) zend_object_store_get_object(getThis() TSRMLS_CC); \
|
||||
if(!intern){ \
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or unitialized gnupg object"); \
|
||||
RETURN_FALSE; \
|
||||
} \
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ free_iterator_storage */
|
||||
static void gnupg_keylistiterator_object_free_storage(void *object TSRMLS_DC){
|
||||
ze_gnupg_keylistiterator_object *intern = (ze_gnupg_keylistiterator_object *) object;
|
||||
static void gnupg_keylistiterator_dtor(gnupg_keylistiterator_object *intern TSRMLS_DC){
|
||||
if(!intern){
|
||||
return;
|
||||
}
|
||||
if(intern->gnupg_keylistiterator_ptr){
|
||||
gpgme_op_keylist_end(intern->gnupg_keylistiterator_ptr->ctx);
|
||||
gpgme_key_release(intern->gnupg_keylistiterator_ptr->gpgkey);
|
||||
gpgme_release(intern->gnupg_keylistiterator_ptr->ctx);
|
||||
zval_dtor(&intern->gnupg_keylistiterator_ptr->pattern);
|
||||
efree(intern->gnupg_keylistiterator_ptr);
|
||||
}
|
||||
gpgme_op_keylist_end(intern->ctx);
|
||||
gpgme_key_release(intern->gpgkey);
|
||||
gpgme_release(intern->ctx);
|
||||
/*
|
||||
zval_dtor(&intern->pattern);
|
||||
*/
|
||||
if(intern->zo.properties){
|
||||
zend_hash_destroy(intern->zo.properties);
|
||||
FREE_HASHTABLE(intern->zo.properties);
|
||||
|
|
@ -72,25 +70,20 @@ static void gnupg_keylistiterator_object_free_storage(void *object TSRMLS_DC){
|
|||
|
||||
/* {{{ keylistiterator_objects_new */
|
||||
zend_object_value gnupg_keylistiterator_objects_new(zend_class_entry *class_type TSRMLS_DC){
|
||||
ze_gnupg_keylistiterator_object *intern;
|
||||
gnupg_keylistiterator_object *intern;
|
||||
zend_object_value retval;
|
||||
gnupg_keylistiterator_object *gnupg_keylistiterator_ptr;
|
||||
gpgme_ctx_t ctx;
|
||||
|
||||
intern = emalloc(sizeof(ze_gnupg_keylistiterator_object));
|
||||
intern = emalloc(sizeof(gnupg_keylistiterator_object));
|
||||
intern->zo.ce = class_type;
|
||||
intern->zo.in_get = 0;
|
||||
intern->zo.in_set = 0;
|
||||
intern->zo.properties = NULL;
|
||||
retval.handle = zend_objects_store_put(intern,NULL,(zend_objects_free_object_storage_t) gnupg_keylistiterator_object_free_storage,NULL TSRMLS_CC);
|
||||
retval.handle = zend_objects_store_put(intern,NULL,(zend_objects_free_object_storage_t) gnupg_keylistiterator_dtor,NULL TSRMLS_CC);
|
||||
retval.handlers = (zend_object_handlers *) & gnupg_keylistiterator_object_handlers;
|
||||
|
||||
gpgme_new(&ctx);
|
||||
gnupg_keylistiterator_ptr = emalloc(sizeof(gnupg_keylistiterator_object));
|
||||
gnupg_keylistiterator_ptr->ctx = ctx;
|
||||
|
||||
intern->gnupg_keylistiterator_ptr = gnupg_keylistiterator_ptr;
|
||||
|
||||
intern->ctx = ctx;
|
||||
return retval;
|
||||
}
|
||||
/* }}} */
|
||||
|
|
@ -141,7 +134,7 @@ PHP_FUNCTION(gnupg_keylistiterator___construct){
|
|||
intern->pattern = *pattern;
|
||||
zval_copy_ctor(&intern->pattern);
|
||||
}else{
|
||||
convert_to_string(&intern->pattern);
|
||||
ZVAL_EMPTY_STRING(&intern->pattern);
|
||||
}
|
||||
}
|
||||
PHP_FUNCTION(gnupg_keylistiterator_current){
|
||||
|
|
@ -159,6 +152,10 @@ PHP_FUNCTION(gnupg_keylistiterator_key){
|
|||
PHP_FUNCTION(gnupg_keylistiterator_next){
|
||||
GNUPG_GET_ITERATOR();
|
||||
|
||||
if(intern->gpgkey){
|
||||
gpgme_key_release(intern->gpgkey);
|
||||
}
|
||||
|
||||
if(intern->err = gpgme_op_keylist_next(intern->ctx, &intern->gpgkey)){
|
||||
gpgme_key_release(intern->gpgkey);
|
||||
intern->gpgkey = NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue