Я пытаюсь деформировать библиотеку C вокруг PHP-класса, используя PHP Zend Engine.Функция-конструктор класса должна принимать строку и указатель на функцию.Я смог извлечь строковые значения из аргументов __construct и распечатать их.Однако, когда я получаю функцию и пытаюсь заставить ее работать в конструкторе класса.Я получаю ошибку segfault.
По сути, конечный результат должен выглядеть примерно так:
class TestClass
{
function __construct(callable: $callBack, string: $name);
}
(Естественно, в классе есть другие методы, но у меня не было с ними проблем),Расширение C выглядит так:
PHP_METHOD(TestClass, __construct)
{
zend_string* name;
zend_fcall_info fci;
zend_fcall_info_cache fci_cache;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "fS", &fci, &fci_cache, &name) == FAILURE)
return;
php_printf("name: %s\n", ZSTR_VAL(name));
if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS) {
php_printf("Called");
}
zval* obj = getThis();
test_class_t* intern;
intern = Z_TSTOBJ_P(obj);
php_printf("Constructor\n");
zend_string_release(name);
if (fci.params)
efree(fci.params);
}
Segfault не происходит, когда zend_call_function
закомментирован.Я использую 7.2.19 и C99.Есть ли способ решить эту проблему?
Спасибо