]> granicus.if.org Git - php/commitdiff
Improve call_user_function() to support array($obj, $method)
authorZeev Suraski <zeev@php.net>
Sat, 3 Jun 2000 03:28:08 +0000 (03:28 +0000)
committerZeev Suraski <zeev@php.net>
Sat, 3 Jun 2000 03:28:08 +0000 (03:28 +0000)
Zend/zend_execute_API.c

index 21ee9c40c0dc8135e226d8253a3d19aaf4a51cb9..9fa150fa5f91fc9f261d2c9684e10e03d0d01a9d 100644 (file)
@@ -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) {