optimize_func_calls.phpt 1.7 KB

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