poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3] pkl: trans: get rid of pkl_ast_finish_breaks


From: Jose E. Marchesi
Subject: Re: [PATCH v3] pkl: trans: get rid of pkl_ast_finish_breaks
Date: Sun, 17 Jul 2022 23:40:56 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)

Hi Mohammad.

This is OK for master.
Thank you!

> 2022-07-17  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
>
>       * libpoke/pkl-ast.h (pkl_ast_finish_breaks): Remove.
>       * libpoke/pkl-ast.c (pkl_ast_finish_breaks): Likewise.
>       (pkl_ast_finish_breaks_1): Likewise.
>       * libpoke/pkl-tab.y (stmt): Likewise.
>       * libpoke/pkl-trans.h (struct pkl_trans_escapable_ctx): New struct.
>       (PKL_TRANS_MAX_COMP_STMT_NEST): New macro.
>       (struct pkl_trans_payload): Add new fields.
>       * libpoke/pkl-trans.c (PKL_TRANS_ESCAPABLE): New macro.
>       (PKL_TRANS_PUSH_ESCAPABLE): Likewise.
>       (PKL_TRANS_POP_ESCAPABLE): Likewise.
>       (pkl_trans1_pr_comp_stmt): Add logic to track lexical frames around
>       `break` and `continue` keywords.
>       (pkl_trans1_ps_comp_stmt): Likewise.
>       (pkl_trans1_pr_loop_stmt): Likewise.
>       (pkl_trans1_ps_loop_stmt): Likewise.
>       (pkl_trans1_pr_try_stmt_body): Likewise.
>       (pkl_trans1_ps_try_stmt_body): Likewise.
>       (pkl_trans1_pr_try_stmt): New handler.
>       (pkl_trans1_ps_try_stmt): Likewise.
>       (pkl_trans1_pr_try_stmt_handler): Likewise.
>       (pkl_trans1_ps_try_stmt_handler): Likewise.
>       (pkl_trans1_ps_break_stmt): Likewise.
>       (pkl_trans1_ps_continue_stmt): Likewise.
>       (pkl_phase_trans1): Register new handlers.
> ---
>
> Hi Jose,
>
> Changes:
>   - Add comments for trans handlers.
>   - Fix typo (s/escapable/breakable).
>
>
> Regards,
> Mohammad-Reza
>
>
>  ChangeLog           |  27 +++++++++
>  libpoke/pkl-ast.c   |  91 ----------------------------
>  libpoke/pkl-ast.h   |   2 -
>  libpoke/pkl-tab.y   |  30 ----------
>  libpoke/pkl-trans.c | 140 ++++++++++++++++++++++++++++++++++++++++++--
>  libpoke/pkl-trans.h |  27 ++++++++-
>  6 files changed, 188 insertions(+), 129 deletions(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index d6763f64..85bacb64 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,30 @@
> +2022-07-17  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
> +
> +     * libpoke/pkl-ast.h (pkl_ast_finish_breaks): Remove.
> +     * libpoke/pkl-ast.c (pkl_ast_finish_breaks): Likewise.
> +     (pkl_ast_finish_breaks_1): Likewise.
> +     * libpoke/pkl-tab.y (stmt): Likewise.
> +     * libpoke/pkl-trans.h (struct pkl_trans_escapable_ctx): New struct.
> +     (PKL_TRANS_MAX_COMP_STMT_NEST): New macro.
> +     (struct pkl_trans_payload): Add new fields.
> +     * libpoke/pkl-trans.c (PKL_TRANS_ESCAPABLE): New macro.
> +     (PKL_TRANS_PUSH_ESCAPABLE): Likewise.
> +     (PKL_TRANS_POP_ESCAPABLE): Likewise.
> +     (pkl_trans1_pr_comp_stmt): Add logic to track lexical frames around
> +     `break` and `continue` keywords.
> +     (pkl_trans1_ps_comp_stmt): Likewise.
> +     (pkl_trans1_pr_loop_stmt): Likewise.
> +     (pkl_trans1_ps_loop_stmt): Likewise.
> +     (pkl_trans1_pr_try_stmt_body): Likewise.
> +     (pkl_trans1_ps_try_stmt_body): Likewise.
> +     (pkl_trans1_pr_try_stmt): New handler.
> +     (pkl_trans1_ps_try_stmt): Likewise.
> +     (pkl_trans1_pr_try_stmt_handler): Likewise.
> +     (pkl_trans1_ps_try_stmt_handler): Likewise.
> +     (pkl_trans1_ps_break_stmt): Likewise.
> +     (pkl_trans1_ps_continue_stmt): Likewise.
> +     (pkl_phase_trans1): Register new handlers.
> +
>  2022-07-17  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
>  
>       * etc/hacking.org (try_stmt): Update the topology.
> diff --git a/libpoke/pkl-ast.c b/libpoke/pkl-ast.c
> index 48d3e76c..697e70e8 100644
> --- a/libpoke/pkl-ast.c
> +++ b/libpoke/pkl-ast.c
> @@ -2644,97 +2644,6 @@ pkl_ast_reverse (pkl_ast_node ast)
>    return prev;
>  }
>  
> -/* Annotate the break and continue statements within a given entity
> -   (loop or switch or...) with a pointer to the entity and their
> -   lexical nest level within the entity.  */
> -
> -static void
> -pkl_ast_finish_breaks_1 (pkl_ast_node entity, pkl_ast_node stmt,
> -                         int *nframes)
> -{
> -  /* STMT can be a statement or a declaration.  */
> -
> -  switch (PKL_AST_CODE (stmt))
> -    {
> -    case PKL_AST_BREAK_STMT:
> -      PKL_AST_BREAK_STMT_ENTITY (stmt) = entity; /* Note no ASTREF */
> -      PKL_AST_BREAK_STMT_NFRAMES (stmt) = *nframes;
> -      break;
> -    case PKL_AST_CONTINUE_STMT:
> -      PKL_AST_CONTINUE_STMT_ENTITY (stmt) = entity; /* Note no ASTREF */
> -      PKL_AST_CONTINUE_STMT_NFRAMES (stmt) = *nframes;
> -      break;
> -    case PKL_AST_COMP_STMT:
> -      {
> -        pkl_ast_node t;
> -
> -        *nframes += 1;
> -        for (t = PKL_AST_COMP_STMT_STMTS (stmt); t;
> -             t = PKL_AST_CHAIN (t))
> -          pkl_ast_finish_breaks_1 (entity, t, nframes);
> -
> -        /* Pop the frame of the compound itself.  */
> -        *nframes -= 1;
> -        break;
> -      }
> -    case PKL_AST_IF_STMT:
> -      pkl_ast_finish_breaks_1 (entity,
> -                               PKL_AST_IF_STMT_THEN_STMT (stmt),
> -                               nframes);
> -      if (PKL_AST_IF_STMT_ELSE_STMT (stmt))
> -        pkl_ast_finish_breaks_1 (entity,
> -                                 PKL_AST_IF_STMT_ELSE_STMT (stmt),
> -                                 nframes);
> -      break;
> -    case PKL_AST_TRY_STMT_BODY:
> -      pkl_ast_finish_breaks_1 (entity,
> -                               PKL_AST_TRY_STMT_BODY_CODE (stmt),
> -                               nframes);
> -      break;
> -    case PKL_AST_TRY_STMT_HANDLER:
> -      pkl_ast_finish_breaks_1 (entity,
> -                               PKL_AST_TRY_STMT_HANDLER_CODE (stmt),
> -                               nframes);
> -      break;
> -    case PKL_AST_TRY_STMT:
> -      pkl_ast_finish_breaks_1 (entity,
> -                               PKL_AST_TRY_STMT_BODY (stmt),
> -                               nframes);
> -
> -      if (PKL_AST_TRY_STMT_KIND (stmt) == PKL_AST_TRY_STMT_KIND_CATCH)
> -        {
> -          if (PKL_AST_TRY_STMT_ARG (stmt))
> -            *nframes += 1;
> -          pkl_ast_finish_breaks_1 (entity,
> -                                   PKL_AST_TRY_STMT_HANDLER (stmt),
> -                                   nframes);
> -          if (PKL_AST_TRY_STMT_ARG (stmt))
> -            *nframes -=1;
> -        }
> -      break;
> -    case PKL_AST_DECL:
> -    case PKL_AST_RETURN_STMT:
> -    case PKL_AST_LOOP_STMT:
> -    case PKL_AST_LOOP_STMT_ITERATOR:
> -    case PKL_AST_EXP_STMT:
> -    case PKL_AST_ASS_STMT:
> -    case PKL_AST_PRINT_STMT:
> -    case PKL_AST_RAISE_STMT:
> -    case PKL_AST_NULL_STMT:
> -      break;
> -    default:
> -      assert (0);
> -      break;
> -    }
> -}
> -
> -void
> -pkl_ast_finish_breaks (pkl_ast_node entity, pkl_ast_node stmt)
> -{
> -  int nframes = 0;
> -  pkl_ast_finish_breaks_1 (entity, stmt, &nframes);
> -}
> -
>  pkl_ast_node
>  pkl_ast_type_incr_step (pkl_ast ast, pkl_ast_node type)
>  {
> diff --git a/libpoke/pkl-ast.h b/libpoke/pkl-ast.h
> index 6ad9992a..3f3bca7a 100644
> --- a/libpoke/pkl-ast.h
> +++ b/libpoke/pkl-ast.h
> @@ -1928,8 +1928,6 @@ struct pkl_ast_break_stmt
>  
>  pkl_ast_node pkl_ast_make_break_stmt (pkl_ast ast);
>  
> -void pkl_ast_finish_breaks (pkl_ast_node entity, pkl_ast_node stmt);
> -
>  /* PKL_AST_RAISE_STMT nodes represent `raise' statements, which are
>     used in order to raise exceptions at the program level.
>  
> diff --git a/libpoke/pkl-tab.y b/libpoke/pkl-tab.y
> index 89328436..a7675ab0 100644
> --- a/libpoke/pkl-tab.y
> +++ b/libpoke/pkl-tab.y
> @@ -2334,11 +2334,6 @@ stmt:
>                                                 NULL, /* tail */
>                                                 $5);  /* body */
>                    PKL_AST_LOC ($$) = @$;
> -
> -                  /* Annotate the contained BREAK and CONTINUE
> -                     statements with their lexical level within this
> -                     loop.  */
> -                  pkl_ast_finish_breaks ($$, $5);
>                  }
>          | FOR '(' pushlevel simple_declaration ';' expression_opt ';' 
> simple_stmt_list ')' stmt
>                  {
> @@ -2351,11 +2346,6 @@ stmt:
>                                                 $10); /* body */
>                    PKL_AST_LOC ($$) = @$;
>  
> -                  /* Annotate the contained BREAK and CONTINUE
> -                     statements with their lexical level within this
> -                     loop.  */
> -                  pkl_ast_finish_breaks ($$, $10);
> -
>                    /* Pop the frame introduced by `pushlevel'
>                       above.  */
>                    pkl_parser->env = pkl_env_pop_frame (pkl_parser->env);
> @@ -2370,11 +2360,6 @@ stmt:
>                                                 $6,   /* tail */
>                                                 $8);  /* body */
>  
> -                  /* Annotate the contained BREAK and CONTINUE
> -                     statements with their lexical level within this
> -                     loop.  */
> -                  pkl_ast_finish_breaks ($$, $8);
> -
>                    PKL_AST_LOC ($$) = @$;
>                  }
>          | FOR '(' IDENTIFIER IN expression pushlevel
> @@ -2421,11 +2406,6 @@ stmt:
>                    /* Free the identifier.  */
>                    $3 = ASTREF ($3); pkl_ast_node_free ($3);
>  
> -                  /* Annotate the contained BREAK and CONTINUE
> -                     statements with their lexical level within this
> -                     loop.  */
> -                  pkl_ast_finish_breaks ($$, $9);
> -
>                    /* Pop the frame introduced by `pushlevel'
>                       above.  */
>                    pkl_parser->env = pkl_env_pop_frame (pkl_parser->env);
> @@ -2474,11 +2454,6 @@ stmt:
>                    PKL_AST_LOC ($3) = @3;
>                    PKL_AST_LOC ($$) = @$;
>  
> -                  /* Annotate the contained BREAK and CONTINUE
> -                     statements with their lexical level within this
> -                     loop.  */
> -                  pkl_ast_finish_breaks ($$, $11);
> -
>                    /* Pop the frame introduced by `pushlevel'
>                       above.  */
>                    pkl_parser->env = pkl_env_pop_frame (pkl_parser->env);
> @@ -2562,11 +2537,6 @@ stmt:
>                                                NULL /* arg */, $4);
>                    PKL_AST_LOC (body) = @2;
>                    PKL_AST_LOC ($$) = @$;
> -
> -                  /* Annotate the contained BREAK and CONTINUE
> -                     statements with their lexical level within this
> -                     loop.  */
> -                  pkl_ast_finish_breaks ($$, $2);
>                  }
>          | RAISE ';'
>                  {
> diff --git a/libpoke/pkl-trans.c b/libpoke/pkl-trans.c
> index 768c8023..11be7a8a 100644
> --- a/libpoke/pkl-trans.c
> +++ b/libpoke/pkl-trans.c
> @@ -107,6 +107,32 @@ pkl_trans_in_functions (struct pkl_trans_function_ctx 
> functions[],
>      }                                                           \
>    while (0)
>  
> +/* Handling of the stack of escapable constructions.  */
> +
> +#define PKL_TRANS_ESCAPABLE                                     \
> +  (PKL_TRANS_PAYLOAD->next_escapable == 0                       \
> +   ? NULL                                                       \
> +   : &PKL_TRANS_PAYLOAD->escapables[PKL_TRANS_PAYLOAD->next_escapable - 1])
> +
> +#define PKL_TRANS_PUSH_ESCAPABLE(b)                             \
> +  do                                                            \
> +    {                                                           \
> +      assert (PKL_TRANS_PAYLOAD->next_escapable < 
> PKL_TRANS_MAX_COMP_STMT_NEST);\
> +      
> PKL_TRANS_PAYLOAD->escapables[PKL_TRANS_PAYLOAD->next_escapable].nframes  \
> +        = 0;                                                    \
> +      
> PKL_TRANS_PAYLOAD->escapables[PKL_TRANS_PAYLOAD->next_escapable++].node \
> +        = (b);                                                  \
> +    }                                                           \
> +  while (0)
> +
> +#define PKL_TRANS_POP_ESCAPABLE                                 \
> +  do                                                            \
> +    {                                                           \
> +      assert (PKL_TRANS_PAYLOAD->next_escapable > 0);           \
> +      PKL_TRANS_PAYLOAD->next_escapable--;                      \
> +    }                                                           \
> +  while (0)
> +
>  /* The following handler is used in all trans phases and initializes
>     the phase payload.  */
>  
> @@ -1101,6 +1127,9 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_pr_comp_stmt)
>            PKL_TRANS_FUNCTION->npopes++;
>          }
>      }
> +
> +  if (PKL_TRANS_ESCAPABLE)
> +    PKL_TRANS_ESCAPABLE->nframes++;
>  }
>  PKL_PHASE_END_HANDLER
>  
> @@ -1115,7 +1144,12 @@ PKL_PHASE_BEGIN_HANDLER 
> (pkl_trans1_ps_loop_stmt_iterator)
>  }
>  PKL_PHASE_END_HANDLER
>  
> -/* Likewise.  */
> +/* FOR statements introduce a lexical level if they use an iterator
> +   or have a head of declarations.  Update the current function
> +   context accordingly.
> +
> +   FOR statements are escapable constructs, push it to current
> +   escapables stack.  */
>  
>  PKL_PHASE_BEGIN_HANDLER (pkl_trans1_pr_loop_stmt)
>  {
> @@ -1130,10 +1164,12 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_pr_loop_stmt)
>  
>    if (PKL_TRANS_FUNCTION && PKL_AST_LOOP_STMT_ITERATOR (stmt))
>      PKL_TRANS_FUNCTION->ndrops += 3;
> +
> +  PKL_TRANS_PUSH_ESCAPABLE (stmt);
>  }
>  PKL_PHASE_END_HANDLER
>  
> -/* Likewise.  */
> +/* Revert what we did in `pkl_trans1_pr_loop_stmt'.  */
>  
>  PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_loop_stmt)
>  {
> @@ -1146,6 +1182,8 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_loop_stmt)
>    if (PKL_TRANS_FUNCTION
>        && (PKL_TRANS_FUNCTION && PKL_AST_LOOP_STMT_ITERATOR (stmt)))
>      PKL_TRANS_FUNCTION->ndrops -= 3;
> +
> +  PKL_TRANS_POP_ESCAPABLE;
>  }
>  PKL_PHASE_END_HANDLER
>  
> @@ -1153,7 +1191,7 @@ PKL_PHASE_END_HANDLER
>     function declarations occurring in the statement.
>  
>     Compound statements introduce a lexical level.  Update the current
> -   function context accordingly.
> +   function context and current escapable context accordingly.
>  
>     If the compound statement is the first operand of an excond
>     operator, then it increases the number of exception handlers that
> @@ -1189,6 +1227,9 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_comp_stmt)
>            PKL_TRANS_FUNCTION->npopes--;
>          }
>      }
> +
> +  if (PKL_TRANS_ESCAPABLE)
> +    PKL_TRANS_ESCAPABLE->nframes--;
>  }
>  PKL_PHASE_END_HANDLER
>  
> @@ -1238,23 +1279,106 @@ PKL_PHASE_END_HANDLER
>  
>  /* The body of a try statement increases the number of exception
>     handlers that need to be eventually poped.  Update the current
> -   function context accordingly.   */
> +   function context accordingly.
> +
> +   try-until statements are escapable constructs.  Update escapables
> +   stack accordingly.  */
>  
>  PKL_PHASE_BEGIN_HANDLER (pkl_trans1_pr_try_stmt_body)
>  {
>    if (PKL_TRANS_FUNCTION)
>      PKL_TRANS_FUNCTION->npopes++;
> +
> +  if (PKL_AST_TRY_STMT_KIND (PKL_PASS_PARENT) == PKL_AST_TRY_STMT_KIND_UNTIL)
> +    PKL_TRANS_PUSH_ESCAPABLE (PKL_PASS_PARENT);
>  }
>  PKL_PHASE_END_HANDLER
>  
>  /* The body of a try statement increases the number of exception
>     handlers that need to be eventually poped.  Update the current
> -   function context accordingly.   */
> +   function context accordingly.
> +
> +   try-until statements are escapable constructs.  Update escapables
> +   stack accordingly.  */
>  
>  PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_try_stmt_body)
>  {
>    if (PKL_TRANS_FUNCTION)
>      PKL_TRANS_FUNCTION->npopes--;
> +
> +  if (PKL_AST_TRY_STMT_KIND (PKL_PASS_PARENT) == PKL_AST_TRY_STMT_KIND_UNTIL)
> +    PKL_TRANS_POP_ESCAPABLE;
> +}
> +PKL_PHASE_END_HANDLER
> +
> +/* The handler of a try-catch statement introduces a new lexical
> +   level for escapable constructs.  Update the current escapable
> +   context.  */
> +
> +PKL_PHASE_BEGIN_HANDLER (pkl_trans1_pr_try_stmt_handler)
> +{
> +  if (PKL_TRANS_ESCAPABLE)
> +    PKL_TRANS_ESCAPABLE->nframes++;
> +}
> +PKL_PHASE_END_HANDLER
> +
> +/* Likewise.  */
> +
> +PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_try_stmt_handler)
> +{
> +  if (PKL_TRANS_ESCAPABLE)
> +    PKL_TRANS_ESCAPABLE->nframes--;
> +}
> +PKL_PHASE_END_HANDLER
> +
> +/* try-until statements are escapable constructs.  Update escapables
> +   stack accordingly.  */
> +
> +PKL_PHASE_BEGIN_HANDLER (pkl_trans1_pr_try_stmt)
> +{
> +  if (PKL_AST_TRY_STMT_KIND (PKL_PASS_NODE) == PKL_AST_TRY_STMT_KIND_UNTIL)
> +    PKL_TRANS_PUSH_ESCAPABLE (PKL_PASS_NODE);
> +}
> +PKL_PHASE_END_HANDLER
> +
> +/* Likewise.  */
> +
> +PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_try_stmt)
> +{
> +  if (PKL_AST_TRY_STMT_KIND (PKL_PASS_NODE) == PKL_AST_TRY_STMT_KIND_UNTIL)
> +    PKL_TRANS_POP_ESCAPABLE;
> +}
> +PKL_PHASE_END_HANDLER
> +
> +/* Annotate break statements with enclosing escapable construct, and
> +   with their lexical nesting level with respect to the enclosing
> +   escapable construct.  */
> +
> +PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_break_stmt)
> +{
> +  if (PKL_TRANS_ESCAPABLE)
> +    {
> +      PKL_AST_BREAK_STMT_ENTITY (PKL_PASS_NODE)
> +        = PKL_TRANS_ESCAPABLE->node;
> +      PKL_AST_BREAK_STMT_NFRAMES (PKL_PASS_NODE)
> +        = PKL_TRANS_ESCAPABLE->nframes;
> +    }
> +}
> +PKL_PHASE_END_HANDLER
> +
> +/* Annotate continue statements with enclosing escapable construct,
> +   and with their lexical nesting level with respect to the enclosing
> +   escapable construct.  */
> +
> +PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_continue_stmt)
> +{
> +  if (PKL_TRANS_ESCAPABLE)
> +    {
> +      PKL_AST_CONTINUE_STMT_ENTITY (PKL_PASS_NODE)
> +        = PKL_TRANS_ESCAPABLE->node;
> +      PKL_AST_CONTINUE_STMT_NFRAMES (PKL_PASS_NODE)
> +        = PKL_TRANS_ESCAPABLE->nframes;
> +    }
>  }
>  PKL_PHASE_END_HANDLER
>  
> @@ -1292,7 +1416,13 @@ struct pkl_phase pkl_phase_trans1 =
>     PKL_PHASE_PS_HANDLER (PKL_AST_LOOP_STMT_ITERATOR, 
> pkl_trans1_ps_loop_stmt_iterator),
>     PKL_PHASE_PR_HANDLER (PKL_AST_LOOP_STMT, pkl_trans1_pr_loop_stmt),
>     PKL_PHASE_PS_HANDLER (PKL_AST_LOOP_STMT, pkl_trans1_ps_loop_stmt),
> +   PKL_PHASE_PS_HANDLER (PKL_AST_BREAK_STMT, pkl_trans1_ps_break_stmt),
> +   PKL_PHASE_PS_HANDLER (PKL_AST_CONTINUE_STMT, pkl_trans1_ps_continue_stmt),
> +   PKL_PHASE_PR_HANDLER (PKL_AST_TRY_STMT_BODY, pkl_trans1_pr_try_stmt),
> +   PKL_PHASE_PS_HANDLER (PKL_AST_TRY_STMT_BODY, pkl_trans1_ps_try_stmt),
>     PKL_PHASE_PR_HANDLER (PKL_AST_TRY_STMT_BODY, pkl_trans1_pr_try_stmt_body),
> +   PKL_PHASE_PS_HANDLER (PKL_AST_TRY_STMT_HANDLER, 
> pkl_trans1_ps_try_stmt_handler),
> +   PKL_PHASE_PR_HANDLER (PKL_AST_TRY_STMT_HANDLER, 
> pkl_trans1_pr_try_stmt_handler),
>     PKL_PHASE_PS_HANDLER (PKL_AST_TRY_STMT_BODY, pkl_trans1_ps_try_stmt_body),
>     PKL_PHASE_PR_HANDLER (PKL_AST_STRUCT_TYPE_FIELD, 
> pkl_trans1_pr_struct_type_field),
>     PKL_PHASE_PS_HANDLER (PKL_AST_STRUCT_TYPE_FIELD, 
> pkl_trans1_ps_struct_type_field),
> diff --git a/libpoke/pkl-trans.h b/libpoke/pkl-trans.h
> index 8d3b1f6f..5a220e3d 100644
> --- a/libpoke/pkl-trans.h
> +++ b/libpoke/pkl-trans.h
> @@ -53,6 +53,23 @@ struct pkl_trans_function_ctx
>    struct pkl_trans_function_ctx *next;
>  };
>  
> +/* The trans phases keep a stack of escapable entities (loops and
> +   try-until statements) and the corresponding `break' and `continue'
> +   keywords, while they operate on the AST.
> +
> +   The following struct implements each entry on the breakable/continuable
> +   entities stack.
> +
> +   NODE is the escapable entity (loop or try-until statement).
> +
> +   NFRAMES is the number of frames in the body of NODE.  */
> +
> +struct pkl_trans_escapable_ctx
> +{
> +  pkl_ast_node node;
> +  int nframes;
> +};
> +
>  /* The following struct defines the payload of the trans phases.
>  
>     ERRORS is the number of errors detected while running the phase.
> @@ -69,10 +86,16 @@ struct pkl_trans_function_ctx
>     when mapping and writing integral types.
>  
>     CUR_ENDIAN is the index to ENDIAN and marks the top of the stack of
> -   endianness.  Initially PKL_AST_ENDIAN_DFL.  */
> +   endianness.  Initially PKL_AST_ENDIAN_DFL.
> +
> +   ESCAPABLES is a stack of escapables.
> +
> +   NEXT_ESCAPABLE - 1 is the index for the enclosing escapable
> +   entity.  */
>  
>  #define PKL_TRANS_MAX_FUNCTION_NEST 32
>  #define PKL_TRANS_MAX_ENDIAN 25
> +#define PKL_TRANS_MAX_COMP_STMT_NEST 32
>  
>  struct pkl_trans_payload
>  {
> @@ -82,6 +105,8 @@ struct pkl_trans_payload
>    int next_function;
>    enum pkl_ast_endian endian[PKL_TRANS_MAX_ENDIAN];
>    int cur_endian;
> +  struct pkl_trans_escapable_ctx escapables[PKL_TRANS_MAX_COMP_STMT_NEST];
> +  int next_escapable;
>  };
>  
>  typedef struct pkl_trans_payload *pkl_trans_payload;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]