From: Marcus Boerger Date: Wed, 8 Mar 2006 21:54:48 +0000 (+0000) Subject: - MFH Allow pecl/phar and alike too hook into spl_filesystem_object's X-Git-Tag: php-5.1.3RC1~5 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4a5dd3020191856d7a99b04ba3b0eed1e0160031;p=php - MFH Allow pecl/phar and alike too hook into spl_filesystem_object's --- diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index dfe56e8df6..c3fd193dc7 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -70,6 +70,9 @@ static void spl_filesystem_object_free_storage(void *object TSRMLS_DC) /* {{{ */ { spl_filesystem_object *intern = (spl_filesystem_object*)object; + if (intern->oth_handler && intern->oth_handler->dtor) { + intern->oth_handler->dtor(intern TSRMLS_CC); + } zend_hash_destroy(intern->std.properties); FREE_HASHTABLE(intern->std.properties); @@ -130,7 +133,7 @@ static zend_object_value spl_filesystem_object_new_ex(zend_class_entry *class_ty intern = emalloc(sizeof(spl_filesystem_object)); memset(intern, 0, sizeof(spl_filesystem_object)); intern->std.ce = class_type; - /* intern->type = SPL_FS_INFO; done by set o */ + /* intern->type = SPL_FS_INFO; done by set 0 */ intern->file_class = spl_ce_SplFileObject; intern->info_class = spl_ce_SplFileInfo; if (obj) *obj = intern; @@ -270,9 +273,14 @@ static zend_object_value spl_filesystem_object_clone(zval *zobject TSRMLS_DC) intern->info_class = source->info_class; intern->flags = source->flags; intern->oth = source->oth; + intern->oth_handler = source->oth_handler; zend_objects_clone_members(new_object, new_obj_val, old_object, handle TSRMLS_CC); + if (intern->oth_handler && intern->oth_handler->clone) { + intern->oth_handler->clone(source, intern TSRMLS_CC); + } + return new_obj_val; } /* }}} */ @@ -437,8 +445,8 @@ SPL_METHOD(DirectoryIterator, __construct) if (!len) { php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); - zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Directory name must not be empty."); - return; + zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Directory name must not be empty."); + return; } intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); diff --git a/ext/spl/spl_directory.h b/ext/spl/spl_directory.h index c0c68eddd2..5a72bb6c24 100755 --- a/ext/spl/spl_directory.h +++ b/ext/spl/spl_directory.h @@ -33,14 +33,25 @@ extern PHPAPI zend_class_entry *spl_ce_SplTempFileObject; PHP_MINIT_FUNCTION(spl_directory); typedef enum { - SPL_FS_INFO, + SPL_FS_INFO, /* must be 0 */ SPL_FS_DIR, SPL_FS_FILE, } SPL_FS_OBJ_TYPE; -typedef struct _spl_filesystem_object { +typedef struct _spl_filesystem_object spl_filesystem_object; + +typedef void (*spl_foreign_dtor_t)(spl_filesystem_object *object TSRMLS_DC); +typedef void (*spl_foreign_clone_t)(spl_filesystem_object *src, spl_filesystem_object *dst TSRMLS_DC); + +typedef struct _spl_other_handler { + spl_foreign_dtor_t dtor; + spl_foreign_clone_t clone; +} spl_other_handler; + +struct _spl_filesystem_object { zend_object std; void *oth; + spl_other_handler *oth_handler; char *path; int path_len; char *file_name; @@ -73,7 +84,7 @@ typedef struct _spl_filesystem_object { zend_function *func_getCurr; } file; } u; -} spl_filesystem_object; +}; #define SPL_FILE_OBJECT_DROP_NEW_LINE 0x00000001 /* drop new lines */