1--TEST-- 2Nullsafe basic optimization 3--INI-- 4opcache.enable=1 5opcache.enable_cli=1 6opcache.opt_debug_level=0x20000 7zend_test.observer.enabled=0 8--EXTENSIONS-- 9opcache 10--FILE-- 11<?php 12 13function test() { 14 $null = null; 15 var_dump($null?->foo); 16 var_dump(isset($null?->foo)); 17 var_dump(empty($null?->foo)); 18} 19 20function test2(object $obj) { 21 // TODO: Optimize the JMP_NULL away. 22 var_dump($obj?->foo); 23 var_dump(isset($obj?->foo)); 24 var_dump(empty($obj?->foo)); 25} 26 27?> 28--EXPECTF-- 29$_main: 30 ; (lines=1, args=0, vars=0, tmps=0) 31 ; (after optimizer) 32 ; %s 330000 RETURN int(1) 34 35test: 36 ; (lines=10, args=0, vars=0, tmps=0) 37 ; (after optimizer) 38 ; %s 390000 INIT_FCALL 1 %d string("var_dump") 400001 SEND_VAL null 1 410002 DO_ICALL 420003 INIT_FCALL 1 %d string("var_dump") 430004 SEND_VAL bool(false) 1 440005 DO_ICALL 450006 INIT_FCALL 1 %d string("var_dump") 460007 SEND_VAL bool(true) 1 470008 DO_ICALL 480009 RETURN null 49 50test2: 51 ; (lines=17, args=1, vars=1, tmps=1) 52 ; (after optimizer) 53 ; %s 540000 CV0($obj) = RECV 1 550001 INIT_FCALL 1 %d string("var_dump") 560002 T1 = JMP_NULL CV0($obj) 0004 570003 T1 = FETCH_OBJ_R CV0($obj) string("foo") 580004 SEND_VAL T1 1 590005 DO_ICALL 600006 INIT_FCALL 1 %d string("var_dump") 610007 T1 = JMP_NULL CV0($obj) 0009 620008 T1 = ISSET_ISEMPTY_PROP_OBJ (isset) CV0($obj) string("foo") 630009 SEND_VAL T1 1 640010 DO_ICALL 650011 INIT_FCALL 1 %d string("var_dump") 660012 T1 = JMP_NULL CV0($obj) 0014 670013 T1 = ISSET_ISEMPTY_PROP_OBJ (empty) CV0($obj) string("foo") 680014 SEND_VAL T1 1 690015 DO_ICALL 700016 RETURN null 71