Browse Source

- no unneccessary retval initialization

- new c-level iterator handler invalidate_current that is optionally
  used to clear internal caching like in implementation of Iterator
PHP-5.0
Marcus Boerger 23 years ago
parent
commit
e1cd098925
  1. 21
      Zend/zend_interfaces.c
  2. 2
      Zend/zend_interfaces.h
  3. 3
      Zend/zend_iterators.h

21
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_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; 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; zend_user_iterator *iter = (zend_user_iterator*)_iter;
zval *object = (zval*)iter->it.data; 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); zval_ptr_dtor(&object);
efree(iter); 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); zend_call_method_with_0_params(&object, iter->ce, &iter->ce->iterator_funcs.zf_key, "key", &retval);
if (!retval) { if (!retval) {
*str_key = "";
*str_key_len = 0;
*int_key = 0; *int_key = 0;
zend_error(E_WARNING, "Nothing returned from %s::key()", iter->ce->name); zend_error(E_WARNING, "Nothing returned from %s::key()", iter->ce->name);
return HASH_KEY_IS_LONG; return HASH_KEY_IS_LONG;
@ -197,8 +192,6 @@ static int zend_user_it_get_current_key(zend_object_iterator *_iter, char **str_
default: default:
zend_error(E_WARNING, "Illegal type returned from %s::key()", iter->ce->name); zend_error(E_WARNING, "Illegal type returned from %s::key()", iter->ce->name);
case IS_NULL: case IS_NULL:
*str_key = "";
*str_key_len = 0;
*int_key = 0; *int_key = 0;
zval_ptr_dtor(&retval); zval_ptr_dtor(&retval);
return HASH_KEY_IS_LONG; 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: case IS_STRING:
*str_key = estrndup(retval->value.str.val, retval->value.str.len); *str_key = estrndup(retval->value.str.val, retval->value.str.len);
*str_key_len = retval->value.str.len+1; *str_key_len = retval->value.str.len+1;
*int_key = 0;
zval_ptr_dtor(&retval); zval_ptr_dtor(&retval);
return HASH_KEY_IS_STRING; 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; zend_user_iterator *iter = (zend_user_iterator*)_iter;
zval *object = (zval*)iter->it.data; 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); 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; zend_user_iterator *iter = (zend_user_iterator*)_iter;
zval *object = (zval*)iter->it.data; 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); 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_data,
zend_user_it_get_current_key, zend_user_it_get_current_key,
zend_user_it_move_forward, zend_user_it_move_forward,
zend_user_it_rewind
zend_user_it_rewind,
zend_user_it_invalidate_current
}; };
/* {{{ zend_user_it_get_iterator */ /* {{{ zend_user_it_get_iterator */

2
Zend/zend_interfaces.h

@ -37,8 +37,6 @@ typedef struct _zend_user_iterator {
zval *value; zval *value;
} zend_user_iterator; } 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); 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) \ #define zend_call_method_with_0_params(obj, obj_ce, fn_proxy, function_name, retval) \

3
Zend/zend_iterators.h

@ -46,6 +46,9 @@ typedef struct _zend_object_iterator_funcs {
/* rewind to start of data (optional, may be NULL) */ /* rewind to start of data (optional, may be NULL) */
void (*rewind)(zend_object_iterator *iter TSRMLS_DC); 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; } zend_object_iterator_funcs;
struct _zend_object_iterator { struct _zend_object_iterator {

Loading…
Cancel
Save