Previous: Instructions, Up: Opcodes in PHP [Contents]
Operand type can be of following:
#define IS_UNUSED 0 #define IS_CONST (1<<0) #define IS_TMP_VAR (1<<1) #define IS_VAR (1<<2) #define IS_CV (1<<3) // Compiled variable
znode_op
is
IS_UNUSED
.
IS_CONST
.
IS_TMP_VAR
.
IS_CV
.
IS_VAR
.
For example, the following PHP code:
$a = 1; $a + 1; $b = $a + 1; $a += 1; $c = $b = $a += 1;
Compiles to:
# (op1 op2 result) type ASSIGN $a, 1 # CV CONST UNUSED ADD $a, 1, ~1 # CV CONST TMP_VAR FREE ~1 # TMP_VAR UNUSED UNUSED ADD $a, 1, ~2 # CV CONST TMP_VAR ASSIGN $b, ~2 # CV TMP_VAR UNUSED ASSIGN_ADD $a, 1 # CV CONST UNUSED ASSIGN_ADD $a, 1, @5 # CV CONST VAR ASSIGN $b, @5, @6 # CV VAR VAR ASSIGN $c, @6 # CV VAR UNUSED
We can see that, for an assignment instruction, whether it has a result depends on whether the result is used or not. But for non-assignment instructions, the result is always stored in a temporary variable, even when the result is unused, in case it needs to be freed.