On Fri, Jun 26, 2015 at 2:11 PM, Derick Rethans <der...@php.net> wrote:

> On Fri, 26 Jun 2015, Dmitry Stogov wrote:
>
> > You shouldn't use opcode handlers directly, we have a use USER_OPCODE
> API.
> >
> > typedef int (*user_opcode_handler_t) (zend_execute_data *execute_data);
> >
> > #define ZEND_USER_OPCODE_CONTINUE   0 /* execute next opcode */
> > #define ZEND_USER_OPCODE_RETURN     1 /* exit from executor (return from
> function) */
> > #define ZEND_USER_OPCODE_DISPATCH   2 /* call original opcode handler */
> > #define ZEND_USER_OPCODE_ENTER      3 /* enter into new op_array without
> recursion */
> > #define ZEND_USER_OPCODE_LEAVE      4 /* return to calling op_array
> within the same executor */
> >
> > #define ZEND_USER_OPCODE_DISPATCH_TO 0x100 /* call original handler of
> returned opcode */
> >
> > ZEND_API int zend_set_user_opcode_handler(zend_uchar opcode,
> user_opcode_handler_t handler);
> > ZEND_API user_opcode_handler_t zend_get_user_opcode_handler(zend_uchar
> opcode);
>
> Sure - I use that:
>
> https://github.com/xdebug/xdebug/blob/master/xdebug.c#L721
>
> The problem is that with:
>
> > typedef int (*user_opcode_handler_t) (zend_execute_data *execute_data);
>
> The PHP 5 code had a define for "zend_execute_data *execute_data" in
> "zend_compile.h":
>
> > -#define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data
>
> So the code at for example
> https://github.com/xdebug/xdebug/blob/master/xdebug.c#L499 uses that:
>
> static int xdebug_silence_handler(ZEND_OPCODE_HANDLER_ARGS)
>
> Whereas in PHP 7, this ZEND_OPCODE_HANDLER_ARGS define now in a .h file
> I can't include (zend_execute_vm.h) — and I can't quite understand *why*
> you've moved that macro.
>
> cheers,
> Derick
>
> > On Fri, Jun 26, 2015 at 2:46 AM, Derick Rethans <der...@php.net> wrote:
> >
> > > Hi,
> > >
> > > this change moved:
> > >
> > > -#define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data
> > > -#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data
> > > -
> > > -typedef int (*user_opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS);
> > > -typedef int (ZEND_FASTCALL *opcode_handler_t)
> (ZEND_OPCODE_HANDLER_ARGS);
> > > -
> > > -extern ZEND_API opcode_handler_t *zend_opcode_handlers;
> > > +typedef int (*user_opcode_handler_t) (zend_execute_data
> *execute_data);
> > >
> > > to Zend/zend_vm_execute.h:
> > >
> > > +#define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data
> > > +#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data
> > > +
> > > +typedef int (ZEND_FASTCALL *opcode_handler_t)
> (ZEND_OPCODE_HANDLER_ARGS);
> > >
> > >
> > > WHich means that I can now no longer override opcodes in Xdebug --- and
> > > I certainly can't include Zend/zend_vm_execute.h.
> > >
> > > The following code now fails (xdebug_code_coverage.[hc]):
> > >
> > >         int xdebug_check_branch_entry_handler(ZEND_OPCODE_HANDLER_ARGS)
> > >
> > > Is there a different way for declaring/defining these functions now? (I
> > > could just expand the ZEND_OPCODE_HANDLER_ARGS macro myself, but that's
> > > cheating...
>

ZEND_OPCODE_HANDLER_ARGS was intended for VM handlers only.
Leter we added USER_OPCODE API, and probably reused that macro.
But now we made big difference between "internal" and "user" handlers.
In general you shold write something like this

#if PHP_VERSION >= 7
# define ZEND_USER_OPCODE_HANDLER_ARGS zend_execute_data *execute_data
#else
# define ZEND_USER_OPCODE_HANDLER_ARGS ZEND_OPCODE_HANDLER_ARGS
#endif

Thanks. Dmitry.



> > >
> > > cheers,
> > > Derick
> > >
> > >
> > > On Thu, 12 Mar 2015, Dmitry Stogov wrote:
> > >
> > > > Commit:    6289f7e52f07d411bce0a0a99fe65bfbe87e4290
> > > > Author:    Dmitry Stogov <dmi...@zend.com>         Thu, 12 Mar 2015
> > > 20:39:04 +0300
> > > > Parents:   41571e7fa97feb2f43fc1ed3844daada35a29587
> > > > Branches:  master
> > > >
> > > > Link:
> > >
> http://git.php.net/?p=php-src.git;a=commitdiff;h=6289f7e52f07d411bce0a0a99fe65bfbe87e4290
> > > >
> > > > Log:
> > > > Executor cleanup: fix GOTO and SWITCH VMs, remove aility to build
> > > additional PHP-5.0 compatible VM, hide executor implementation details.
> > > >
> > > > Changed paths:
> > > >   M  Zend/zend_compile.h
> > > >   M  Zend/zend_execute.c
> > > >   M  Zend/zend_execute.h
> > > >   M  Zend/zend_vm_def.h
> > > >   M  Zend/zend_vm_execute.h
> > > >   M  Zend/zend_vm_gen.php
> > > >   M  ext/opcache/Optimizer/zend_optimizer_internal.h
> > > >
> > > >
> > >
> > > --
> > > http://derickrethans.nl | http://xdebug.org
> > > Like Xdebug? Consider a donation: http://xdebug.org/donate.php
> > > twitter: @derickr and @xdebug
> > > Posted with an email client that doesn't mangle email: alpine
> > >
> >
>
> --
> http://derickrethans.nl | http://xdebug.org
> Like Xdebug? Consider a donation: http://xdebug.org/donate.php
> twitter: @derickr and @xdebug
> Posted with an email client that doesn't mangle email: alpine
>

Reply via email to