#include "php.h" #include "string.h" #include "main/php_main.h" #include "Zend/zend_API.h" #include "zend_exceptions.h" #include "zend_interfaces.h" #include "zend_object_handlers.h" #include "ext/pcre/php_pcre.h" #include "ext/standard/php_string.h" #include "ct_helper.h" #define ZEND_FIND_FUNC(ce, name, name_len, fe) \ zend_hash_find(&ce->function_table, name, name_len, (void **) &fe) #define ZEND_FIND_FUNC_QUICK(ce, name, name_len, fe) \ zend_hash_quick_find(&ce->function_table, name, name_len, zend_inline_hash_func(name, name_len) , (void **) &fe) /* {{{ zend_call_method Only returns the returned zval if retval_ptr != NULL */ ZEND_API zval* zend_call_method_with_3_params(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, const char *function_name, int function_name_len, zval **retval_ptr_ptr, int param_count, zval* arg1, zval* arg2, zval* arg3 TSRMLS_DC) { int result; zend_fcall_info fci; zval z_fname; zval *retval; HashTable *function_table; zval **params[3]; params[0] = &arg1; params[1] = &arg2; params[2] = &arg3; fci.size = sizeof(fci); /*fci.function_table = NULL; will be read form zend_class_entry of object if needed */ fci.object_ptr = object_pp ? *object_pp : NULL; fci.function_name = &z_fname; fci.retval_ptr_ptr = retval_ptr_ptr ? retval_ptr_ptr : &retval; fci.param_count = param_count; 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); fci.function_table = !object_pp ? EG(function_table) : NULL; result = zend_call_function(&fci, NULL TSRMLS_CC); } else { zend_fcall_info_cache fcic; fcic.initialized = 1; if (!obj_ce) { obj_ce = object_pp ? Z_OBJCE_PP(object_pp) : NULL; } if (obj_ce) { function_table = &obj_ce->function_table; } else { function_table = EG(function_table); } if (!fn_proxy || !*fn_proxy) { if (zend_hash_find(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%s", obj_ce ? obj_ce->name : "", obj_ce ? "::" : "", function_name); } if (fn_proxy) { *fn_proxy = fcic.function_handler; } } else { fcic.function_handler = *fn_proxy; } fcic.calling_scope = obj_ce; if (object_pp) { fcic.called_scope = Z_OBJCE_PP(object_pp); } else if (obj_ce && !(EG(called_scope) && instanceof_function(EG(called_scope), obj_ce TSRMLS_CC))) { fcic.called_scope = obj_ce; } else { fcic.called_scope = EG(called_scope); } fcic.object_ptr = object_pp ? *object_pp : NULL; result = zend_call_function(&fci, &fcic TSRMLS_CC); } if (result == FAILURE) { /* error at c-level */ if (!obj_ce) { obj_ce = object_pp ? Z_OBJCE_PP(object_pp) : NULL; } if (!EG(exception)) { zend_error(E_CORE_ERROR, "Couldn't execute method %s%s%s", obj_ce ? obj_ce->name : "", obj_ce ? "::" : "", function_name); } } if (!retval_ptr_ptr) { if (retval) { zval_ptr_dtor(&retval); } return NULL; } return *retval_ptr_ptr; } /* }}} */ char * find_place_holder(char *pattern, int pattern_len) { char needle_char[2] = { ':', 0 }; return php_memnstr(pattern, needle_char, 1, pattern + pattern_len); }