Skip to content

Commit 370bd33

Browse files
authored
Merge pull request #107 from zephir-lang/require_once-statement
Add 'require_once' statement
2 parents b2cbbb9 + 1290be6 commit 370bd33

File tree

7 files changed

+80
-4
lines changed

7 files changed

+80
-4
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ jobs:
9595
run: |
9696
phpize
9797
98-
if [ "${{ matrix.ccov}}" = "ON" ]; then
98+
if [ "${{ matrix.ccov }}" = "ON" ]; then
9999
./configure \
100100
--enable-zephir-parser \
101101
--enable-zephir-parser-debug \

parser/base.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ void xx_parse_program(zval *return_value, char *program, size_t program_length,
178178
case XX_T_RETURN:
179179
xx_(xx_parser, XX_RETURN, NULL, parser_status);
180180
break;
181+
case XX_T_REQUIRE_ONCE:
182+
xx_(xx_parser, XX_REQUIRE_ONCE, NULL, parser_status);
183+
break;
181184
case XX_T_REQUIRE:
182185
xx_(xx_parser, XX_REQUIRE, NULL, parser_status);
183186
break;

parser/parser.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@ static int is_empty(const char *program)
3333
static void parser_add_str(zval *arr, const char *key, const char *val) {
3434
zval tmp;
3535
zend_string *tmp_str;
36+
3637
if (!strcmp(val, "return_value")) {
3738
tmp_str = zend_string_init("_zephir_return_value", strlen("_zephir_return_value"), 0);
3839
} else if (!strcmp(val, "this_ptr")) {
3940
tmp_str = zend_string_init("_zephir_this_ptr", strlen("_zephir_this_ptr"), 0);
4041
} else {
4142
tmp_str = zend_string_init(val, strlen(val), 0);
4243
}
44+
4345
ZVAL_STR(&tmp, tmp_str);
4446
zend_hash_str_add(Z_ARRVAL_P(arr), key, strlen(key), &tmp);
4547
}
@@ -894,6 +896,18 @@ static void xx_ret_return_statement(zval *ret, zval *expr, xx_scanner_state *sta
894896
parser_add_int(ret, "char", state->active_char);
895897
}
896898

899+
static void xx_ret_require_once_statement(zval *ret, zval *expr, xx_scanner_state *state)
900+
{
901+
array_init(ret);
902+
903+
parser_add_str(ret, "type", "require_once");
904+
parser_add_zval(ret, "expr", expr);
905+
906+
parser_add_str(ret, "file", state->active_file);
907+
parser_add_int(ret, "line", state->active_line);
908+
parser_add_int(ret, "char", state->active_char);
909+
}
910+
897911
static void xx_ret_require_statement(zval *ret, zval *expr, xx_scanner_state *state)
898912
{
899913
array_init(ret);
@@ -1046,7 +1060,7 @@ static void xx_ret_declare_variable(zval *ret, xx_parser_token *T, zval *expr, x
10461060
array_init(ret);
10471061

10481062
parser_add_str_free(ret, "variable", T->token);
1049-
1063+
10501064
efree(T);
10511065

10521066
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 459
100101

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

parser/scanner.re

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@
2424
#define YYMARKER (s->marker)
2525

2626
int xx_get_token(xx_scanner_state *s, xx_scanner_token *token) {
27-
2827
char *start = YYCURSOR;
2928
int status = XX_SCANNER_RETCODE_IMPOSSIBLE;
3029
int is_constant = 0, j;
3130

3231
while (XX_SCANNER_RETCODE_IMPOSSIBLE == status) {
33-
3432
/*!re2c
3533
re2c:indent:top = 2;
3634
re2c:yyfill:enable = 0;
@@ -353,6 +351,12 @@ int xx_get_token(xx_scanner_state *s, xx_scanner_token *token) {
353351
return 0;
354352
}
355353
354+
'require_once' {
355+
s->active_char += sizeof("require_once")-1;
356+
token->opcode = XX_T_REQUIRE_ONCE;
357+
return 0;
358+
}
359+
356360
'require' {
357361
s->active_char += sizeof("require")-1;
358362
token->opcode = XX_T_REQUIRE;

parser/zephir.lemon

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@
3737
//
3838
// The token values assigned to these symbols is determined by the order
3939
// in which lemon first sees them.
40+
4041
%left INTERNAL PUBLIC PROTECTED STATIC PRIVATE SCOPED .
4142
%left COMMA .
43+
%right REQUIRE_ONCE .
4244
%right REQUIRE .
4345
%right DOUBLEARROW .
4446
%right QUESTION .
@@ -980,6 +982,10 @@ xx_statement(R) ::= xx_return_statement(S) . {
980982
R = S;
981983
}
982984

985+
xx_statement(R) ::= xx_require_once_statement(S) . {
986+
R = S;
987+
}
988+
983989
xx_statement(R) ::= xx_require_statement(S) . {
984990
R = S;
985991
}
@@ -1526,6 +1532,11 @@ xx_return_statement(R) ::= RETURN DOTCOMMA . {
15261532
xx_ret_return_statement(&R, NULL, status->scanner_state);
15271533
}
15281534

1535+
/* require_once statement */
1536+
xx_require_once_statement(R) ::= REQUIRE_ONCE xx_common_expr(E) DOTCOMMA . {
1537+
xx_ret_require_once_statement(&R, &E, status->scanner_state);
1538+
}
1539+
15291540
/* require statement */
15301541
xx_require_statement(R) ::= REQUIRE xx_common_expr(E) DOTCOMMA . {
15311542
xx_ret_require_statement(&R, &E, status->scanner_state);
@@ -1630,6 +1641,10 @@ xx_common_expr(R) ::= ISSET xx_common_expr(O1) . {
16301641
xx_ret_expr(&R, "isset", &O1, NULL, NULL, status->scanner_state);
16311642
}
16321643

1644+
xx_common_expr(R) ::= REQUIRE_ONCE xx_common_expr(O1) . {
1645+
xx_ret_expr(&R, "require_once", &O1, NULL, NULL, status->scanner_state);
1646+
}
1647+
16331648
xx_common_expr(R) ::= REQUIRE xx_common_expr(O1) . {
16341649
xx_ret_expr(&R, "require", &O1, NULL, NULL, status->scanner_state);
16351650
}

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(12) "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(18)
32+
}
33+
["file"]=>
34+
string(11) "(eval code)"
35+
["line"]=>
36+
int(3)
37+
["char"]=>
38+
int(1)
39+
}

0 commit comments

Comments
 (0)