helly Sat Aug 16 16:27:29 2003 EDT Modified files: /spl spl_engine.c spl_engine.h spl_foreach.c Log: spl_call_method returns the zval* if used Index: spl/spl_engine.c diff -u spl/spl_engine.c:1.14 spl/spl_engine.c:1.15 --- spl/spl_engine.c:1.14 Sat Aug 16 06:37:14 2003 +++ spl/spl_engine.c Sat Aug 16 16:27:29 2003 @@ -171,7 +171,7 @@ /* }}} */ /* {{{ 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 @@ 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 @@ } 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 @@ 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; } /* }}} */ Index: spl/spl_engine.h diff -u spl/spl_engine.h:1.11 spl/spl_engine.h:1.12 --- spl/spl_engine.h:1.11 Thu Aug 7 18:50:46 2003 +++ spl/spl_engine.h Sat Aug 16 16:27:29 2003 @@ -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) Index: spl/spl_foreach.c diff -u spl/spl_foreach.c:1.18 spl/spl_foreach.c:1.19 --- spl/spl_foreach.c:1.18 Thu Aug 7 18:43:01 2003 +++ spl/spl_foreach.c Sat Aug 16 16:27:29 2003 @@ -141,6 +141,7 @@ 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 @@ } 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 @@ #endif NEXT_OPCODE(); } - zval_dtor(more); - FREE_ZVAL(more); EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num; return 0; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php