diff options
author | Marcus Boerger <helly@php.net> | 2003-08-16 20:27:29 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2003-08-16 20:27:29 +0000 |
commit | c346aad91a3f5db185f7add67ddf778db59c7bbd (patch) | |
tree | a7ea62a3289d133e8828d1d631ba080a1ad31fcc /ext/spl | |
parent | 7a12eb8a2d788f9a3bb99075f78b20712c7b307d (diff) | |
download | php-git-c346aad91a3f5db185f7add67ddf778db59c7bbd.tar.gz |
spl_call_method returns the zval* if used
Diffstat (limited to 'ext/spl')
-rwxr-xr-x | ext/spl/spl_engine.c | 17 | ||||
-rwxr-xr-x | ext/spl/spl_engine.h | 2 | ||||
-rwxr-xr-x | ext/spl/spl_foreach.c | 14 |
3 files changed, 20 insertions, 13 deletions
diff --git a/ext/spl/spl_engine.c b/ext/spl/spl_engine.c index 2fdf8ae9ac..48a0f1b9de 100755 --- a/ext/spl/spl_engine.c +++ b/ext/spl/spl_engine.c @@ -171,7 +171,7 @@ spl_is_a spl_implements(zend_class_entry *ce) /* }}} */ /* {{{ spl_call_method */ -int spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int function_name_len, zval **retval_ptr, int param_count, zval* arg1, zval* arg2 TSRMLS_DC) +zval * spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int function_name_len, zval **retval_ptr, int param_count, zval* arg1, zval* arg2 TSRMLS_DC) { int result; zend_fcall_info fci; @@ -192,8 +192,10 @@ int spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function ** fci.params = params; fci.no_separation = 1; fci.symbol_table = NULL; - + if (!fn_proxy && !obj_ce) { + /* no interest in caching and no information already present that is + * needed later inside zend_call_function. */ ZVAL_STRINGL(&z_fname, function_name, function_name_len, 0); result = zend_call_function(&fci, NULL TSRMLS_CC); } else { @@ -205,6 +207,7 @@ int spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function ** } if (!fn_proxy || !*fn_proxy) { if (zend_hash_find(&obj_ce->function_table, function_name, function_name_len+1, (void **) &fcic.function_handler) == FAILURE) { + /* error at c-level */ zend_error(E_CORE_ERROR, "Couldn't find implementation for method %s::%s\n", obj_ce->name, function_name); } if (fn_proxy) { @@ -217,11 +220,19 @@ int spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function ** fcic.object_pp = object_pp; result = zend_call_function(&fci, &fcic TSRMLS_CC); } + if (result == FAILURE) { + /* error at c-level */ + if (!obj_ce) { + obj_ce = Z_OBJCE_PP(object_pp); + } + zend_error(E_CORE_ERROR, "Couldn't execute method %s::%s\n", obj_ce->name, function_name); + } if (!retval_ptr && retval) { zval_dtor(retval); FREE_ZVAL(retval); + return NULL; } - return result; + return *retval_ptr; } /* }}} */ diff --git a/ext/spl/spl_engine.h b/ext/spl/spl_engine.h index 91e1f7b016..e4c0e93a4a 100755 --- a/ext/spl/spl_engine.h +++ b/ext/spl/spl_engine.h @@ -34,7 +34,7 @@ EX(opline)++; \ return 0; -int spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int function_name_len, zval **retval_ptr, int param_count, zval* arg1, zval* arg2 TSRMLS_DC); +zval * spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int function_name_len, zval **retval_ptr, int param_count, zval* arg1, zval* arg2 TSRMLS_DC); /* {{{ zend_class_entry */ static inline zend_class_entry *spl_get_class_entry(zval *obj TSRMLS_DC) diff --git a/ext/spl/spl_foreach.c b/ext/spl/spl_foreach.c index 114aa53952..d57d048fde 100755 --- a/ext/spl/spl_foreach.c +++ b/ext/spl/spl_foreach.c @@ -141,6 +141,7 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_FE_FETCH) spl_foreach_proxy *proxy; if (Z_TYPE_PP(obj) == IS_STRING) { + int has_more; proxy = (spl_foreach_proxy*)Z_STRVAL_PP(obj); obj = &proxy->obj; /* will be optimized out */ @@ -159,13 +160,10 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_FE_FETCH) } spl_call_method_0(obj, proxy->obj_ce, &proxy->funcs.more, "has_more", sizeof("has_more")-1, &more); - if (!more->type == IS_BOOL && !more->type == IS_LONG) { - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Method %s::has_more implements spl_forward::has_more and should return a value of type boolean or int"); - convert_to_boolean(more); - } - if (more->value.lval) { - zval_dtor(more); - FREE_ZVAL(more); + has_more = i_zend_is_true(more); + zval_dtor(more); + FREE_ZVAL(more); + if (has_more) { result = &EX_T(EX(opline)->result.u.var).tmp_var; spl_call_method_0(obj, proxy->obj_ce, &proxy->funcs.current, "current", sizeof("current")-1, &value); @@ -230,8 +228,6 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_FE_FETCH) #endif NEXT_OPCODE(); } - zval_dtor(more); - FREE_ZVAL(more); EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num; return 0; } |