diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index a9bad08aa39f9..f8ab30bc969a9 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -1448,9 +1448,10 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */ } switch (intern->type) { - case SPL_FS_DIR: - test = spl_filesystem_object_get_path(intern, NULL); - fname_len = spprintf(&fname, 0, "%s%c%s", test, DEFAULT_SLASH, intern->u.dir.entry.d_name); + case SPL_FS_DIR: { + zend_string *test_str = spl_filesystem_object_get_path(intern); + fname_len = spprintf(&fname, 0, "%s%c%s", ZSTR_VAL(test_str), DEFAULT_SLASH, intern->u.dir.entry.d_name); + zend_string_release_ex(test_str, /* persistent */ false); if (php_stream_stat_path(fname, &ssb) == 0 && S_ISDIR(ssb.sb.st_mode)) { /* ignore directories */ efree(fname); @@ -1470,6 +1471,7 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */ save = fname; goto phar_spl_fileinfo; + } case SPL_FS_INFO: case SPL_FS_FILE: fname = expand_filepath(ZSTR_VAL(intern->file_name), NULL); diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index cc1a660823330..9de3445b7f43d 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -52,6 +52,34 @@ PHPAPI zend_class_entry *spl_ce_GlobIterator; PHPAPI zend_class_entry *spl_ce_SplFileObject; PHPAPI zend_class_entry *spl_ce_SplTempFileObject; +/* Object helper */ +static inline spl_filesystem_object *spl_filesystem_from_obj(zend_object *obj) /* {{{ */ { + return (spl_filesystem_object*)((char*)(obj) - XtOffsetOf(spl_filesystem_object, std)); +} +/* }}} */ + +/* define an overloaded iterator structure */ +typedef struct { + zend_object_iterator intern; + zval current; + void *object; +} spl_filesystem_iterator; + +static inline spl_filesystem_iterator* spl_filesystem_object_to_iterator(spl_filesystem_object *obj) +{ + spl_filesystem_iterator *it; + + it = ecalloc(1, sizeof(spl_filesystem_iterator)); + it->object = (void *)obj; + zend_iterator_init(&it->intern); + return it; +} + +static inline spl_filesystem_object* spl_filesystem_iterator_to_object(spl_filesystem_iterator *it) +{ + return (spl_filesystem_object*)it->object; +} + #define CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(spl_filesystem_object_pointer) \ if (!(spl_filesystem_object_pointer)->u.file.stream) { \ zend_throw_error(NULL, "Object not initialized"); \ @@ -194,19 +222,22 @@ static zend_object *spl_filesystem_object_new_check(zend_class_entry *class_type } /* }}} */ -PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, size_t *len) /* {{{ */ +PHPAPI zend_string *spl_filesystem_object_get_path(spl_filesystem_object *intern) /* {{{ */ { #ifdef HAVE_GLOB - if (intern->type == SPL_FS_DIR) { - if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) { - return php_glob_stream_get_path(intern->u.dir.dirp, len); + if (intern->type == SPL_FS_DIR && php_stream_is(intern->u.dir.dirp, &php_glob_stream_ops)) { + size_t len = 0; + char *tmp = php_glob_stream_get_path(intern->u.dir.dirp, &len); + if (len == 0) { + return NULL; } + return zend_string_init(tmp, len, /* persistent */ false); } #endif - if (len) { - *len = intern->path ? ZSTR_LEN(intern->path) : 0; + if (!intern->path) { + return NULL; } - return intern->path ? ZSTR_VAL(intern->path) : NULL; + return zend_string_copy(intern->path); } /* }}} */ static inline zend_result spl_filesystem_object_get_file_name(spl_filesystem_object *intern) /* {{{ */ @@ -221,29 +252,25 @@ static inline zend_result spl_filesystem_object_get_file_name(spl_filesystem_obj case SPL_FS_FILE: zend_throw_error(NULL, "Object not initialized"); return FAILURE; - break; - case SPL_FS_DIR: - { - size_t name_len; - size_t path_len = 0; - char *path; - char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH; - - path = spl_filesystem_object_get_path(intern, &path_len); - /* if there is parent path, amend it, otherwise just use the given path as is */ - name_len = strlen(intern->u.dir.entry.d_name); - if (path_len == 0) { - intern->file_name = zend_string_init(intern->u.dir.entry.d_name, name_len, 0); - } else { - zend_string *file_name = zend_string_alloc(path_len + 1 + name_len, 0); - memcpy(ZSTR_VAL(file_name), path, path_len); - ZSTR_VAL(file_name)[path_len] = slash; - memcpy(ZSTR_VAL(file_name) + path_len + 1, intern->u.dir.entry.d_name, name_len); - ZSTR_VAL(file_name)[path_len + 1 + name_len] = 0; - intern->file_name = file_name; - } + case SPL_FS_DIR: { + size_t name_len; + zend_string *path; + char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH; + + path = spl_filesystem_object_get_path(intern); + /* if there is parent path, amend it, otherwise just use the given path as is */ + name_len = strlen(intern->u.dir.entry.d_name); + if (!path) { + intern->file_name = zend_string_init(intern->u.dir.entry.d_name, name_len, 0); + return SUCCESS; } + + ZEND_ASSERT(ZSTR_LEN(path) != 0); + intern->file_name = zend_string_concat3( + ZSTR_VAL(path), ZSTR_LEN(path), &slash, 1, intern->u.dir.entry.d_name, name_len); + zend_string_release_ex(path, /* persistent */ false); break; + } } return SUCCESS; } /* }}} */ @@ -517,16 +544,8 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp zend_call_method_with_1_params(Z_OBJ_P(return_value), ce, &ce->constructor, "__construct", NULL, &arg1); zval_ptr_dtor(&arg1); } else { - char *path; - size_t path_len; - intern->file_name = zend_string_copy(source->file_name); - path = spl_filesystem_object_get_path(source, &path_len); - if (source->path && ZSTR_VAL(source->path) == path) { - intern->path = zend_string_copy(source->path); - } else { - intern->path = zend_string_init(path, path_len, 0); - } + intern->path = spl_filesystem_object_get_path(source); } break; case SPL_FS_FILE: @@ -556,17 +575,8 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp zval_ptr_dtor(&arg1); zval_ptr_dtor(&arg2); } else { - char *path; - size_t path_len; - intern->file_name = source->file_name; - path = spl_filesystem_object_get_path(source, &path_len); - if (source->path && ZSTR_VAL(source->path) == path) { - intern->path = zend_string_copy(source->path); - } else { - intern->path = zend_string_init(path, path_len, 0); - } - + intern->path = spl_filesystem_object_get_path(source); intern->u.file.open_mode = zend_string_copy(open_mode); intern->u.file.zcontext = resource; @@ -636,18 +646,19 @@ static inline HashTable *spl_filesystem_object_get_debug_info(zend_object *objec zend_string_release_ex(pnstr, 0); if (intern->file_name) { - size_t path_len; + zend_string *path; pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1); - spl_filesystem_object_get_path(intern, &path_len); + path = spl_filesystem_object_get_path(intern); - if (path_len && path_len < ZSTR_LEN(intern->file_name)) { - ZVAL_STRINGL(&tmp, ZSTR_VAL(intern->file_name) + path_len + 1, ZSTR_LEN(intern->file_name) - (path_len + 1)); + if (ZSTR_LEN(path) && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) { + ZVAL_STRINGL(&tmp, ZSTR_VAL(intern->file_name) + ZSTR_LEN(path) + 1, ZSTR_LEN(intern->file_name) - (ZSTR_LEN(path) + 1)); } else { ZVAL_STR_COPY(&tmp, intern->file_name); } zend_symtable_update(rv, pnstr, &tmp); - zend_string_release_ex(pnstr, 0); + zend_string_release_ex(pnstr, /* persistent */ false); + zend_string_release_ex(path, /* persistent */ false); } if (intern->type == SPL_FS_DIR) { #ifdef HAVE_GLOB @@ -731,7 +742,7 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long cto RETURN_THROWS(); } - intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (intern->path) { /* object is already initialized */ zend_throw_error(NULL, "Directory object is already initialized"); @@ -768,7 +779,7 @@ PHP_METHOD(DirectoryIterator, __construct) /* {{{ Rewind dir back to the start */ PHP_METHOD(DirectoryIterator, rewind) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -784,7 +795,7 @@ PHP_METHOD(DirectoryIterator, rewind) /* {{{ Return current dir entry */ PHP_METHOD(DirectoryIterator, key) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -802,7 +813,7 @@ PHP_METHOD(DirectoryIterator, current) RETURN_THROWS(); } - CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(Z_SPLFILESYSTEM_P(ZEND_THIS)); + CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS))); RETURN_OBJ_COPY(Z_OBJ_P(ZEND_THIS)); } /* }}} */ @@ -810,7 +821,7 @@ PHP_METHOD(DirectoryIterator, current) /* {{{ Move to next entry */ PHP_METHOD(DirectoryIterator, next) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); bool skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); if (zend_parse_parameters_none() == FAILURE) { @@ -832,7 +843,7 @@ PHP_METHOD(DirectoryIterator, next) /* {{{ Seek to the given position */ PHP_METHOD(DirectoryIterator, seek) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zval retval; zend_long pos; @@ -862,7 +873,7 @@ PHP_METHOD(DirectoryIterator, seek) /* {{{ Check whether dir contains more entries */ PHP_METHOD(DirectoryIterator, valid) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -876,17 +887,16 @@ PHP_METHOD(DirectoryIterator, valid) /* {{{ Return the path */ PHP_METHOD(SplFileInfo, getPath) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); - char *path; - size_t path_len; + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); + zend_string *path; if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } - path = spl_filesystem_object_get_path(intern, &path_len); + path = spl_filesystem_object_get_path(intern); if (path) { - RETURN_STRINGL(path, path_len); + RETURN_STR(path); } else { RETURN_EMPTY_STRING(); } @@ -896,8 +906,8 @@ PHP_METHOD(SplFileInfo, getPath) /* {{{ Return filename only */ PHP_METHOD(SplFileInfo, getFilename) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); - size_t path_len; + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); + zend_string *path; if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -908,20 +918,22 @@ PHP_METHOD(SplFileInfo, getFilename) RETURN_THROWS(); } - spl_filesystem_object_get_path(intern, &path_len); + path = spl_filesystem_object_get_path(intern); - if (path_len && path_len < ZSTR_LEN(intern->file_name)) { - RETURN_STRINGL(ZSTR_VAL(intern->file_name) + path_len + 1, ZSTR_LEN(intern->file_name) - (path_len + 1)); + if (path && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) { + size_t path_len = ZSTR_LEN(path); + RETVAL_STRINGL(ZSTR_VAL(intern->file_name) + path_len + 1, ZSTR_LEN(intern->file_name) - (path_len + 1)); } else { - RETURN_STR_COPY(intern->file_name); + RETVAL_STR_COPY(intern->file_name); } + zend_string_release_ex(path, /* persistent */ false); } /* }}} */ /* {{{ Return filename of current dir entry */ PHP_METHOD(DirectoryIterator, getFilename) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -935,11 +947,11 @@ PHP_METHOD(DirectoryIterator, getFilename) /* {{{ Returns file extension component of path */ PHP_METHOD(SplFileInfo, getExtension) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char *fname = NULL; const char *p; size_t flen; - size_t path_len; + zend_string *path; size_t idx; zend_string *ret; @@ -952,15 +964,16 @@ PHP_METHOD(SplFileInfo, getExtension) RETURN_THROWS(); } - spl_filesystem_object_get_path(intern, &path_len); + path = spl_filesystem_object_get_path(intern); - if (path_len && path_len < ZSTR_LEN(intern->file_name)) { - fname = ZSTR_VAL(intern->file_name) + path_len + 1; - flen = ZSTR_LEN(intern->file_name) - (path_len + 1); + if (ZSTR_LEN(path) && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) { + fname = ZSTR_VAL(intern->file_name) + ZSTR_LEN(path) + 1; + flen = ZSTR_LEN(intern->file_name) - (ZSTR_LEN(path) + 1); } else { fname = ZSTR_VAL(intern->file_name); flen = ZSTR_LEN(intern->file_name); } + zend_string_release_ex(path, /* persistent */ false); ret = php_basename(fname, flen, NULL, 0); @@ -980,7 +993,7 @@ PHP_METHOD(SplFileInfo, getExtension) /* {{{ Returns the file extension component of path */ PHP_METHOD(DirectoryIterator, getExtension) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); const char *p; size_t idx; zend_string *fname; @@ -1007,10 +1020,11 @@ PHP_METHOD(DirectoryIterator, getExtension) /* {{{ Returns filename component of path */ PHP_METHOD(SplFileInfo, getBasename) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char *fname, *suffix = 0; size_t flen; - size_t slen = 0, path_len; + size_t slen = 0; + zend_string *path; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &suffix, &slen) == FAILURE) { RETURN_THROWS(); @@ -1021,15 +1035,16 @@ PHP_METHOD(SplFileInfo, getBasename) RETURN_THROWS(); } - spl_filesystem_object_get_path(intern, &path_len); + path = spl_filesystem_object_get_path(intern); - if (path_len && path_len < ZSTR_LEN(intern->file_name)) { - fname = ZSTR_VAL(intern->file_name) + path_len + 1; - flen = ZSTR_LEN(intern->file_name) - (path_len + 1); + if (path && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) { + fname = ZSTR_VAL(intern->file_name) + ZSTR_LEN(path) + 1; + flen = ZSTR_LEN(intern->file_name) - (ZSTR_LEN(path) + 1); } else { fname = ZSTR_VAL(intern->file_name); flen = ZSTR_LEN(intern->file_name); } + zend_string_release_ex(path, /* persistent */ false); RETURN_STR(php_basename(fname, flen, suffix, slen)); } @@ -1038,7 +1053,7 @@ PHP_METHOD(SplFileInfo, getBasename) /* {{{ Returns filename component of current dir entry */ PHP_METHOD(DirectoryIterator, getBasename) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char *suffix = 0; size_t slen = 0; zend_string *fname; @@ -1057,7 +1072,7 @@ PHP_METHOD(DirectoryIterator, getBasename) /* {{{ Return path and filename */ PHP_METHOD(SplFileInfo, getPathname) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_string *path; if (zend_parse_parameters_none() == FAILURE) { @@ -1075,7 +1090,7 @@ PHP_METHOD(SplFileInfo, getPathname) /* {{{ Return getPathname() or getFilename() depending on flags */ PHP_METHOD(FilesystemIterator, key) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -1095,7 +1110,7 @@ PHP_METHOD(FilesystemIterator, key) /* {{{ Return getFilename(), getFileInfo() or $this depending on flags */ PHP_METHOD(FilesystemIterator, current) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -1120,7 +1135,7 @@ PHP_METHOD(FilesystemIterator, current) /* {{{ Returns true if current entry is '.' or '..' */ PHP_METHOD(DirectoryIterator, isDot) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -1144,7 +1159,7 @@ PHP_METHOD(SplFileInfo, __construct) RETURN_THROWS(); } - intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); spl_filesystem_info_set_filename(intern, path); @@ -1156,7 +1171,7 @@ PHP_METHOD(SplFileInfo, __construct) #define FileInfoFunction(func_name, func_num) \ PHP_METHOD(SplFileInfo, func_name) \ { \ - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); \ + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); \ zend_error_handling error_handling; \ if (zend_parse_parameters_none() == FAILURE) { \ RETURN_THROWS(); \ @@ -1233,7 +1248,7 @@ FileInfoFunction(isLink, FS_IS_LINK) /* {{{ Return the target of a symbolic link */ PHP_METHOD(SplFileInfo, getLinkTarget) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); ssize_t ret; char buff[MAXPATHLEN]; @@ -1280,7 +1295,7 @@ PHP_METHOD(SplFileInfo, getLinkTarget) /* {{{ Return the resolved path */ PHP_METHOD(SplFileInfo, getRealPath) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char buff[MAXPATHLEN]; char *filename; @@ -1317,7 +1332,7 @@ PHP_METHOD(SplFileInfo, getRealPath) /* {{{ Open the current file */ PHP_METHOD(SplFileInfo, openFile) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); spl_filesystem_object_create_type(ZEND_NUM_ARGS(), intern, SPL_FS_FILE, NULL, return_value); } @@ -1326,7 +1341,7 @@ PHP_METHOD(SplFileInfo, openFile) /* {{{ Class to use in openFile() */ PHP_METHOD(SplFileInfo, setFileClass) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_class_entry *ce = spl_ce_SplFileObject; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|C", &ce) == FAILURE) { @@ -1340,7 +1355,7 @@ PHP_METHOD(SplFileInfo, setFileClass) /* {{{ Class to use in getFileInfo(), getPathInfo() */ PHP_METHOD(SplFileInfo, setInfoClass) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_class_entry *ce = spl_ce_SplFileInfo; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|C", &ce) == FAILURE) { @@ -1354,7 +1369,7 @@ PHP_METHOD(SplFileInfo, setInfoClass) /* {{{ Get/copy file info */ PHP_METHOD(SplFileInfo, getFileInfo) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_class_entry *ce = intern->info_class; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|C!", &ce) == FAILURE) { @@ -1368,7 +1383,7 @@ PHP_METHOD(SplFileInfo, getFileInfo) /* {{{ Get/copy file info */ PHP_METHOD(SplFileInfo, getPathInfo) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_class_entry *ce = intern->info_class; zend_string *path; @@ -1417,7 +1432,7 @@ PHP_METHOD(FilesystemIterator, __construct) /* {{{ Rewind dir back to the start */ PHP_METHOD(FilesystemIterator, rewind) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); bool skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); if (zend_parse_parameters_none() == FAILURE) { @@ -1437,7 +1452,7 @@ PHP_METHOD(FilesystemIterator, rewind) /* {{{ Get handling flags */ PHP_METHOD(FilesystemIterator, getFlags) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -1449,7 +1464,7 @@ PHP_METHOD(FilesystemIterator, getFlags) /* {{{ Set handling flags */ PHP_METHOD(FilesystemIterator, setFlags) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_long flags; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &flags) == FAILURE) { @@ -1464,7 +1479,7 @@ PHP_METHOD(FilesystemIterator, setFlags) PHP_METHOD(RecursiveDirectoryIterator, hasChildren) { bool allow_links = 0; - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); ZEND_PARSE_PARAMETERS_START(0, 1) Z_PARAM_OPTIONAL @@ -1497,7 +1512,7 @@ PHP_METHOD(RecursiveDirectoryIterator, hasChildren) PHP_METHOD(RecursiveDirectoryIterator, getChildren) { zval zpath, zflags; - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); spl_filesystem_object *subdir; char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH; @@ -1514,7 +1529,7 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren) spl_instantiate_arg_ex2(Z_OBJCE_P(ZEND_THIS), return_value, &zpath, &zflags); zval_ptr_dtor(&zpath); - subdir = Z_SPLFILESYSTEM_P(return_value); + subdir = spl_filesystem_from_obj(Z_OBJ_P(return_value)); if (subdir) { size_t name_len = strlen(intern->u.dir.entry.d_name); if (intern->u.dir.sub_path && ZSTR_LEN(intern->u.dir.sub_path)) { @@ -1537,7 +1552,7 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren) /* {{{ Get sub path */ PHP_METHOD(RecursiveDirectoryIterator, getSubPath) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -1554,7 +1569,7 @@ PHP_METHOD(RecursiveDirectoryIterator, getSubPath) /* {{{ Get sub path and file name */ PHP_METHOD(RecursiveDirectoryIterator, getSubPathname) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH; if (zend_parse_parameters_none() == FAILURE) { @@ -1587,7 +1602,7 @@ PHP_METHOD(GlobIterator, __construct) /* {{{ Return the number of directories and files found by globbing */ PHP_METHOD(GlobIterator, count) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -1635,7 +1650,7 @@ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval zend_throw_error(NULL, "An iterator cannot be used with foreach by reference"); return NULL; } - dir_object = Z_SPLFILESYSTEM_P(object); + dir_object = spl_filesystem_from_obj(Z_OBJ_P(object)); iterator = spl_filesystem_object_to_iterator(dir_object); ZVAL_OBJ_COPY(&iterator->intern.data, Z_OBJ_P(object)); iterator->intern.funcs = &spl_filesystem_dir_it_funcs; @@ -1828,7 +1843,7 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva zend_throw_error(NULL, "An iterator cannot be used with foreach by reference"); return NULL; } - dir_object = Z_SPLFILESYSTEM_P(object); + dir_object = spl_filesystem_from_obj(Z_OBJ_P(object)); iterator = spl_filesystem_object_to_iterator(dir_object); ZVAL_OBJ_COPY(&iterator->intern.data, Z_OBJ_P(object)); @@ -2061,7 +2076,7 @@ static void spl_filesystem_file_rewind(zval * this_ptr, spl_filesystem_object *i /* {{{ Construct a new file object */ PHP_METHOD(SplFileObject, __construct) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_string *open_mode = ZSTR_CHAR('r'); bool use_include_path = 0; size_t path_len; @@ -2109,7 +2124,7 @@ PHP_METHOD(SplTempFileObject, __construct) { zend_string *file_name; zend_long max_memory = PHP_STREAM_MAX_MEM; - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_error_handling error_handling; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &max_memory) == FAILURE) { @@ -2138,7 +2153,7 @@ PHP_METHOD(SplTempFileObject, __construct) /* {{{ Rewind the file and read the first line */ PHP_METHOD(SplFileObject, rewind) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2150,7 +2165,7 @@ PHP_METHOD(SplFileObject, rewind) /* {{{ Return whether end of file is reached */ PHP_METHOD(SplFileObject, eof) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2164,7 +2179,7 @@ PHP_METHOD(SplFileObject, eof) /* {{{ Return !eof() */ PHP_METHOD(SplFileObject, valid) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2182,7 +2197,7 @@ PHP_METHOD(SplFileObject, valid) /* {{{ Return next line from file */ PHP_METHOD(SplFileObject, fgets) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2199,7 +2214,7 @@ PHP_METHOD(SplFileObject, fgets) /* {{{ Return current line from file */ PHP_METHOD(SplFileObject, current) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2222,7 +2237,7 @@ PHP_METHOD(SplFileObject, current) /* {{{ Return line number */ PHP_METHOD(SplFileObject, key) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2238,7 +2253,7 @@ PHP_METHOD(SplFileObject, key) /* {{{ Read next line */ PHP_METHOD(SplFileObject, next) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2254,7 +2269,7 @@ PHP_METHOD(SplFileObject, next) /* {{{ Set file handling flags */ PHP_METHOD(SplFileObject, setFlags) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &intern->flags) == FAILURE) { RETURN_THROWS(); @@ -2264,7 +2279,7 @@ PHP_METHOD(SplFileObject, setFlags) /* {{{ Get file handling flags */ PHP_METHOD(SplFileObject, getFlags) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2278,7 +2293,7 @@ PHP_METHOD(SplFileObject, setMaxLineLen) { zend_long max_len; - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &max_len) == FAILURE) { RETURN_THROWS(); @@ -2295,7 +2310,7 @@ PHP_METHOD(SplFileObject, setMaxLineLen) /* {{{ Get maximum line length */ PHP_METHOD(SplFileObject, getMaxLineLen) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2326,7 +2341,7 @@ PHP_METHOD(SplFileObject, getChildren) /* {{{ Return current line as CSV */ PHP_METHOD(SplFileObject, fgetcsv) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char delimiter = intern->u.file.delimiter, enclosure = intern->u.file.enclosure; int escape = intern->u.file.escape; char *delim = NULL, *enclo = NULL, *esc = NULL; @@ -2373,7 +2388,7 @@ PHP_METHOD(SplFileObject, fgetcsv) /* {{{ Output a field array as a CSV line */ PHP_METHOD(SplFileObject, fputcsv) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char delimiter = intern->u.file.delimiter, enclosure = intern->u.file.enclosure; int escape = intern->u.file.escape; char *delim = NULL, *enclo = NULL, *esc = NULL; @@ -2423,7 +2438,7 @@ PHP_METHOD(SplFileObject, fputcsv) /* {{{ Set the delimiter, enclosure and escape character used in fgetcsv */ PHP_METHOD(SplFileObject, setCsvControl) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char delimiter = ',', enclosure = '"'; int escape = (unsigned char) '\\'; char *delim = NULL, *enclo = NULL, *esc = NULL; @@ -2468,7 +2483,7 @@ PHP_METHOD(SplFileObject, setCsvControl) /* {{{ Get the delimiter, enclosure and escape character used in fgetcsv */ PHP_METHOD(SplFileObject, getCsvControl) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char delimiter[2], enclosure[2], escape[2]; if (zend_parse_parameters_none() == FAILURE) { @@ -2497,7 +2512,7 @@ PHP_METHOD(SplFileObject, getCsvControl) /* {{{ Portable file locking */ PHP_METHOD(SplFileObject, flock) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zval *wouldblock = NULL; zend_long operation = 0; @@ -2514,7 +2529,7 @@ PHP_METHOD(SplFileObject, flock) /* {{{ Flush the file */ PHP_METHOD(SplFileObject, fflush) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2528,7 +2543,7 @@ PHP_METHOD(SplFileObject, fflush) /* {{{ Return current file position */ PHP_METHOD(SplFileObject, ftell) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_long ret; if (zend_parse_parameters_none() == FAILURE) { @@ -2549,7 +2564,7 @@ PHP_METHOD(SplFileObject, ftell) /* {{{ Seek to a position */ PHP_METHOD(SplFileObject, fseek) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_long pos, whence = SEEK_SET; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l", &pos, &whence) == FAILURE) { @@ -2565,7 +2580,7 @@ PHP_METHOD(SplFileObject, fseek) /* {{{ Get a character from the file */ PHP_METHOD(SplFileObject, fgetc) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char buf[2]; int result; @@ -2594,7 +2609,7 @@ PHP_METHOD(SplFileObject, fgetc) /* {{{ Output all remaining data from a file pointer */ PHP_METHOD(SplFileObject, fpassthru) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2611,7 +2626,7 @@ PHP_METHOD(SplFileObject, fscanf) int result, num_varargs = 0; zend_string *format_str; zval *varargs= NULL; - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "S*", &format_str, &varargs, &num_varargs) == FAILURE) { RETURN_THROWS(); @@ -2635,7 +2650,7 @@ PHP_METHOD(SplFileObject, fscanf) /* {{{ Binary-safe file write */ PHP_METHOD(SplFileObject, fwrite) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char *str; size_t str_len; zend_long length = 0; @@ -2668,7 +2683,7 @@ PHP_METHOD(SplFileObject, fwrite) PHP_METHOD(SplFileObject, fread) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_long length = 0; zend_string *str; @@ -2693,7 +2708,7 @@ PHP_METHOD(SplFileObject, fread) /* {{{ Stat() on a filehandle */ PHP_METHOD(SplFileObject, fstat) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -2708,7 +2723,7 @@ PHP_METHOD(SplFileObject, fstat) /* {{{ Truncate file to 'size' length */ PHP_METHOD(SplFileObject, ftruncate) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_long size; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &size) == FAILURE) { @@ -2728,7 +2743,7 @@ PHP_METHOD(SplFileObject, ftruncate) /* {{{ Seek to specified line */ PHP_METHOD(SplFileObject, seek) { - spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); zend_long line_pos, i; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &line_pos) == FAILURE) { diff --git a/ext/spl/spl_directory.h b/ext/spl/spl_directory.h index 0a99a0778be1e..ca0e547865025 100644 --- a/ext/spl/spl_directory.h +++ b/ext/spl/spl_directory.h @@ -30,30 +30,24 @@ extern PHPAPI zend_class_entry *spl_ce_SplTempFileObject; PHP_MINIT_FUNCTION(spl_directory); -typedef enum { - SPL_FS_INFO, /* must be 0 */ - SPL_FS_DIR, - SPL_FS_FILE -} SPL_FS_OBJ_TYPE; - +/* Internal objecte structure and helpers for Directory and File SPL objects */ typedef struct _spl_filesystem_object spl_filesystem_object; typedef void (*spl_foreign_dtor_t)(spl_filesystem_object *object); typedef void (*spl_foreign_clone_t)(spl_filesystem_object *src, spl_filesystem_object *dst); -PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, size_t *len); +PHPAPI zend_string *spl_filesystem_object_get_path(spl_filesystem_object *intern); typedef struct _spl_other_handler { spl_foreign_dtor_t dtor; spl_foreign_clone_t clone; } spl_other_handler; -/* define an overloaded iterator structure */ -typedef struct { - zend_object_iterator intern; - zval current; - void *object; -} spl_filesystem_iterator; +typedef enum { + SPL_FS_INFO, /* must be 0 */ + SPL_FS_DIR, + SPL_FS_FILE +} SPL_FS_OBJ_TYPE; struct _spl_filesystem_object { void *oth; @@ -96,28 +90,6 @@ struct _spl_filesystem_object { zend_object std; }; -static inline spl_filesystem_object *spl_filesystem_from_obj(zend_object *obj) /* {{{ */ { - return (spl_filesystem_object*)((char*)(obj) - XtOffsetOf(spl_filesystem_object, std)); -} -/* }}} */ - -#define Z_SPLFILESYSTEM_P(zv) spl_filesystem_from_obj(Z_OBJ_P((zv))) - -static inline spl_filesystem_iterator* spl_filesystem_object_to_iterator(spl_filesystem_object *obj) -{ - spl_filesystem_iterator *it; - - it = ecalloc(1, sizeof(spl_filesystem_iterator)); - it->object = (void *)obj; - zend_iterator_init(&it->intern); - return it; -} - -static inline spl_filesystem_object* spl_filesystem_iterator_to_object(spl_filesystem_iterator *it) -{ - return (spl_filesystem_object*)it->object; -} - #define SPL_FILE_OBJECT_DROP_NEW_LINE 0x00000001 /* drop new lines */ #define SPL_FILE_OBJECT_READ_AHEAD 0x00000002 /* read on rewind/next */ #define SPL_FILE_OBJECT_SKIP_EMPTY 0x00000004 /* skip empty lines */