Skip to content

Commit 1e68ae2

Browse files
committed
Fixed wrapping C-code in CBLOCKs
1 parent 79e3e25 commit 1e68ae2

File tree

3 files changed

+119
-2
lines changed

3 files changed

+119
-2
lines changed

parser/scanner.re

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,8 +560,8 @@ int xx_get_token(xx_scanner_state *s, xx_scanner_token *token) {
560560
CBLOCK = ("%{"([^}]+|[}]+[^%{])*"}%");
561561
CBLOCK {
562562
token->opcode = XX_T_CBLOCK;
563-
token->value = estrndup(start+1, YYCURSOR - start - 3 );
564-
token->len = YYCURSOR - start - 3;
563+
token->value = estrndup(start + 1, YYCURSOR - start - 2);
564+
token->len = YYCURSOR - start - 2;
565565
{
566566
int k, ch = s->active_char;
567567
for (k = 0; k < (token->len - 1); k++) {

tests/base/cblocks.phpt

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
--TEST--
2+
cblocks - Tests recognizing wrapping C-code in CBLOCKs
3+
--SKIPIF--
4+
<?php if (!extension_loaded("Zephir Parser")) print "skip The zephir_parser extension is not loaded"; ?>
5+
--FILE--
6+
<?php require(__DIR__ . "/../zephir_parser_test.inc");
7+
8+
$ir = parse_file("base/cblocks.zep");
9+
var_dump($ir);
10+
--EXPECTF--
11+
array(2) {
12+
[0]=>
13+
array(5) {
14+
["type"]=>
15+
string(9) "namespace"
16+
["name"]=>
17+
string(7) "Example"
18+
["file"]=>
19+
string(%d) "%s/tests/data/base/cblocks.zep"
20+
["line"]=>
21+
int(3)
22+
["char"]=>
23+
int(5)
24+
}
25+
[1]=>
26+
array(8) {
27+
["type"]=>
28+
string(5) "class"
29+
["name"]=>
30+
string(4) "Test"
31+
["abstract"]=>
32+
int(0)
33+
["final"]=>
34+
int(0)
35+
["definition"]=>
36+
array(4) {
37+
["methods"]=>
38+
array(1) {
39+
[0]=>
40+
array(8) {
41+
["visibility"]=>
42+
array(1) {
43+
[0]=>
44+
string(6) "public"
45+
}
46+
["type"]=>
47+
string(6) "method"
48+
["name"]=>
49+
string(5) "block"
50+
["statements"]=>
51+
array(1) {
52+
[0]=>
53+
array(5) {
54+
["type"]=>
55+
string(6) "cblock"
56+
["value"]=>
57+
string(83) "{
58+
59+
// Some comment
60+
61+
{
62+
while(1) {
63+
RETURN_MM_NULL();
64+
}
65+
}
66+
}"
67+
["file"]=>
68+
string(%d) "%s/tests/data/base/cblocks.zep"
69+
["line"]=>
70+
int(17)
71+
["char"]=>
72+
int(2)
73+
}
74+
}
75+
["file"]=>
76+
string(%d) "%s/tests/data/base/cblocks.zep"
77+
["line"]=>
78+
int(5)
79+
["last-line"]=>
80+
int(18)
81+
["char"]=>
82+
int(16)
83+
}
84+
}
85+
["file"]=>
86+
string(%d) "%s/tests/data/base/cblocks.zep"
87+
["line"]=>
88+
int(3)
89+
["char"]=>
90+
int(5)
91+
}
92+
["file"]=>
93+
string(%d) "%s/tests/data/base/cblocks.zep"
94+
["line"]=>
95+
int(3)
96+
["char"]=>
97+
int(5)
98+
}
99+
}

tests/data/base/cblocks.zep

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace Example;
2+
3+
class Test
4+
{
5+
public function block()
6+
{
7+
%{
8+
9+
// Some comment
10+
11+
{
12+
while(1) {
13+
RETURN_MM_NULL();
14+
}
15+
}
16+
}%
17+
}
18+
}

0 commit comments

Comments
 (0)