123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- --TEST--
- Magic object handlers segfaults and memory errors
- --FILE--
- <?php
- function f($x) {
- return $x;
- }
- class foo implements ArrayAccess {
- function __get($property) {
- $GLOBALS["y"] = $property;
- }
- function __set($property, $value) {
- $GLOBALS["y"] = $property;
- }
- function __call($func, $args) {
- $GLOBALS["y"] = $func;
- }
- static function __callStatic($func, $args) {
- $GLOBALS["y"] = $func;
- }
- function offsetGet($index): mixed {
- $GLOBALS["y"] = $index;
- return null;
- }
- function offsetSet($index, $newval): void {
- $GLOBALS["y"] = $index;
- }
- function offsetExists($index): bool {
- $GLOBALS["y"] = $index;
- return true;
- }
- function offsetUnset($index): void {
- $GLOBALS["y"] = $index;
- }
- }
- $x = new foo();
- $y = null;
- // IS_CONST
- $z = $x->const_get;
- echo $y,"\n";
- $x->const_set = 1;
- echo $y,"\n";
- $x->const_call();
- echo $y,"\n";
- foo::const_callstatic();
- echo $y,"\n";
- $z = $x["const_dim_get"];
- echo $y,"\n";
- $x["const_dim_set"] = 1;
- echo $y,"\n";
- isset($x["const_dim_isset"]);
- echo $y,"\n";
- unset($x["const_dim_unset"]);
- echo $y,"\n";
- // IS_CONST + conversion
- $z = $x->{1};
- echo $y,"\n";
- $x->{2} = 1;
- echo $y,"\n";
- // IS_TMP_VAR
- $c = "tmp";
- $z = $x->{$c."_get"};
- echo $y,"\n";
- $x->{$c."_set"} = 1;
- echo $y,"\n";
- $x->{$c."_call"}();
- echo $y,"\n";
- $z = $x[$c."_dim_get"];
- echo $y,"\n";
- $x[$c."_dim_set"] = 1;
- echo $y,"\n";
- isset($x[$c."_dim_isset"]);
- echo $y,"\n";
- unset($x[$c."_dim_unset"]);
- echo $y,"\n";
- // IS_TMP_VAR + conversion
- $c = 0;
- $z = $x->{$c+3};
- echo $y,"\n";
- $x->{$c+4} = 1;
- echo $y,"\n";
- // IS_CV
- $c = "cv_get";
- $z = $x->{$c};
- echo $y,"\n";
- $c = "cv_set";
- $x->{$c} = 1;
- echo $y,"\n";
- $c = "cv_call";
- $x->{$c}();
- echo $y,"\n";
- $c = "cv_dim_get";
- $z = $x[$c];
- echo $y,"\n";
- $c = "cv_dim_set";
- $x[$c] = 1;
- echo $y,"\n";
- $c = "cv_dim_isset";
- isset($x[$c]);
- echo $y,"\n";
- $c = "cv_dim_unset";
- unset($x[$c]);
- echo $y,"\n";
- // IS_CV + conversion
- $c = 5;
- $z = $x->{$c};
- echo $y,"\n";
- $c = 6;
- $x->{$c} = 1;
- echo $y,"\n";
- // IS_VAR
- $z = $x->{f("var_get")};
- echo $y,"\n";
- $x->{f("var_set")} = 1;
- echo $y,"\n";
- $x->{f("var_call")}();
- echo $y,"\n";
- $z = $x[f("var_dim_get")];
- echo $y,"\n";
- $x[f("var_dim_set")] = 1;
- echo $y,"\n";
- isset($x[f("var_dim_isset")]);
- echo $y,"\n";
- unset($x[f("var_dim_unset")]);
- echo $y,"\n";
- // IS_VAR + conversion
- $z = $x->{f(7)};
- echo $y,"\n";
- $x->{f(8)} = 1;
- echo $y,"\n";
- ?>
- --EXPECT--
- const_get
- const_set
- const_call
- const_callstatic
- const_dim_get
- const_dim_set
- const_dim_isset
- const_dim_unset
- 1
- 2
- tmp_get
- tmp_set
- tmp_call
- tmp_dim_get
- tmp_dim_set
- tmp_dim_isset
- tmp_dim_unset
- 3
- 4
- cv_get
- cv_set
- cv_call
- cv_dim_get
- cv_dim_set
- cv_dim_isset
- cv_dim_unset
- 5
- 6
- var_get
- var_set
- var_call
- var_dim_get
- var_dim_set
- var_dim_isset
- var_dim_unset
- 7
- 8
|