summaryrefslogtreecommitdiff
path: root/Zend/zend_execute_API.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2000-06-03 03:28:08 +0000
committerZeev Suraski <zeev@php.net>2000-06-03 03:28:08 +0000
commit5a35a6bafc6b009b41ed090116566907c8d038e8 (patch)
tree2970dd1ed6c403dcbb37983937b0da2776bf9172 /Zend/zend_execute_API.c
parentd1f1d4052746191023cb0bbd8ab0e2f189f1a65f (diff)
downloadphp-git-5a35a6bafc6b009b41ed090116566907c8d038e8.tar.gz
Improve call_user_function() to support array($obj, $method)
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r--Zend/zend_execute_API.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 21ee9c40c0..9fa150fa5f 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -360,12 +360,30 @@ int call_user_function_ex(HashTable *function_table, zval *object, zval *functio
*retval_ptr_ptr = NULL;
+ if (function_name->type==IS_ARRAY) { /* assume array($obj, $name) couple */
+ zval **tmp_object_ptr, **tmp_real_function_name;
+
+ if (zend_hash_index_find(function_name->value.ht, 0, (void **) &tmp_object_ptr)==FAILURE) {
+ return FAILURE;
+ }
+ if (zend_hash_index_find(function_name->value.ht, 1, (void **) &tmp_real_function_name)==FAILURE) {
+ return FAILURE;
+ }
+ function_name = *tmp_real_function_name;
+ object = *tmp_object_ptr;
+ }
+
if (object) {
if (object->type != IS_OBJECT) {
return FAILURE;
}
function_table = &object->value.obj.ce->function_table;
}
+
+ if (function_name->type!=IS_STRING) {
+ return FAILURE;
+ }
+
original_function_state_ptr = EG(function_state_ptr);
zend_str_tolower(function_name->value.str.val, function_name->value.str.len);
if (zend_hash_find(function_table, function_name->value.str.val, function_name->value.str.len+1, (void **) &function_state.function)==FAILURE) {