#define SPL_DEFAULT_FILE_EXTENSIONS ".inc,.php"
-static void construction_wrapper(INTERNAL_FUNCTION_PARAMETERS);
-
/* {{{ PHP_GINIT_FUNCTION
*/
static PHP_GINIT_FUNCTION(spl)
{
- zend_function *cwf = &spl_globals->constr_wrapper_fun;
spl_globals->autoload_extensions = NULL;
spl_globals->autoload_extensions_len = 0;
spl_globals->autoload_functions = NULL;
spl_globals->autoload_running = 0;
- spl_globals->validating_fun = NULL;
-
- cwf->type = ZEND_INTERNAL_FUNCTION;
- cwf->common.function_name = "internal_construction_wrapper";
- cwf->common.scope = NULL; /* to be filled w/ object runtime class */
- cwf->common.fn_flags = ZEND_ACC_PRIVATE;
- cwf->common.prototype = NULL;
- cwf->common.num_args = 0; /* not necessarily true but not enforced */
- cwf->common.required_num_args = 0;
- cwf->common.arg_info = NULL;
-
- cwf->internal_function.handler = construction_wrapper;
- cwf->internal_function.module = &spl_module_entry;
}
/* }}} */
return ZEND_HASH_APPLY_KEEP;
} /* }}} */
-zend_function *php_spl_get_constructor_helper(zval *object, int (*validating_fun)(void *object_data TSRMLS_DC) TSRMLS_DC) /* {{{ */
-{
- if (Z_OBJCE_P(object)->type == ZEND_INTERNAL_CLASS) {
- return std_object_handlers.get_constructor(object TSRMLS_CC);
- } else {
- SPL_G(validating_fun) = validating_fun;
- SPL_G(constr_wrapper_fun).common.scope = Z_OBJCE_P(object);
- return &SPL_G(constr_wrapper_fun);
- }
-}
-/* }}} */
-
-static void construction_wrapper(INTERNAL_FUNCTION_PARAMETERS) /* {{{ */
-{
- zval *this = getThis();
- void *object_data;
- zend_class_entry *this_ce;
- zend_function *zf;
- zend_fcall_info fci = {0};
- zend_fcall_info_cache fci_cache = {0};
- zval *retval_ptr = NULL;
-
- object_data = zend_object_store_get_object(this TSRMLS_CC);
- this_ce = Z_OBJCE_P(this);
-
- /* The call of this internal function did not change the scope because
- * zend_do_fcall_common_helper doesn't do that for internal instance
- * function calls. So the visibility checks on zend_std_get_constructor
- * will still work. Reflection refuses to instantiate classes whose
- * constructor is not public so we're OK there too*/
- zf = zend_std_get_constructor(this TSRMLS_CC);
-
- if (zf == NULL) {
- return;
- }
-
- fci.size = sizeof(fci);
- fci.function_table = &this_ce->function_table;
- /* fci.function_name = ; not necessary */
- /* fci.symbol_table = ; not necessary */
- fci.retval_ptr_ptr = &retval_ptr;
- fci.param_count = ZEND_NUM_ARGS();
- if (fci.param_count > 0) {
- fci.params = emalloc(fci.param_count * sizeof *fci.params);
- if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), fci.params) == FAILURE) {
- zend_throw_exception(NULL, "Unexpected error fetching arguments", 0 TSRMLS_CC);
- goto cleanup;
- }
- }
- fci.object_ptr = this;
- fci.no_separation = 0;
-
- fci_cache.initialized = 1;
- fci_cache.called_scope = this_ce; /* set called scope to class of this */
- /* function->common.scope will replace it, except for
- * ZEND_OVERLOADED_FUNCTION, which we won't get */
- fci_cache.calling_scope = EG(scope);
- fci_cache.function_handler = zf;
- fci_cache.object_ptr = this;
-
- if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == FAILURE) {
- if (!EG(exception)) {
- zend_throw_exception(NULL, "Error calling parent constructor", 0 TSRMLS_CC);
- }
- goto cleanup;
- }
- if (!EG(exception) && SPL_G(validating_fun)(object_data TSRMLS_CC) == 0)
- zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC,
- "In the constructor of %s, parent::__construct() must be called "
- "and its exceptions cannot be cleared", this_ce->name);
-
-cleanup:
- /* no need to cleanup zf, zend_std_get_constructor never allocates a new
- * function (so no ZEND_OVERLOADED_FUNCTION or call-via-handlers) */
- if (fci.params != NULL) {
- efree(fci.params);
- }
- if (retval_ptr != NULL) {
- zval_ptr_dtor(&retval_ptr);
- }
-}
-/* }}} */
-
/* {{{ PHP_MINFO(spl)
*/
PHP_MINFO_FUNCTION(spl)
/* declare the class handlers */
static zend_object_handlers spl_filesystem_object_handlers;
+/* includes handler to validate object state when retrieving methods */
+static zend_object_handlers spl_filesystem_object_check_handlers;
-/* declare the class entry */
+/* decalre the class entry */
PHPAPI zend_class_entry *spl_ce_SplFileInfo;
PHPAPI zend_class_entry *spl_ce_DirectoryIterator;
PHPAPI zend_class_entry *spl_ce_FilesystemIterator;
/* 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;
- }
+ if (obj) *obj = intern;
zend_object_std_init(&intern->std, class_type TSRMLS_CC);
object_properties_init(&intern->std, class_type);
retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) spl_filesystem_object_free_storage, NULL TSRMLS_CC);
retval.handlers = &spl_filesystem_object_handlers;
-
return retval;
}
/* }}} */
}
/* }}} */
+/* {{{ spl_filesystem_object_new_ex */
+static zend_object_value spl_filesystem_object_new_check(zend_class_entry *class_type TSRMLS_DC)
+{
+ zend_object_value ret = spl_filesystem_object_new_ex(class_type, NULL TSRMLS_CC);
+ ret.handlers = &spl_filesystem_object_check_handlers;
+ return ret;
+}
+/* }}} */
+
+
PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, int *len TSRMLS_DC) /* {{{ */
{
#ifdef HAVE_GLOB
}
/* }}} */
-static int spl_filesystem_object_constructor_validator(void *object_data TSRMLS_DC) /* {{{ */
+zend_function *spl_filesystem_object_get_method_check(zval **object_ptr, char *method, int method_len, const struct _zend_literal *key TSRMLS_DC) /* {{{ */
{
- spl_filesystem_object *fsobj = object_data;
+ spl_filesystem_object *fsobj = zend_object_store_get_object(*object_ptr TSRMLS_CC);
- /* check if GlobIterator and Spl[Temp]FileObject had their constructor
- * and check if everything went smoothly/there was an exception not cleared
- * or if there was an userspace class that did not call the parent
- * constructor or cleared its exception */
+ if (fsobj->u.dir.entry.d_name[0] == '\0' && fsobj->orig_path == NULL) {
+ method = "_bad_state_ex";
+ method_len = sizeof("_bad_state_ex") - 1;
+ key = NULL;
+ }
- return (fsobj->u.dir.entry.d_name[0] != '\0' /* GlobIterator */ ||
- fsobj->_path != NULL /* SplFileInfo */ ||
- fsobj->orig_path != NULL /* Spl[Temp]FileObject */);
-}
-/* }}} */
-
-static zend_function *spl_filesystem_object_get_constructor(zval *object TSRMLS_DC) /* {{{ */
-{
- return php_spl_get_constructor_helper(object,
- spl_filesystem_object_constructor_validator TSRMLS_CC);
+ return zend_get_std_object_handlers()->get_method(object_ptr, method, method_len, key TSRMLS_CC);
}
/* }}} */
}
/* }}} */
+/* {{{ */
+SPL_METHOD(SplFileInfo, _bad_state_ex)
+{
+ zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC,
+ "The parent constructor was not called: the object is in an "
+ "invalid state ");
+}
+/* }}} */
+
/* {{{ proto void FilesystemIterator::__construct(string path [, int flags])
Cronstructs a new dir iterator from a path. */
SPL_METHOD(FilesystemIterator, __construct)
SPL_ME(SplFileInfo, openFile, arginfo_info_openFile, ZEND_ACC_PUBLIC)
SPL_ME(SplFileInfo, setFileClass, arginfo_info_optinalFileClass, ZEND_ACC_PUBLIC)
SPL_ME(SplFileInfo, setInfoClass, arginfo_info_optinalFileClass, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFileInfo, _bad_state_ex, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
SPL_MA(SplFileInfo, __toString, SplFileInfo, getPathname, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
PHP_FE_END
};
spl_filesystem_object_handlers.clone_obj = spl_filesystem_object_clone;
spl_filesystem_object_handlers.cast_object = spl_filesystem_object_cast;
spl_filesystem_object_handlers.get_debug_info = spl_filesystem_object_get_debug_info;
- spl_filesystem_object_handlers.get_constructor = spl_filesystem_object_get_constructor;
-
spl_ce_SplFileInfo->serialize = zend_class_serialize_deny;
spl_ce_SplFileInfo->unserialize = zend_class_unserialize_deny;
REGISTER_SPL_IMPLEMENTS(DirectoryIterator, SeekableIterator);
spl_ce_DirectoryIterator->get_iterator = spl_filesystem_dir_get_iterator;
-
+
REGISTER_SPL_SUB_CLASS_EX(FilesystemIterator, DirectoryIterator, spl_filesystem_object_new, spl_FilesystemIterator_functions);
REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_MODE_MASK", SPL_FILE_DIR_CURRENT_MODE_MASK);
REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, FilesystemIterator, spl_filesystem_object_new, spl_RecursiveDirectoryIterator_functions);
REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
+ memcpy(&spl_filesystem_object_check_handlers, &spl_filesystem_object_handlers, sizeof(zend_object_handlers));
+ spl_filesystem_object_check_handlers.get_method = spl_filesystem_object_get_method_check;
+
#ifdef HAVE_GLOB
- REGISTER_SPL_SUB_CLASS_EX(GlobIterator, FilesystemIterator, spl_filesystem_object_new, spl_GlobIterator_functions);
+ REGISTER_SPL_SUB_CLASS_EX(GlobIterator, FilesystemIterator, spl_filesystem_object_new_check, spl_GlobIterator_functions);
REGISTER_SPL_IMPLEMENTS(GlobIterator, Countable);
#endif
- REGISTER_SPL_SUB_CLASS_EX(SplFileObject, SplFileInfo, spl_filesystem_object_new, spl_SplFileObject_functions);
+ REGISTER_SPL_SUB_CLASS_EX(SplFileObject, SplFileInfo, spl_filesystem_object_new_check, spl_SplFileObject_functions);
REGISTER_SPL_IMPLEMENTS(SplFileObject, RecursiveIterator);
REGISTER_SPL_IMPLEMENTS(SplFileObject, SeekableIterator);
REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "SKIP_EMPTY", SPL_FILE_OBJECT_SKIP_EMPTY);
REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "READ_CSV", SPL_FILE_OBJECT_READ_CSV);
- REGISTER_SPL_SUB_CLASS_EX(SplTempFileObject, SplFileObject, spl_filesystem_object_new, spl_SplTempFileObject_functions);
+ REGISTER_SPL_SUB_CLASS_EX(SplTempFileObject, SplFileObject, spl_filesystem_object_new_check, spl_SplTempFileObject_functions);
return SUCCESS;
}
/* }}} */
static zend_object_handlers spl_handlers_rec_it_it;
static zend_object_handlers spl_handlers_dual_it;
+#define SPL_FETCH_AND_CHECK_DUAL_IT(var, objzval) \
+ do { \
+ spl_dual_it_object *it = zend_object_store_get_object((objzval) TSRMLS_CC); \
+ if (it->dit_type == DIT_Unknown) { \
+ zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, \
+ "The object is in an invalid state as the parent constructor was not called"); \
+ return; \
+ } \
+ (var) = it; \
+ } while (0)
+
static void spl_recursive_it_dtor(zend_object_iterator *_iter TSRMLS_DC)
{
spl_recursive_it_iterator *iter = (spl_recursive_it_iterator*)_iter;
}
iterator = emalloc(sizeof(spl_recursive_it_iterator));
object = (spl_recursive_it_object*)zend_object_store_get_object(zobject TSRMLS_CC);
+ if (object->iterators == NULL) {
+ zend_error(E_ERROR, "The object to be iterated is in an invalid state: "
+ "the parent constructor has not been called");
+ }
Z_ADDREF_P(zobject);
iterator->intern.data = (void*)object;
return function_handler;
}
-static int spl_recursive_it_constructor_validator(void *object_data TSRMLS_DC) /* {{{ */
-{
- spl_recursive_it_object *sobj = object_data;
- return (sobj->iterators != NULL);
-}
-/* }}} */
-
-static zend_function *spl_recursive_it_get_constructor(zval *object TSRMLS_DC) /* {{{ */
-{
- return php_spl_get_constructor_helper(object,
- spl_recursive_it_constructor_validator TSRMLS_CC);
-}
-/* }}} */
-
-static int spl_dual_it_constructor_validator(void *object_data TSRMLS_DC) /* {{{ */
-{
- spl_dual_it_object *dobj = object_data;
- return (dobj->dit_type != DIT_Unknown);
-}
-/* }}} */
-
-static zend_function *spl_dual_it_get_constructor(zval *object TSRMLS_DC) /* {{{ */
-{
- return php_spl_get_constructor_helper(object,
- spl_dual_it_constructor_validator TSRMLS_CC);
-}
-/* }}} */
-
/* {{{ spl_RecursiveIteratorIterator_dtor */
static void spl_RecursiveIteratorIterator_dtor(zend_object *_object, zend_object_handle handle TSRMLS_DC)
{
}
#endif
+#define SPL_CHECK_CTOR(intern, classname) \
+ if (intern->dit_type == DIT_Unknown) { \
+ zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Classes derived from %s must call %s::__construct()", \
+ (spl_ce_##classname)->name, (spl_ce_##classname)->name); \
+ return; \
+ }
+
+#define APPENDIT_CHECK_CTOR(intern) SPL_CHECK_CTOR(intern, AppendIterator)
+
static inline int spl_dual_it_fetch(spl_dual_it_object *intern, int check_more TSRMLS_DC);
static inline int spl_cit_check_flags(int flags)
SPL_METHOD(dual_it, getInnerIterator)
{
spl_dual_it_object *intern;
-
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
if (zend_parse_parameters_none() == FAILURE) {
return;
}
+
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (intern->inner.zobject) {
RETVAL_ZVAL(intern->inner.zobject, 1, 0);
SPL_METHOD(dual_it, rewind)
{
spl_dual_it_object *intern;
-
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
if (zend_parse_parameters_none() == FAILURE) {
return;
}
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
+
spl_dual_it_rewind(intern TSRMLS_CC);
spl_dual_it_fetch(intern, 1 TSRMLS_CC);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
RETURN_BOOL(intern->current.data);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (intern->current.data) {
if (intern->current.key_type == HASH_KEY_IS_STRING) {
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (intern->current.data) {
RETVAL_ZVAL(intern->current.data, 1, 0);
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_dual_it_next(intern, 1 TSRMLS_CC);
spl_dual_it_fetch(intern, 1 TSRMLS_CC);
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_filter_it_rewind(getThis(), intern TSRMLS_CC);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_filter_it_next(getThis(), intern TSRMLS_CC);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval);
if (retval) {
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval);
if (!EG(exception) && retval) {
Match (string)current() against regular expression */
SPL_METHOD(RegexIterator, accept)
{
- spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ spl_dual_it_object *intern;
char *subject, tmp[32], *result;
int subject_len, use_copy, count = 0, result_len;
zval subject_copy, zcount, *replacement, tmp_replacement;
return;
}
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
+
if (intern->current.data == NULL) {
RETURN_FALSE;
}
Returns current operation mode */
SPL_METHOD(RegexIterator, getMode)
{
- spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ spl_dual_it_object *intern;
if (zend_parse_parameters_none() == FAILURE) {
return;
}
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
+
RETURN_LONG(intern->u.regex.mode);
} /* }}} */
Set new operation mode */
SPL_METHOD(RegexIterator, setMode)
{
- spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ spl_dual_it_object *intern;
long mode;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &mode) == FAILURE) {
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Illegal mode %ld", mode);
return;/* NULL */
}
+
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
intern->u.regex.mode = mode;
} /* }}} */
Returns current operation flags */
SPL_METHOD(RegexIterator, getFlags)
{
- spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ spl_dual_it_object *intern;
if (zend_parse_parameters_none() == FAILURE) {
return;
}
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
+
RETURN_LONG(intern->u.regex.flags);
} /* }}} */
Set operation flags */
SPL_METHOD(RegexIterator, setFlags)
{
- spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ spl_dual_it_object *intern;
long flags;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &flags) == FAILURE) {
return;
}
+
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
intern->u.regex.flags = flags;
} /* }}} */
Returns current PREG flags (if in use or NULL) */
SPL_METHOD(RegexIterator, getPregFlags)
{
- spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ spl_dual_it_object *intern;
if (zend_parse_parameters_none() == FAILURE) {
return;
}
+
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (intern->u.regex.use_flags) {
RETURN_LONG(intern->u.regex.preg_flags);
Set PREG flags */
SPL_METHOD(RegexIterator, setPregFlags)
{
- spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ spl_dual_it_object *intern;
long preg_flags;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &preg_flags) == FAILURE) {
return;
}
+
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
intern->u.regex.preg_flags = preg_flags;
intern->u.regex.use_flags = 1;
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval);
if (!EG(exception)) {
{
spl_dual_it_object *intern;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_dual_it_rewind(intern TSRMLS_CC);
spl_limit_it_seek(intern, intern->u.limit.offset TSRMLS_CC);
} /* }}} */
{
spl_dual_it_object *intern;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
/* RETURN_BOOL(spl_limit_it_valid(intern TSRMLS_CC) == SUCCESS);*/
RETURN_BOOL((intern->u.limit.count == -1 || intern->current.pos < intern->u.limit.offset + intern->u.limit.count) && intern->current.data);
{
spl_dual_it_object *intern;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_dual_it_next(intern, 1 TSRMLS_CC);
if (intern->u.limit.count == -1 || intern->current.pos < intern->u.limit.offset + intern->u.limit.count) {
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_limit_it_seek(intern, pos TSRMLS_CC);
RETURN_LONG(intern->current.pos);
} /* }}} */
SPL_METHOD(LimitIterator, getPosition)
{
spl_dual_it_object *intern;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
RETURN_LONG(intern->current.pos);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_caching_it_rewind(intern TSRMLS_CC);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
RETURN_BOOL(spl_caching_it_valid(intern TSRMLS_CC) == SUCCESS);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_caching_it_next(intern TSRMLS_CC);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
RETURN_BOOL(spl_caching_it_has_next(intern TSRMLS_CC) == SUCCESS);
} /* }}} */
{
spl_dual_it_object *intern;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (!(intern->u.caching.flags & (CIT_CALL_TOSTRING|CIT_TOSTRING_USE_KEY|CIT_TOSTRING_USE_CURRENT|CIT_TOSTRING_USE_INNER))) {
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not fetch string value (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name);
uint nKeyLength;
zval *value;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (!(intern->u.caching.flags & CIT_FULL_CACHE)) {
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name);
uint nKeyLength;
zval **value;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (!(intern->u.caching.flags & CIT_FULL_CACHE)) {
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name);
char *arKey;
uint nKeyLength;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (!(intern->u.caching.flags & CIT_FULL_CACHE)) {
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name);
char *arKey;
uint nKeyLength;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (!(intern->u.caching.flags & CIT_FULL_CACHE)) {
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name);
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (!(intern->u.caching.flags & CIT_FULL_CACHE)) {
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%v does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name);
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
RETURN_LONG(intern->u.caching.flags);
}
spl_dual_it_object *intern;
long flags;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &flags) == FAILURE) {
return;
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (!(intern->u.caching.flags & CIT_FULL_CACHE)) {
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%v does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name);
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
RETURN_BOOL(intern->u.caching.zchildren);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (intern->u.caching.zchildren) {
RETURN_ZVAL(intern->u.caching.zchildren, 1, 0);
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
RETURN_BOOL(intern->inner.iterator->funcs->valid(intern->inner.iterator TSRMLS_CC) == SUCCESS);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (intern->inner.iterator->funcs->get_current_key) {
char *str_key;
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
intern->inner.iterator->funcs->get_current_data(intern->inner.iterator, &data TSRMLS_CC);
if (data && *data) {
RETURN_ZVAL(*data, 1, 0);
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
intern->inner.iterator->funcs->move_forward(intern->inner.iterator TSRMLS_CC);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_dual_it_next(intern, 1 TSRMLS_CC);
if (spl_dual_it_valid(intern TSRMLS_CC) == SUCCESS) {
spl_dual_it_object *intern;
zval *it;
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "O", &it, zend_ce_iterator) == FAILURE) {
return;
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
intern->u.append.iterator->funcs->rewind(intern->u.append.iterator TSRMLS_CC);
if (spl_append_it_next_iterator(intern TSRMLS_CC) == SUCCESS) {
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
RETURN_BOOL(intern->current.data);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
spl_append_it_next(intern TSRMLS_CC);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
-
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
+
+ APPENDIT_CHECK_CTOR(intern);
spl_array_iterator_key(intern->u.append.zarrayit, return_value TSRMLS_CC);
} /* }}} */
return;
}
- intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
-
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
+
RETURN_ZVAL(intern->u.append.zarrayit, 1, 0);
} /* }}} */
memcpy(&spl_handlers_rec_it_it, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
spl_handlers_rec_it_it.get_method = spl_recursive_it_get_method;
spl_handlers_rec_it_it.clone_obj = NULL;
- spl_handlers_rec_it_it.get_constructor = spl_recursive_it_get_constructor;
memcpy(&spl_handlers_dual_it, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
spl_handlers_dual_it.get_method = spl_dual_it_get_method;
/*spl_handlers_dual_it.call_method = spl_dual_it_call_method;*/
spl_handlers_dual_it.clone_obj = NULL;
- spl_handlers_dual_it.get_constructor = spl_dual_it_get_constructor;
spl_ce_RecursiveIteratorIterator->get_iterator = spl_recursive_it_get_iterator;
spl_ce_RecursiveIteratorIterator->iterator_funcs.funcs = &spl_recursive_it_iterator_funcs;