{
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);
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;
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;
}
/* }}} */
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);
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;
zend_function *func_getCurr;
} file;
} u;
-} spl_filesystem_object;
+};
#define SPL_FILE_OBJECT_DROP_NEW_LINE 0x00000001 /* drop new lines */