Added php-test-helpers to the vendors directory
Seemed easier than trying to figure out how to force the prompt to accept the unknown IP (perhaps not possible at all as it is part of SSH?). `yes` didn't work, unfortunately.
This commit is contained in:
parent
ebc9b7fb38
commit
8f3c623e5d
32 changed files with 1629 additions and 2 deletions
671
vendors/php-test-helpers/test_helpers.c
vendored
Executable file
671
vendors/php-test-helpers/test_helpers.c
vendored
Executable file
|
@ -0,0 +1,671 @@
|
|||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| ext/test_helper |
|
||||
| An extension for the PHP Interpreter to ease testing of PHP code. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 2009-2013 Sebastian Bergmann. All rights reserved. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Redistribution and use in source and binary forms, with or without |
|
||||
| modification, are permitted provided that the following conditions |
|
||||
| are met: |
|
||||
| |
|
||||
| * Redistributions of source code must retain the above copyright |
|
||||
| notice, this list of conditions and the following disclaimer. |
|
||||
| |
|
||||
| * Redistributions in binary form must reproduce the above copyright |
|
||||
| notice, this list of conditions and the following disclaimer in |
|
||||
| the documentation and/or other materials provided with the |
|
||||
| distribution. |
|
||||
| |
|
||||
| * Neither the name of Sebastian Bergmann nor the names of his |
|
||||
| contributors may be used to endorse or promote products derived |
|
||||
| from this software without specific prior written permission. |
|
||||
| |
|
||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
|
||||
| FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
|
||||
| COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
|
||||
| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
|
||||
| BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|
||||
| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
||||
| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
|
||||
| ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
||||
| POSSIBILITY OF SUCH DAMAGE. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Author: Johannes Schlüter <johannes@schlueters.de> |
|
||||
| Scott MacVicar <scott@macvicar.net> |
|
||||
| Sebastian Bergmann <sb@sebastian-bergmann.de> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "php.h"
|
||||
#include "php_ini.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "php_test_helpers.h"
|
||||
#include "Zend/zend_exceptions.h"
|
||||
#include "Zend/zend_extensions.h"
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
# define PHP_TEST_HELPERS_API __declspec(dllexport)
|
||||
#elif defined(__GNUC__) && __GNUC__ >= 4
|
||||
# define PHP_TEST_HELPERS_API __attribute__ ((visibility("default")))
|
||||
#else
|
||||
# define PHP_TEST_HELPERS_API
|
||||
#endif
|
||||
|
||||
/* {{{ PHP < 5.3.0 */
|
||||
#if PHP_VERSION_ID < 50300
|
||||
typedef opcode_handler_t user_opcode_handler_t;
|
||||
|
||||
#define Z_ADDREF_P(z) ((z)->refcount++)
|
||||
|
||||
#define zend_parse_parameters_none() zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")
|
||||
|
||||
static void zend_fcall_info_args_clear(zend_fcall_info *fci, int free_mem) /* {{{ */
|
||||
{
|
||||
if (fci->params) {
|
||||
if (free_mem) {
|
||||
efree(fci->params);
|
||||
fci->params = NULL;
|
||||
}
|
||||
}
|
||||
fci->param_count = 0;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int zend_fcall_info_argv(zend_fcall_info *fci TSRMLS_DC, int argc, va_list *argv) /* {{{ */
|
||||
{
|
||||
int i;
|
||||
zval **arg;
|
||||
|
||||
if (argc < 0) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
zend_fcall_info_args_clear(fci, !argc);
|
||||
|
||||
if (argc) {
|
||||
fci->param_count = argc;
|
||||
fci->params = (zval ***) erealloc(fci->params, fci->param_count * sizeof(zval **));
|
||||
|
||||
for (i = 0; i < argc; ++i) {
|
||||
arg = va_arg(*argv, zval **);
|
||||
fci->params[i] = arg;
|
||||
}
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int zend_fcall_info_argn(zend_fcall_info *fci TSRMLS_DC, int argc, ...) /* {{{ */
|
||||
{
|
||||
int ret;
|
||||
va_list argv;
|
||||
|
||||
va_start(argv, argc);
|
||||
ret = zend_fcall_info_argv(fci TSRMLS_CC, argc, &argv);
|
||||
va_end(argv);
|
||||
|
||||
return ret;
|
||||
}
|
||||
/* }}} */
|
||||
#endif /* PHP_VERSION_ID < 50300 */
|
||||
/* }}} */
|
||||
|
||||
static user_opcode_handler_t old_new_handler = NULL;
|
||||
static user_opcode_handler_t old_exit_handler = NULL;
|
||||
static int test_helpers_module_initialized = 0;
|
||||
|
||||
typedef struct {
|
||||
zend_fcall_info fci;
|
||||
zend_fcall_info_cache fcc;
|
||||
} user_handler_t;
|
||||
|
||||
ZEND_BEGIN_MODULE_GLOBALS(test_helpers)
|
||||
user_handler_t new_handler;
|
||||
user_handler_t exit_handler;
|
||||
ZEND_END_MODULE_GLOBALS(test_helpers)
|
||||
|
||||
ZEND_DECLARE_MODULE_GLOBALS(test_helpers)
|
||||
|
||||
#ifdef ZTS
|
||||
#define THG(v) TSRMG(test_helpers_globals_id, zend_test_helpers_globals *, v)
|
||||
#else
|
||||
#define THG(v) (test_helpers_globals.v)
|
||||
#endif
|
||||
|
||||
#undef EX
|
||||
#define EX(element) execute_data->element
|
||||
|
||||
#if PHP_VERSION_ID >= 50500
|
||||
# define EX_T(offset) (*EX_TMP_VAR(execute_data, offset))
|
||||
#else
|
||||
# define EX_T(offset) (*(temp_variable *)((char*)execute_data->Ts + offset))
|
||||
#endif
|
||||
|
||||
#if PHP_VERSION_ID >= 50399
|
||||
# define PTH_ZNODE znode_op
|
||||
# define PTH_TYPE(t) t##_type
|
||||
#else
|
||||
# define PTH_ZNODE znode
|
||||
# define PTH_TYPE(t) t.op_type
|
||||
#endif
|
||||
|
||||
zval *pth_get_zval_ptr(int node_type, PTH_ZNODE *node, zval **freeval, zend_execute_data *execute_data TSRMLS_DC)
|
||||
{
|
||||
*freeval = NULL;
|
||||
|
||||
switch (node_type) {
|
||||
case IS_CONST:
|
||||
#if PHP_VERSION_ID >= 50399
|
||||
return node->zv;
|
||||
#else
|
||||
return &node->u.constant;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case IS_VAR:
|
||||
#if PHP_VERSION_ID >= 50399
|
||||
if (EX_T(node->var).var.ptr) {
|
||||
return EX_T(node->var).var.ptr;
|
||||
#else
|
||||
if (EX_T(node->u.var).var.ptr) {
|
||||
return EX_T(node->u.var).var.ptr;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
case IS_TMP_VAR:
|
||||
#if PHP_VERSION_ID >= 50399
|
||||
return (*freeval = &EX_T(node->var).tmp_var);
|
||||
#else
|
||||
return (*freeval = &EX_T(node->u.var).tmp_var);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case IS_CV: {
|
||||
zval **tmp;
|
||||
#if PHP_VERSION_ID >= 50399
|
||||
tmp = zend_get_compiled_variable_value(execute_data, node->constant);
|
||||
#else
|
||||
tmp = zend_get_compiled_variable_value(execute_data, node->u.constant.value.lval);
|
||||
#endif
|
||||
if (tmp) {
|
||||
return *tmp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void test_helpers_free_handler(zend_fcall_info *fci TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
if (fci->function_name) {
|
||||
zval_ptr_dtor(&fci->function_name);
|
||||
fci->function_name = NULL;
|
||||
}
|
||||
#if PHP_VERSION_ID >= 50300
|
||||
if (fci->object_ptr) {
|
||||
zval_ptr_dtor(&fci->object_ptr);
|
||||
fci->object_ptr = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int pth_new_handler(ZEND_OPCODE_HANDLER_ARGS) /* {{{ */
|
||||
{
|
||||
zval *retval, *arg;
|
||||
zend_op *opline = EX(opline);
|
||||
zend_class_entry *old_ce, **new_ce;
|
||||
|
||||
if (THG(new_handler).fci.function_name == NULL) {
|
||||
if (old_new_handler) {
|
||||
return old_new_handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||
} else {
|
||||
return ZEND_USER_OPCODE_DISPATCH;
|
||||
}
|
||||
}
|
||||
|
||||
#if ZEND_EXTENSION_API_NO >= 220100525
|
||||
old_ce = EX_T(opline->op1.var).class_entry;
|
||||
#else
|
||||
old_ce = EX_T(opline->op1.u.var).class_entry;
|
||||
#endif
|
||||
|
||||
MAKE_STD_ZVAL(arg);
|
||||
ZVAL_STRINGL(arg, old_ce->name, old_ce->name_length, 1);
|
||||
|
||||
zend_fcall_info_argn(&THG(new_handler).fci TSRMLS_CC, 1, &arg);
|
||||
zend_fcall_info_call(&THG(new_handler).fci, &THG(new_handler).fcc, &retval, NULL TSRMLS_CC);
|
||||
zend_fcall_info_args_clear(&THG(new_handler).fci, 1);
|
||||
|
||||
convert_to_string_ex(&retval);
|
||||
if (zend_lookup_class(Z_STRVAL_P(retval), Z_STRLEN_P(retval), &new_ce TSRMLS_CC) == FAILURE) {
|
||||
if (!EG(exception)) {
|
||||
zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), -1 TSRMLS_CC, "Class %s does not exist", Z_STRVAL_P(retval));
|
||||
}
|
||||
zval_ptr_dtor(&arg);
|
||||
zval_ptr_dtor(&retval);
|
||||
|
||||
return ZEND_USER_OPCODE_CONTINUE;
|
||||
}
|
||||
|
||||
zval_ptr_dtor(&arg);
|
||||
zval_ptr_dtor(&retval);
|
||||
|
||||
|
||||
#if ZEND_EXTENSION_API_NO >= 220100525
|
||||
EX_T(opline->op1.var).class_entry = *new_ce;
|
||||
#else
|
||||
EX_T(opline->op1.u.var).class_entry = *new_ce;
|
||||
#endif
|
||||
|
||||
if (old_new_handler) {
|
||||
return old_new_handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||
} else {
|
||||
return ZEND_USER_OPCODE_DISPATCH;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int pth_exit_handler(ZEND_OPCODE_HANDLER_ARGS) /* {{{ */
|
||||
{
|
||||
zval *msg, *freeop;
|
||||
zend_op *opline = EX(opline);
|
||||
zval *retval = NULL;
|
||||
|
||||
if (THG(exit_handler).fci.function_name == NULL) {
|
||||
if (old_exit_handler) {
|
||||
return old_exit_handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||
} else {
|
||||
return ZEND_USER_OPCODE_DISPATCH;
|
||||
}
|
||||
}
|
||||
|
||||
msg = pth_get_zval_ptr(opline->PTH_TYPE(op1), &opline->op1, &freeop, execute_data TSRMLS_CC);
|
||||
|
||||
if (msg) {
|
||||
zend_fcall_info_argn(&THG(exit_handler).fci TSRMLS_CC, 1, &msg);
|
||||
}
|
||||
zend_fcall_info_call(&THG(exit_handler).fci, &THG(exit_handler).fcc, &retval, NULL TSRMLS_CC);
|
||||
zend_fcall_info_args_clear(&THG(exit_handler).fci, 1);
|
||||
|
||||
if(UNEXPECTED(retval == NULL)) {
|
||||
EX(opline)++;
|
||||
return ZEND_USER_OPCODE_CONTINUE;
|
||||
}
|
||||
|
||||
convert_to_boolean(retval);
|
||||
if (Z_LVAL_P(retval)) {
|
||||
zval_ptr_dtor(&retval);
|
||||
if (old_exit_handler) {
|
||||
return old_exit_handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||
} else {
|
||||
return ZEND_USER_OPCODE_DISPATCH;
|
||||
}
|
||||
} else {
|
||||
zval_ptr_dtor(&retval);
|
||||
EX(opline)++;
|
||||
return ZEND_USER_OPCODE_CONTINUE;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void php_test_helpers_init_globals(zend_test_helpers_globals *globals) /* {{{ */
|
||||
{
|
||||
globals->new_handler.fci.function_name = NULL;
|
||||
globals->exit_handler.fci.function_name = NULL;
|
||||
#if PHP_VERSION_ID >= 50300
|
||||
globals->new_handler.fci.object_ptr = NULL;
|
||||
globals->exit_handler.fci.object_ptr = NULL;
|
||||
#endif
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINIT_FUNCTION
|
||||
*/
|
||||
static PHP_MINIT_FUNCTION(test_helpers)
|
||||
{
|
||||
if (test_helpers_module_initialized) {
|
||||
/* This should never happen as it is handled by the module loader, but let's play safe */
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "test_helpers had already been initialized! Either load it as regular PHP extension or zend_extension");
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
ZEND_INIT_MODULE_GLOBALS(test_helpers, php_test_helpers_init_globals, NULL);
|
||||
old_new_handler = zend_get_user_opcode_handler(ZEND_NEW);
|
||||
zend_set_user_opcode_handler(ZEND_NEW, pth_new_handler);
|
||||
|
||||
old_exit_handler = zend_get_user_opcode_handler(ZEND_EXIT);
|
||||
zend_set_user_opcode_handler(ZEND_EXIT, pth_exit_handler);
|
||||
|
||||
test_helpers_module_initialized = 1;
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_RSHUTDOWN_FUNCTION
|
||||
*/
|
||||
static PHP_RSHUTDOWN_FUNCTION(test_helpers)
|
||||
{
|
||||
test_helpers_free_handler(&THG(new_handler).fci TSRMLS_CC);
|
||||
test_helpers_free_handler(&THG(exit_handler).fci TSRMLS_CC);
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINFO_FUNCTION
|
||||
*/
|
||||
static PHP_MINFO_FUNCTION(test_helpers)
|
||||
{
|
||||
char *conflict_text;
|
||||
|
||||
if (pth_new_handler != zend_get_user_opcode_handler(ZEND_NEW)) {
|
||||
conflict_text = "Yes. The work-around was NOT enabled. Please make sure test_helpers was loaded as zend_extension AFTER conflicting extensions like Xdebug!";
|
||||
} else if (old_new_handler != NULL) {
|
||||
conflict_text = "Yes, work-around enabled";
|
||||
} else {
|
||||
conflict_text = "No conflict detected";
|
||||
}
|
||||
php_info_print_table_start();
|
||||
php_info_print_table_header(2, "test_helpers support", "enabled");
|
||||
php_info_print_table_row(2, "Conflicting extension found", conflict_text);
|
||||
php_info_print_table_end();
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void overload_helper(user_opcode_handler_t op_handler, int opcode, user_handler_t *handler, INTERNAL_FUNCTION_PARAMETERS) /* {{{ */
|
||||
{
|
||||
zend_fcall_info fci;
|
||||
zend_fcall_info_cache fcc;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f", &fci, &fcc) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (op_handler != zend_get_user_opcode_handler(opcode)) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "A conflicting extension was detected. Make sure to load test_helpers as zend_extension after other extensions");
|
||||
}
|
||||
|
||||
test_helpers_free_handler(&handler->fci TSRMLS_CC);
|
||||
|
||||
handler->fci = fci;
|
||||
handler->fcc = fcc;
|
||||
Z_ADDREF_P(handler->fci.function_name);
|
||||
#if PHP_VERSION_ID >= 50300
|
||||
if (handler->fci.object_ptr) {
|
||||
Z_ADDREF_P(handler->fci.object_ptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
RETURN_TRUE;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool set_new_overload(callback cb)
|
||||
Register a callback, called on instantiation of a new object */
|
||||
static PHP_FUNCTION(set_new_overload)
|
||||
{
|
||||
overload_helper(pth_new_handler, ZEND_NEW, &THG(new_handler), INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool set_exit_overload(callback cb)
|
||||
Register a callback, called on exit()/die() */
|
||||
static PHP_FUNCTION(set_exit_overload)
|
||||
{
|
||||
overload_helper(pth_exit_handler, ZEND_EXIT, &THG(exit_handler), INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void unset_overload_helper(user_handler_t *handler, INTERNAL_FUNCTION_PARAMETERS) /* {{{ */
|
||||
{
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
test_helpers_free_handler(&handler->fci TSRMLS_CC);
|
||||
RETURN_TRUE;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool unset_new_overload()
|
||||
Remove the current new handler */
|
||||
static PHP_FUNCTION(unset_new_overload)
|
||||
{
|
||||
unset_overload_helper(&THG(new_handler), INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool unset_exit_overload()
|
||||
Remove the current exit handler */
|
||||
static PHP_FUNCTION(unset_exit_overload)
|
||||
{
|
||||
unset_overload_helper(&THG(exit_handler), INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int pth_rename_function_impl(HashTable *table, char *orig, int orig_len, char *new, int new_len TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_function *func, *dummy_func;
|
||||
|
||||
if (zend_hash_find(table, orig, orig_len + 1, (void **) &func) == FAILURE) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s(%s, %s) failed: %s does not exist!" ,
|
||||
get_active_function_name(TSRMLS_C),
|
||||
orig, new, orig);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
/* TODO: Add infrastructure for resetting internal funcs */
|
||||
if (func->type != ZEND_USER_FUNCTION) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "\"%s\" is an internal function", orig);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (zend_hash_find(table, new, new_len + 1, (void **) &dummy_func) == SUCCESS) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s(%s, %s) failed: %s already exists!" ,
|
||||
get_active_function_name(TSRMLS_C),
|
||||
orig, new, new);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (zend_hash_add(table, new, new_len + 1, func, sizeof(zend_function), NULL) == FAILURE) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s() failed to insert %s into EG(function_table)", get_active_function_name(TSRMLS_C), new);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (func->type == ZEND_USER_FUNCTION) {
|
||||
function_add_ref(func);
|
||||
}
|
||||
|
||||
if (zend_hash_del(table, orig, orig_len + 1) == FAILURE) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s() failed to remove %s from function table", get_active_function_name(TSRMLS_C), orig);
|
||||
|
||||
zend_hash_del(table, new, new_len + 1);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int pth_rename_function(HashTable *table, char *orig, int orig_len, char *new, int new_len TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
char *lower_orig, *lower_new;
|
||||
int success;
|
||||
|
||||
lower_orig = zend_str_tolower_dup(orig, orig_len);
|
||||
lower_new = zend_str_tolower_dup(new, new_len);
|
||||
|
||||
success = pth_rename_function_impl(table, lower_orig, orig_len, lower_new, new_len TSRMLS_CC);
|
||||
|
||||
efree(lower_orig);
|
||||
efree(lower_new);
|
||||
|
||||
return success;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool rename_method(string class name, string orig_method_name, string new_method_name)
|
||||
Rename a method inside a class. The method whil remain partof the same class */
|
||||
static PHP_FUNCTION(rename_method)
|
||||
{
|
||||
zend_class_entry *ce = NULL;
|
||||
char *orig_fname, *new_fname;
|
||||
int orig_fname_len, new_fname_len;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Css", &ce, &orig_fname, &orig_fname_len, &new_fname, &new_fname_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (SUCCESS == pth_rename_function(&ce->function_table, orig_fname, orig_fname_len, new_fname, new_fname_len TSRMLS_CC)) {
|
||||
RETURN_TRUE;
|
||||
} else {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool rename_function(string orig_func_name, string new_func_name)
|
||||
Rename a function from its original to a new name. This is mainly useful in
|
||||
unittest to stub out untested functions */
|
||||
static PHP_FUNCTION(rename_function)
|
||||
{
|
||||
char *orig_fname, *new_fname;
|
||||
int orig_fname_len, new_fname_len;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &orig_fname, &orig_fname_len, &new_fname, &new_fname_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (SUCCESS == pth_rename_function(EG(function_table), orig_fname, orig_fname_len, new_fname, new_fname_len TSRMLS_CC)) {
|
||||
RETURN_TRUE;
|
||||
} else {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ arginfo */
|
||||
/* {{{ unset_new_overload */
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_unset_new_overload, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
/* }}} */
|
||||
|
||||
/* {{{ unset_exit_overload */
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_unset_exit_overload, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
/* }}} */
|
||||
|
||||
/* {{{ set_new_overload */
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_set_new_overload, 0)
|
||||
ZEND_ARG_INFO(0, callback)
|
||||
ZEND_END_ARG_INFO()
|
||||
/* }}} */
|
||||
|
||||
/* {{{ rename_method */
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_rename_method, 0)
|
||||
ZEND_ARG_INFO(0, class_name)
|
||||
ZEND_ARG_INFO(0, orig_method_name)
|
||||
ZEND_ARG_INFO(0, new_method_name)
|
||||
ZEND_END_ARG_INFO()
|
||||
/* }}} */
|
||||
|
||||
/* {{{ rename_function */
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_rename_function, 0)
|
||||
ZEND_ARG_INFO(0, orig_func_name)
|
||||
ZEND_ARG_INFO(0, new_func_name)
|
||||
ZEND_END_ARG_INFO()
|
||||
/* }}} */
|
||||
|
||||
/* {{{ set_exit_overload */
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_set_exit_overload, 0)
|
||||
ZEND_ARG_INFO(0, "callback")
|
||||
ZEND_END_ARG_INFO()
|
||||
/* }}} */
|
||||
|
||||
/* }}} */
|
||||
|
||||
/* {{{ test_helpers_functions[]
|
||||
*/
|
||||
static const zend_function_entry test_helpers_functions[] = {
|
||||
PHP_FE(unset_new_overload, arginfo_unset_new_overload)
|
||||
PHP_FE(set_new_overload, arginfo_set_new_overload)
|
||||
PHP_FE(unset_exit_overload, arginfo_unset_exit_overload)
|
||||
PHP_FE(set_exit_overload, arginfo_set_exit_overload)
|
||||
PHP_FE(rename_method, arginfo_rename_method)
|
||||
PHP_FE(rename_function, arginfo_rename_function)
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
/* {{{ test_helpers_module_entry
|
||||
*/
|
||||
zend_module_entry test_helpers_module_entry = {
|
||||
STANDARD_MODULE_HEADER,
|
||||
"test_helpers",
|
||||
test_helpers_functions,
|
||||
PHP_MINIT(test_helpers),
|
||||
NULL,
|
||||
NULL,
|
||||
PHP_RSHUTDOWN(test_helpers),
|
||||
PHP_MINFO(test_helpers),
|
||||
TEST_HELPERS_VERSION,
|
||||
STANDARD_MODULE_PROPERTIES
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
static int test_helpers_zend_startup(zend_extension *extension) /* {{{ */
|
||||
{
|
||||
return zend_startup_module(&test_helpers_module_entry);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
#ifndef ZEND_EXT_API
|
||||
#define ZEND_EXT_API ZEND_DLEXPORT
|
||||
#endif
|
||||
ZEND_EXTENSION();
|
||||
|
||||
zend_extension zend_extension_entry = {
|
||||
"test_helpers",
|
||||
TEST_HELPERS_VERSION,
|
||||
"Johannes Schlueter, Scott MacVicar, Sebastian Bergmann",
|
||||
"http://github.com/johannes/php-test-helpers",
|
||||
"Copyright (c) 2009-2013",
|
||||
test_helpers_zend_startup,
|
||||
NULL, /* shutdown_func_t */
|
||||
NULL, /* activate_func_t */
|
||||
NULL, /* deactivate_func_t */
|
||||
NULL, /* message_handler_func_t */
|
||||
NULL, /* op_array_handler_func_t */
|
||||
NULL, /* statement_handler_func_t */
|
||||
NULL, /* fcall_begin_handler_func_t */
|
||||
NULL, /* fcall_end_handler_func_t */
|
||||
NULL, /* op_array_ctor_func_t */
|
||||
NULL, /* op_array_dtor_func_t */
|
||||
STANDARD_ZEND_EXTENSION_PROPERTIES
|
||||
};
|
||||
|
||||
#ifdef COMPILE_DL_TEST_HELPERS
|
||||
ZEND_GET_MODULE(test_helpers)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: noet sw=4 ts=4 fdm=marker
|
||||
* vim<600: noet sw=4 ts=4
|
||||
*/
|
Loading…
Add table
Add a link
Reference in a new issue