Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zephir is unable to array_shift an array the first call #1831

Closed
colorvamp opened this issue Mar 16, 2019 · 2 comments
Closed

Zephir is unable to array_shift an array the first call #1831

colorvamp opened this issue Mar 16, 2019 · 2 comments
Labels

Comments

@colorvamp
Copy link

colorvamp commented Mar 16, 2019

Zephir code:

namespace Fail;

class _fail{
	public params = [];
	public function task(){
		var first;
		print_r(this->params);
		let first = array_shift(this->params);
		print_r(this->params);

		array_unshift(this->params,first);
		print_r(this->params);

		let first = array_shift(this->params);
		print_r(this->params);
	}
}

PHP code:

$_fail = new Fail\_fail();
$_fail->params = ['lalala'];
$_fail->task();

Output:

Array
(
    [0] => lalala
)
Array
(
    [0] => lalala
)
Array
(
    [0] => lalala
    [1] => lalala
)
Array
(
    [0] => lalala
)

Note that second print_r should be an empty array. array_unshift seems to work ok. I am doing something wrong?
Zephir 0.11.11

@dvil88
Copy link

dvil88 commented Mar 18, 2019

I think this is worse than only an array_shift failure. I've wrote some tests and the behavior is totally unexpected:

Zephir:

namespace Fail2;

class fail2{
	public dataArray1 = [
		"header 1",
		"header 2",
		"header 3",
		"data 1",
		"data 2",
		"data 3",
		"data 4",
		"data 5",
		"data 6",
		"data 7",
		"data 8"
	];
	protected dataArray2 = [];
	private dataArray3 = [];


	public function runTest1(){
		var info;
		var headers;

		print_r(this->dataArray1);

		let headers = [];
		while( true ){
			let info = array_shift(this->dataArray1);

			if( stripos(info, "header") !== false ){
				let headers[] = info;
				continue;
			} else {
				array_unshift(this->dataArray1, info);
				break;
			}
		}

		print_r(headers);
		print_r(this->dataArray1);
	}

	public function runTest2(){
		var info2;
		var headers2;

		print_r(this->dataArray2);

		let headers2 = [];
		while( true ){
			let info2 = array_shift(this->dataArray2);

			if( stripos(info2, "header") !== false ){
				let headers2[] = info2;
				continue;
			} else {
				array_unshift(this->dataArray2, info2);
				break;
			}
		}

		print_r(headers2);
		print_r(this->dataArray2);
	}

	public function runTest3(){
		var info3;
		var headers3;

		print_r(this->dataArray3);

		let headers3 = [];
		while( true ){
			let info3 = array_shift(this->dataArray3);

			if( stripos(info3, "header") !== false ){
				let headers3[] = info3;
				continue;
			} else {
				array_unshift(this->dataArray3, info3);
				break;
			}
		}

		print_r(headers3);
		print_r(this->dataArray3);
	}

	public function setDataArray2(data){
		let this->dataArray2 = data;
	}

	public function setDataArray3(data){
		let this->dataArray3 = data;
	}
}

PHP test code 1:

<?php
$dataArray1 = [
    "header 1",
    "header 2",
    "header 3",
    "data 1",
    "data 2",
    "data 3",
    "data 4",
    "data 5",
    "data 6",
    "data 7",
    "data 8"
];
 
$_fail = new Fail2\fail2();
$_fail->dataArray = $dataArray;
$_fail->setDataArray2($dataArray);
$_fail->setDataArray3($dataArray);
 
echo PHP_EOL.PHP_EOL.'Test 1 :: Public'.PHP_EOL;
$_fail->runTest1();
 
echo PHP_EOL.PHP_EOL.'Test 2 :: setDataArray Protected'.PHP_EOL;
$_fail->runTest2();
 
echo PHP_EOL.PHP_EOL.'Test 3 :: setDataArray Private'.PHP_EOL;
$_fail->runTest3();

Result:

Test 1 :: Public
Array
(
    [0] => header 1
    [1] => header 2
    [2] => header 3
    [3] => data 1
    [4] => data 2
    [5] => data 3
    [6] => data 4
    [7] => data 5
    [8] => data 6
    [9] => data 7
    [10] => data 8
)
Array
(
    [0] => header 1
    [1] => header 2
    [2] => header 3
)
Array
(
    [0] => data 1
    [1] => data 2
    [2] => data 3
    [3] => data 4
    [4] => data 5
    [5] => data 6
    [6] => data 7
    [7] => data 8
)


Test 2 :: setDataArray Protected
Array
(
    [0] => header 1
    [1] => header 2
    [2] => header 3
    [3] => data 1
    [4] => data 2
    [5] => data 3
    [6] => data 4
    [7] => data 5
    [8] => data 6
    [9] => data 7
    [10] => data 8
)
Array
(
    [0] => header 1
    [1] => header 1
    [2] => header 1
    [3] => header 1
    [4] => header 1
    [5] => header 2
    [6] => header 3
)
Array
(
    [0] => data 1
    [1] => data 2
    [2] => data 3
    [3] => data 4
    [4] => data 5
    [5] => data 6
    [6] => data 7
    [7] => data 8
)


Test 3 :: setDataArray Private
Array
(
    [0] => data 1
    [1] => data 2
    [2] => data 3
    [3] => data 4
    [4] => data 5
    [5] => data 6
    [6] => data 7
    [7] => data 8
)
Array
(
)
Array
(
    [0] => data 1
    [1] => data 2
    [2] => data 3
    [3] => data 4
    [4] => data 5
    [5] => data 6
    [6] => data 7
    [7] => data 8
)

PHP test code 2:

<?php
$dataArray1 = [
	"header 1",
	"header 2",
	"header 3",
	"data 1",
	"data 2",
	"data 3",
	"data 4",
	"data 5",
	"data 6",
	"data 7",
	"data 8"
];

$dataArray2 = [
	"header 1",
	"header 2",
	"header 3",
	"data 1",
	"data 2",
	"data 3",
	"data 4",
	"data 5",
	"data 6",
	"data 7",
	"data 8"
];

$dataArray3 = [
	"header 1",
	"header 2",
	"header 3",
	"data 1",
	"data 2",
	"data 3",
	"data 4",
	"data 5",
	"data 6",
	"data 7",
	"data 8"
];

$_fail = new Fail2\fail2();
$_fail->dataArray = $dataArray1;
$_fail->setDataArray2($dataArray2);
$_fail->setDataArray3($dataArray3);

echo PHP_EOL.PHP_EOL.'Test 1 :: Public'.PHP_EOL;
$_fail->runTest1();

echo PHP_EOL.PHP_EOL.'Test 2 :: setDataArray Protected'.PHP_EOL;
$_fail->runTest2();

echo PHP_EOL.PHP_EOL.'Test 3 :: setDataArray Private'.PHP_EOL;
$_fail->runTest3();

Result:

Test 1 :: Public
Array
(
    [0] => header 1
    [1] => header 2
    [2] => header 3
    [3] => data 1
    [4] => data 2
    [5] => data 3
    [6] => data 4
    [7] => data 5
    [8] => data 6
    [9] => data 7
    [10] => data 8
)
Array
(
    [0] => header 1
    [1] => header 2
    [2] => header 3
)
Array
(
    [0] => data 1
    [1] => data 2
    [2] => data 3
    [3] => data 4
    [4] => data 5
    [5] => data 6
    [6] => data 7
    [7] => data 8
)


Test 2 :: setDataArray Protected
Array
(
    [0] => header 1
    [1] => header 2
    [2] => header 3
    [3] => data 1
    [4] => data 2
    [5] => data 3
    [6] => data 4
    [7] => data 5
    [8] => data 6
    [9] => data 7
    [10] => data 8
)
Array
(
    [0] => header 1
    [1] => header 1
    [2] => header 1
    [3] => header 2
    [4] => header 3
)
Array
(
    [0] => data 1
    [1] => data 2
    [2] => data 3
    [3] => data 4
    [4] => data 5
    [5] => data 6
    [6] => data 7
    [7] => data 8
)


Test 3 :: setDataArray Private
Array
(
    [0] => header 1
    [1] => header 2
    [2] => header 3
    [3] => data 1
    [4] => data 2
    [5] => data 3
    [6] => data 4
    [7] => data 5
    [8] => data 6
    [9] => data 7
    [10] => data 8
)
Array
(
    [0] => header 1
    [1] => header 1
    [2] => header 1
    [3] => header 2
    [4] => header 3
)
Array
(
    [0] => data 1
    [1] => data 2
    [2] => data 3
    [3] => data 4
    [4] => data 5
    [5] => data 6
    [6] => data 7
    [7] => data 8
)

Equivalent class in PHP:

<?php

class fail2{
	public $dataArray1 = [
		"header 1",
		"header 2",
		"header 3",
		"data 1",
		"data 2",
		"data 3",
		"data 4",
		"data 5",
		"data 6",
		"data 7",
		"data 8"
	];
	protected $dataArray2 = [];
	private $dataArray3 = [];


	public function runTest1(){
		print_r($this->dataArray1);

		$headers = [];
		while( true ){
			$info = array_shift($this->dataArray1);

			if( stripos($info, "header") !== false ){
				$headers[] = $info;
				continue;
			} else {
				array_unshift($this->dataArray1, $info);
				break;
			}
		}

		print_r($headers);
		print_r($this->dataArray1);
	}

	public function runTest2(){
		print_r($this->dataArray2);

		$headers2 = [];
		while( true ){
			$info2 = array_shift($this->dataArray2);

			if( stripos($info2, "header") !== false ){
				$headers2[] = $info2;
				continue;
			} else {
				array_unshift($this->dataArray2, $info2);
				break;
			}
		}

		print_r($headers2);
		print_r($this->dataArray2);
	}

	public function runTest3(){
		print_r($this->dataArray3);

		$headers3 = [];
		while( true ){
			$info3 = array_shift($this->dataArray3);

			if( stripos($info3, "header") !== false ){
				$headers3[] = $info3;
				continue;
			} else {
				array_unshift($this->dataArray3, $info3);
				break;
			}
		}

		print_r($headers3);
		print_r($this->dataArray3);
	}

	public function setDataArray2($data){
		$this->dataArray2 = $data;
	}

	public function setDataArray3($data){
		$this->dataArray3 = $data;
	}
}

This class is working perfectly with test 1 and 2:
Test 1 result: https://3v4l.org/In9J8
Test 2 result: https://3v4l.org/ZU2C5

PHP Version: 7.3.3
Zephir version: 0.11.11
PHP API: 20180731

@dreamsxin
Copy link
Contributor

I will test

@dreamsxin dreamsxin mentioned this issue Mar 19, 2019
3 tasks
@sergeyklay sergeyklay added the bug label Mar 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants