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 --
|