summaryrefslogtreecommitdiffhomepage
path: root/tests/custom/04_bugs/12_altblock_stack_mismatch
blob: e350660cb425eb2bcc2a086505499dda83d7b791 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
When compiling alternative syntax blocks, such as `for ...: endfor`,
`if ...: endif` etc., the compiler didn't assign the contained statements
to a dedicated lexical scope, which caused a stack mismatch between
compiler and vm when such blocks declaring local variables weren't
actually executed.

-- Expect stdout --
2
-- End --

-- Testcase --
{%
	if (false):
		let a = 1;
	endif;

	/* Due to lack of own lexical scope above, the compiler assumed
	 * that `a` is still on stack but the code to initialize it was
	 * never executed, so stack offsets were shifted by one from here
	 * on throughout the rest of the program. */

	let b = 2;

	print(b, "\n");
%}
-- End --


Test a variation of the bug using `for in..endfor` loop syntax.

-- Expect stdout --
2
-- End --

-- Testcase --
{%
	for (let x in []):
		let a = 1;
	endfor;

	let b = 2;

	print(b, "\n");
%}
-- End --


Test a variation of the bug using `for..endfor` count loop syntax.

-- Expect stdout --
2
-- End --

-- Testcase --
{%
	for (let i = 0; i < 0; i++):
		let a = 1;
	endfor;

	let b = 2;

	print(b, "\n");
%}
-- End --


Test a variation of the bug using `while..endwhile` loop syntax.

-- Expect stdout --
2
-- End --

-- Testcase --
{%
	while (false):
		let a = 1;
	endwhile;

	let b = 2;

	print(b, "\n");
%}
-- End --