object_handlers.phpt 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. --TEST--
  2. Magic object handlers segfaults and memory errors
  3. --FILE--
  4. <?php
  5. function f($x) {
  6. return $x;
  7. }
  8. class foo implements ArrayAccess {
  9. function __get($property) {
  10. $GLOBALS["y"] = $property;
  11. }
  12. function __set($property, $value) {
  13. $GLOBALS["y"] = $property;
  14. }
  15. function __call($func, $args) {
  16. $GLOBALS["y"] = $func;
  17. }
  18. static function __callStatic($func, $args) {
  19. $GLOBALS["y"] = $func;
  20. }
  21. function offsetGet($index): mixed {
  22. $GLOBALS["y"] = $index;
  23. return null;
  24. }
  25. function offsetSet($index, $newval): void {
  26. $GLOBALS["y"] = $index;
  27. }
  28. function offsetExists($index): bool {
  29. $GLOBALS["y"] = $index;
  30. return true;
  31. }
  32. function offsetUnset($index): void {
  33. $GLOBALS["y"] = $index;
  34. }
  35. }
  36. $x = new foo();
  37. $y = null;
  38. // IS_CONST
  39. $z = $x->const_get;
  40. echo $y,"\n";
  41. $x->const_set = 1;
  42. echo $y,"\n";
  43. $x->const_call();
  44. echo $y,"\n";
  45. foo::const_callstatic();
  46. echo $y,"\n";
  47. $z = $x["const_dim_get"];
  48. echo $y,"\n";
  49. $x["const_dim_set"] = 1;
  50. echo $y,"\n";
  51. isset($x["const_dim_isset"]);
  52. echo $y,"\n";
  53. unset($x["const_dim_unset"]);
  54. echo $y,"\n";
  55. // IS_CONST + conversion
  56. $z = $x->{1};
  57. echo $y,"\n";
  58. $x->{2} = 1;
  59. echo $y,"\n";
  60. // IS_TMP_VAR
  61. $c = "tmp";
  62. $z = $x->{$c."_get"};
  63. echo $y,"\n";
  64. $x->{$c."_set"} = 1;
  65. echo $y,"\n";
  66. $x->{$c."_call"}();
  67. echo $y,"\n";
  68. $z = $x[$c."_dim_get"];
  69. echo $y,"\n";
  70. $x[$c."_dim_set"] = 1;
  71. echo $y,"\n";
  72. isset($x[$c."_dim_isset"]);
  73. echo $y,"\n";
  74. unset($x[$c."_dim_unset"]);
  75. echo $y,"\n";
  76. // IS_TMP_VAR + conversion
  77. $c = 0;
  78. $z = $x->{$c+3};
  79. echo $y,"\n";
  80. $x->{$c+4} = 1;
  81. echo $y,"\n";
  82. // IS_CV
  83. $c = "cv_get";
  84. $z = $x->{$c};
  85. echo $y,"\n";
  86. $c = "cv_set";
  87. $x->{$c} = 1;
  88. echo $y,"\n";
  89. $c = "cv_call";
  90. $x->{$c}();
  91. echo $y,"\n";
  92. $c = "cv_dim_get";
  93. $z = $x[$c];
  94. echo $y,"\n";
  95. $c = "cv_dim_set";
  96. $x[$c] = 1;
  97. echo $y,"\n";
  98. $c = "cv_dim_isset";
  99. isset($x[$c]);
  100. echo $y,"\n";
  101. $c = "cv_dim_unset";
  102. unset($x[$c]);
  103. echo $y,"\n";
  104. // IS_CV + conversion
  105. $c = 5;
  106. $z = $x->{$c};
  107. echo $y,"\n";
  108. $c = 6;
  109. $x->{$c} = 1;
  110. echo $y,"\n";
  111. // IS_VAR
  112. $z = $x->{f("var_get")};
  113. echo $y,"\n";
  114. $x->{f("var_set")} = 1;
  115. echo $y,"\n";
  116. $x->{f("var_call")}();
  117. echo $y,"\n";
  118. $z = $x[f("var_dim_get")];
  119. echo $y,"\n";
  120. $x[f("var_dim_set")] = 1;
  121. echo $y,"\n";
  122. isset($x[f("var_dim_isset")]);
  123. echo $y,"\n";
  124. unset($x[f("var_dim_unset")]);
  125. echo $y,"\n";
  126. // IS_VAR + conversion
  127. $z = $x->{f(7)};
  128. echo $y,"\n";
  129. $x->{f(8)} = 1;
  130. echo $y,"\n";
  131. ?>
  132. --EXPECT--
  133. const_get
  134. const_set
  135. const_call
  136. const_callstatic
  137. const_dim_get
  138. const_dim_set
  139. const_dim_isset
  140. const_dim_unset
  141. 1
  142. 2
  143. tmp_get
  144. tmp_set
  145. tmp_call
  146. tmp_dim_get
  147. tmp_dim_set
  148. tmp_dim_isset
  149. tmp_dim_unset
  150. 3
  151. 4
  152. cv_get
  153. cv_set
  154. cv_call
  155. cv_dim_get
  156. cv_dim_set
  157. cv_dim_isset
  158. cv_dim_unset
  159. 5
  160. 6
  161. var_get
  162. var_set
  163. var_call
  164. var_dim_get
  165. var_dim_set
  166. var_dim_isset
  167. var_dim_unset
  168. 7
  169. 8