[svn:parrot] r41023 - in trunk/src: . call gc

bacek at svn.parrot.org bacek at svn.parrot.org
Sun Sep 6 00:19:53 UTC 2009


Author: bacek
Date: Sun Sep  6 00:19:53 2009
New Revision: 41023
URL: https://trac.parrot.org/parrot/changeset/41023

Log:
[cage] Put asserts into accessing non-existing registers.

Also:
 * Initialise Context.pred_offset
 * Fix saving/restoring registers in parrot_fetch_args to preserve n_regs_used
 * Fix parrot_debugger to not set said registers.

Modified:
   trunk/src/call/pcc.c
   trunk/src/debug.c
   trunk/src/gc/alloc_register.c

Modified: trunk/src/call/pcc.c
==============================================================================
--- trunk/src/call/pcc.c	Sun Sep  6 00:02:34 2009	(r41022)
+++ trunk/src/call/pcc.c	Sun Sep  6 00:19:53 2009	(r41023)
@@ -1194,22 +1194,28 @@
     for (; key; key = VTABLE_shift_pmc(interp, key)) {
         /* register keys have to be cloned */
         if (PObj_get_FLAGS(key) & KEY_register_FLAG) {
+            INTVAL  n_regs_used[4];
             Regs_ni bp;
             Regs_ps bp_ps;
 
             /* clone sets key values according to refered register items */
             bp    = *Parrot_pcc_get_regs_ni(interp, CURRENT_CONTEXT(interp));
             bp_ps = *Parrot_pcc_get_regs_ps(interp, CURRENT_CONTEXT(interp));
+            memcpy(n_regs_used, CONTEXT(interp)->n_regs_used, 4 * sizeof (INTVAL));
 
             Parrot_pcc_set_regs_ni(interp, CURRENT_CONTEXT(interp),
                     Parrot_pcc_get_regs_ni(interp, st->src.ctx));
             Parrot_pcc_set_regs_ps(interp, CURRENT_CONTEXT(interp),
                     Parrot_pcc_get_regs_ps(interp, st->src.ctx));
+            memcpy(CONTEXT(interp)->n_regs_used,
+                    Parrot_pcc_get_context_struct(interp, st->src.ctx),
+                    4 * sizeof (INTVAL));
 
             UVal_pmc(st->val) = VTABLE_clone(interp, key);
 
             Parrot_pcc_set_regs_ni(interp, CURRENT_CONTEXT(interp), &bp);
             Parrot_pcc_set_regs_ps(interp, CURRENT_CONTEXT(interp), &bp_ps);
+            memcpy(CONTEXT(interp)->n_regs_used, n_regs_used, 4 * sizeof (INTVAL));
 
             return;
         }

Modified: trunk/src/debug.c
==============================================================================
--- trunk/src/debug.c	Sun Sep  6 00:02:34 2009	(r41022)
+++ trunk/src/debug.c	Sun Sep  6 00:19:53 2009	(r41023)
@@ -3211,14 +3211,29 @@
 
     switch (reg_type) {
         case 'I':
+                if (register_num >= Parrot_pcc_get_regs_used(interp,
+                                            CURRENT_CONTEXT(interp), REGNO_INT)) {
+                    fprintf(stderr, "I%ld = no such register\n", register_num);
+                    return;
+                }
                 t                  = REGNO_INT;
                 IREG(register_num) = get_ulong(&command, 0);
                 break;
         case 'N':
+                if (register_num >= Parrot_pcc_get_regs_used(interp,
+                                            CURRENT_CONTEXT(interp), REGNO_NUM)) {
+                    fprintf(stderr, "N%ld = no such register\n", register_num);
+                    return;
+                }
                 t                  = REGNO_NUM;
                 NREG(register_num) = atof(command);
                 break;
         case 'S':
+                if (register_num >= Parrot_pcc_get_regs_used(interp,
+                                            CURRENT_CONTEXT(interp), REGNO_NUM)) {
+                    fprintf(stderr, "S%ld = no such register\n", register_num);
+                    return;
+                }
                 t                  = REGNO_STR;
                 SREG(register_num) = Parrot_str_new(interp, command, strlen(command));
                 break;
@@ -3634,7 +3649,7 @@
     ASSERT_ARGS(GDB_print_reg)
     char * string;
 
-    if (n >= 0 && n < Parrot_pcc_get_regs_used(interp, CURRENT_CONTEXT(interp), t)) {
+    if (n >= 0 && (UINTVAL)n < Parrot_pcc_get_regs_used(interp, CURRENT_CONTEXT(interp), t)) {
         switch (t) {
             case REGNO_INT:
                 return Parrot_str_from_int(interp, IREG(n))->strstart;

Modified: trunk/src/gc/alloc_register.c
==============================================================================
--- trunk/src/gc/alloc_register.c	Sun Sep  6 00:02:34 2009	(r41022)
+++ trunk/src/gc/alloc_register.c	Sun Sep  6 00:19:53 2009	(r41023)
@@ -210,6 +210,7 @@
     ctx->current_object    = NULL;
     ctx->handlers          = PMCNULL;
     ctx->caller_ctx        = NULL;
+    ctx->pred_offset       = 0;
 
     if (old) {
         /* some items should better be COW copied */
@@ -488,6 +489,7 @@
 Parrot_pcc_get_INTVAL_reg(PARROT_INTERP, ARGIN(PMC *ctx), INTVAL idx)
 {
     ASSERT_ARGS(Parrot_pcc_get_INTVAL_reg)
+    PARROT_ASSERT(Parrot_pcc_get_regs_used(interp, ctx, REGNO_INT) > idx);
     return &(Parrot_pcc_get_context_struct(interp, ctx)->bp.regs_i[idx]);
 }
 
@@ -508,6 +510,7 @@
 Parrot_pcc_get_FLOATVAL_reg(PARROT_INTERP, ARGIN(PMC *ctx), INTVAL idx)
 {
     ASSERT_ARGS(Parrot_pcc_get_FLOATVAL_reg)
+    PARROT_ASSERT(Parrot_pcc_get_regs_used(interp, ctx, REGNO_NUM) > idx);
     return &(Parrot_pcc_get_context_struct(interp, ctx)->bp.regs_n[-1L - idx]);
 }
 
@@ -528,6 +531,7 @@
 Parrot_pcc_get_STRING_reg(PARROT_INTERP, ARGIN(PMC *ctx), INTVAL idx)
 {
     ASSERT_ARGS(Parrot_pcc_get_STRING_reg)
+    PARROT_ASSERT(Parrot_pcc_get_regs_used(interp, ctx, REGNO_STR) > idx);
     return &(Parrot_pcc_get_context_struct(interp, ctx)->bp_ps.regs_s[idx]);
 }
 
@@ -547,6 +551,7 @@
 Parrot_pcc_get_PMC_reg(PARROT_INTERP, ARGIN(PMC *ctx), INTVAL idx)
 {
     ASSERT_ARGS(Parrot_pcc_get_PMC_reg)
+    PARROT_ASSERT(Parrot_pcc_get_regs_used(interp, ctx, REGNO_PMC) > idx);
     return &(Parrot_pcc_get_context_struct(interp, ctx)->bp_ps.regs_p[-1L - idx]);
 }
 


More information about the parrot-commits mailing list