xdebug — Что такое EXT_NOP и EXT_STMT, код операции PHP

Я пытаюсь понять более глубокие и внутренние аспекты php, просто выполняя нативные функции php в отношении моих реализаций.

Но в каждом дампе кода операции я вижу следующие два кода операции:

EXT_NOP : http://php.net/manual/tr/internals2.opcodes.ext-nop.php

EXT_STMT : http://php.net/manual/tr/internals2.opcodes.ext-stmt.php

как вы видите в документах нет подробного объяснения.

Даже в следующем примере, который приведен в доктор мои свалки отличаются от специфики документа. Я действительно хочу знать, почему эти две стойки стоят на каждой свалке? Какова их функциональность?

<?php
/*
* no operation
* opcode number: 0
*/
function A(){};
?>

Env Spesification:

LXC
Linux web 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u5 (2015-10-09) x86_64 GNU/Linux
PHP 5.6.15-1~dotdeb+7.1 (cli) (built: Nov  3 2015 16:29:58)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans

OpCode Dump:

➜  php -d vld.active=1 -d vld.execute=0 -f nop.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /root/web/www/optest/nop.php
function name:  (null)
number of ops:  5
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
2     0  E >   EXT_STMT
1        NOP
2        NOP
4     3        EXT_STMT
4      > RETURN                                                   1

branch: #  0; line:     2-    4; sop:     0; eop:     4; out1:  -2
path #1: 0,
Function a:
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /root/web/www/optest/nop.php
function name:  A
number of ops:  3
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
2     0  E >   EXT_NOP
1        EXT_STMT
2      > RETURN                                                   null

branch: #  0; line:     2-    2; sop:     0; eop:     2; out1:  -2
path #1: 0,
End of function a

3

Решение

EXT_NOP используется в тех случаях, когда ранее было что-то делать (то есть объявление функции), но механизм внутренне уже позаботился об этом и заменил исходный код операции на EXT_NOP. NOP означает «без операции». NOP немного отличается от EXT_NOP, поскольку он генерируется в разное время, но он делает то же самое: ничего.

EXT_STMT создается между операторами и позволяет отладчикам (таким как Xdebug) останавливаться в безопасных местах. Xdebug использует «обработчик операторов» (https://github.com/derickr/xdebug/blob/master/xdebug.c#L2534) подключиться к Zend Engine. Zend Engine вызывает этот обработчик для каждого EXT_STMT код операции он встречает.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]