Skip to content

Commit d9df57e

Browse files
committed
Add 'require_once' statement
1 parent b2cbbb9 commit d9df57e

File tree

5 files changed

+68
-1
lines changed

5 files changed

+68
-1
lines changed

parser/parser.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,18 @@ static void xx_ret_require_statement(zval *ret, zval *expr, xx_scanner_state *st
906906
parser_add_int(ret, "char", state->active_char);
907907
}
908908

909+
static void xx_ret_require_once_statement(zval *ret, zval *expr, xx_scanner_state *state)
910+
{
911+
array_init(ret);
912+
913+
parser_add_str(ret, "type", "require_once");
914+
parser_add_zval(ret, "expr", expr);
915+
916+
parser_add_str(ret, "file", state->active_file);
917+
parser_add_int(ret, "line", state->active_line);
918+
parser_add_int(ret, "char", state->active_char);
919+
}
920+
909921
static void xx_ret_fetch_statement(zval *ret, zval *expr, xx_scanner_state *state)
910922
{
911923
array_init(ret);
@@ -1046,7 +1058,7 @@ static void xx_ret_declare_variable(zval *ret, xx_parser_token *T, zval *expr, x
10461058
array_init(ret);
10471059

10481060
parser_add_str_free(ret, "variable", T->token);
1049-
1061+
10501062
efree(T);
10511063

10521064
if (expr) {

parser/scanner.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
#define XX_T_TRY 397
9898
#define XX_T_CATCH 398
9999
#define XX_T_DEPRECATED 399
100+
#define XX_T_REQUIRE_ONCE 400
100101

101102
/* Operators */
102103
#define XX_T_AT '@'

parser/scanner.re

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,12 @@ int xx_get_token(xx_scanner_state *s, xx_scanner_token *token) {
359359
return 0;
360360
}
361361
362+
'require_once' {
363+
s->active_char += sizeof("require_once")-1;
364+
token->opcode = XX_T_REQUIRE_ONCE;
365+
return 0;
366+
}
367+
362368
'clone' {
363369
s->active_char += sizeof("clone")-1;
364370
token->opcode = XX_T_CLONE;

parser/zephir.lemon

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,6 +1531,11 @@ xx_require_statement(R) ::= REQUIRE xx_common_expr(E) DOTCOMMA . {
15311531
xx_ret_require_statement(&R, &E, status->scanner_state);
15321532
}
15331533

1534+
/* require_once statement */
1535+
xx_require_statement(R) ::= REQUIRE_ONCE xx_common_expr(E) DOTCOMMA . {
1536+
xx_ret_require_once_statement(&R, &E, status->scanner_state);
1537+
}
1538+
15341539
/* unset {expr} */
15351540
xx_unset_statement(R) ::= UNSET xx_common_expr(E) DOTCOMMA . {
15361541
xx_ret_unset_statement(&R, &E, status->scanner_state);
@@ -1634,6 +1639,10 @@ xx_common_expr(R) ::= REQUIRE xx_common_expr(O1) . {
16341639
xx_ret_expr(&R, "require", &O1, NULL, NULL, status->scanner_state);
16351640
}
16361641

1642+
xx_common_expr(R) ::= REQUIRE_ONCE xx_common_expr(O1) . {
1643+
xx_ret_expr(&R, "require_once", &O1, NULL, NULL, status->scanner_state);
1644+
}
1645+
16371646
xx_common_expr(R) ::= CLONE xx_common_expr(O1) . {
16381647
xx_ret_expr(&R, "clone", &O1, NULL, NULL, status->scanner_state);
16391648
}

tests/statements/require_once.phpt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
--TEST--
2+
require_once statement
3+
--SKIPIF--
4+
<?php include(__DIR__ . '/../skipif.inc'); ?>
5+
--FILE--
6+
<?php
7+
$code =<<<ZEP
8+
function test() {
9+
require_once foo;
10+
}
11+
ZEP;
12+
13+
$ir = zephir_parse_file($code, '(eval code)');
14+
var_dump($ir[0]["statements"][0]);
15+
?>
16+
--EXPECT--
17+
array(5) {
18+
["type"]=>
19+
string(7) "require_once"
20+
["expr"]=>
21+
array(5) {
22+
["type"]=>
23+
string(8) "variable"
24+
["value"]=>
25+
string(3) "foo"
26+
["file"]=>
27+
string(11) "(eval code)"
28+
["line"]=>
29+
int(2)
30+
["char"]=>
31+
int(13)
32+
}
33+
["file"]=>
34+
string(11) "(eval code)"
35+
["line"]=>
36+
int(3)
37+
["char"]=>
38+
int(1)
39+
}

0 commit comments

Comments
 (0)