1--TEST-- 2Nullsafe basic optimization 3--INI-- 4opcache.enable=1 5opcache.enable_cli=1 6opcache.opt_debug_level=0x20000 7--EXTENSIONS-- 8opcache 9--FILE-- 10<?php 11 12function test() { 13 $null = null; 14 var_dump($null?->foo); 15 var_dump(isset($null?->foo)); 16 var_dump(empty($null?->foo)); 17} 18 19function test2(object $obj) { 20 // TODO: Optimize the JMP_NULL away. 21 var_dump($obj?->foo); 22 var_dump(isset($obj?->foo)); 23 var_dump(empty($obj?->foo)); 24} 25 26?> 27--EXPECTF-- 28$_main: 29 ; (lines=1, args=0, vars=0, tmps=0) 30 ; (after optimizer) 31 ; %s 320000 RETURN int(1) 33 34test: 35 ; (lines=10, args=0, vars=0, tmps=0) 36 ; (after optimizer) 37 ; %s 380000 INIT_FCALL 1 %d string("var_dump") 390001 SEND_VAL null 1 400002 DO_ICALL 410003 INIT_FCALL 1 %d string("var_dump") 420004 SEND_VAL bool(false) 1 430005 DO_ICALL 440006 INIT_FCALL 1 %d string("var_dump") 450007 SEND_VAL bool(true) 1 460008 DO_ICALL 470009 RETURN null 48 49test2: 50 ; (lines=17, args=1, vars=1, tmps=1) 51 ; (after optimizer) 52 ; %s 530000 CV0($obj) = RECV 1 540001 INIT_FCALL 1 %d string("var_dump") 550002 T1 = JMP_NULL CV0($obj) 0004 560003 T1 = FETCH_OBJ_R CV0($obj) string("foo") 570004 SEND_VAL T1 1 580005 DO_ICALL 590006 INIT_FCALL 1 %d string("var_dump") 600007 T1 = JMP_NULL CV0($obj) 0009 610008 T1 = ISSET_ISEMPTY_PROP_OBJ (isset) CV0($obj) string("foo") 620009 SEND_VAL T1 1 630010 DO_ICALL 640011 INIT_FCALL 1 %d string("var_dump") 650012 T1 = JMP_NULL CV0($obj) 0014 660013 T1 = ISSET_ISEMPTY_PROP_OBJ (empty) CV0($obj) string("foo") 670014 SEND_VAL T1 1 680015 DO_ICALL 690016 RETURN null 70