diff options
author | Zoe Slattery <zoe@php.net> | 2009-05-29 07:51:42 +0000 |
---|---|---|
committer | Zoe Slattery <zoe@php.net> | 2009-05-29 07:51:42 +0000 |
commit | 533c6473f0028955df3c42af9a01dffc1817d553 (patch) | |
tree | 56c2cb449e8e394e1b9db0a0a1ec0ac833c2a12e /tests/lang | |
parent | 2ec0e93ae8a09d5b9b751f0f1eb96da916e3c7ab (diff) | |
download | php-git-533c6473f0028955df3c42af9a01dffc1817d553.tar.gz |
Engine execution order tests
Diffstat (limited to 'tests/lang')
-rw-r--r-- | tests/lang/engine_assignExecutionOrder_001.phpt | 152 | ||||
-rw-r--r-- | tests/lang/engine_assignExecutionOrder_002.phpt | 135 | ||||
-rw-r--r-- | tests/lang/engine_assignExecutionOrder_003.phpt | 96 | ||||
-rw-r--r-- | tests/lang/engine_assignExecutionOrder_004.phpt | 52 | ||||
-rw-r--r-- | tests/lang/engine_assignExecutionOrder_005.phpt | 74 | ||||
-rw-r--r-- | tests/lang/engine_assignExecutionOrder_006.phpt | 138 | ||||
-rw-r--r-- | tests/lang/engine_assignExecutionOrder_007.phpt | 46 | ||||
-rw-r--r-- | tests/lang/engine_assignExecutionOrder_008.phpt | 75 | ||||
-rw-r--r-- | tests/lang/engine_assignExecutionOrder_009.phpt | 36 |
9 files changed, 804 insertions, 0 deletions
diff --git a/tests/lang/engine_assignExecutionOrder_001.phpt b/tests/lang/engine_assignExecutionOrder_001.phpt new file mode 100644 index 0000000000..1b85cb7e6c --- /dev/null +++ b/tests/lang/engine_assignExecutionOrder_001.phpt @@ -0,0 +1,152 @@ +--TEST-- +Evaluation order during assignments. +--FILE-- +<?php + +function f() { + echo "in f()\n"; + return "name"; +} + +function g() { + echo "in g()\n"; + return "assigned value"; +} + + +echo "\n\nOrder with local assignment:\n"; +${f()} = g(); +var_dump($name); + +echo "\n\nOrder with array assignment:\n"; +$a[f()] = g(); +var_dump($a); + +echo "\n\nOrder with object property assignment:\n"; +$oa = new stdClass; +$oa->${f()} = g(); +var_dump($oa); + +echo "\n\nOrder with nested object property assignment:\n"; +$ob = new stdClass; +$ob->o1 = new stdClass; +$ob->o1->o2 = new stdClass; +$ob->o1->o2->${f()} = g(); +var_dump($ob); + +echo "\n\nOrder with dim_list property assignment:\n"; +$oc = new stdClass; +$oc->a[${f()}] = g(); +var_dump($oc); + + +class C { + public static $name = "original"; + public static $a = array(); + public static $string = "hello"; +} +echo "\n\nOrder with static property assignment:\n"; +C::${f()} = g(); +var_dump(C::$name); + +echo "\n\nOrder with static array property assignment:\n"; +C::$a[f()] = g(); +var_dump(C::$a); + +echo "\n\nOrder with indexed string assignment:\n"; +$string = "hello"; +function getOffset() { + echo "in getOffset()\n"; + return 0; +} +function newChar() { + echo "in newChar()\n"; + return 'j'; +} +$string[getOffset()] = newChar(); +var_dump($string); + +echo "\n\nOrder with static string property assignment:\n"; +C::$string[getOffset()] = newChar(); +var_dump(C::$string); + +?> +--EXPECTF-- + + +Order with local assignment: +in f() +in g() +%string|unicode%(14) "assigned value" + + +Order with array assignment: +in f() +in g() +array(1) { + [%u|b%"name"]=> + %string|unicode%(14) "assigned value" +} + + +Order with object property assignment: +in f() +in g() +object(stdClass)#%d (1) { + [%u|b%"assigned value"]=> + %string|unicode%(14) "assigned value" +} + + +Order with nested object property assignment: +in f() +in g() +object(stdClass)#%d (1) { + [%u|b%"o1"]=> + object(stdClass)#%d (1) { + [%u|b%"o2"]=> + object(stdClass)#%d (1) { + [%u|b%"assigned value"]=> + %string|unicode%(14) "assigned value" + } + } +} + + +Order with dim_list property assignment: +in f() +in g() +object(stdClass)#%d (1) { + [%u|b%"a"]=> + array(1) { + [%u|b%"assigned value"]=> + %string|unicode%(14) "assigned value" + } +} + + +Order with static property assignment: +in f() +in g() +%string|unicode%(14) "assigned value" + + +Order with static array property assignment: +in f() +in g() +array(1) { + [%u|b%"name"]=> + %string|unicode%(14) "assigned value" +} + + +Order with indexed string assignment: +in getOffset() +in newChar() +%string|unicode%(5) "jello" + + +Order with static string property assignment: +in getOffset() +in newChar() +%string|unicode%(5) "jello" diff --git a/tests/lang/engine_assignExecutionOrder_002.phpt b/tests/lang/engine_assignExecutionOrder_002.phpt new file mode 100644 index 0000000000..ba88150dd4 --- /dev/null +++ b/tests/lang/engine_assignExecutionOrder_002.phpt @@ -0,0 +1,135 @@ +--TEST-- +Evaluation order during assignments. +--FILE-- +<?php + +// simple case with missing element +$f = array("hello","item2","bye"); +list($a,,$b) = $f; +echo "A=$a B=$b\n"; + + +// Warning: Cannot use a scalar value as an array in %s on line %d +$c[$c=1] = 1; + +// i++ evaluated first, so $d[0] is 10 +$d = array(0,10); +$i = 0; +$d[$i++] = $i*10; +// expected array is 10,10 +var_dump($d); + +// the f++++ makes f into 2, so $e 0 and 1 should both be 30 +$e = array(0,0); +$f = 0; +$g1 = array(10,10); +$g2 = array(20,20); +$g3 = array(30,30); +$g = array($g1,$g2,$g3); +list($e[$f++],$e[$f++]) = $g[$f]; +// expect 30,30 +var_dump($e); + + +$i1 = array(1,2); +$i2 = array(10,20); +$i3 = array(100,200); +$i4 = array(array(1000,2000),3000); +$i = array($i1,$i2,$i3,$i4); +$j = array(0,0,0); +$h = 0; +// a list of lists +list(list($j[$h++],$j[$h++]),$j[$h++]) = $i[$h]; +var_dump($j); + + +// list of lists with just variable assignments - expect 100,200,300 +$k3 = array(100,200); +$k = array($k3,300); +list(list($l,$m),$n) = $k; +echo "L=$l M=$m N=$n\n"; + + +// expect $x and $y to be null - this fails on php.net 5.2.1 (invalid opcode) - fixed in 5.2.3 +list($o,$p) = 20; +echo "O=$o and P=$p\n"; + + +// list of lists with blanks and nulls expect 10 20 40 50 60 70 80 +$q1 = array(10,20,30,40); +$q2 = array(50,60); +$q3 = array($q1,$q2,null,70); +$q4 = array($q3,null,80); + +list(list(list($r,$s,,$t),list($u,$v),,$w),,$x) = $q4; +echo "$r $s $t $u $v $w $x\n"; + + +// expect y and z to be undefined +list($y,$z) = array(); +echo "Y=$y,Z=$z\n"; + +// expect h to be defined and be 10 +list($aa,$bb) = array(10); +echo "AA=$aa\n"; + +// expect cc and dd to be 10 and 30 +list($cc,,$dd) = array(10,20,30,40); +echo "CC=$cc DD=$dd\n"; + +// expect the inner array to be defined +$ee = array("original array"); +function f() { + global $ee; + $ee = array("array created in f()"); + return 1; +} +$ee["array entry created after f()"][f()] = "hello"; +print_r($ee); + +?> +--EXPECTF-- +A=hello B=bye + +Warning: Cannot use a scalar value as an array in %s on line %d +array(2) { + [0]=> + int(10) + [1]=> + int(10) +} +array(2) { + [0]=> + int(30) + [1]=> + int(30) +} +array(3) { + [0]=> + int(1000) + [1]=> + int(2000) + [2]=> + int(3000) +} +L=100 M=200 N=300 +O= and P= +10 20 40 50 60 70 80 + +Notice: Undefined offset: 1 in %s on line %d + +Notice: Undefined offset: 0 in %s on line %d +Y=,Z= + +Notice: Undefined offset: 1 in %s on line %d +AA=10 +CC=10 DD=30 +Array +( + [0] => array created in f() + [array entry created after f()] => Array + ( + [1] => hello + ) + +) diff --git a/tests/lang/engine_assignExecutionOrder_003.phpt b/tests/lang/engine_assignExecutionOrder_003.phpt new file mode 100644 index 0000000000..ae3ae787c7 --- /dev/null +++ b/tests/lang/engine_assignExecutionOrder_003.phpt @@ -0,0 +1,96 @@ +--TEST-- +Evaluation order during assignments. +--FILE-- +<?php +$b = "bb"; +$a = "aa"; + +function foo() +{ +echo "Bad call\n"; +} + +function baa() +{ +echo "Good call\n"; +} + +$bb = "baa"; + +$aa = "foo"; + +$c = ${$a=$b}; + +$c(); + +$a1 = array("dead","dead","dead"); +$a2 = array("dead","dead","live"); +$a3 = array("dead","dead","dead"); + +$a = array($a1,$a2,$a3); + +function live() +{ +echo "Good call\n"; +} + +function dead() +{ +echo "Bad call\n"; +} + +$i = 0; + +$a[$i=1][++$i](); + +$a = -1; + +function foo1() +{ + global $a; + return ++$a; +} + +$arr = array(array(0,0),0); + +$brr = array(0,0,array(0,0,0,5),0); +$crr = array(0,0,0,0,array(0,0,0,0,0,10),0,0); + +$arr[foo1()][foo1()] = $brr[foo1()][foo1()] + + $crr[foo1()][foo1()]; + +$val = $arr[0][1]; +echo "Expect 15 and get...$val\n"; + +$x = array(array(0),0); +function mod($b) +{ +global $x; +$x = $b; +return 0; +} + +$x1 = array(array(1),1); +$x2 = array(array(2),2); +$x3 = array(array(3),3); +$bx = array(10); + +$x[mod($x1)][mod($x2)] = $bx[mod($x3)]; + +// expecting 10,3 + +var_dump($x); +?> +--EXPECT-- +Good call +Good call +Expect 15 and get...15 +array(2) { + [0]=> + array(1) { + [0]=> + int(10) + } + [1]=> + int(3) +}
\ No newline at end of file diff --git a/tests/lang/engine_assignExecutionOrder_004.phpt b/tests/lang/engine_assignExecutionOrder_004.phpt new file mode 100644 index 0000000000..86bc87f9c7 --- /dev/null +++ b/tests/lang/engine_assignExecutionOrder_004.phpt @@ -0,0 +1,52 @@ +--TEST-- +Evaluation order during assignments. +--FILE-- +<?php + +function i1() { + echo "i1\n"; + return 1; +} + +function i2() { + echo "i2\n"; + return 1; +} + +function i3() { + echo "i3\n"; + return 3; +} + +function i4() { + global $a; + $a = array(10, 11, 12, 13, 14); + echo "i4\n"; + return 4; +} + +$a = 0; // $a should not be indexable till the i4 has been executed +list($a[i1()+i2()], , list($a[i3()], $a[i4()]), $a[]) = array (0, 1, array(30, 40), 3, 4); + +var_dump($a); + +?> +--EXPECT-- +i1 +i2 +i3 +i4 +array(6) { + [0]=> + int(10) + [1]=> + int(11) + [2]=> + int(0) + [3]=> + int(30) + [4]=> + int(40) + [5]=> + int(3) +} diff --git a/tests/lang/engine_assignExecutionOrder_005.phpt b/tests/lang/engine_assignExecutionOrder_005.phpt new file mode 100644 index 0000000000..6ec03f17c0 --- /dev/null +++ b/tests/lang/engine_assignExecutionOrder_005.phpt @@ -0,0 +1,74 @@ +--TEST-- +Evaluation order during assignments. +--FILE-- +<?php + +function i1() { + echo "i1\n"; + return 0; +} + +function i2() { + echo "i2\n"; + return 0; +} + +function i3() { + echo "i3\n"; + return 0; +} + +function i4() { + echo "i4\n"; + return 0; +} + +function i5() { + echo "i5\n"; + return 0; +} + +function i6() { + echo "i6\n"; + return 0; +} + +$a = array(array(0)); +$b = array(array(1)); +$c = array(array(2)); + +$a[i1()][i2()] = $b[i3()][i4()] = $c[i5()][i6()]; + +var_dump($a); +var_dump($b); +var_dump($c); + +?> +--EXPECT-- +i1 +i2 +i3 +i4 +i5 +i6 +array(1) { + [0]=> + array(1) { + [0]=> + int(2) + } +} +array(1) { + [0]=> + array(1) { + [0]=> + int(2) + } +} +array(1) { + [0]=> + array(1) { + [0]=> + int(2) + } +} diff --git a/tests/lang/engine_assignExecutionOrder_006.phpt b/tests/lang/engine_assignExecutionOrder_006.phpt new file mode 100644 index 0000000000..faa34c387a --- /dev/null +++ b/tests/lang/engine_assignExecutionOrder_006.phpt @@ -0,0 +1,138 @@ +--TEST-- +Evaluation order during assignments. +--FILE-- +<?php + +function i1() { + echo "i1\n"; + return 0; +} + +function i2() { + echo "i2\n"; + return 0; +} + +function i3() { + echo "i3\n"; + return 0; +} + +function i4() { + echo "i4\n"; + return 0; +} + +function i5() { + echo "i5\n"; + return 0; +} + +function i6() { + echo "i6\n"; + return 0; +} + +$a = array(array(0)); +$b = array(array(1)); +$c = array(array(2)); + +$a[i1()][i2()] = ($b[i3()][i4()] = $c[i5()][i6()]); +var_dump($a); +var_dump($b); +var_dump($c); + +$a[i1()][i2()] = $b[i3()][i4()] = -$c[i5()][i6()]; +var_dump($a); +var_dump($b); +var_dump($c); + +$a[i1()][i2()] = -($b[i3()][i4()] = +($c[i5()][i6()])); +var_dump($a); +var_dump($b); +var_dump($c); + + +?> +--EXPECT-- +i1 +i2 +i3 +i4 +i5 +i6 +array(1) { + [0]=> + array(1) { + [0]=> + int(2) + } +} +array(1) { + [0]=> + array(1) { + [0]=> + int(2) + } +} +array(1) { + [0]=> + array(1) { + [0]=> + int(2) + } +} +i1 +i2 +i3 +i4 +i5 +i6 +array(1) { + [0]=> + array(1) { + [0]=> + int(-2) + } +} +array(1) { + [0]=> + array(1) { + [0]=> + int(-2) + } +} +array(1) { + [0]=> + array(1) { + [0]=> + int(2) + } +} +i1 +i2 +i3 +i4 +i5 +i6 +array(1) { + [0]=> + array(1) { + [0]=> + int(-2) + } +} +array(1) { + [0]=> + array(1) { + [0]=> + int(2) + } +} +array(1) { + [0]=> + array(1) { + [0]=> + int(2) + } +} diff --git a/tests/lang/engine_assignExecutionOrder_007.phpt b/tests/lang/engine_assignExecutionOrder_007.phpt new file mode 100644 index 0000000000..56b729ed88 --- /dev/null +++ b/tests/lang/engine_assignExecutionOrder_007.phpt @@ -0,0 +1,46 @@ +--TEST-- +Check key execution order with &new. +--FILE-- +<?php +$a[2][3] = 'stdClass'; +$a[$i=0][++$i] =& new $a[++$i][++$i]; +print_r($a); + +$o = new stdClass; +$o->a =& new $a[$i=2][++$i]; +$o->a->b =& new $a[$i=2][++$i]; +print_r($o); +?> +--EXPECTF-- +Deprecated: Assigning the return value of new by reference is deprecated in %s.php on line 3 + +Deprecated: Assigning the return value of new by reference is deprecated in %s.php on line 7 + +Deprecated: Assigning the return value of new by reference is deprecated in %s.php on line 8 +Array +( + [2] => Array + ( + [3] => stdClass + ) + + [0] => Array + ( + [1] => stdClass Object + ( + ) + + ) + +) +stdClass Object +( + [a] => stdClass Object + ( + [b] => stdClass Object + ( + ) + + ) + +) diff --git a/tests/lang/engine_assignExecutionOrder_008.phpt b/tests/lang/engine_assignExecutionOrder_008.phpt new file mode 100644 index 0000000000..0d699bc649 --- /dev/null +++ b/tests/lang/engine_assignExecutionOrder_008.phpt @@ -0,0 +1,75 @@ +--TEST-- +Ensure by value assignments leave temporaries on the stack, for all sorts of assignees. +--FILE-- +<?php +error_reporting(E_ALL & ~E_STRICT); + +function f() { return 0; } +$a[0][1] = 'good'; +$a[1][1] = 'bad'; + +echo "\n" . '$i=f(): '; +echo $a[$i=f()][++$i]; +unset($i); + +echo "\n" . '$$x=f(): '; +$x='i'; +echo $a[$$x=f()][++$$x]; +unset($i, $x); + +echo "\n" . '${\'i\'}=f(): '; +echo $a[${'i'}=f()][++${'i'}]; +unset(${'i'}); + +echo "\n" . '$i[0]=f(): '; +echo $a[$i[0]=f()][++$i[0]]; +unset($i); + +echo "\n" . '$i[0][0]=f(): '; +echo $a[$i[0][0]=f()][++$i[0][0]]; +unset($i); + +echo "\n" . '$i->p=f(): '; +echo $a[$i->p=f()][++$i->p]; +unset($i); + +echo "\n" . '$i->p->q=f(): '; +echo $a[$i->p->q=f()][++$i->p->q]; +unset($i); + +echo "\n" . '$i->p[0]=f(): '; +echo $a[$i->p[0]=f()][++$i->p[0]]; +unset($i); + +echo "\n" . '$i->p[0]->p=f(): '; +echo $a[$i->p[0]->p=f()][++$i->p[0]->p]; +unset($i); + +Class C { + static $p; +} + +echo "\n" . 'C::$p=f(): '; +echo $a[C::$p=f()][++C::$p]; + +echo "\n" . 'C::$p[0]=f(): '; +C::$p = array(); +echo $a[C::$p[0]=f()][++C::$p[0]]; + +echo "\n" . 'C::$p->q=f(): '; +C::$p = new stdclass; +echo $a[C::$p->q=f()][++C::$p->q]; +?> +--EXPECTF-- +$i=f(): good +$$x=f(): good +${'i'}=f(): good +$i[0]=f(): good +$i[0][0]=f(): good +$i->p=f(): good +$i->p->q=f(): good +$i->p[0]=f(): good +$i->p[0]->p=f(): good +C::$p=f(): good +C::$p[0]=f(): good +C::$p->q=f(): good
\ No newline at end of file diff --git a/tests/lang/engine_assignExecutionOrder_009.phpt b/tests/lang/engine_assignExecutionOrder_009.phpt new file mode 100644 index 0000000000..e1d5b71c69 --- /dev/null +++ b/tests/lang/engine_assignExecutionOrder_009.phpt @@ -0,0 +1,36 @@ +--TEST-- +Execution ordering with comparison operators. +--FILE-- +<?php +function f($x) { + echo "f($x) "; + return $x; +} + +echo "Function call args:\n"; +var_dump(f($i=0) < f(++$i)); +var_dump(f($i=0) <= f(++$i)); +var_dump(f($i=0) > f(++$i)); +var_dump(f($i=0) >= f(++$i)); + +echo "\nArray indices:\n"; +$a[1][2] = 0; +$a[3][4] = 1; +$i=0; +var_dump($a[$i=1][++$i] < $a[++$i][++$i]); +var_dump($a[$i=1][++$i] <= $a[++$i][++$i]); +var_dump($a[$i=1][++$i] > $a[++$i][++$i]); +var_dump($a[$i=1][++$i] >= $a[++$i][++$i]); +?> +--EXPECTF-- +Function call args: +f(0) f(1) bool(true) +f(0) f(1) bool(true) +f(0) f(1) bool(false) +f(0) f(1) bool(false) + +Array indices: +bool(true) +bool(true) +bool(false) +bool(false) |