diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-12-18 19:10:53 +0100 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-12-20 18:19:22 +0100 |
commit | b85f0d1cd0cc49ad339b8129c3d45181b56eff24 (patch) | |
tree | 93adb3a55918db97f5af15aa8fddcbbd901a990b /ext/fileinfo/fileinfo.c | |
parent | 54c866106e51d8fff2ad240febca7871e6b086a9 (diff) | |
download | php-git-b85f0d1cd0cc49ad339b8129c3d45181b56eff24.tar.gz |
Convert file_info resources to objects
Besides our general desire to get rid of the legacy resource types,
this is particularly appealing for fileinfo, because there are already
respective objects.
Closes GH-5987.
Diffstat (limited to 'ext/fileinfo/fileinfo.c')
-rw-r--r-- | ext/fileinfo/fileinfo.c | 87 |
1 files changed, 20 insertions, 67 deletions
diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c index add971b6d6..5670debe4a 100644 --- a/ext/fileinfo/fileinfo.c +++ b/ext/fileinfo/fileinfo.c @@ -51,22 +51,12 @@ typedef struct _finfo_object { zend_object zo; } finfo_object; -#define FILEINFO_DECLARE_INIT_OBJECT(object) \ - zval *object = getThis(); - static inline finfo_object *php_finfo_fetch_object(zend_object *obj) { return (finfo_object *)((char*)(obj) - XtOffsetOf(finfo_object, zo)); } #define Z_FINFO_P(zv) php_finfo_fetch_object(Z_OBJ_P((zv))) -#define FILEINFO_REGISTER_OBJECT(_object, _ptr) \ -{ \ - finfo_object *obj; \ - obj = Z_FINFO_P(_object); \ - obj->ptr = _ptr; \ -} - #define FILEINFO_FROM_OBJECT(finfo, object) \ { \ finfo_object *obj = Z_FINFO_P(object); \ @@ -112,20 +102,6 @@ PHP_FILEINFO_API zend_object *finfo_objects_new(zend_class_entry *class_type) options, magic_errno(magic), magic_error(magic)); \ RETURN_FALSE; \ } - -/* True global resources - no need for thread safety here */ -static int le_fileinfo; -/* }}} */ - -void finfo_resource_destructor(zend_resource *rsrc) /* {{{ */ -{ - if (rsrc->ptr) { - php_fileinfo *finfo = (php_fileinfo *) rsrc->ptr; - magic_close(finfo->magic); - efree(rsrc->ptr); - rsrc->ptr = NULL; - } -} /* }}} */ /* {{{ PHP_MINIT_FUNCTION */ @@ -144,8 +120,6 @@ PHP_MINIT_FUNCTION(finfo) finfo_object_handlers.free_obj = finfo_objects_free; finfo_object_handlers.clone_obj = NULL; - le_fileinfo = zend_register_list_destructors_ex(finfo_resource_destructor, NULL, "file_info", module_number); - REGISTER_LONG_CONSTANT("FILEINFO_NONE", MAGIC_NONE, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FILEINFO_SYMLINK", MAGIC_SYMLINK, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FILEINFO_MIME", MAGIC_MIME, CONST_CS|CONST_PERSISTENT); @@ -204,14 +178,14 @@ PHP_MINFO_FUNCTION(fileinfo) } /* }}} */ -/* {{{ Create a new fileinfo resource. */ +/* {{{ Construct a new fileinfo object. */ PHP_FUNCTION(finfo_open) { zend_long options = MAGIC_NONE; char *file = NULL; size_t file_len = 0; php_fileinfo *finfo; - FILEINFO_DECLARE_INIT_OBJECT(object) + zval *object = getThis(); char resolved_path[MAXPATHLEN]; zend_error_handling zeh; @@ -287,30 +261,28 @@ PHP_FUNCTION(finfo_open) } if (object) { + finfo_object *obj; zend_restore_error_handling(&zeh); - FILEINFO_REGISTER_OBJECT(object, finfo); + obj = Z_FINFO_P(object); + obj->ptr = finfo; } else { - RETURN_RES(zend_register_resource(finfo, le_fileinfo)); + zend_object *zobj = finfo_objects_new(finfo_class_entry); + finfo_object *obj = php_finfo_fetch_object(zobj); + obj->ptr = finfo; + RETURN_OBJ(zobj); } } /* }}} */ -/* {{{ Close fileinfo resource. */ +/* {{{ Close fileinfo object - a NOP. */ PHP_FUNCTION(finfo_close) { - php_fileinfo *finfo; - zval *zfinfo; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zfinfo) == FAILURE) { - RETURN_THROWS(); - } + zval *self; - if ((finfo = (php_fileinfo *)zend_fetch_resource(Z_RES_P(zfinfo), "file_info", le_fileinfo)) == NULL) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &self, finfo_class_entry) == FAILURE) { RETURN_THROWS(); } - zend_list_close(Z_RES_P(zfinfo)); - RETURN_TRUE; } /* }}} */ @@ -320,22 +292,12 @@ PHP_FUNCTION(finfo_set_flags) { zend_long options; php_fileinfo *finfo; - zval *zfinfo; - FILEINFO_DECLARE_INIT_OBJECT(object) + zval *self; - if (object) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &options) == FAILURE) { - RETURN_THROWS(); - } - FILEINFO_FROM_OBJECT(finfo, object); - } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &zfinfo, &options) == FAILURE) { - RETURN_THROWS(); - } - if ((finfo = (php_fileinfo *)zend_fetch_resource(Z_RES_P(zfinfo), "file_info", le_fileinfo)) == NULL) { - RETURN_THROWS(); - } + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ol", &self, finfo_class_entry, &options) == FAILURE) { + RETURN_THROWS(); } + FILEINFO_FROM_OBJECT(finfo, self); FINFO_SET_OPTION(finfo->magic, options) finfo->options = options; @@ -354,12 +316,10 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime char *ret_val = NULL, *buffer = NULL; size_t buffer_len; php_fileinfo *finfo = NULL; - zval *zfinfo, *zcontext = NULL; + zval *zcontext = NULL; zval *what; char mime_directory[] = "directory"; - struct magic_set *magic = NULL; - FILEINFO_DECLARE_INIT_OBJECT(object) if (mimetype_emu) { @@ -389,19 +349,12 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime php_error_docref(NULL, E_WARNING, "Failed to load magic database"); goto common; } - } else if (object) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lr!", &buffer, &buffer_len, &options, &zcontext) == FAILURE) { - RETURN_THROWS(); - } - FILEINFO_FROM_OBJECT(finfo, object); - magic = finfo->magic; } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|lr!", &zfinfo, &buffer, &buffer_len, &options, &zcontext) == FAILURE) { - RETURN_THROWS(); - } - if ((finfo = (php_fileinfo *)zend_fetch_resource(Z_RES_P(zfinfo), "file_info", le_fileinfo)) == NULL) { + zval *self; + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os|lr!", &self, finfo_class_entry, &buffer, &buffer_len, &options, &zcontext) == FAILURE) { RETURN_THROWS(); } + FILEINFO_FROM_OBJECT(finfo, self); magic = finfo->magic; } |