On Thu, 31 Dec 2015, Nikita Popov wrote:
> On Thu, Dec 31, 2015 at 1:09 AM, Derick Rethans <[email protected]> wrote:
>
> > On Thu, 31 Dec 2015, Nikita Popov wrote:
> >
> > > For PHP 7 only: FAST_CALL always jumps to op1. op2 is not a jmp
> > > addr, it's a try_catch_array offset. For FAST_RET there are no
> > > jump addresses encoded in the opline. It will either jump back to
> > > one past the invoking FAST_CALL (of which there may be multiple),
> > > or (if finally is executed due to an uncaught exception) it will
> > > jump back to the next applicable catch or finally or leave the
> > > function.
> >
> > Hmm, that's more complicated than I thought. How would I fix that
> > code? (PR welcome :D )
>
> I don't know what you need this for, but maybe you can use the same
> "good enough" approximation we use for our internal control flow
> analysis, namely simply say that FAST_CALL either jumps to op1 or to
> the next instruction, while FAST_RET is treated as a terminator
> instruction (like RETURN). This does not accurately model control
> flow, but it may be sufficient for your purposes.
I need to analyse every possible branch, and path through the code in
order to do dead code analysis (for which I think your simplified
option works), but also for path coverage, for which I don't think your
algorithm works. Xinchen alluded on IRC:
15:21 <@laruence> Derick, it used for calling "finally block"
15:22 <@laruence> it has the entry opline of finally block as opline->op1
15:22 <@laruence> and in the end of finally block ,there always be a
ZEND_FAST_RET opline, which will return to proper address
after finally block codes is executed
To me that indicates that the FAST_RET can jump back to any location
where FAST_CALL was *called* from (+1)?
In any case, I think my current code does what you describe, except for
FAST_RET, as that does not act like a RETURN - is there any reason why
my approach wouldn't work?
Some more observations and questions:
FAST_CALL:
*jmp1 = XDEBUG_ZNODE_JMP_LINE(opcode.op1, position, base_address);
- But what do do for *jmp2 - if extended_value is set?
- I can't come up with PHP code that sets extended_value though. Can you?
FAST_RET:
*jmp1 = position + 1;
- But you indicate that that really should be *jmp1 = XDEBUG_JMP_EXIT?
- Or, it should jump back to something else?
- But how do I know to which possible opline(s) it is going to jump back to?
- Is there a list of these somewhere?
- I can't come up with PHP code that sets extended_value here either.
Can you?
cheers,
Derick
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php