Re: Re: calling protected PHP_METHOD via call_user_function; missing context ??

From: Date: Mon, 05 Jan 2009 11:42:11 +0000
Subject: Re: Re: calling protected PHP_METHOD via call_user_function; missing context ??
References: 1 2 3  Groups: php.pecl.dev 
Request: Send a blank email to pecl-dev+get-6035@lists.php.net to get a copy of this message
Nathan, Not sure of this line here: if(zend_hash_exists(&this_ce-> > > function_table, > "initializeMacroCommand", sizeof("initializeMacroCommand")) == 1) { Why are you using '== 1' ? Perhaps you should use '== SUCCESS'. SUCCESS is a macro that is expanded to '0'. So zend_hash_exists will either return 0 or -1. I guess that is the reason why it is always going inside the else block.. Test it and see if that works :) Also, why are you casting all those NULLs ? Regards, Henrique On Thu, Jan 1, 2009 at 5:36 PM, Nathan Nobbe <quickshiftin@gmail.com> wrote: > On Tue, Dec 30, 2008 at 2:11 PM, Johannes Schlüter <johannes@php.net> > wrote: > > > On Tue, 2008-12-30 at 13:11 -0700, "Nathan Nobbe" wrote: > > > call_user_function(&this_ce->function_table, &this, callback, > > &retval, > > > 0, > > > (zval**)NULL TSRMLS_CC); > > > > use zend_call_method - the second parameter there is the CE of the > > calling scope. See Zend/zend_interfaces.h there are few wrappers, too. > > > > thanks for your quick response. i switched over to zend_call_method > passing > a casted NULL for the fn_proxy, which just means im not leveraging some > caching feature, right? > > anywasys, i was getting the same error even w/ zend_call_method, so i > decided to wrap this code in an outer call to zend_hash_exists. then i > raise a fatal if its not found (at least for now during development). > turns > out, the error message is coming up every time, but im not sure why.. > > if i do php --rc i can see the MacroCommand::initializeMacroCommand, i have > an implementation, its just and empty block right now, but i assumed that > would be sufficient, im using the function_table in the zend_class_entry, > which i get by first using getThis() and then using zend_get_class_entry(), > that seems like it should be the correct function_table. > > any more advice for a newb ? heres the code ive got atm > > /* {{{ proto public void MacroCommand::__construct() > > Constructor. */ > PHP_METHOD(MacroCommand, __construct) > { > zval *this, *retval; > zend_class_entry *this_ce; > > this = getThis(); > this_ce = zend_get_class_entry(this); > > array_init(return_value); > > zend_update_property(this_ce, this, "subCommands", > sizeof("subCommands")-1, > return_value TSRMLS_CC); > > > if(zend_hash_exists(&this_ce->function_table, > "initializeMacroCommand", sizeof("initializeMacroCommand")) == 1) { > > retval = NULL; > zend_call_method(&this, this_ce, (zend_function**)NULL, > > "initializeMacroCommand", > sizeof("initializeMacroCommand"), &retval, > 0, (zval*)NULL, (zval*)NULL TSRMLS_CC); > } else { > php_error_docref(NULL TSRMLS_CC, E_ERROR, > "MacroCommand::initializeMacroCommand was not found!"); > > } > } > /* }}} */ > > -nathan >

« previous php.pecl.dev (#6035) next »