[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