summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2004-04-27 15:38:07 +0000
committerMarcus Boerger <helly@php.net>2004-04-27 15:38:07 +0000
commite1cd098925007713926506f44681fbff7f9e7d28 (patch)
treec2a24f98bf34765689eeaa379c09fc802a0a053a
parente780c42f2135862d81b68935279f3345f33f7991 (diff)
downloadphp-git-e1cd098925007713926506f44681fbff7f9e7d28.tar.gz
- no unneccessary retval initialization
- new c-level iterator handler invalidate_current that is optionally used to clear internal caching like in implementation of Iterator
-rwxr-xr-xZend/zend_interfaces.c21
-rwxr-xr-xZend/zend_interfaces.h2
-rwxr-xr-xZend/zend_iterators.h3
3 files changed, 9 insertions, 17 deletions
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index 2d755191fa..276bcb6412 100755
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -108,7 +108,7 @@ static zval *zend_user_it_new_iterator(zend_class_entry *ce, zval *object TSRMLS
/* }}} */
/* {{{ zend_user_it_dtor */
-ZEND_API void zend_user_it_free_current(zend_object_iterator *_iter TSRMLS_DC)
+static void zend_user_it_invalidate_current(zend_object_iterator *_iter TSRMLS_DC)
{
zend_user_iterator *iter = (zend_user_iterator*)_iter;
@@ -125,10 +125,7 @@ static void zend_user_it_dtor(zend_object_iterator *_iter TSRMLS_DC)
zend_user_iterator *iter = (zend_user_iterator*)_iter;
zval *object = (zval*)iter->it.data;
- if (iter->value) {
- zval_ptr_dtor(&iter->value);
- iter->value = NULL;
- }
+ zend_user_it_invalidate_current(iter TSRMLS_CC);
zval_ptr_dtor(&object);
efree(iter);
}
@@ -187,8 +184,6 @@ static int zend_user_it_get_current_key(zend_object_iterator *_iter, char **str_
zend_call_method_with_0_params(&object, iter->ce, &iter->ce->iterator_funcs.zf_key, "key", &retval);
if (!retval) {
- *str_key = "";
- *str_key_len = 0;
*int_key = 0;
zend_error(E_WARNING, "Nothing returned from %s::key()", iter->ce->name);
return HASH_KEY_IS_LONG;
@@ -197,8 +192,6 @@ static int zend_user_it_get_current_key(zend_object_iterator *_iter, char **str_
default:
zend_error(E_WARNING, "Illegal type returned from %s::key()", iter->ce->name);
case IS_NULL:
- *str_key = "";
- *str_key_len = 0;
*int_key = 0;
zval_ptr_dtor(&retval);
return HASH_KEY_IS_LONG;
@@ -206,7 +199,6 @@ static int zend_user_it_get_current_key(zend_object_iterator *_iter, char **str_
case IS_STRING:
*str_key = estrndup(retval->value.str.val, retval->value.str.len);
*str_key_len = retval->value.str.len+1;
- *int_key = 0;
zval_ptr_dtor(&retval);
return HASH_KEY_IS_STRING;
@@ -232,10 +224,7 @@ static void zend_user_it_move_forward(zend_object_iterator *_iter TSRMLS_DC)
zend_user_iterator *iter = (zend_user_iterator*)_iter;
zval *object = (zval*)iter->it.data;
- if (iter->value) {
- zval_ptr_dtor(&iter->value);
- iter->value = NULL;
- }
+ zend_user_it_invalidate_current(iter TSRMLS_CC);
zend_call_method_with_0_params(&object, iter->ce, &iter->ce->iterator_funcs.zf_next, "next", NULL);
}
/* }}} */
@@ -246,6 +235,7 @@ static void zend_user_it_rewind(zend_object_iterator *_iter TSRMLS_DC)
zend_user_iterator *iter = (zend_user_iterator*)_iter;
zval *object = (zval*)iter->it.data;
+ zend_user_it_invalidate_current(iter TSRMLS_CC);
zend_call_method_with_0_params(&object, iter->ce, &iter->ce->iterator_funcs.zf_rewind, "rewind", NULL);
}
/* }}} */
@@ -256,7 +246,8 @@ zend_object_iterator_funcs zend_interface_iterator_funcs_iterator = {
zend_user_it_get_current_data,
zend_user_it_get_current_key,
zend_user_it_move_forward,
- zend_user_it_rewind
+ zend_user_it_rewind,
+ zend_user_it_invalidate_current
};
/* {{{ zend_user_it_get_iterator */
diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h
index e6c10299f1..78674cc627 100755
--- a/Zend/zend_interfaces.h
+++ b/Zend/zend_interfaces.h
@@ -37,8 +37,6 @@ typedef struct _zend_user_iterator {
zval *value;
} zend_user_iterator;
-ZEND_API void zend_user_it_free_current(zend_object_iterator *_iter TSRMLS_DC);
-
ZEND_API zval* zend_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int function_name_len, zval **retval_ptr_ptr, int param_count, zval* arg1, zval* arg2 TSRMLS_DC);
#define zend_call_method_with_0_params(obj, obj_ce, fn_proxy, function_name, retval) \
diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h
index 8cf0435adc..0c83cf4ce2 100755
--- a/Zend/zend_iterators.h
+++ b/Zend/zend_iterators.h
@@ -46,6 +46,9 @@ typedef struct _zend_object_iterator_funcs {
/* rewind to start of data (optional, may be NULL) */
void (*rewind)(zend_object_iterator *iter TSRMLS_DC);
+
+ /* invalidate current value/key (optional, may be NULL) */
+ void (*invalidate_current)(zend_object_iterator *iter TSRMLS_DC);
} zend_object_iterator_funcs;
struct _zend_object_iterator {