ash: parser: Add syntax stack for recursive parsing
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 2 Apr 2018 10:35:04 +0000 (12:35 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 2 Apr 2018 11:15:37 +0000 (13:15 +0200)
commit216913c290fd2b88b744c04c0a2ef21fd1410ba9
tree906139aa9c6d05a091c55ab83d1bf547fe839f31
parente84212f8346741a2d4a04b40639c44fe519cf5a7
ash: parser: Add syntax stack for recursive parsing

This closes 10821.

Upstream patch:

    From: Herbert Xu <herbert@gondor.apana.org.au>
    Date: Fri, 9 Mar 2018 00:14:02 +0800
    parser: Add syntax stack for recursive parsing

    Without a stack of syntaxes we cannot correctly these two cases
    together:

            "${a#'$$'}"
            "${a#"${b-'$$'}"}"

    A recursive parser also helps in some other corner cases such
    as nested arithmetic expansion with paratheses.

    This patch adds a syntax stack allocated from the stack using
    alloca.  As a side-effect this allows us to remove the naked
    backslashes for patterns within double-quotes, which means that
    EXP_QPAT also has to go.

    This patch also fixes removes any backslashes that precede right
    braces when they are present within a parameter expansion context,
    and backslashes that precede double quotes within inner double
    quotes inside a parameter expansion in a here-document context.

    The idea of a recursive parser is based on a patch by Harald van
    Dijk.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
var_bash3, var_bash4 and var_bash6 tests are updated
with the output given by bash-4.3.43

With this patch, the following tests now pass for ash:

    dollar_repl_slash_bash2.tests
    squote_in_varexp2.tests
    squote_in_varexp.tests
    var_bash4.tests

function                                             old     new   delta
readtoken1                                          2615    2874    +259
synstack_push                                          -      54     +54
evalvar                                              574     571      -3
rmescapes                                            330     310     -20
subevalvar                                          1279    1258     -21
argstr                                              1146    1107     -39
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/4 up/down: 313/-83)           Total: 230 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
19 files changed:
shell/ash.c
shell/ash_test/ash-arith/arith_nested1.right [new file with mode: 0644]
shell/ash_test/ash-arith/arith_nested1.tests [new file with mode: 0755]
shell/ash_test/ash-quoting/squote_in_varexp3.right [new file with mode: 0644]
shell/ash_test/ash-quoting/squote_in_varexp3.tests [new file with mode: 0755]
shell/ash_test/ash-vars/var_bash3.right
shell/ash_test/ash-vars/var_bash4.right
shell/ash_test/ash-vars/var_bash6.right
shell/ash_test/ash-vars/var_bash6.tests
shell/ash_test/ash-vars/var_bash7.right [new file with mode: 0644]
shell/ash_test/ash-vars/var_bash7.tests [new file with mode: 0755]
shell/hush_test/hush-arith/arith_nested1.right [new file with mode: 0644]
shell/hush_test/hush-arith/arith_nested1.tests [new file with mode: 0755]
shell/hush_test/hush-quoting/squote_in_varexp3.right [new file with mode: 0644]
shell/hush_test/hush-quoting/squote_in_varexp3.tests [new file with mode: 0755]
shell/hush_test/hush-vars/var_bash3.right
shell/hush_test/hush-vars/var_bash4.right
shell/hush_test/hush-vars/var_bash6.right
shell/hush_test/hush-vars/var_bash6.tests