poke-devel
[Top][All Lists]
Advanced

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

[PATCH 1/2] pkl: Fix leaking of exceptions inside try blocks


From: Mohammad-Reza Nabipoor
Subject: [PATCH 1/2] pkl: Fix leaking of exceptions inside try blocks
Date: Sun, 26 Dec 2021 20:11:19 +0330

Without this patch the code generator leaves the exception(s) in
exception stack for the following code:

  try return something;
  catch {}

2021-12-26  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>

        * libpoke/pkl-ast.h (struct pkl_ast_return_stmt): Add new field
        `npopes` (number of `pope`s).
        (PKL_AST_RETURN_STMT_NPOPES): New macro.
        * libpoke/pkl-ast.c (pkl_ast_finish_returns_1): Add new arg `npopes`
        to count the `pope`s.
        (pkl_ast_finish_returns): Likewise.
        * libpoke/pkl-gen.c (pkl_gen_ps_return_stmt): Insert necessary `pope`
        instruction(s).
---
 ChangeLog         | 11 +++++++++++
 libpoke/pkl-ast.c | 24 +++++++++++++++---------
 libpoke/pkl-ast.h |  5 +++++
 libpoke/pkl-gen.c |  4 ++++
 4 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ad1af792..0432f5d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2021-12-26  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
+
+       * libpoke/pkl-ast.h (struct pkl_ast_return_stmt): Add new field
+       `npopes` (number of `pope`s).
+       (PKL_AST_RETURN_STMT_NPOPES): New macro.
+       * libpoke/pkl-ast.c (pkl_ast_finish_returns_1): Add new arg `npopes`
+       to count the `pope`s.
+       (pkl_ast_finish_returns): Likewise.
+       * libpoke/pkl-gen.c (pkl_gen_ps_return_stmt): Insert necessary `pope`
+       instruction(s).
+
 2021-12-24  Jose E. Marchesi  <jemarch@gnu.org>
 
        * libpoke/pkl-gen-builtins.pks: New file.
diff --git a/libpoke/pkl-ast.c b/libpoke/pkl-ast.c
index d0573a87..fdfccf99 100644
--- a/libpoke/pkl-ast.c
+++ b/libpoke/pkl-ast.c
@@ -2515,7 +2515,7 @@ pkl_ast_type_incr_step (pkl_ast ast, pkl_ast_node type)
 
 static void
 pkl_ast_finish_returns_1 (pkl_ast_node function, pkl_ast_node stmt,
-                          int *nframes, int *ndrops)
+                          int *nframes, int *ndrops, int *npopes)
 {
   /* STMT can be a statement or a declaration.  */
 
@@ -2525,6 +2525,7 @@ pkl_ast_finish_returns_1 (pkl_ast_node function, 
pkl_ast_node stmt,
       PKL_AST_RETURN_STMT_FUNCTION (stmt) = function; /* Note no ASTREF.  */
       PKL_AST_RETURN_STMT_NFRAMES (stmt) = *nframes;
       PKL_AST_RETURN_STMT_NDROPS (stmt) = *ndrops;
+      PKL_AST_RETURN_STMT_NPOPES (stmt) = *npopes;
       break;
     case PKL_AST_COMP_STMT:
       {
@@ -2533,7 +2534,7 @@ pkl_ast_finish_returns_1 (pkl_ast_node function, 
pkl_ast_node stmt,
         *nframes += 1;
         for (t = PKL_AST_COMP_STMT_STMTS (stmt); t;
              t = PKL_AST_CHAIN (t))
-          pkl_ast_finish_returns_1 (function, t, nframes, ndrops);
+          pkl_ast_finish_returns_1 (function, t, nframes, ndrops, npopes);
 
         /* Pop the frame of the compound itself.  */
         *nframes -= 1;
@@ -2542,11 +2543,11 @@ pkl_ast_finish_returns_1 (pkl_ast_node function, 
pkl_ast_node stmt,
     case PKL_AST_IF_STMT:
       pkl_ast_finish_returns_1 (function,
                                 PKL_AST_IF_STMT_THEN_STMT (stmt),
-                                nframes, ndrops);
+                                nframes, ndrops, npopes);
       if (PKL_AST_IF_STMT_ELSE_STMT (stmt))
         pkl_ast_finish_returns_1 (function,
                                   PKL_AST_IF_STMT_ELSE_STMT (stmt),
-                                  nframes, ndrops);
+                                  nframes, ndrops, npopes);
       break;
     case PKL_AST_LOOP_STMT:
       {
@@ -2554,23 +2555,27 @@ pkl_ast_finish_returns_1 (pkl_ast_node function, 
pkl_ast_node stmt,
           *ndrops += 3;
         pkl_ast_finish_returns_1 (function,
                                   PKL_AST_LOOP_STMT_BODY (stmt),
-                                  nframes, ndrops);
+                                  nframes, ndrops, npopes);
         if (PKL_AST_LOOP_STMT_ITERATOR (stmt))
           *ndrops -= 3;
         break;
       }
     case PKL_AST_TRY_CATCH_STMT:
+      *npopes += 1;
       pkl_ast_finish_returns_1 (function,
                                 PKL_AST_TRY_CATCH_STMT_CODE (stmt),
-                                nframes, ndrops);
+                                nframes, ndrops, npopes);
+      *npopes -= 1;
       pkl_ast_finish_returns_1 (function,
                                 PKL_AST_TRY_CATCH_STMT_HANDLER (stmt),
-                                nframes, ndrops);
+                                nframes, ndrops, npopes);
       break;
     case PKL_AST_TRY_UNTIL_STMT:
+      *npopes += 1;
       pkl_ast_finish_returns_1 (function,
                                 PKL_AST_TRY_UNTIL_STMT_CODE (stmt),
-                                nframes, ndrops);
+                                nframes, ndrops, npopes);
+      *npopes -= 1;
       break;
     case PKL_AST_DECL:
     case PKL_AST_EXP_STMT:
@@ -2592,8 +2597,9 @@ pkl_ast_finish_returns (pkl_ast_node function)
 {
   int nframes = 0;
   int ndrops = 0;
+  int npopes = 0;
   pkl_ast_finish_returns_1 (function, PKL_AST_FUNC_BODY (function),
-                            &nframes, &ndrops);
+                            &nframes, &ndrops, &npopes);
 }
 
 int
diff --git a/libpoke/pkl-ast.h b/libpoke/pkl-ast.h
index d5f42f65..e7e32247 100644
--- a/libpoke/pkl-ast.h
+++ b/libpoke/pkl-ast.h
@@ -1707,12 +1707,16 @@ pkl_ast_node pkl_ast_make_loop_stmt_iterator (pkl_ast 
ast,
    NDROPS is the number of stack elements to drop before returning
    from the function.
 
+   NPOPES is the number of exception stack elements to drop before
+   returning from the function.
+
    FUNCTION is the PKL_AST_FUNCTION containing this return
    statement. */
 
 #define PKL_AST_RETURN_STMT_EXP(AST) ((AST)->return_stmt.exp)
 #define PKL_AST_RETURN_STMT_NFRAMES(AST) ((AST)->return_stmt.nframes)
 #define PKL_AST_RETURN_STMT_NDROPS(AST) ((AST)->return_stmt.ndrops)
+#define PKL_AST_RETURN_STMT_NPOPES(AST) ((AST)->return_stmt.npopes)
 #define PKL_AST_RETURN_STMT_FUNCTION(AST) ((AST)->return_stmt.function)
 
 struct pkl_ast_return_stmt
@@ -1723,6 +1727,7 @@ struct pkl_ast_return_stmt
   union pkl_ast_node *function;
   int nframes;
   int ndrops;
+  int npopes;
 };
 
 pkl_ast_node pkl_ast_make_return_stmt (pkl_ast ast, pkl_ast_node exp);
diff --git a/libpoke/pkl-gen.c b/libpoke/pkl-gen.c
index bd5c1cf5..fd43b0ad 100644
--- a/libpoke/pkl-gen.c
+++ b/libpoke/pkl-gen.c
@@ -1259,6 +1259,10 @@ PKL_PHASE_BEGIN_HANDLER (pkl_gen_ps_return_stmt)
   pkl_ast_node return_stmt = PKL_PASS_NODE;
   pkl_ast_node function = PKL_AST_RETURN_STMT_FUNCTION (return_stmt);
   pkl_ast_node function_type = PKL_AST_TYPE (function);
+  int i;
+
+  for (i = 0; i < PKL_AST_RETURN_STMT_NPOPES (PKL_PASS_NODE); ++i)
+    pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPE);
 
   /* In a void function, return PVM_NULL in the stack.  */
   if (PKL_AST_TYPE_CODE (PKL_AST_TYPE_F_RTYPE (function_type))
-- 
2.34.1




reply via email to

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