1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
--TEST--
Test with optimization of function calls
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
class A {
public $obj;
public function test($a) {
}
}
function a(&$b) {
$b = "changed";
return "done";
}
$a = "a";
$b = "b";
$c = "c";
$f = "a";
/*
* INIT_FCALL_BY_NAME
* SEND_VAR
* DO_FCALL
* DO_FCALL_BY_NAME
*/
foo(a($a));
var_dump($a);
$a = "a";
/*
* INIT_FCALL_BY_NAME
* INIT_FCALL_BY_NAME -- un-optimizable
* DO_FCALL_BY_NAME -- un-optimizable
* DO_FCALL_BY_NAME
*/
foo($f($a));
var_dump($a);
/*
* INIT_FCALL_BY_NAME
* ZEND_NEW
* DO_FCALL_BY_NAME
* DO_FCALL_BY_NAME
*/
foo(new A());
/*
* INIT_FCALL_BY_NAME
* FETCH_OBJ_FUNC_ARG
* ZEND_SEND_VAR
* DO_FCALL_BY_NAME
*/
foo((new A)->obj);
$obj = new A;
ref($obj->obj);
var_dump($obj->obj);
ref(retarray()[0]);
$a = "a";
foo(a($a), $a, ref($b, $c), $obj);
var_dump($a);
var_dump($b);
/*
* INIT_FCALL_BY_NAME
* SEND_VAL
* DO_FCALL_BY_NAME
*/
ref("xxx");
function retarray() {
return array("retarray");
}
function foo($a) {
print_r(func_get_args());
}
function ref(&$b) {
$b = "changed";
return "ref";
}
--EXPECTF--
Array
(
[0] => done
)
string(7) "changed"
Array
(
[0] => done
)
string(7) "changed"
Array
(
[0] => A Object
(
[obj] =>
)
)
Array
(
[0] =>
)
string(7) "changed"
Array
(
[0] => done
[1] => changed
[2] => ref
[3] => A Object
(
[obj] => changed
)
)
string(7) "changed"
string(7) "changed"
Fatal error: Cannot pass parameter 1 by reference in %soptimize_func_calls.php on line %d
|