fix leaks
authorMichael Wallner <mike@php.net>
Wed, 31 Oct 2018 08:23:31 +0000 (09:23 +0100)
committerMichael Wallner <mike@php.net>
Wed, 31 Oct 2018 08:23:31 +0000 (09:23 +0100)
19 files changed:
src/context.c
src/cpp.c
src/cpp_tokiter.c
src/module.c
src/parser.c
src/parser.h
src/parser.re
src/parser_proc.c
src/parser_proc_grammar.y
src/token.c
src/types/cpp_exp.c
src/types/decl.c
src/types/decl_abi.c
src/types/decl_arg.c
src/types/decl_extvar.c
src/types/decl_struct.c
src/types/let_func.c
src/types/number.c
src/types/return_exp.c

index 995a0010498aa1d11c75f236b57183f130dbf55a..da36c8ef6b13693cbbdb7931889433f5b8872e0a 100644 (file)
@@ -142,7 +142,7 @@ void psi_context_build(struct psi_context *C, const char *paths)
                                psi_parser_parse(&P, I);
                                psi_context_add(C, &P);
                                psi_parser_dtor(&P);
-                               free(I);
+                               psi_parser_input_free(&I);
                        }
                }
 
index 5a1130c73031f323908e94f3b4a5f601b36016c2..2a53df84339bbd0edfdaa5f750fd1ce316787075 100644 (file)
--- a/src/cpp.c
+++ b/src/cpp.c
@@ -60,7 +60,7 @@ bool psi_cpp_load_defaults(struct psi_cpp *cpp)
 
        if ((predef = psi_parser_open_string(cpp->parser, psi_cpp_predef, sizeof(psi_cpp_predef) - 1))) {
                bool parsed = psi_parser_parse(cpp->parser, predef);
-               free(predef);
+               psi_parser_input_free(&predef);
                return parsed;
        }
 
@@ -436,7 +436,7 @@ static inline bool try_include(struct psi_cpp *cpp, const char *path, bool *pars
                                psi_plist_free(tokens);
                        }
                }
-               free(include);
+               psi_parser_input_free(&include);
 
                zend_hash_str_add_empty_element(&cpp->once, path, strlen(path));
                return true;
index 9ebe1915f21ea059ef07feb57a1a400cc31d5a91..8073281ea7c80f12043e2d0644edbd6844dee53b 100644 (file)
@@ -259,7 +259,7 @@ static size_t psi_cpp_tokiter_expand_tokens(struct psi_cpp *cpp,
 
                                tmp_tok = psi_token_init(old_tok->type, "", 0,
                                                target->col, target->line,
-                                               target->file ? target->file->val : "");
+                                               target->file ? target->file : zend_empty_string);
 
                                new_tok = psi_token_cat(NULL, 3, tmp_tok, old_tok, tok);
                                psi_token_free(&old_tok);
@@ -268,7 +268,8 @@ static size_t psi_cpp_tokiter_expand_tokens(struct psi_cpp *cpp,
                                exp_tokens[n - 1] = new_tok;
                        } else {
                                new_tok = psi_token_init(stringify ? PSI_T_QUOTED_STRING : tok->type,
-                                               tok->text->val, tok->text->len, target->col, target->line, target->file?:"");
+                                               tok->text->val, tok->text->len, target->col, target->line,
+                                               target->file ?: zend_empty_string);
 
                                exp_tokens[n++] = new_tok;
                        }
index 338f9451f0104981f6b616898b1d3519cba51cae..0aba56448cd92738eddca507672255f38498b5c3 100644 (file)
@@ -232,7 +232,7 @@ static PHP_FUNCTION(psi_validate)
        psi_validate_scope_dtor(&S);
        psi_data_dtor(&D);
        psi_parser_dtor(&P);
-       free(I);
+       psi_parser_input_free(&I);
 }
 
 ZEND_BEGIN_ARG_INFO_EX(ai_psi_validate_string, 0, 0, 1)
@@ -284,7 +284,7 @@ static PHP_FUNCTION(psi_validate_string)
        psi_validate_scope_dtor(&S);
        psi_data_dtor(&D);
        psi_parser_dtor(&P);
-       free(I);
+       psi_parser_input_free(&I);
 }
 
 static ZEND_RESULT_CODE psi_ops_load()
index 70e4ba2ce1f55bf3b03eaefab17c55d82a9c91f0..af5d7fd3d4c447950bee90bc8f960844659cd37b 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.1.1 on Tue Oct 30 13:23:48 2018 */
+/* Generated by re2c 1.1.1 on Wed Oct 31 09:21:44 2018 */
 #line 1 "src/parser.re"
 /*******************************************************************************
  Copyright (c) 2016, Michael Wallner <mike@php.net>.
@@ -167,19 +167,20 @@ void psi_parser_postprocess(struct psi_parser *P)
                                struct psi_const *cnst;
                                struct psi_num_exp *num;
                                smart_str ns_name = {0};
-                               zend_string *name_str;
+                               zend_string *name_str, *type_str;
 
                                smart_str_appendl_ex(&ns_name, ZEND_STRL("psi\\"), 1);
                                smart_str_append_ex(&ns_name, name, 1);
                                name_str = smart_str_extract(&ns_name);
+                               type_str = zend_string_init(ZEND_STRL("<eval number>"), 1);
 
                                num = psi_num_exp_copy(scope.macro->exp);
                                def = psi_impl_def_val_init(PSI_T_NUMBER, num);
-                               type = psi_impl_type_init(PSI_T_NUMBER,
-                                               zend_string_init(ZEND_STRL("<eval number>"), 1));
+                               type = psi_impl_type_init(PSI_T_NUMBER, type_str);
                                cnst = psi_const_init(type, name_str, def);
                                P->consts = psi_plist_add(P->consts, &cnst);
                                zend_string_release(name_str);
+                               zend_string_release(type_str);
                        }
                } else {
                        if (psi_plist_count(scope.macro->tokens) == 1) {
@@ -191,18 +192,19 @@ void psi_parser_postprocess(struct psi_parser *P)
                                                struct psi_impl_def_val *def;
                                                struct psi_const *cnst;
                                                smart_str ns_name = {0};
-                                               zend_string *name_str;
+                                               zend_string *name_str, *type_str;
 
                                                smart_str_appendl_ex(&ns_name, ZEND_STRL("psi\\"), 1);
                                                smart_str_append_ex(&ns_name, name, 1);
                                                name_str = smart_str_extract(&ns_name);
+                                               type_str = zend_string_init(ZEND_STRL("string"), 1);
 
-                                               type = psi_impl_type_init(PSI_T_STRING,
-                                                               zend_string_init(ZEND_STRL("string"), 1));
+                                               type = psi_impl_type_init(PSI_T_STRING, type_str);
                                                def = psi_impl_def_val_init(PSI_T_QUOTED_STRING, t->text);
                                                cnst = psi_const_init(type, name_str, def);
                                                P->consts = psi_plist_add(P->consts, &cnst);
                                                zend_string_release(name_str);
+                                               zend_string_release(type_str);
                                        }
                                }
                        }
@@ -298,7 +300,7 @@ struct psi_plist *psi_parser_scan(struct psi_parser *P, struct psi_parser_input
                (void) ctxmrk;
 
                
-#line 302 "src/parser.c"
+#line 304 "src/parser.c"
                {
                        unsigned char yych;
                        unsigned int yyaccept = 0;
@@ -423,9 +425,9 @@ struct psi_plist *psi_parser_scan(struct psi_parser *P, struct psi_parser_input
 yy2:
                        ++cur;
 yy3:
-#line 467 "src/parser.re"
+#line 469 "src/parser.re"
                        { NEWTOKEN(-2); goto error; }
-#line 429 "src/parser.c"
+#line 431 "src/parser.c"
 yy4:
                        ++cur;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -437,14 +439,14 @@ yy4:
                        default:        goto yy6;
                        }
 yy6:
-#line 466 "src/parser.re"
+#line 468 "src/parser.re"
                        { NEWTOKEN(PSI_T_WHITESPACE); goto start; }
-#line 443 "src/parser.c"
+#line 445 "src/parser.c"
 yy7:
                        ++cur;
-#line 465 "src/parser.re"
+#line 467 "src/parser.re"
                        { NEWTOKEN(PSI_T_EOL); NEWLINE(); goto start; }
-#line 448 "src/parser.c"
+#line 450 "src/parser.c"
 yy9:
                        yych = *++cur;
                        switch (yych) {
@@ -452,14 +454,14 @@ yy9:
                        default:        goto yy10;
                        }
 yy10:
-#line 368 "src/parser.re"
+#line 370 "src/parser.re"
                        { NEWTOKEN(PSI_T_NOT); goto start; }
-#line 458 "src/parser.c"
+#line 460 "src/parser.c"
 yy11:
                        ++cur;
-#line 341 "src/parser.re"
+#line 343 "src/parser.re"
                        { escaped = false; tok += 1; goto string; }
-#line 463 "src/parser.c"
+#line 465 "src/parser.c"
 yy13:
                        yych = *++cur;
                        switch (yych) {
@@ -467,9 +469,9 @@ yy13:
                        default:        goto yy14;
                        }
 yy14:
-#line 351 "src/parser.re"
+#line 353 "src/parser.re"
                        { NEWTOKEN(PSI_T_HASH); goto start; }
-#line 473 "src/parser.c"
+#line 475 "src/parser.c"
 yy15:
                        yych = *++cur;
                        switch (yych) {
@@ -542,9 +544,9 @@ yy15:
                        }
 yy16:
                        ++cur;
-#line 369 "src/parser.re"
+#line 371 "src/parser.re"
                        { NEWTOKEN(PSI_T_MODULO); goto start; }
-#line 548 "src/parser.c"
+#line 550 "src/parser.c"
 yy18:
                        yych = *++cur;
                        switch (yych) {
@@ -552,29 +554,29 @@ yy18:
                        default:        goto yy19;
                        }
 yy19:
-#line 370 "src/parser.re"
+#line 372 "src/parser.re"
                        { NEWTOKEN(PSI_T_AMPERSAND); goto start; }
-#line 558 "src/parser.c"
+#line 560 "src/parser.c"
 yy20:
                        ++cur;
-#line 340 "src/parser.re"
+#line 342 "src/parser.re"
                        { escaped = false; tok += 1; goto character; }
-#line 563 "src/parser.c"
+#line 565 "src/parser.c"
 yy22:
                        ++cur;
-#line 352 "src/parser.re"
+#line 354 "src/parser.re"
                        { NEWTOKEN(PSI_T_LPAREN); goto start; }
-#line 568 "src/parser.c"
+#line 570 "src/parser.c"
 yy24:
                        ++cur;
-#line 353 "src/parser.re"
+#line 355 "src/parser.re"
                        { NEWTOKEN(PSI_T_RPAREN); goto start; }
-#line 573 "src/parser.c"
+#line 575 "src/parser.c"
 yy26:
                        ++cur;
-#line 366 "src/parser.re"
+#line 368 "src/parser.re"
                        { NEWTOKEN(PSI_T_ASTERISK); goto start; }
-#line 578 "src/parser.c"
+#line 580 "src/parser.c"
 yy28:
                        yyaccept = 0;
                        yych = *(mrk = ++cur);
@@ -593,14 +595,14 @@ yy28:
                        default:        goto yy29;
                        }
 yy29:
-#line 371 "src/parser.re"
+#line 373 "src/parser.re"
                        { NEWTOKEN(PSI_T_PLUS); goto start; }
-#line 599 "src/parser.c"
+#line 601 "src/parser.c"
 yy30:
                        ++cur;
-#line 355 "src/parser.re"
+#line 357 "src/parser.re"
                        { NEWTOKEN(PSI_T_COMMA); goto start; }
-#line 604 "src/parser.c"
+#line 606 "src/parser.c"
 yy32:
                        yyaccept = 1;
                        yych = *(mrk = ++cur);
@@ -619,9 +621,9 @@ yy32:
                        default:        goto yy33;
                        }
 yy33:
-#line 372 "src/parser.re"
+#line 374 "src/parser.re"
                        { NEWTOKEN(PSI_T_MINUS); goto start; }
-#line 625 "src/parser.c"
+#line 627 "src/parser.c"
 yy34:
                        yyaccept = 2;
                        yych = *(mrk = ++cur);
@@ -640,9 +642,9 @@ yy34:
                        default:        goto yy35;
                        }
 yy35:
-#line 383 "src/parser.re"
+#line 385 "src/parser.re"
                        { NEWTOKEN(PSI_T_PERIOD); goto start; }
-#line 646 "src/parser.c"
+#line 648 "src/parser.c"
 yy36:
                        yych = *++cur;
                        switch (yych) {
@@ -651,9 +653,9 @@ yy36:
                        default:        goto yy37;
                        }
 yy37:
-#line 373 "src/parser.re"
+#line 375 "src/parser.re"
                        { NEWTOKEN(PSI_T_SLASH); goto start; }
-#line 657 "src/parser.c"
+#line 659 "src/parser.c"
 yy38:
                        yyaccept = 3;
                        yych = *(mrk = ++cur);
@@ -666,9 +668,9 @@ yy38:
                        default:        goto yy126;
                        }
 yy39:
-#line 327 "src/parser.re"
+#line 329 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT; goto start; }
-#line 672 "src/parser.c"
+#line 674 "src/parser.c"
 yy40:
                        yyaccept = 3;
                        mrk = ++cur;
@@ -696,14 +698,14 @@ yy40:
                        }
 yy42:
                        ++cur;
-#line 356 "src/parser.re"
+#line 358 "src/parser.re"
                        { NEWTOKEN(PSI_T_COLON); goto start; }
-#line 702 "src/parser.c"
+#line 704 "src/parser.c"
 yy44:
                        ++cur;
-#line 354 "src/parser.re"
+#line 356 "src/parser.re"
                        { NEWTOKEN(PSI_T_EOS); goto start; }
-#line 707 "src/parser.c"
+#line 709 "src/parser.c"
 yy46:
                        yyaccept = 4;
                        yych = *(mrk = ++cur);
@@ -779,9 +781,9 @@ yy46:
                        default:        goto yy47;
                        }
 yy47:
-#line 381 "src/parser.re"
+#line 383 "src/parser.re"
                        { NEWTOKEN(PSI_T_LCHEVR); goto start; }
-#line 785 "src/parser.c"
+#line 787 "src/parser.c"
 yy48:
                        yych = *++cur;
                        switch (yych) {
@@ -789,9 +791,9 @@ yy48:
                        default:        goto yy49;
                        }
 yy49:
-#line 365 "src/parser.re"
+#line 367 "src/parser.re"
                        { NEWTOKEN(PSI_T_EQUALS); goto start; }
-#line 795 "src/parser.c"
+#line 797 "src/parser.c"
 yy50:
                        yych = *++cur;
                        switch (yych) {
@@ -800,14 +802,14 @@ yy50:
                        default:        goto yy51;
                        }
 yy51:
-#line 382 "src/parser.re"
+#line 384 "src/parser.re"
                        { NEWTOKEN(PSI_T_RCHEVR); goto start; }
-#line 806 "src/parser.c"
+#line 808 "src/parser.c"
 yy52:
                        ++cur;
-#line 385 "src/parser.re"
+#line 387 "src/parser.re"
                        { NEWTOKEN(PSI_T_IIF); goto start; }
-#line 811 "src/parser.c"
+#line 813 "src/parser.c"
 yy54:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -819,9 +821,9 @@ yy54:
                        default:        goto yy62;
                        }
 yy55:
-#line 460 "src/parser.re"
+#line 462 "src/parser.re"
                        { NEWTOKEN(PSI_T_NAME); goto start; }
-#line 825 "src/parser.c"
+#line 827 "src/parser.c"
 yy56:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -1064,9 +1066,9 @@ yy74:
                        }
 yy75:
                        ++cur;
-#line 359 "src/parser.re"
+#line 361 "src/parser.re"
                        { NEWTOKEN(PSI_T_LBRACKET); goto start; }
-#line 1070 "src/parser.c"
+#line 1072 "src/parser.c"
 yy77:
                        yych = *++cur;
                        switch (yych) {
@@ -1148,19 +1150,19 @@ yy77:
                        default:        goto yy184;
                        }
 yy78:
-#line 374 "src/parser.re"
+#line 376 "src/parser.re"
                        { NEWTOKEN(PSI_T_BSLASH); goto start; }
-#line 1154 "src/parser.c"
+#line 1156 "src/parser.c"
 yy79:
                        ++cur;
-#line 360 "src/parser.re"
+#line 362 "src/parser.re"
                        { NEWTOKEN(PSI_T_RBRACKET); goto start; }
-#line 1159 "src/parser.c"
+#line 1161 "src/parser.c"
 yy81:
                        ++cur;
-#line 376 "src/parser.re"
+#line 378 "src/parser.re"
                        { NEWTOKEN(PSI_T_CARET); goto start; }
-#line 1164 "src/parser.c"
+#line 1166 "src/parser.c"
 yy83:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -1300,9 +1302,9 @@ yy95:
                        }
 yy96:
                        ++cur;
-#line 357 "src/parser.re"
+#line 359 "src/parser.re"
                        { NEWTOKEN(PSI_T_LBRACE); goto start; }
-#line 1306 "src/parser.c"
+#line 1308 "src/parser.c"
 yy98:
                        yych = *++cur;
                        switch (yych) {
@@ -1310,29 +1312,29 @@ yy98:
                        default:        goto yy99;
                        }
 yy99:
-#line 375 "src/parser.re"
+#line 377 "src/parser.re"
                        { NEWTOKEN(PSI_T_PIPE); goto start; }
-#line 1316 "src/parser.c"
+#line 1318 "src/parser.c"
 yy100:
                        ++cur;
-#line 358 "src/parser.re"
+#line 360 "src/parser.re"
                        { NEWTOKEN(PSI_T_RBRACE); goto start; }
-#line 1321 "src/parser.c"
+#line 1323 "src/parser.c"
 yy102:
                        ++cur;
-#line 367 "src/parser.re"
+#line 369 "src/parser.re"
                        { NEWTOKEN(PSI_T_TILDE); goto start; }
-#line 1326 "src/parser.c"
+#line 1328 "src/parser.c"
 yy104:
                        ++cur;
-#line 361 "src/parser.re"
+#line 363 "src/parser.re"
                        { NEWTOKEN(PSI_T_CMP_NE); goto start; }
-#line 1331 "src/parser.c"
+#line 1333 "src/parser.c"
 yy106:
                        ++cur;
-#line 350 "src/parser.re"
+#line 352 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_PASTE); goto start; }
-#line 1336 "src/parser.c"
+#line 1338 "src/parser.c"
 yy108:
                        ++cur;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -1406,14 +1408,14 @@ yy108:
                        default:        goto yy108;
                        }
 yy110:
-#line 462 "src/parser.re"
+#line 464 "src/parser.re"
                        { NEWTOKEN(PSI_T_DOLLAR_NAME); goto start; }
-#line 1412 "src/parser.c"
+#line 1414 "src/parser.c"
 yy111:
                        ++cur;
-#line 363 "src/parser.re"
+#line 365 "src/parser.re"
                        { NEWTOKEN(PSI_T_AND); goto start; }
-#line 1417 "src/parser.c"
+#line 1419 "src/parser.c"
 yy113:
                        yych = *++cur;
                        switch (yych) {
@@ -1547,19 +1549,19 @@ yy116:
                        default:        goto yy118;
                        }
 yy118:
-#line 333 "src/parser.re"
+#line 335 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT; goto start; }
-#line 1553 "src/parser.c"
+#line 1555 "src/parser.c"
 yy119:
                        ++cur;
-#line 347 "src/parser.re"
+#line 349 "src/parser.re"
                        { goto comment; }
-#line 1558 "src/parser.c"
+#line 1560 "src/parser.c"
 yy121:
                        ++cur;
-#line 348 "src/parser.re"
+#line 350 "src/parser.re"
                        { goto comment_sl; }
-#line 1563 "src/parser.c"
+#line 1565 "src/parser.c"
 yy123:
                        yyaccept = 6;
                        mrk = ++cur;
@@ -1635,9 +1637,9 @@ yy128:
                        }
 yy129:
                        cur -= 1;
-#line 329 "src/parser.re"
+#line 331 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_L; cur += 1; goto start; }
-#line 1641 "src/parser.c"
+#line 1643 "src/parser.c"
 yy130:
                        yych = *++cur;
                        switch (yych) {
@@ -1647,9 +1649,9 @@ yy130:
                        }
 yy131:
                        cur -= 1;
-#line 328 "src/parser.re"
+#line 330 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_U; cur += 1; goto start; }
-#line 1653 "src/parser.c"
+#line 1655 "src/parser.c"
 yy132:
                        yych = *++cur;
                        switch (yych) {
@@ -1753,29 +1755,29 @@ yy133:
                        }
 yy135:
                        ++cur;
-#line 377 "src/parser.re"
+#line 379 "src/parser.re"
                        { NEWTOKEN(PSI_T_LSHIFT); goto start; }
-#line 1759 "src/parser.c"
+#line 1761 "src/parser.c"
 yy137:
                        ++cur;
-#line 379 "src/parser.re"
+#line 381 "src/parser.re"
                        { NEWTOKEN(PSI_T_CMP_LE); goto start; }
-#line 1764 "src/parser.c"
+#line 1766 "src/parser.c"
 yy139:
                        ++cur;
-#line 362 "src/parser.re"
+#line 364 "src/parser.re"
                        { NEWTOKEN(PSI_T_CMP_EQ); goto start; }
-#line 1769 "src/parser.c"
+#line 1771 "src/parser.c"
 yy141:
                        ++cur;
-#line 380 "src/parser.re"
+#line 382 "src/parser.re"
                        { NEWTOKEN(PSI_T_CMP_GE); goto start; }
-#line 1774 "src/parser.c"
+#line 1776 "src/parser.c"
 yy143:
                        ++cur;
-#line 378 "src/parser.re"
+#line 380 "src/parser.re"
                        { NEWTOKEN(PSI_T_RSHIFT); goto start; }
-#line 1779 "src/parser.c"
+#line 1781 "src/parser.c"
 yy145:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -1856,9 +1858,9 @@ yy146:
                        default:        goto yy61;
                        }
 yy147:
-#line 440 "src/parser.re"
+#line 442 "src/parser.re"
                        { NEWTOKEN(PSI_T_AS); goto start; }
-#line 1862 "src/parser.c"
+#line 1864 "src/parser.c"
 yy148:
                        ++cur;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -2107,9 +2109,9 @@ yy160:
                        default:        goto yy61;
                        }
 yy161:
-#line 410 "src/parser.re"
+#line 412 "src/parser.re"
                        { NEWTOKEN(PSI_T_IF); goto start; }
-#line 2113 "src/parser.c"
+#line 2115 "src/parser.c"
 yy162:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2123,9 +2125,9 @@ yy162:
 yy163:
                        ++cur;
                        cur -= 1;
-#line 345 "src/parser.re"
+#line 347 "src/parser.re"
                        { char_width = sizeof(wchar_t)/8; }
-#line 2129 "src/parser.c"
+#line 2131 "src/parser.c"
 yy165:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2242,9 +2244,9 @@ yy178:
 yy179:
                        ++cur;
                        cur -= 1;
-#line 344 "src/parser.re"
+#line 346 "src/parser.re"
                        { char_width = 4; }
-#line 2248 "src/parser.c"
+#line 2250 "src/parser.c"
 yy181:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2343,9 +2345,9 @@ yy184:
                        default:        goto yy184;
                        }
 yy186:
-#line 461 "src/parser.re"
+#line 463 "src/parser.re"
                        { NEWTOKEN(PSI_T_NSNAME); goto start; }
-#line 2349 "src/parser.c"
+#line 2351 "src/parser.c"
 yy187:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2474,9 +2476,9 @@ yy201:
 yy202:
                        ++cur;
                        cur -= 1;
-#line 343 "src/parser.re"
+#line 345 "src/parser.re"
                        { char_width = 2; }
-#line 2480 "src/parser.c"
+#line 2482 "src/parser.c"
 yy204:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2504,14 +2506,14 @@ yy206:
                        }
 yy207:
                        ++cur;
-#line 364 "src/parser.re"
+#line 366 "src/parser.re"
                        { NEWTOKEN(PSI_T_OR); goto start; }
-#line 2510 "src/parser.c"
+#line 2512 "src/parser.c"
 yy209:
                        ++cur;
-#line 384 "src/parser.re"
+#line 386 "src/parser.re"
                        { NEWTOKEN(PSI_T_ELLIPSIS); goto start; }
-#line 2515 "src/parser.c"
+#line 2517 "src/parser.c"
 yy211:
                        yych = *++cur;
                        switch (yych) {
@@ -2526,15 +2528,15 @@ yy211:
 yy212:
                        ++cur;
                        cur -= 1;
-#line 334 "src/parser.re"
+#line 336 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_F; cur += 1; goto start; }
-#line 2532 "src/parser.c"
+#line 2534 "src/parser.c"
 yy214:
                        ++cur;
                        cur -= 1;
-#line 335 "src/parser.re"
+#line 337 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_L; cur += 1; goto start; }
-#line 2538 "src/parser.c"
+#line 2540 "src/parser.c"
 yy216:
                        yych = *++cur;
                        switch (yych) {
@@ -2546,9 +2548,9 @@ yy217:
                        ++cur;
 yy218:
                        cur -= 2;
-#line 330 "src/parser.re"
+#line 332 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_UL; cur += 2; goto start; }
-#line 2552 "src/parser.c"
+#line 2554 "src/parser.c"
 yy219:
                        yych = *++cur;
                        switch (yych) {
@@ -2595,9 +2597,9 @@ yy220:
                        }
 yy222:
                        ++cur;
-#line 463 "src/parser.re"
+#line 465 "src/parser.re"
                        { tok += 1; cur -= 1; NEWTOKEN(PSI_T_CPP_HEADER); cur += 1; goto start; }
-#line 2601 "src/parser.c"
+#line 2603 "src/parser.c"
 yy224:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2808,9 +2810,9 @@ yy241:
                        default:        goto yy61;
                        }
 yy242:
-#line 435 "src/parser.re"
+#line 437 "src/parser.re"
                        { NEWTOKEN(PSI_T_LET); goto start; }
-#line 2814 "src/parser.c"
+#line 2816 "src/parser.c"
 yy243:
                        yyaccept = 12;
                        yych = *(mrk = ++cur);
@@ -2883,9 +2885,9 @@ yy243:
                        default:        goto yy61;
                        }
 yy244:
-#line 434 "src/parser.re"
+#line 436 "src/parser.re"
                        { NEWTOKEN(PSI_T_LIB); goto start; }
-#line 2889 "src/parser.c"
+#line 2891 "src/parser.c"
 yy245:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3015,9 +3017,9 @@ yy252:
                        default:        goto yy61;
                        }
 yy253:
-#line 436 "src/parser.re"
+#line 438 "src/parser.re"
                        { NEWTOKEN(PSI_T_SET); goto start; }
-#line 3021 "src/parser.c"
+#line 3023 "src/parser.c"
 yy254:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3243,9 +3245,9 @@ yy272:
                        default:        goto yy61;
                        }
 yy273:
-#line 404 "src/parser.re"
+#line 406 "src/parser.re"
                        { NEWTOKEN(PSI_T_INT); goto start; }
-#line 3249 "src/parser.c"
+#line 3251 "src/parser.c"
 yy274:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3311,9 +3313,9 @@ yy281:
 yy282:
                        ++cur;
                        cur -= 1;
-#line 342 "src/parser.re"
+#line 344 "src/parser.re"
                        { char_width = 1; }
-#line 3317 "src/parser.c"
+#line 3319 "src/parser.c"
 yy284:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3345,27 +3347,27 @@ yy287:
 yy288:
                        ++cur;
                        cur -= 2;
-#line 337 "src/parser.re"
+#line 339 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_DD; cur += 2; goto start; }
-#line 3351 "src/parser.c"
+#line 3353 "src/parser.c"
 yy290:
                        ++cur;
                        cur -= 2;
-#line 336 "src/parser.re"
+#line 338 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_DF; cur += 2; goto start; }
-#line 3357 "src/parser.c"
+#line 3359 "src/parser.c"
 yy292:
                        ++cur;
                        cur -= 2;
-#line 338 "src/parser.re"
+#line 340 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_DL; cur += 2; goto start; }
-#line 3363 "src/parser.c"
+#line 3365 "src/parser.c"
 yy294:
                        ++cur;
                        cur -= 3;
-#line 331 "src/parser.re"
+#line 333 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_ULL; cur += 3; goto start; }
-#line 3369 "src/parser.c"
+#line 3371 "src/parser.c"
 yy296:
                        ++cur;
                        if ((lim - cur) < 3) if (cur >= lim) goto done;;
@@ -3521,9 +3523,9 @@ yy304:
                        default:        goto yy61;
                        }
 yy305:
-#line 414 "src/parser.re"
+#line 416 "src/parser.re"
                        { NEWTOKEN(PSI_T_ELIF); goto start; }
-#line 3527 "src/parser.c"
+#line 3529 "src/parser.c"
 yy306:
                        yyaccept = 16;
                        yych = *(mrk = ++cur);
@@ -3596,9 +3598,9 @@ yy306:
                        default:        goto yy61;
                        }
 yy307:
-#line 413 "src/parser.re"
+#line 415 "src/parser.re"
                        { NEWTOKEN(PSI_T_ELSE); goto start; }
-#line 3602 "src/parser.c"
+#line 3604 "src/parser.c"
 yy308:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3703,9 +3705,9 @@ yy312:
                        default:        goto yy61;
                        }
 yy313:
-#line 441 "src/parser.re"
+#line 443 "src/parser.re"
                        { NEWTOKEN(PSI_T_FREE); goto start; }
-#line 3709 "src/parser.c"
+#line 3711 "src/parser.c"
 yy314:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3826,9 +3828,9 @@ yy320:
                        default:        goto yy61;
                        }
 yy321:
-#line 425 "src/parser.re"
+#line 427 "src/parser.re"
                        { NEWTOKEN(PSI_T_NULL); goto start; }
-#line 3832 "src/parser.c"
+#line 3834 "src/parser.c"
 yy322:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3980,9 +3982,9 @@ yy332:
                        default:        goto yy61;
                        }
 yy333:
-#line 442 "src/parser.re"
+#line 444 "src/parser.re"
                        { NEWTOKEN(PSI_T_TEMP); goto start; }
-#line 3986 "src/parser.c"
+#line 3988 "src/parser.c"
 yy334:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4103,9 +4105,9 @@ yy340:
                        default:        goto yy61;
                        }
 yy341:
-#line 423 "src/parser.re"
+#line 425 "src/parser.re"
                        { NEWTOKEN(PSI_T_TRUE); goto start; }
-#line 4109 "src/parser.c"
+#line 4111 "src/parser.c"
 yy342:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4194,9 +4196,9 @@ yy344:
                        default:        goto yy61;
                        }
 yy345:
-#line 451 "src/parser.re"
+#line 453 "src/parser.re"
                        { NEWTOKEN(PSI_T_ZVAL); goto start; }
-#line 4200 "src/parser.c"
+#line 4202 "src/parser.c"
 yy346:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4306,9 +4308,9 @@ yy351:
                        default:        goto yy61;
                        }
 yy352:
-#line 401 "src/parser.re"
+#line 403 "src/parser.re"
                        { NEWTOKEN(PSI_T_BOOL); goto start; }
-#line 4312 "src/parser.c"
+#line 4314 "src/parser.c"
 yy353:
                        yyaccept = 23;
                        yych = *(mrk = ++cur);
@@ -4381,9 +4383,9 @@ yy353:
                        default:        goto yy61;
                        }
 yy354:
-#line 402 "src/parser.re"
+#line 404 "src/parser.re"
                        { NEWTOKEN(PSI_T_CHAR); goto start; }
-#line 4387 "src/parser.c"
+#line 4389 "src/parser.c"
 yy355:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4470,9 +4472,9 @@ yy357:
                        default:        goto yy61;
                        }
 yy358:
-#line 398 "src/parser.re"
+#line 400 "src/parser.re"
                        { NEWTOKEN(PSI_T_ENUM); goto start; }
-#line 4476 "src/parser.c"
+#line 4478 "src/parser.c"
 yy359:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4553,9 +4555,9 @@ yy360:
                        default:        goto yy61;
                        }
 yy361:
-#line 394 "src/parser.re"
+#line 396 "src/parser.re"
                        { NEWTOKEN(PSI_T_LINE); goto start; }
-#line 4559 "src/parser.c"
+#line 4561 "src/parser.c"
 yy362:
                        yyaccept = 26;
                        yych = *(mrk = ++cur);
@@ -4628,9 +4630,9 @@ yy362:
                        default:        goto yy61;
                        }
 yy363:
-#line 405 "src/parser.re"
+#line 407 "src/parser.re"
                        { NEWTOKEN(PSI_T_LONG); goto start; }
-#line 4634 "src/parser.c"
+#line 4636 "src/parser.c"
 yy364:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4759,9 +4761,9 @@ yy372:
                        default:        goto yy61;
                        }
 yy373:
-#line 400 "src/parser.re"
+#line 402 "src/parser.re"
                        { NEWTOKEN(PSI_T_VOID); goto start; }
-#line 4765 "src/parser.c"
+#line 4767 "src/parser.c"
 yy374:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4841,9 +4843,9 @@ yy375:
                        default:        goto yy61;
                        }
 yy376:
-#line 429 "src/parser.re"
+#line 431 "src/parser.re"
                        { NEWTOKEN(PSI_T_ARRAY); goto start; }
-#line 4847 "src/parser.c"
+#line 4849 "src/parser.c"
 yy377:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4956,9 +4958,9 @@ yy382:
                        default:        goto yy61;
                        }
 yy383:
-#line 452 "src/parser.re"
+#line 454 "src/parser.re"
                        { NEWTOKEN(PSI_T_COUNT); goto start; }
-#line 4962 "src/parser.c"
+#line 4964 "src/parser.c"
 yy384:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5039,9 +5041,9 @@ yy385:
                        default:        goto yy61;
                        }
 yy386:
-#line 415 "src/parser.re"
+#line 417 "src/parser.re"
                        { NEWTOKEN(PSI_T_ENDIF); goto start; }
-#line 5045 "src/parser.c"
+#line 5047 "src/parser.c"
 yy387:
                        yyaccept = 31;
                        yych = *(mrk = ++cur);
@@ -5114,9 +5116,9 @@ yy387:
                        default:        goto yy61;
                        }
 yy388:
-#line 420 "src/parser.re"
+#line 422 "src/parser.re"
                        { NEWTOKEN(PSI_T_ERROR); goto start; }
-#line 5120 "src/parser.c"
+#line 5122 "src/parser.c"
 yy389:
                        yyaccept = 32;
                        yych = *(mrk = ++cur);
@@ -5189,9 +5191,9 @@ yy389:
                        default:        goto yy61;
                        }
 yy390:
-#line 424 "src/parser.re"
+#line 426 "src/parser.re"
                        { NEWTOKEN(PSI_T_FALSE); goto start; }
-#line 5195 "src/parser.c"
+#line 5197 "src/parser.c"
 yy391:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5280,9 +5282,9 @@ yy393:
                        default:        goto yy61;
                        }
 yy394:
-#line 411 "src/parser.re"
+#line 413 "src/parser.re"
                        { NEWTOKEN(PSI_T_IFDEF); goto start; }
-#line 5286 "src/parser.c"
+#line 5288 "src/parser.c"
 yy395:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5379,9 +5381,9 @@ yy398:
                        default:        goto yy61;
                        }
 yy399:
-#line 426 "src/parser.re"
+#line 428 "src/parser.re"
                        { NEWTOKEN(PSI_T_MIXED); goto start; }
-#line 5385 "src/parser.c"
+#line 5387 "src/parser.c"
 yy400:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5582,9 +5584,9 @@ yy416:
                        default:        goto yy61;
                        }
 yy417:
-#line 418 "src/parser.re"
+#line 420 "src/parser.re"
                        { NEWTOKEN(PSI_T_UNDEF); goto start; }
-#line 5588 "src/parser.c"
+#line 5590 "src/parser.c"
 yy418:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5700,9 +5702,9 @@ yy424:
                        default:        goto yy61;
                        }
 yy425:
-#line 399 "src/parser.re"
+#line 401 "src/parser.re"
                        { NEWTOKEN(PSI_T_CONST); goto start; }
-#line 5706 "src/parser.c"
+#line 5708 "src/parser.c"
 yy426:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5784,9 +5786,9 @@ yy427:
                        default:        goto yy61;
                        }
 yy428:
-#line 406 "src/parser.re"
+#line 408 "src/parser.re"
                        { NEWTOKEN(PSI_T_FLOAT); goto start; }
-#line 5790 "src/parser.c"
+#line 5792 "src/parser.c"
 yy429:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5866,9 +5868,9 @@ yy430:
                        default:        goto yy61;
                        }
 yy431:
-#line 403 "src/parser.re"
+#line 405 "src/parser.re"
                        { NEWTOKEN(PSI_T_SHORT); goto start; }
-#line 5872 "src/parser.c"
+#line 5874 "src/parser.c"
 yy432:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5969,9 +5971,9 @@ yy436:
                        default:        goto yy61;
                        }
 yy437:
-#line 397 "src/parser.re"
+#line 399 "src/parser.re"
                        { NEWTOKEN(PSI_T_UNION); goto start; }
-#line 5975 "src/parser.c"
+#line 5977 "src/parser.c"
 yy438:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6058,9 +6060,9 @@ yy440:
                        default:        goto yy61;
                        }
 yy441:
-#line 449 "src/parser.re"
+#line 451 "src/parser.re"
                        { NEWTOKEN(PSI_T_ARRVAL); goto start; }
-#line 6064 "src/parser.c"
+#line 6066 "src/parser.c"
 yy442:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6157,9 +6159,9 @@ yy445:
                        default:        goto yy61;
                        }
 yy446:
-#line 453 "src/parser.re"
+#line 455 "src/parser.re"
                        { NEWTOKEN(PSI_T_CALLOC); goto start; }
-#line 6163 "src/parser.c"
+#line 6165 "src/parser.c"
 yy447:
                        yyaccept = 42;
                        yych = *(mrk = ++cur);
@@ -6234,9 +6236,9 @@ yy447:
                        default:        goto yy61;
                        }
 yy448:
-#line 416 "src/parser.re"
+#line 418 "src/parser.re"
                        { NEWTOKEN(PSI_T_DEFINE); goto start; }
-#line 6240 "src/parser.c"
+#line 6242 "src/parser.c"
 yy449:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6325,9 +6327,9 @@ yy451:
                        default:        goto yy61;
                        }
 yy452:
-#line 412 "src/parser.re"
+#line 414 "src/parser.re"
                        { NEWTOKEN(PSI_T_IFNDEF); goto start; }
-#line 6331 "src/parser.c"
+#line 6333 "src/parser.c"
 yy453:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6408,9 +6410,9 @@ yy454:
                        default:        goto yy61;
                        }
 yy455:
-#line 446 "src/parser.re"
+#line 448 "src/parser.re"
                        { NEWTOKEN(PSI_T_INTVAL); goto start; }
-#line 6414 "src/parser.c"
+#line 6416 "src/parser.c"
 yy456:
                        yyaccept = 45;
                        yych = *(mrk = ++cur);
@@ -6483,9 +6485,9 @@ yy456:
                        default:        goto yy61;
                        }
 yy457:
-#line 430 "src/parser.re"
+#line 432 "src/parser.re"
                        { NEWTOKEN(PSI_T_OBJECT); goto start; }
-#line 6489 "src/parser.c"
+#line 6491 "src/parser.c"
 yy458:
                        yyaccept = 46;
                        yych = *(mrk = ++cur);
@@ -6558,9 +6560,9 @@ yy458:
                        default:        goto yy61;
                        }
 yy459:
-#line 450 "src/parser.re"
+#line 452 "src/parser.re"
                        { NEWTOKEN(PSI_T_OBJVAL); goto start; }
-#line 6564 "src/parser.c"
+#line 6566 "src/parser.c"
 yy460:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6657,9 +6659,9 @@ yy463:
                        default:        goto yy61;
                        }
 yy464:
-#line 439 "src/parser.re"
+#line 441 "src/parser.re"
                        { NEWTOKEN(PSI_T_RETURN); goto start; }
-#line 6663 "src/parser.c"
+#line 6665 "src/parser.c"
 yy465:
                        yyaccept = 48;
                        yych = *(mrk = ++cur);
@@ -6732,9 +6734,9 @@ yy465:
                        default:        goto yy61;
                        }
 yy466:
-#line 432 "src/parser.re"
+#line 434 "src/parser.re"
                        { NEWTOKEN(PSI_T_STATIC); goto start; }
-#line 6738 "src/parser.c"
+#line 6740 "src/parser.c"
 yy467:
                        yyaccept = 49;
                        yych = *(mrk = ++cur);
@@ -6807,9 +6809,9 @@ yy467:
                        default:        goto yy61;
                        }
 yy468:
-#line 428 "src/parser.re"
+#line 430 "src/parser.re"
                        { NEWTOKEN(PSI_T_STRING); goto start; }
-#line 6813 "src/parser.c"
+#line 6815 "src/parser.c"
 yy469:
                        yyaccept = 50;
                        yych = *(mrk = ++cur);
@@ -6882,9 +6884,9 @@ yy469:
                        default:        goto yy61;
                        }
 yy470:
-#line 443 "src/parser.re"
+#line 445 "src/parser.re"
                        { NEWTOKEN(PSI_T_STRLEN); goto start; }
-#line 6888 "src/parser.c"
+#line 6890 "src/parser.c"
 yy471:
                        yyaccept = 51;
                        yych = *(mrk = ++cur);
@@ -6957,9 +6959,9 @@ yy471:
                        default:        goto yy61;
                        }
 yy472:
-#line 444 "src/parser.re"
+#line 446 "src/parser.re"
                        { NEWTOKEN(PSI_T_STRVAL); goto start; }
-#line 6963 "src/parser.c"
+#line 6965 "src/parser.c"
 yy473:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7056,9 +7058,9 @@ yy476:
                        default:        goto yy61;
                        }
 yy477:
-#line 457 "src/parser.re"
+#line 459 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_INT); goto start; }
-#line 7062 "src/parser.c"
+#line 7064 "src/parser.c"
 yy478:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7190,9 +7192,9 @@ yy486:
                        default:        goto yy61;
                        }
 yy487:
-#line 407 "src/parser.re"
+#line 409 "src/parser.re"
                        { NEWTOKEN(PSI_T_DOUBLE); goto start; }
-#line 7196 "src/parser.c"
+#line 7198 "src/parser.c"
 yy488:
                        yyaccept = 54;
                        yych = *(mrk = ++cur);
@@ -7265,9 +7267,9 @@ yy488:
                        default:        goto yy527;
                        }
 yy489:
-#line 386 "src/parser.re"
+#line 388 "src/parser.re"
                        { NEWTOKEN(PSI_T_PRAGMA); goto start; }
-#line 7271 "src/parser.c"
+#line 7273 "src/parser.c"
 yy490:
                        yyaccept = 55;
                        yych = *(mrk = ++cur);
@@ -7340,9 +7342,9 @@ yy490:
                        default:        goto yy61;
                        }
 yy491:
-#line 409 "src/parser.re"
+#line 411 "src/parser.re"
                        { NEWTOKEN(PSI_T_SIGNED); goto start; }
-#line 7346 "src/parser.c"
+#line 7348 "src/parser.c"
 yy492:
                        yyaccept = 56;
                        yych = *(mrk = ++cur);
@@ -7415,9 +7417,9 @@ yy492:
                        default:        goto yy61;
                        }
 yy493:
-#line 393 "src/parser.re"
+#line 395 "src/parser.re"
                        { NEWTOKEN(PSI_T_SIZEOF); goto start; }
-#line 7421 "src/parser.c"
+#line 7423 "src/parser.c"
 yy494:
                        yyaccept = 57;
                        yych = *(mrk = ++cur);
@@ -7490,9 +7492,9 @@ yy494:
                        default:        goto yy61;
                        }
 yy495:
-#line 396 "src/parser.re"
+#line 398 "src/parser.re"
                        { NEWTOKEN(PSI_T_STRUCT); goto start; }
-#line 7496 "src/parser.c"
+#line 7498 "src/parser.c"
 yy496:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7586,9 +7588,9 @@ yy499:
                        default:        goto yy61;
                        }
 yy500:
-#line 448 "src/parser.re"
+#line 450 "src/parser.re"
                        { NEWTOKEN(PSI_T_BOOLVAL); goto start; }
-#line 7592 "src/parser.c"
+#line 7594 "src/parser.c"
 yy501:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7677,9 +7679,9 @@ yy503:
                        default:        goto yy61;
                        }
 yy504:
-#line 417 "src/parser.re"
+#line 419 "src/parser.re"
                        { NEWTOKEN(PSI_T_DEFINED); goto start; }
-#line 7683 "src/parser.c"
+#line 7685 "src/parser.c"
 yy505:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7769,9 +7771,9 @@ yy507:
                        default:        goto yy61;
                        }
 yy508:
-#line 421 "src/parser.re"
+#line 423 "src/parser.re"
                        { NEWTOKEN(PSI_T_INCLUDE); goto start; }
-#line 7775 "src/parser.c"
+#line 7777 "src/parser.c"
 yy509:
                        yyaccept = 61;
                        yych = *(mrk = ++cur);
@@ -7844,9 +7846,9 @@ yy509:
                        default:        goto yy61;
                        }
 yy510:
-#line 445 "src/parser.re"
+#line 447 "src/parser.re"
                        { NEWTOKEN(PSI_T_PATHVAL); goto start; }
-#line 7850 "src/parser.c"
+#line 7852 "src/parser.c"
 yy511:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7943,9 +7945,9 @@ yy514:
                        default:        goto yy61;
                        }
 yy515:
-#line 459 "src/parser.re"
+#line 461 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_BOOL); goto start; }
-#line 7949 "src/parser.c"
+#line 7951 "src/parser.c"
 yy516:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8042,9 +8044,9 @@ yy519:
                        default:        goto yy61;
                        }
 yy520:
-#line 419 "src/parser.re"
+#line 421 "src/parser.re"
                        { NEWTOKEN(PSI_T_WARNING); goto start; }
-#line 8048 "src/parser.c"
+#line 8050 "src/parser.c"
 yy521:
                        yyaccept = 64;
                        yych = *(mrk = ++cur);
@@ -8117,9 +8119,9 @@ yy521:
                        default:        goto yy61;
                        }
 yy522:
-#line 391 "src/parser.re"
+#line 393 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_ASM); goto start; }
-#line 8123 "src/parser.c"
+#line 8125 "src/parser.c"
 yy523:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8294,9 +8296,9 @@ yy529:
                        default:        goto yy61;
                        }
 yy530:
-#line 395 "src/parser.re"
+#line 397 "src/parser.re"
                        { NEWTOKEN(PSI_T_TYPEDEF); goto start; }
-#line 8300 "src/parser.c"
+#line 8302 "src/parser.c"
 yy531:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8383,9 +8385,9 @@ yy533:
                        default:        goto yy61;
                        }
 yy534:
-#line 427 "src/parser.re"
+#line 429 "src/parser.re"
                        { NEWTOKEN(PSI_T_CALLABLE); goto start; }
-#line 8389 "src/parser.c"
+#line 8391 "src/parser.c"
 yy535:
                        yyaccept = 67;
                        yych = *(mrk = ++cur);
@@ -8458,9 +8460,9 @@ yy535:
                        default:        goto yy61;
                        }
 yy536:
-#line 431 "src/parser.re"
+#line 433 "src/parser.re"
                        { NEWTOKEN(PSI_T_CALLBACK); goto start; }
-#line 8464 "src/parser.c"
+#line 8466 "src/parser.c"
 yy537:
                        yyaccept = 68;
                        yych = *(mrk = ++cur);
@@ -8533,9 +8535,9 @@ yy537:
                        default:        goto yy61;
                        }
 yy538:
-#line 447 "src/parser.re"
+#line 449 "src/parser.re"
                        { NEWTOKEN(PSI_T_FLOATVAL); goto start; }
-#line 8539 "src/parser.c"
+#line 8541 "src/parser.c"
 yy539:
                        yyaccept = 69;
                        yych = *(mrk = ++cur);
@@ -8608,9 +8610,9 @@ yy539:
                        default:        goto yy61;
                        }
 yy540:
-#line 433 "src/parser.re"
+#line 435 "src/parser.re"
                        { NEWTOKEN(PSI_T_FUNCTION); goto start; }
-#line 8614 "src/parser.c"
+#line 8616 "src/parser.c"
 yy541:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8707,9 +8709,9 @@ yy544:
                        default:        goto yy61;
                        }
 yy545:
-#line 455 "src/parser.re"
+#line 457 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_ARRAY); goto start; }
-#line 8713 "src/parser.c"
+#line 8715 "src/parser.c"
 yy546:
                        yyaccept = 71;
                        yych = *(mrk = ++cur);
@@ -8782,9 +8784,9 @@ yy546:
                        default:        goto yy61;
                        }
 yy547:
-#line 458 "src/parser.re"
+#line 460 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_FLOAT); goto start; }
-#line 8788 "src/parser.c"
+#line 8790 "src/parser.c"
 yy548:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8887,9 +8889,9 @@ yy552:
                        default:        goto yy61;
                        }
 yy553:
-#line 388 "src/parser.re"
+#line 390 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_INLINE); goto start; }
-#line 8893 "src/parser.c"
+#line 8895 "src/parser.c"
 yy554:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9044,9 +9046,9 @@ yy557:
                        default:        goto yy61;
                        }
 yy558:
-#line 408 "src/parser.re"
+#line 410 "src/parser.re"
                        { NEWTOKEN(PSI_T_UNSIGNED); goto start; }
-#line 9050 "src/parser.c"
+#line 9052 "src/parser.c"
 yy559:
                        yyaccept = 74;
                        yych = *(mrk = ++cur);
@@ -9119,9 +9121,9 @@ yy559:
                        default:        goto yy61;
                        }
 yy560:
-#line 392 "src/parser.re"
+#line 394 "src/parser.re"
                        { NEWTOKEN(PSI_T_VOLATILE); goto start; }
-#line 9125 "src/parser.c"
+#line 9127 "src/parser.c"
 yy561:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9218,9 +9220,9 @@ yy564:
                        default:        goto yy61;
                        }
 yy565:
-#line 454 "src/parser.re"
+#line 456 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_OBJECT); goto start; }
-#line 9224 "src/parser.c"
+#line 9226 "src/parser.c"
 yy566:
                        yyaccept = 76;
                        yych = *(mrk = ++cur);
@@ -9293,9 +9295,9 @@ yy566:
                        default:        goto yy61;
                        }
 yy567:
-#line 456 "src/parser.re"
+#line 458 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_STRING); goto start; }
-#line 9299 "src/parser.c"
+#line 9301 "src/parser.c"
 yy568:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9480,9 +9482,9 @@ yy574:
                        default:        goto yy61;
                        }
 yy575:
-#line 437 "src/parser.re"
+#line 439 "src/parser.re"
                        { NEWTOKEN(PSI_T_PRE_ASSERT); goto start; }
-#line 9486 "src/parser.c"
+#line 9488 "src/parser.c"
 yy576:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9569,9 +9571,9 @@ yy578:
                        default:        goto yy61;
                        }
 yy579:
-#line 389 "src/parser.re"
+#line 391 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_RESTRICT); goto start; }
-#line 9575 "src/parser.c"
+#line 9577 "src/parser.c"
 yy580:
                        yyaccept = 5;
                        mrk = ++cur;
@@ -9727,9 +9729,9 @@ yy582:
                        default:        goto yy61;
                        }
 yy583:
-#line 438 "src/parser.re"
+#line 440 "src/parser.re"
                        { NEWTOKEN(PSI_T_POST_ASSERT); goto start; }
-#line 9733 "src/parser.c"
+#line 9735 "src/parser.c"
 yy584:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9819,9 +9821,9 @@ yy586:
                        default:        goto yy527;
                        }
 yy587:
-#line 387 "src/parser.re"
+#line 389 "src/parser.re"
                        { NEWTOKEN(PSI_T_PRAGMA_ONCE); goto start; }
-#line 9825 "src/parser.c"
+#line 9827 "src/parser.c"
 yy588:
                        yyaccept = 81;
                        yych = *(mrk = ++cur);
@@ -9894,9 +9896,9 @@ yy588:
                        default:        goto yy61;
                        }
 yy589:
-#line 422 "src/parser.re"
+#line 424 "src/parser.re"
                        { NEWTOKEN(PSI_T_INCLUDE_NEXT); goto start; }
-#line 9900 "src/parser.c"
+#line 9902 "src/parser.c"
 yy590:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9993,9 +9995,9 @@ yy593:
                        default:        goto yy61;
                        }
 yy594:
-#line 390 "src/parser.re"
+#line 392 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_EXTENSION); goto start; }
-#line 9999 "src/parser.c"
+#line 10001 "src/parser.c"
 yy595:
                        ++cur;
                        if ((lim - cur) < 2) if (cur >= lim) goto done;;
@@ -10015,16 +10017,16 @@ yy597:
                        }
 yy598:
                        ++cur;
-#line 464 "src/parser.re"
+#line 466 "src/parser.re"
                        { parens = 2; goto cpp_attribute; }
-#line 10021 "src/parser.c"
+#line 10023 "src/parser.c"
                }
-#line 470 "src/parser.re"
+#line 472 "src/parser.re"
 
 
        character: ;
                
-#line 10028 "src/parser.c"
+#line 10030 "src/parser.c"
                {
                        unsigned char yych;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -10038,17 +10040,17 @@ yy598:
                        }
 yy602:
                        ++cur;
-#line 488 "src/parser.re"
+#line 490 "src/parser.re"
                        { escaped = false; goto character; }
-#line 10044 "src/parser.c"
+#line 10046 "src/parser.c"
 yy604:
                        ++cur;
-#line 475 "src/parser.re"
+#line 477 "src/parser.re"
                        { NEWLINE(); goto character; }
-#line 10049 "src/parser.c"
+#line 10051 "src/parser.c"
 yy606:
                        ++cur;
-#line 477 "src/parser.re"
+#line 479 "src/parser.re"
                        {
                        if (escaped) {
                                escaped = false;
@@ -10060,19 +10062,19 @@ yy606:
                        token->flags = char_width;
                        goto start;
                }
-#line 10064 "src/parser.c"
+#line 10066 "src/parser.c"
 yy608:
                        ++cur;
-#line 476 "src/parser.re"
+#line 478 "src/parser.re"
                        { escaped = !escaped;  goto character; }
-#line 10069 "src/parser.c"
+#line 10071 "src/parser.c"
                }
-#line 490 "src/parser.re"
+#line 492 "src/parser.re"
 
 
        string: ;
                
-#line 10076 "src/parser.c"
+#line 10078 "src/parser.c"
                {
                        unsigned char yych;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -10086,17 +10088,17 @@ yy608:
                        }
 yy612:
                        ++cur;
-#line 508 "src/parser.re"
+#line 510 "src/parser.re"
                        { escaped = false; goto string; }
-#line 10092 "src/parser.c"
+#line 10094 "src/parser.c"
 yy614:
                        ++cur;
-#line 495 "src/parser.re"
+#line 497 "src/parser.re"
                        { NEWLINE(); goto string; }
-#line 10097 "src/parser.c"
+#line 10099 "src/parser.c"
 yy616:
                        ++cur;
-#line 497 "src/parser.re"
+#line 499 "src/parser.re"
                        {
                        if (escaped) {
                                escaped = false;
@@ -10108,19 +10110,19 @@ yy616:
                        token->flags = char_width;
                        goto start;
                }
-#line 10112 "src/parser.c"
+#line 10114 "src/parser.c"
 yy618:
                        ++cur;
-#line 496 "src/parser.re"
+#line 498 "src/parser.re"
                        { escaped = !escaped; goto string; }
-#line 10117 "src/parser.c"
+#line 10119 "src/parser.c"
                }
-#line 510 "src/parser.re"
+#line 512 "src/parser.re"
 
 
        comment: ;
                
-#line 10124 "src/parser.c"
+#line 10126 "src/parser.c"
                {
                        unsigned char yych;
                        if ((lim - cur) < 2) if (cur >= lim) goto done;;
@@ -10134,14 +10136,14 @@ yy618:
 yy622:
                        ++cur;
 yy623:
-#line 517 "src/parser.re"
+#line 519 "src/parser.re"
                        { goto comment; }
-#line 10140 "src/parser.c"
+#line 10142 "src/parser.c"
 yy624:
                        ++cur;
-#line 515 "src/parser.re"
+#line 517 "src/parser.re"
                        { NEWLINE(); goto comment; }
-#line 10145 "src/parser.c"
+#line 10147 "src/parser.c"
 yy626:
                        yych = *++cur;
                        switch (yych) {
@@ -10150,16 +10152,16 @@ yy626:
                        }
 yy627:
                        ++cur;
-#line 516 "src/parser.re"
+#line 518 "src/parser.re"
                        { NEWTOKEN(PSI_T_COMMENT); goto start; }
-#line 10156 "src/parser.c"
+#line 10158 "src/parser.c"
                }
-#line 519 "src/parser.re"
+#line 521 "src/parser.re"
 
 
        comment_sl: ;
                
-#line 10163 "src/parser.c"
+#line 10165 "src/parser.c"
                {
                        unsigned char yych;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -10171,22 +10173,22 @@ yy627:
                        }
 yy631:
                        ++cur;
-#line 525 "src/parser.re"
+#line 527 "src/parser.re"
                        { goto comment_sl; }
-#line 10177 "src/parser.c"
+#line 10179 "src/parser.c"
 yy633:
                        ++cur;
-#line 524 "src/parser.re"
+#line 526 "src/parser.re"
                        { NEWTOKEN(PSI_T_COMMENT); NEWLINE(); goto start; }
-#line 10182 "src/parser.c"
+#line 10184 "src/parser.c"
                }
-#line 527 "src/parser.re"
+#line 529 "src/parser.re"
 
 
        cpp_attribute: ;
 
                
-#line 10190 "src/parser.c"
+#line 10192 "src/parser.c"
                {
                        unsigned char yych;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -10200,26 +10202,26 @@ yy633:
                        }
 yy637:
                        ++cur;
-#line 536 "src/parser.re"
+#line 538 "src/parser.re"
                        { goto cpp_attribute; }
-#line 10206 "src/parser.c"
+#line 10208 "src/parser.c"
 yy639:
                        ++cur;
-#line 535 "src/parser.re"
+#line 537 "src/parser.re"
                        { NEWLINE(); goto cpp_attribute; }
-#line 10211 "src/parser.c"
+#line 10213 "src/parser.c"
 yy641:
                        ++cur;
-#line 533 "src/parser.re"
+#line 535 "src/parser.re"
                        { ++parens; goto cpp_attribute; }
-#line 10216 "src/parser.c"
+#line 10218 "src/parser.c"
 yy643:
                        ++cur;
-#line 534 "src/parser.re"
+#line 536 "src/parser.re"
                        { if (parens == 1) { NEWTOKEN(PSI_T_CPP_ATTRIBUTE); goto start; } else { --parens; goto cpp_attribute; } }
-#line 10221 "src/parser.c"
+#line 10223 "src/parser.c"
                }
-#line 538 "src/parser.re"
+#line 540 "src/parser.re"
 
 error: ;
 
index 261b2b9748e6b6c2f68a826578e0d9ec59c0fc70..7aef5f53f907b87fd0298ea9b11e9275ff6104ec 100644 (file)
@@ -51,6 +51,16 @@ struct psi_parser_input {
        char buffer[1];
 };
 
+static inline void psi_parser_input_free(struct psi_parser_input **I) {
+       if (*I) {
+               struct psi_parser_input *i = *I;
+
+               *I = NULL;
+               zend_string_release(i->file);
+               free(i);
+       }
+}
+
 struct psi_parser *psi_parser_init(struct psi_parser *P, psi_error_cb error, unsigned flags);
 struct psi_parser_input *psi_parser_open_file(struct psi_parser *P, const char *filename, bool report_errors);
 struct psi_parser_input *psi_parser_open_string(struct psi_parser *P, const char *string, size_t length);
index 2085a1288f9b14fa0d23d88f32f1d53f81c617d6..926cc7cf02a279dc38a4c9b8bf8d9c89ea430705 100644 (file)
@@ -164,19 +164,20 @@ void psi_parser_postprocess(struct psi_parser *P)
                                struct psi_const *cnst;
                                struct psi_num_exp *num;
                                smart_str ns_name = {0};
-                               zend_string *name_str;
+                               zend_string *name_str, *type_str;
 
                                smart_str_appendl_ex(&ns_name, ZEND_STRL("psi\\"), 1);
                                smart_str_append_ex(&ns_name, name, 1);
                                name_str = smart_str_extract(&ns_name);
+                               type_str = zend_string_init(ZEND_STRL("<eval number>"), 1);
 
                                num = psi_num_exp_copy(scope.macro->exp);
                                def = psi_impl_def_val_init(PSI_T_NUMBER, num);
-                               type = psi_impl_type_init(PSI_T_NUMBER,
-                                               zend_string_init(ZEND_STRL("<eval number>"), 1));
+                               type = psi_impl_type_init(PSI_T_NUMBER, type_str);
                                cnst = psi_const_init(type, name_str, def);
                                P->consts = psi_plist_add(P->consts, &cnst);
                                zend_string_release(name_str);
+                               zend_string_release(type_str);
                        }
                } else {
                        if (psi_plist_count(scope.macro->tokens) == 1) {
@@ -188,18 +189,19 @@ void psi_parser_postprocess(struct psi_parser *P)
                                                struct psi_impl_def_val *def;
                                                struct psi_const *cnst;
                                                smart_str ns_name = {0};
-                                               zend_string *name_str;
+                                               zend_string *name_str, *type_str;
 
                                                smart_str_appendl_ex(&ns_name, ZEND_STRL("psi\\"), 1);
                                                smart_str_append_ex(&ns_name, name, 1);
                                                name_str = smart_str_extract(&ns_name);
+                                               type_str = zend_string_init(ZEND_STRL("string"), 1);
 
-                                               type = psi_impl_type_init(PSI_T_STRING,
-                                                               zend_string_init(ZEND_STRL("string"), 1));
+                                               type = psi_impl_type_init(PSI_T_STRING, type_str);
                                                def = psi_impl_def_val_init(PSI_T_QUOTED_STRING, t->text);
                                                cnst = psi_const_init(type, name_str, def);
                                                P->consts = psi_plist_add(P->consts, &cnst);
                                                zend_string_release(name_str);
+                                               zend_string_release(type_str);
                                        }
                                }
                        }
index ff70d2ba3596158553af0e03275fb4ffcc381e7d..b239d6d086d73a6613e0fda99c54b0dc6344c1e9 100644 (file)
@@ -151,7 +151,7 @@ static inline void psi_parser_proc_deanon_typedef(struct psi_decl_arg *def)
        default:
                return;
        }
-       free(def->type->name);
+       zend_string_release(def->type->name);
        def->type->name = zend_string_copy(def->var->name);
 }
 static inline void psi_parser_proc_add_typedef(struct psi_parser *P, struct psi_decl_arg *def)
index 7101d0ef51ceb42644746d37199ca0e84315c43d..32e673b4d591287b0bec1662be750080a7f47c3c 100644 (file)
@@ -60,7 +60,7 @@ static inline void psi_parser_proc_deanon_typedef(struct psi_decl_arg *def)
        default:
                return;
        }
-       free(def->type->name);
+       zend_string_release(def->type->name);
        def->type->name = zend_string_copy(def->var->name);
 }
 static inline void psi_parser_proc_add_typedef(struct psi_parser *P, struct psi_decl_arg *def)
index 95eaf7a6f765db9793198c5226be8233f66364af..29dcb42657497bc1732bfa358f02d615c424324e 100644 (file)
@@ -91,7 +91,7 @@ struct psi_token *psi_token_cat(const char *sep, unsigned argc, ...) {
        T->type = PSI_T_NAME;
        T->file = zend_string_copy(T->file);
 
-       for (i = 0; i < argc; ++i) {
+       for (i = 1; i < argc; ++i) {
                struct psi_token *arg = va_arg(argv, struct psi_token *);
 
                if (sep_len && text.a) {
@@ -173,7 +173,7 @@ static inline uint64_t psi_hash(char *digest_buf, ...)
 uint64_t psi_token_hash(struct psi_token *t, char *digest_buf) {
        char loc_buf[48];
 
-       sprintf(digest_buf, "%u%u", t->line, t->col);
+       sprintf(loc_buf, "%u%u", t->line, t->col);
        return psi_hash(digest_buf, t->file->val, loc_buf, (char *) NULL);
 }
 
index 2df4854b47e4dfa8c598c48c2d137713577266d4..ded4db5b614ea86a548d3aa0a3f7dfb6f5f7154c 100644 (file)
@@ -73,10 +73,6 @@ void psi_cpp_exp_free(struct psi_cpp_exp **exp_ptr)
                switch (exp->type) {
                case PSI_T_WARNING:
                case PSI_T_ERROR:
-                       if (!exp->data.tok) {
-                               break;
-                       }
-                       /* no break */
                case PSI_T_UNDEF:
                case PSI_T_IFDEF:
                case PSI_T_IFNDEF:
index 56ba81d9b4dd956e1e3479658bc4dad0c4d9ea38..581eadd95d01858261b846ea76b1c99b2aaef702 100644 (file)
@@ -158,10 +158,11 @@ bool psi_decl_validate_nodl(struct psi_data *data, struct psi_decl *decl,
                struct psi_validate_scope *scope)
 {
        if (!decl->abi) {
-               decl->abi = psi_decl_abi_init(zend_string_init(ZEND_STRL("default"), 1));
+               decl->abi = psi_decl_abi_init(NULL);
        } else if (!psi_decl_abi_validate(data, decl->abi)) {
                data->error(data, decl->abi->token, PSI_WARNING,
-                               "Invalid calling convention: '%s'", decl->abi->token->text->val);
+                               "Invalid calling convention: '%s'",
+                               decl->abi->token->text->val);
                return false;
        }
        if (!psi_decl_arg_validate(data, decl->func, scope)) {
index 75de9daf60f5197ac69d30225ea954a1cc40bba9..bf05239a00ac9bc36bd7a7ffe7f73e3bc192c1bd 100644 (file)
@@ -29,7 +29,9 @@
 struct psi_decl_abi *psi_decl_abi_init(zend_string *convention)
 {
        struct psi_decl_abi *abi = calloc(1, sizeof(*abi));
-       abi->convention = zend_string_copy(convention);
+       abi->convention = convention
+                       ? zend_string_copy(convention)
+                       : zend_string_init(ZEND_STRL("default"), 1);
        return abi;
 }
 
index f9ed34766965ac8109b0618947bab22f25632bbc..40490387be2b13c6d7922ecc864093b3502d77b2 100644 (file)
@@ -264,7 +264,7 @@ struct psi_decl_arg *psi_decl_arg_get_by_var(struct psi_decl_var *var,
                return var->arg = arg;
        }
 
-       if (func && !zend_string_equals(var->name, func->var->name)) {
+       if (func && zend_string_equals(var->name, func->var->name)) {
                return var->arg = func;
        }
 
index c21226e04a8b764dd7e28811142d1c1e0f1c5161..fc4a5efd27e9b6b9d31190147291d2c811bacfa4 100644 (file)
@@ -115,8 +115,8 @@ void psi_decl_extvar_dump(int fd, struct psi_decl_extvar *evar)
 
 struct psi_decl *psi_decl_extvar_setter(struct psi_decl_extvar *evar)
 {
-       struct psi_decl_type *func_type = psi_decl_type_init(PSI_T_VOID,
-                       zend_string_init(ZEND_STRS("void"), 1));
+       zend_string *type_str = zend_string_init(ZEND_STRS("void"), 1);
+       struct psi_decl_type *func_type = psi_decl_type_init(PSI_T_VOID, type_str);
        struct psi_decl_var *func_var = psi_decl_var_copy(evar->arg->var);
        struct psi_decl_arg *func = psi_decl_arg_init(func_type, func_var);
        struct psi_decl_type *arg_type = psi_decl_type_copy(evar->arg->type);
@@ -126,6 +126,8 @@ struct psi_decl *psi_decl_extvar_setter(struct psi_decl_extvar *evar)
        struct psi_decl *decl = psi_decl_init(func, psi_plist_add(args, &arg));
        smart_str name = {0};
 
+       zend_string_release(type_str);
+
        func_var->pointer_level = 0;
        func_var->array_size = 0;
 
@@ -153,7 +155,7 @@ struct psi_decl *psi_decl_extvar_getter(struct psi_decl_extvar *evar)
        smart_str name = {0};
 
        smart_str_append_ex(&name, func_var->name, 1);
-       smart_str_appendl_ex(&name, ZEND_STRL("_set"), 1);
+       smart_str_appendl_ex(&name, ZEND_STRL("_get"), 1);
        zend_string_release(func_var->name);
        func_var->name = smart_str_extract(&name);
 
index cfe46c91e5b535b1807b88d8d5532696d5b7ce37..c2b8cc1779806b8582d150dcc30e87d11a2cf1a7 100644 (file)
@@ -177,7 +177,7 @@ bool psi_decl_struct_validate(struct psi_data *data, struct psi_decl_struct *s,
                        align = psi_decl_arg_align(darg, &pos, &len);
 
                        if (darg->layout) {
-                               if (darg->layout->pos != pos) {
+                               if (darg->layout->pos != pos && !darg->layout->bfw) {
                                        data->error(data, darg->token, PSI_WARNING,
                                                        "Computed offset %zu of %s.%s does not match"
                                                        " pre-defined offset %zu",
index 468d215ae3cdf8559488e78a780fe5b32762ce6e..ae8832fe8be6b61449c725ce80aa9a0a54fd04a2 100644 (file)
@@ -139,6 +139,7 @@ static inline bool validate_let_func_inner(struct psi_data *data,
 
                                if (name) {
                                        sub_arg = psi_decl_arg_get_by_name(sub_args, name);
+                                       zend_string_release(name);
                                }
                                if (!name || !sub_arg) {
                                        /* remove expr for portability with different struct members */
index e877e4089d176401daff56d0adfebf7de29be4ee..15505e21dedc8f4c1a4ea72e9dcf25ecceb60635 100644 (file)
@@ -156,9 +156,7 @@ void psi_number_free(struct psi_number **exp_ptr)
                struct psi_number *exp = *exp_ptr;
 
                *exp_ptr = NULL;
-               if (exp->token) {
-                       free(exp->token);
-               }
+               psi_token_free(&exp->token);
                switch (exp->type) {
                case PSI_T_INT8:
                case PSI_T_UINT8:
index 78e1aa56e96e5ea0f990fa80d0ce391cd8c844af..375f096982568e151fe0b744a9c0ed7df84905fa 100644 (file)
@@ -106,7 +106,7 @@ static inline bool psi_return_exp_validate_decl_args(struct psi_data *data,
        if (exp->args) {
                if (psi_plist_count(exp->args) != psi_plist_count(impl->decl->args)) {
                        data->error(data, exp->token, PSI_WARNING,
-                                       "Argument count of return statement of implementation '%s'"
+                                       "Argument count of return statement of implementation '%s' "
                                        "does not match argument count of declaration '%s'",
                                        impl->func->name->val, impl->decl->func->var->name->val);
                        return false;