usage. (Andrey)
- Opcache:
+ . Fixed bug #73789 (Strange behavior of class constants in switch/case block).
+ (Laruence)
. Fixed bug #73746 (Method that returns string returns UNKNOWN:0 instead).
(Laruence)
. Fixed bug #73654 (Segmentation fault in zend_call_function). (Nikita)
// op_1: VERIFY_RETURN_TYPE #orig_var.CV [T] -> #v.CV [T] => NOP
int orig_var = ssa->ops[op_1].op1_use;
- int ret = ssa->vars[v].use_chain;
+ if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
- ssa->vars[orig_var].use_chain = ret;
- ssa->ops[ret].op1_use = orig_var;
+ int ret = ssa->vars[v].use_chain;
- ssa->vars[v].definition = -1;
- ssa->vars[v].use_chain = -1;
+ ssa->ops[ret].op1_use = orig_var;
+ ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
+ ssa->vars[orig_var].use_chain = ret;
- ssa->ops[op_1].op1_def = -1;
- ssa->ops[op_1].op1_use = -1;
+ ssa->vars[v].definition = -1;
+ ssa->vars[v].use_chain = -1;
+
+ ssa->ops[op_1].op1_def = -1;
+ ssa->ops[op_1].op1_use = -1;
- MAKE_NOP(opline);
- remove_nops = 1;
+ MAKE_NOP(opline);
+ remove_nops = 1;
+ }
} else if (ssa->ops[op_1].op1_def == v
&& !RETURN_VALUE_USED(opline)
--- /dev/null
+--TEST--
+Bug #73789 (Strange behavior of class constants in switch/case block)
+--FILE--
+<?php
+class Lexer
+{
+ const T_NONE = 1;
+ const T_STRING = 2;
+ const T_DOT = 8;
+ public function getType($value): int
+ {
+ $type = self::T_NONE;
+ switch (true) {
+ case ctype_alpha($value[0]):
+ $name = 'Lexer::T_' . strtoupper($value);
+ $type = constant($name);
+ if ($type > 100) {
+ return $type;
+ }
+ return self::T_STRING;
+ case $value === '.':
+ return self::T_DOT;
+ default:
+ }
+ return $type;
+ }
+}
+var_dump((new Lexer())->getType("dot"));
+--EXPECT--
+int(2)