[svn:parrot] r44404 - branches/boehm_gc_2/compilers/imcc

bacek at svn.parrot.org bacek at svn.parrot.org
Tue Feb 23 21:02:02 UTC 2010


Author: bacek
Date: Tue Feb 23 21:02:00 2010
New Revision: 44404
URL: https://trac.parrot.org/parrot/changeset/44404

Log:
More GC allocations in IMCC

Modified:
   branches/boehm_gc_2/compilers/imcc/cfg.c
   branches/boehm_gc_2/compilers/imcc/cfg.h
   branches/boehm_gc_2/compilers/imcc/imc.c
   branches/boehm_gc_2/compilers/imcc/imc.h
   branches/boehm_gc_2/compilers/imcc/imcc.l
   branches/boehm_gc_2/compilers/imcc/imcc.y
   branches/boehm_gc_2/compilers/imcc/imclexer.c
   branches/boehm_gc_2/compilers/imcc/imcparser.c
   branches/boehm_gc_2/compilers/imcc/instructions.c
   branches/boehm_gc_2/compilers/imcc/instructions.h
   branches/boehm_gc_2/compilers/imcc/main.c
   branches/boehm_gc_2/compilers/imcc/optimizer.c
   branches/boehm_gc_2/compilers/imcc/parser_util.c
   branches/boehm_gc_2/compilers/imcc/pbc.c
   branches/boehm_gc_2/compilers/imcc/pcc.c
   branches/boehm_gc_2/compilers/imcc/reg_alloc.c
   branches/boehm_gc_2/compilers/imcc/sets.c
   branches/boehm_gc_2/compilers/imcc/sets.h
   branches/boehm_gc_2/compilers/imcc/symreg.c
   branches/boehm_gc_2/compilers/imcc/symreg.h

Modified: branches/boehm_gc_2/compilers/imcc/cfg.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/cfg.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/cfg.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -83,9 +83,12 @@
         __attribute__nonnull__(4)
         FUNC_MODIFIES(*unit);
 
-static void bb_remove_edge(ARGMOD(IMC_Unit *unit), ARGMOD(Edge *edge))
+static void bb_remove_edge(PARROT_INTERP,
+    ARGMOD(IMC_Unit *unit),
+    ARGMOD(Edge *edge))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
+        __attribute__nonnull__(3)
         FUNC_MODIFIES(*unit)
         FUNC_MODIFIES(*edge);
 
@@ -97,20 +100,24 @@
         __attribute__nonnull__(2)
         __attribute__nonnull__(3);
 
-static void free_dominance_frontiers(ARGMOD(IMC_Unit *unit))
+static void free_dominance_frontiers(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*unit);
 
-static void free_dominators(ARGMOD(IMC_Unit *unit))
+static void free_dominators(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*unit);
 
-static void free_edge(ARGMOD(IMC_Unit *unit))
+static void free_edge(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*unit);
 
-static void free_loops(ARGMOD(IMC_Unit *unit))
+static void free_loops(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*unit);
 
 static void init_basic_blocks(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
@@ -173,20 +180,25 @@
     , PARROT_ASSERT_ARG(from) \
     , PARROT_ASSERT_ARG(label))
 #define ASSERT_ARGS_bb_remove_edge __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit) \
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(edge))
 #define ASSERT_ARGS_check_invoke_type __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(ins))
 #define ASSERT_ARGS_free_dominance_frontiers __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit))
 #define ASSERT_ARGS_free_dominators __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit))
 #define ASSERT_ARGS_free_edge __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit))
 #define ASSERT_ARGS_free_loops __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit))
 #define ASSERT_ARGS_init_basic_blocks __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit))
@@ -461,7 +473,7 @@
             if (!bb->pred_list) {
                 /* Remove all successor edges of block bb */
                 while (bb->succ_list) {
-                    bb_remove_edge(unit, bb->succ_list);
+                    bb_remove_edge(interp, unit, bb->succ_list);
                     IMCC_debug(interp, DEBUG_CFG,
                             "remove edge from bb: %d\n", bb->index);
                     changes = 1;
@@ -594,7 +606,7 @@
 
 /*
 
-=item C<static void bb_remove_edge(IMC_Unit *unit, Edge *edge)>
+=item C<static void bb_remove_edge(PARROT_INTERP, IMC_Unit *unit, Edge *edge)>
 
 Removes the given edge from the graph.
 
@@ -603,7 +615,7 @@
 */
 
 static void
-bb_remove_edge(ARGMOD(IMC_Unit *unit), ARGMOD(Edge *edge))
+bb_remove_edge(PARROT_INTERP, ARGMOD(IMC_Unit *unit), ARGMOD(Edge *edge))
 {
     ASSERT_ARGS(bb_remove_edge)
     if (edge->from->succ_list == edge) {
@@ -632,14 +644,14 @@
 
     if (unit->edge_list == edge) {
         unit->edge_list = edge->next;
-        mem_sys_free(edge);
+        mem_gc_free(interp, edge);
     }
     else {
         Edge *prev;
         for (prev = unit->edge_list; prev; prev = prev->next) {
             if (prev->next == edge) {
                 prev->next = edge->next;
-                mem_sys_free(edge);
+                mem_gc_free(interp, edge);
                 break;
             }
         }
@@ -649,7 +661,7 @@
 
 /*
 
-=item C<static void free_edge(IMC_Unit *unit)>
+=item C<static void free_edge(PARROT_INTERP, IMC_Unit *unit)>
 
 Frees the memory of an IMC_Unit's edge list.
 
@@ -658,14 +670,14 @@
 */
 
 static void
-free_edge(ARGMOD(IMC_Unit *unit))
+free_edge(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
 {
     ASSERT_ARGS(free_edge)
     Edge *e;
 
     for (e = unit->edge_list; e;) {
         Edge * const next = e->next;
-        mem_sys_free(e);
+        mem_gc_free(interp, e);
         e = next;
     }
 
@@ -747,7 +759,7 @@
 #endif
 
     if (r->life_info)
-        free_life_info(unit, r);
+        free_life_info(interp, unit, r);
 
     r->life_info = mem_gc_allocate_n_zeroed_typed(interp, unit->n_basic_blocks,
                                                Life_range *);
@@ -791,7 +803,7 @@
 
 /*
 
-=item C<void free_life_info(const IMC_Unit *unit, SymReg *r)>
+=item C<void free_life_info(PARROT_INTERP, const IMC_Unit *unit, SymReg *r)>
 
 Frees memory of the life analysis info structures.
 
@@ -800,7 +812,7 @@
 */
 
 void
-free_life_info(ARGIN(const IMC_Unit *unit), ARGMOD(SymReg *r))
+free_life_info(PARROT_INTERP, ARGIN(const IMC_Unit *unit), ARGMOD(SymReg *r))
 {
     ASSERT_ARGS(free_life_info)
 #if IMC_TRACE_HIGH
@@ -810,10 +822,10 @@
         unsigned int i;
 
         for (i = 0; i < unit->n_basic_blocks; i++) {
-            mem_sys_free(r->life_info[i]);
+            mem_gc_free(interp, r->life_info[i]);
         }
 
-        mem_sys_free(r->life_info);
+        mem_gc_free(interp, r->life_info);
         r->life_info = NULL;
     }
 }
@@ -1005,7 +1017,7 @@
     unit->dominators     = dominators;
 
     dominators[0]        = set_make(interp, n);
-    set_add(dominators[0], 0);
+    set_add(interp, dominators[0], 0);
 
     for (i = n - 1; i; --i) {
         if (unit->bb_list[i]->pred_list) {
@@ -1013,7 +1025,7 @@
         }
         else {
             dominators[i] = set_make(interp, n);
-            set_add(dominators[i], i);
+            set_add(interp, dominators[i], i);
         }
     }
 
@@ -1059,15 +1071,15 @@
                 set_intersec_inplace(s, dominators[pred_index]);
             }
 
-            set_add(s, i);
+            set_add(interp, s, i);
 
             if (! set_equal(dominators[i], s)) {
                 change = 1;
-                set_free(dominators[i]);
+                set_free(interp, dominators[i]);
                 dominators[i] = s;
             }
             else
-                set_free(s);
+                set_free(interp, s);
         }
     }
 #endif
@@ -1103,7 +1115,7 @@
     if (IMCC_INFO(interp)->debug & DEBUG_CFG)
         dump_dominators(unit);
 #if USE_BFS
-    mem_sys_free(q);
+    mem_gc_free(interp, q);
     set_free(visited);
 #endif
 }
@@ -1155,7 +1167,7 @@
                         runner = 0;
                     else
                         /* add b to runner's dominance frontier set */
-                        set_add(unit->dominance_frontiers[runner], b);
+                        set_add(interp, unit->dominance_frontiers[runner], b);
 
                     /* runner = idoms[runner] */
                     if (runner == 0)
@@ -1174,7 +1186,7 @@
 
 /*
 
-=item C<static void free_dominators(IMC_Unit *unit)>
+=item C<static void free_dominators(PARROT_INTERP, IMC_Unit *unit)>
 
 Frees the memory in the given unit related to all dominators.
 
@@ -1183,26 +1195,26 @@
 */
 
 static void
-free_dominators(ARGMOD(IMC_Unit *unit))
+free_dominators(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
 {
     ASSERT_ARGS(free_dominators)
     if (unit->dominators) {
         unsigned int i;
 
         for (i = 0; i < unit->n_basic_blocks; i++) {
-            set_free(unit->dominators[i]);
+            set_free(interp, unit->dominators[i]);
         }
 
-        mem_sys_free(unit->dominators);
+        mem_gc_free(interp, unit->dominators);
         unit->dominators = NULL;
-        mem_sys_free(unit->idoms);
+        mem_gc_free(interp, unit->idoms);
     }
 }
 
 
 /*
 
-=item C<static void free_dominance_frontiers(IMC_Unit *unit)>
+=item C<static void free_dominance_frontiers(PARROT_INTERP, IMC_Unit *unit)>
 
 Frees the memory in the given unit related to all dominance frontiers.
 
@@ -1211,17 +1223,17 @@
 */
 
 static void
-free_dominance_frontiers(ARGMOD(IMC_Unit *unit))
+free_dominance_frontiers(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
 {
     ASSERT_ARGS(free_dominance_frontiers)
     if (unit->dominance_frontiers) {
         unsigned int i;
 
         for (i = 0; i < unit->n_basic_blocks; i++) {
-            set_free(unit->dominance_frontiers[i]);
+            set_free(interp, unit->dominance_frontiers[i]);
         }
 
-        mem_sys_free(unit->dominance_frontiers);
+        mem_gc_free(interp, unit->dominance_frontiers);
         unit->dominance_frontiers = NULL;
     }
 }
@@ -1432,14 +1444,14 @@
     }
 
     loop = set_make(interp, unit->n_basic_blocks);
-    set_add(loop, footer->index);
-    set_add(loop, header->index);
+    set_add(interp, loop, footer->index);
+    set_add(interp, loop, header->index);
 
     footer->loop_depth++;
 
     if (header != footer) {
         header->loop_depth++;
-        search_predecessors_not_in(footer, loop);
+        search_predecessors_not_in(interp, footer, loop);
     }
 
     exits = set_make(interp, unit->n_basic_blocks);
@@ -1451,7 +1463,7 @@
                  edge = edge->succ_next)
             {
                 if (!set_contains(loop, edge->to->index))
-                    set_add(exits, i);
+                    set_add(interp, exits, i);
             }
         }
     }
@@ -1477,7 +1489,7 @@
 
 /*
 
-=item C<static void free_loops(IMC_Unit *unit)>
+=item C<static void free_loops(PARROT_INTERP, IMC_Unit *unit)>
 
 Frees the memory associated with the loops in this unit.
 
@@ -1486,18 +1498,18 @@
 */
 
 static void
-free_loops(ARGMOD(IMC_Unit *unit))
+free_loops(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
 {
     ASSERT_ARGS(free_loops)
     int i;
 
     for (i = 0; i < unit->n_loops; i++) {
-        set_free(unit->loop_info[i]->loop);
-        set_free(unit->loop_info[i]->exits);
-        mem_sys_free(unit->loop_info[i]);
+        set_free(interp, unit->loop_info[i]->loop);
+        set_free(interp, unit->loop_info[i]->exits);
+        mem_gc_free(interp, unit->loop_info[i]);
     }
 
-    mem_sys_free(unit->loop_info);
+    mem_gc_free(interp, unit->loop_info);
 
     unit->n_loops   = 0;
     unit->loop_info = NULL;
@@ -1506,7 +1518,8 @@
 
 /*
 
-=item C<void search_predecessors_not_in(const Basic_block *node, Set *s)>
+=item C<void search_predecessors_not_in(PARROT_INTERP, const Basic_block *node,
+Set *s)>
 
 Searches for predecessor edges for this node not in the given set (and adds
 them).
@@ -1516,7 +1529,7 @@
 */
 
 void
-search_predecessors_not_in(ARGIN(const Basic_block *node), ARGMOD(Set *s))
+search_predecessors_not_in(PARROT_INTERP, ARGIN(const Basic_block *node), ARGMOD(Set *s))
 {
     ASSERT_ARGS(search_predecessors_not_in)
     Edge *edge;
@@ -1525,9 +1538,9 @@
         Basic_block * const pred = edge->from;
 
         if (!set_contains(s, pred->index)) {
-           set_add(s, pred->index);
+           set_add(interp, s, pred->index);
            pred->loop_depth++;
-           search_predecessors_not_in(pred, s);
+           search_predecessors_not_in(interp, pred, s);
         }
     }
 }
@@ -1550,7 +1563,7 @@
     ASSERT_ARGS(init_basic_blocks)
 
     if (!unit->bb_list)
-        clear_basic_blocks(unit);
+        clear_basic_blocks(interp, unit);
 
     unit->n_basic_blocks = 0;
     unit->edge_list      = NULL;
@@ -1562,7 +1575,7 @@
 
 /*
 
-=item C<void clear_basic_blocks(IMC_Unit *unit)>
+=item C<void clear_basic_blocks(PARROT_INTERP, IMC_Unit *unit)>
 
 Frees all of the blocks and CFG memory allocated for this unit.
 
@@ -1571,7 +1584,7 @@
 */
 
 void
-clear_basic_blocks(ARGMOD(IMC_Unit *unit))
+clear_basic_blocks(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
 {
     ASSERT_ARGS(clear_basic_blocks)
 
@@ -1579,16 +1592,16 @@
         unsigned int i;
 
         for (i = 0; i < unit->n_basic_blocks; i++)
-            mem_sys_free(unit->bb_list[i]);
+            mem_gc_free(interp, unit->bb_list[i]);
 
-        mem_sys_free(unit->bb_list);
+        mem_gc_free(interp, unit->bb_list);
         unit->bb_list = NULL;
     }
 
-    free_edge(unit);
-    free_dominators(unit);
-    free_dominance_frontiers(unit);
-    free_loops(unit);
+    free_edge(interp, unit);
+    free_dominators(interp, unit);
+    free_dominance_frontiers(interp, unit);
+    free_loops(interp, unit);
 }
 
 

Modified: branches/boehm_gc_2/compilers/imcc/cfg.h
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/cfg.h	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/cfg.h	Tue Feb 23 21:02:00 2010	(r44404)
@@ -61,8 +61,9 @@
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*unit);
 
-void clear_basic_blocks(ARGMOD(IMC_Unit *unit))
+void clear_basic_blocks(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*unit);
 
 void compute_dominance_frontiers(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
@@ -89,9 +90,12 @@
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*unit);
 
-void free_life_info(ARGIN(const IMC_Unit *unit), ARGMOD(SymReg *r))
+void free_life_info(PARROT_INTERP,
+    ARGIN(const IMC_Unit *unit),
+    ARGMOD(SymReg *r))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
+        __attribute__nonnull__(3)
         FUNC_MODIFIES(*r);
 
 void life_analysis(PARROT_INTERP, ARGIN(const IMC_Unit *unit))
@@ -112,11 +116,12 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
-void search_predecessors_not_in(
+void search_predecessors_not_in(PARROT_INTERP,
     ARGIN(const Basic_block *node),
     ARGMOD(Set *s))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
+        __attribute__nonnull__(3)
         FUNC_MODIFIES(*s);
 
 #define ASSERT_ARGS_blocks_are_connected __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -126,7 +131,8 @@
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit))
 #define ASSERT_ARGS_clear_basic_blocks __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit))
 #define ASSERT_ARGS_compute_dominance_frontiers __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit))
@@ -142,7 +148,8 @@
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit))
 #define ASSERT_ARGS_free_life_info __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit) \
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(r))
 #define ASSERT_ARGS_life_analysis __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
@@ -154,7 +161,8 @@
        PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(loop_info))
 #define ASSERT_ARGS_search_predecessors_not_in __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(node) \
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(node) \
     , PARROT_ASSERT_ARG(s))
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 /* HEADERIZER END: compilers/imcc/cfg.c */

Modified: branches/boehm_gc_2/compilers/imcc/imc.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/imc.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/imc.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -89,7 +89,7 @@
 
         for (ins = unit->instructions; ins;) {
             Instruction * const ins_next = ins->next;
-            free_ins(ins);
+            free_ins(interp, ins);
             ins = ins_next;
         }
 
@@ -143,11 +143,11 @@
     ASSERT_ARGS(imc_cleanup)
     IMCC_pop_parser_state(interp, yyscanner);
     clear_globals(interp);
-    mem_sys_free(IMCC_INFO(interp)->ghash.data);
+    mem_gc_free(interp, IMCC_INFO(interp)->ghash.data);
     IMCC_INFO(interp)->ghash.data = NULL;
 
     if (IMCC_INFO(interp)->state) {
-        mem_sys_free(IMCC_INFO(interp)->state->file);
+        mem_gc_free(interp, IMCC_INFO(interp)->state->file);
         IMCC_INFO(interp)->state->file = NULL;
     }
 }
@@ -261,27 +261,27 @@
     fprintf(stderr, "imc_free_unit()\n");
 #endif
 
-    free_reglist(unit);
+    free_reglist(interp, unit);
 
     /* and cfg ... */
-    clear_basic_blocks(unit);
+    clear_basic_blocks(interp, unit);
 
     if (!imc->n_comp_units)
         IMCC_fatal(interp, 1, "imc_free_unit: non existent unit\n");
 
     imc->n_comp_units--;
 
-    clear_locals(unit);
+    clear_locals(interp, unit);
 
     if (unit->_namespace && unit->owns_namespace)
-        free_sym(unit->_namespace);
+        free_sym(interp, unit->_namespace);
     if (unit->vtable_name)
-        mem_sys_free(unit->vtable_name);
+        mem_gc_free(interp, unit->vtable_name);
     if (unit->instance_of)
-        mem_sys_free(unit->instance_of);
+        mem_gc_free(interp, unit->instance_of);
 
-    mem_sys_free(unit->hash.data);
-    mem_sys_free(unit);
+    mem_gc_free(interp, unit->hash.data);
+    mem_gc_free(interp, unit);
 }
 
 /*

Modified: branches/boehm_gc_2/compilers/imcc/imc.h
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/imc.h	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/imc.h	Tue Feb 23 21:02:00 2010	(r44404)
@@ -141,8 +141,9 @@
 /* HEADERIZER BEGIN: compilers/imcc/reg_alloc.c */
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 
-void free_reglist(ARGMOD(IMC_Unit *unit))
+void free_reglist(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*unit);
 
 void graph_coloring_reg_alloc(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
@@ -158,7 +159,8 @@
         __attribute__nonnull__(1);
 
 #define ASSERT_ARGS_free_reglist __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit))
 #define ASSERT_ARGS_graph_coloring_reg_alloc __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit))

Modified: branches/boehm_gc_2/compilers/imcc/imcc.l
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/imcc.l	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/imcc.l	Tue Feb 23 21:02:00 2010	(r44404)
@@ -76,7 +76,7 @@
 static void scan_file(PARROT_INTERP, ARGIN(struct macro_frame_t *frame), ARGMOD(FILE *file),
         ARGMOD(void *yyscanner));
 
-static int destroy_frame(macro_frame_t *frame, ARGMOD(void *yyscanner));
+static int destroy_frame(PARROT_INTERP, macro_frame_t *frame, ARGMOD(void *yyscanner));
 
 static int yylex_skip(YYSTYPE *valp, PARROT_INTERP, ARGIN(const char *skip),
         ARGMOD(void *yyscanner));
@@ -100,7 +100,7 @@
 #define DUP_AND_RET_FREE(valp, token)        \
   do {                                       \
       if (valp) {                            \
-          mem_sys_free((valp)->s);           \
+          mem_gc_free(interp, (valp)->s);           \
           (valp)->s = Parrot_gc_strdup(interp, yytext);       \
           return (token);                    \
       }                                      \
@@ -179,9 +179,10 @@
         /* Newline in the heredoc. Realloc and cat on. */
         IMCC_INFO(interp)->line++;
         IMCC_INFO(interp)->heredoc_content =
-            (char*)mem_sys_realloc(IMCC_INFO(interp)->heredoc_content,
-                            strlen(IMCC_INFO(interp)->heredoc_content) +
-                            strlen(yytext) + 2);
+            (char*)Parrot_gc_reallocate_memory_chunk(interp,
+                        IMCC_INFO(interp)->heredoc_content,
+                        strlen(IMCC_INFO(interp)->heredoc_content) +
+                        strlen(yytext) + 2);
         strcpy(IMCC_INFO(interp)->heredoc_content +
                strlen(IMCC_INFO(interp)->heredoc_content), yytext);
     }
@@ -199,7 +200,7 @@
 
             IMCC_INFO(interp)->heredoc_content[len + 1] = 0;
 
-            mem_sys_free(IMCC_INFO(interp)->heredoc_end);
+            mem_gc_free(interp, IMCC_INFO(interp)->heredoc_end);
             IMCC_INFO(interp)->heredoc_end = NULL;
 
             IMCC_INFO(interp)->frames->buffer = YY_CURRENT_BUFFER;
@@ -216,9 +217,10 @@
         else {
             /* Part of the heredoc. Realloc and cat the line on. */
             IMCC_INFO(interp)->heredoc_content =
-                (char *)mem_sys_realloc(IMCC_INFO(interp)->heredoc_content,
-                                strlen(IMCC_INFO(interp)->heredoc_content) +
-                                strlen(yytext) + 2);
+                (char *)Parrot_gc_reallocate_memory_chunk(interp,
+                            IMCC_INFO(interp)->heredoc_content,
+                            strlen(IMCC_INFO(interp)->heredoc_content) +
+                            strlen(yytext) + 2);
             strcpy(IMCC_INFO(interp)->heredoc_content +
                    strlen(IMCC_INFO(interp)->heredoc_content), yytext);
         }
@@ -434,11 +436,11 @@
             macro_exists = 1;
 
         define_macro(interp, macro_name, NULL, valp->s, start_line);
-        mem_sys_free(valp->s);
+        mem_gc_free(interp, valp->s);
 
         /* don't leak these */
         if (macro_exists)
-            mem_sys_free(macro_name);
+            mem_gc_free(interp, macro_name);
 
         IMCC_INFO(interp)->cur_macro_name = NULL;
 
@@ -474,7 +476,7 @@
                     IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR, "missing space?");
 
             len = yyleng + 10;
-            label = (char *)mem_sys_allocate(len);
+            label = mem_gc_allocate_n_typed(interp, len, char);
             snprintf(label, len, "%s%d", yytext, IMCC_INFO(interp)->frames->label);
 
             /* XXX: free valp->s if it exists? */
@@ -495,7 +497,7 @@
                 IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR, "missing space?");
 
             len = yyleng + 10;
-            label = (char *)mem_sys_allocate(len);
+            label = mem_gc_allocate_n_typed(interp, len, char);
             snprintf(label, len, "%s%d", yytext, IMCC_INFO(interp)->frames->label);
 
             /* XXX: free valp->s if it exists? */
@@ -520,7 +522,7 @@
 <emit,INITIAL>{DOT}{LETTER}{LETTERDIGIT}* {
         char   * const macro_name = Parrot_gc_strdup(interp, yytext + 1);
         int failed = expand_macro(interp, macro_name, yyscanner);
-        mem_sys_free(macro_name);
+        mem_gc_free(interp, macro_name);
         if (!failed) {
             yyless(1);
             return DOT;
@@ -569,7 +571,7 @@
         IMCC_INFO(interp)->frames = frame;
 
         /* Start slurping up the heredoc. */
-        IMCC_INFO(interp)->heredoc_content    = (char *)mem_sys_allocate(2);
+        IMCC_INFO(interp)->heredoc_content    = mem_gc_allocate_n_typed(interp, 2, char);
 
         /* preserve delim */
         IMCC_INFO(interp)->heredoc_content[0] = yytext[2];
@@ -704,13 +706,13 @@
             YYCHOP();
 
             len = strlen(IMCC_INFO(interp)->cur_macro_name) + yyleng + 15;
-            label = (char *)mem_sys_allocate(len);
+            label = mem_gc_allocate_n_typed(interp, len, char);
 
             snprintf(label, len, "local__%s__%s__$:",
                 IMCC_INFO(interp)->cur_macro_name, yytext+1);
 
             if (valp->s)
-                mem_sys_free(valp->s);
+                mem_gc_free(interp, valp->s);
             valp->s = label;
         }
 
@@ -721,7 +723,7 @@
     if (valp) {
         if (!IMCC_INFO(interp)->cur_macro_name) {
             if (valp->s)
-                mem_sys_free(valp->s);
+                mem_gc_free(interp, valp->s);
             IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                 "Invalid LABEL outside of macro");
         }
@@ -730,14 +732,14 @@
             const size_t fmtlen = strlen(fmt) - (2 * strlen("%s"));
             const size_t len    = strlen(IMCC_INFO(interp)->cur_macro_name)
                                 + yyleng + fmtlen;
-            char * const label  = (char *)mem_sys_allocate(len);
+            char * const label  = mem_gc_allocate_n_typed(interp, len, char);
 
             /* skip over ".$" prefix with the +2 */
             snprintf(label, len, fmt,
                 IMCC_INFO(interp)->cur_macro_name, yytext + 2);
 
             if (valp->s)
-                mem_sys_free(valp->s);
+                mem_gc_free(interp, valp->s);
             valp->s = label;
         }
     }
@@ -818,25 +820,25 @@
 }
 
 static int
-destroy_frame(struct macro_frame_t *frame, void *yyscanner)
+destroy_frame(PARROT_INTERP, struct macro_frame_t *frame, void *yyscanner)
 {
     YY_BUFFER_STATE buffer = frame->buffer;
     int             ret    = 0;
     int             i;
 
     for (i = 0; i < frame->expansion.num_param; i++) {
-        mem_sys_free(frame->expansion.name[i]);
+        mem_gc_free(interp, frame->expansion.name[i]);
         frame->expansion.name[i] = NULL;
     }
 
     if (frame->heredoc_rest) {
-        mem_sys_free(frame->heredoc_rest);
+        mem_gc_free(interp, frame->heredoc_rest);
         frame->heredoc_rest = NULL;
     } else
         ret = frame->s.line;
 
-    mem_sys_free(frame->s.file);
-    mem_sys_free(frame);
+    mem_gc_free(interp, frame->s.file);
+    mem_gc_free(interp, frame);
 
     if (buffer != NULL)
         yy_switch_to_buffer(buffer, yyscanner);
@@ -895,21 +897,21 @@
                         macro_name);
 
         len     += strlen(val.s);
-        current  = (char *)mem_sys_realloc(current, len + 1);
+        current  = mem_gc_realloc_n_typed(interp, current, len + 1, char);
         strcat(current,val.s);
 
-        mem_sys_free(val.s);
+        mem_gc_free(interp, val.s);
         val.s = NULL;
         c = yylex(&val, yyscanner, interp);
     }
 
     if (valp) {
         if (valp->s)
-            mem_sys_free(valp->s);
+            mem_gc_free(interp, valp->s);
         *valp = val;
     }
     else
-        mem_sys_free(val.s);
+        mem_gc_free(interp, val.s);
 
     return current;
 }
@@ -946,7 +948,7 @@
             len                               = 0;
 
             if (val.s)
-                mem_sys_free(val.s);
+                mem_gc_free(interp, val.s);
             c = yylex_skip(&val, interp, " \n", yyscanner);
         }
         else if (need_id && (*current || c != IDENTIFIER) && c != ' ') {
@@ -956,18 +958,18 @@
         }
         else if (c == '{') {
             current = read_braced(&val, interp, macro_name, current, yyscanner);
-            mem_sys_free(val.s);
+            mem_gc_free(interp, val.s);
             c       = yylex_skip(&val, interp, " \n", yyscanner);
             len     = strlen(current);
         }
         else {
             if (!need_id || c != ' ') {
                 len     += strlen(val.s);
-                current  = (char *)mem_sys_realloc(current, len + 1);
+                current  = mem_gc_realloc_n_typed(interp, current, len + 1, char);
                 strcat(current, val.s);
             }
 
-            mem_sys_free(val.s);
+            mem_gc_free(interp, val.s);
             val.s = NULL;
             c = yylex(&val, yyscanner, interp);
         }
@@ -978,7 +980,7 @@
     if (valp)
         *valp = val;
     else
-        mem_sys_free(val.s);
+        mem_gc_free(interp, val.s);
 
     return c;
 }
@@ -1009,7 +1011,7 @@
     c = yylex_skip(valp, interp, " ", yyscanner);
 
     if (c == '(') {
-        mem_sys_free(valp->s);
+        mem_gc_free(interp, valp->s);
         valp->s = NULL;
 
         c = read_params(NULL, interp, &params,
@@ -1023,7 +1025,7 @@
         int   elem_len;
 
         if (c <= 0) {
-            mem_sys_free(valp->s);
+            mem_gc_free(interp, valp->s);
             IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                         "File ended before macro '%s' was complete",
                         IMCC_INFO(interp)->cur_macro_name);
@@ -1038,27 +1040,27 @@
                     buffer_size <<= 1;
 
                     IMCC_INFO(interp)->macro_buffer =
-                        (char *)mem_sys_realloc(IMCC_INFO(interp)->macro_buffer,
-                            buffer_size);
+                        mem_gc_realloc_n_typed(interp, IMCC_INFO(interp)->macro_buffer,
+                            buffer_size, char);
                 }
             }
             else {
                 buffer_size = (elem_len << 1) > 1024 ? elem_len << 1 : 1024;
 
                 IMCC_INFO(interp)->macro_buffer =
-                    (char *)mem_sys_allocate_zeroed(buffer_size);
+                    mem_gc_allocate_n_zeroed_typed(interp, buffer_size, char);
             }
 
             strcat(IMCC_INFO(interp)->macro_buffer, valp->s);
             buffer_used += elem_len;
 
-            mem_sys_free(valp->s);
+            mem_gc_free(interp, valp->s);
             valp->s = NULL;
         }
         c = yylex(valp, yyscanner, interp);
     }
 
-    mem_sys_free(valp->s);
+    mem_gc_free(interp, valp->s);
     valp->s = NULL;
 
     BEGIN(start_cond);
@@ -1066,7 +1068,7 @@
     define_macro(interp, IMCC_INFO(interp)->cur_macro_name,
                  &params, IMCC_INFO(interp)->macro_buffer, start_line);
 
-    mem_sys_free(IMCC_INFO(interp)->macro_buffer);
+    mem_gc_free(interp, IMCC_INFO(interp)->macro_buffer);
     IMCC_INFO(interp)->macro_buffer   = NULL;
     IMCC_INFO(interp)->cur_macro_name = NULL;
 
@@ -1103,7 +1105,7 @@
     macro_t *m = find_macro(interp, name);
 
     if (m) {
-        mem_sys_free(m->expansion);
+        mem_gc_free(interp, m->expansion);
         m->expansion = NULL;
     }
     else {
@@ -1162,7 +1164,7 @@
         /* remember macro name for error reporting
          * first free any filename allocated in new_frame() */
         if (frame->s.file)
-            mem_sys_free(frame->s.file);
+            mem_gc_free(interp, frame->s.file);
 
         frame->s.file            = Parrot_gc_strdup(interp, name);
 
@@ -1213,7 +1215,7 @@
 
                 if (s) {
                     frame->expansion.name[i] = Parrot_gc_strdup(interp, s);
-                    mem_sys_free(current);
+                    mem_gc_free(interp, current);
                 }
 
             }
@@ -1221,14 +1223,14 @@
                 const size_t len = strlen(current);
                 if (len && (current[len - 1] == '$')) { /* local label */
                     const size_t slen = len + 10;
-                    char * const s    = (char *)mem_sys_allocate(slen);
+                    char * const s    = mem_gc_allocate_n_typed(interp, slen, char);
 
                     current[len - 1] = '\0';
 
                     snprintf(s, slen, "%s%d", current, IMCC_INFO(interp)->frames->label);
 
                     frame->expansion.name[i] = s;
-                    mem_sys_free(current);
+                    mem_gc_free(interp, current);
                 }
             }
         }
@@ -1255,13 +1257,13 @@
 
     if (!s || !(file = fopen(s, "r"))) {
         if (frame->s.file)
-            mem_sys_free(frame->s.file);
+            mem_gc_free(interp, frame->s.file);
         IMCC_fataly(interp, EXCEPTION_EXTERNAL_ERROR, strerror(errno));
     }
 
     if (frame->s.file)
-        mem_sys_free(frame->s.file);
-    mem_sys_free(s);
+        mem_gc_free(interp, frame->s.file);
+    mem_gc_free(interp, s);
     frame->s.file            = Parrot_gc_strdup(interp, file_name);
     frame->s.handle          = file;
     ext                      = strrchr(file_name, '.');
@@ -1318,7 +1320,7 @@
         IMCC_INFO(interp)->frames =
             (macro_frame_t *)IMCC_INFO(interp)->frames->s.next;
 
-        l = destroy_frame(tmp, yyscanner);
+        l = destroy_frame(interp, tmp, yyscanner);
 
         if (l)
             IMCC_INFO(interp)->line = l;

Modified: branches/boehm_gc_2/compilers/imcc/imcc.y
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/imcc.y	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/imcc.y	Tue Feb 23 21:02:00 2010	(r44404)
@@ -479,7 +479,7 @@
     r[1]          = rhs;
     rhs->pmc_type = type_enum;
 
-    mem_sys_free(name);
+    mem_gc_free(interp, name);
 
     return INS(interp, unit, "set_p_pc", "", r, 2, 0, 1);
 }
@@ -545,8 +545,8 @@
     rhs->pmc_type = Parrot_pmc_get_type_str(interp,
         Parrot_str_new(interp, unquoted_name, name_length));
 
-    mem_sys_free(unquoted_name);
-    mem_sys_free(const_name);
+    mem_gc_free(interp, unquoted_name);
+    mem_gc_free(interp, const_name);
 
     return INS(interp, unit, "set_p_pc", "", r, 2, 0, 1);
 }
@@ -795,7 +795,7 @@
     }
 
     r = mk_sub_address(interp, name_copy + 1);
-    mem_sys_free(name_copy);
+    mem_gc_free(interp, name_copy);
 
     return r;
 }
@@ -1202,7 +1202,7 @@
          {
            $$ = 0;
            do_loadlib(interp, $2);
-           mem_sys_free($2);
+           mem_gc_free(interp, $2);
          }
    ;
 
@@ -1227,7 +1227,7 @@
            * store annotation like it's an instruction. */
           SymReg * const key = mk_const(interp, $2, 'S');
           $$ = MK_I(interp, IMCC_INFO(interp)->cur_unit, ".annotate", 2, key, $4);
-          mem_sys_free($2);
+          mem_gc_free(interp, $2);
         }
     ;
 
@@ -1240,7 +1240,7 @@
                 Parrot_register_HLL(interp, hll_name));
 
             IMCC_INFO(interp)->cur_namespace = NULL;
-            mem_sys_free($2);
+            mem_gc_free(interp, $2);
             $$ = 0;
          }
    ;
@@ -1249,7 +1249,7 @@
      CONST { IMCC_INFO(interp)->is_def = 1; } type IDENTIFIER '=' const
          {
              mk_const_ident(interp, $4, $3, $6, 1);
-             mem_sys_free($4);
+             mem_gc_free(interp, $4);
              IMCC_INFO(interp)->is_def = 0;
          }
    ;
@@ -1258,15 +1258,15 @@
      CONST { IMCC_INFO(interp)->is_def = 1; } INTC var_or_i '=' any_string
          {
            $$ = mk_pmc_const(interp, IMCC_INFO(interp)->cur_unit, $3, $4, $6);
-           mem_sys_free($6);
+           mem_gc_free(interp, $6);
            IMCC_INFO(interp)->is_def = 0;
          }
 
      | CONST { IMCC_INFO(interp)->is_def = 1; } STRINGC var_or_i '=' any_string
          {
            $$ = mk_pmc_const_named(interp, IMCC_INFO(interp)->cur_unit, $3, $4, $6);
-           mem_sys_free($3);
-           mem_sys_free($6);
+           mem_gc_free(interp, $3);
+           mem_gc_free(interp, $6);
            IMCC_INFO(interp)->is_def = 0;
          }
    ;
@@ -1296,7 +1296,7 @@
            $$ = INS(interp, IMCC_INFO(interp)->cur_unit,
                     $2, 0, IMCC_INFO(interp)->regs,
                     IMCC_INFO(interp)->nargs, IMCC_INFO(interp) -> keyvec, 1);
-            mem_sys_free($2);
+            mem_gc_free(interp, $2);
          }
    | PCC_SUB
          {
@@ -1309,7 +1309,7 @@
                     IMCC_INFO(interp)->cur_unit,
                     mk_sub_label(interp, $4));
            IMCC_INFO(interp)->cur_call->pcc_sub->pragma = $3;
-           mem_sys_free($4);
+           mem_gc_free(interp, $4);
          }
    | PNULL var
          {
@@ -1324,9 +1324,9 @@
            n = mk_const(interp, name, 'S');
            set_lexical(interp, r, n);
            $$ = 0;
-           mem_sys_free(name);
-           mem_sys_free($2);
-           mem_sys_free($4);
+           mem_gc_free(interp, name);
+           mem_gc_free(interp, $2);
+           mem_gc_free(interp, $4);
          }
    | /* none */                { $$ = 0;}
    ;
@@ -1436,7 +1436,7 @@
            else
                $$ = mk_ident(interp, $2, $1);
            $$->type |= $3;
-           mem_sys_free($2);
+           mem_gc_free(interp, $2);
           }
    ;
 
@@ -1451,13 +1451,13 @@
          {
            $$ = 0;
            IMCC_INFO(interp)->cur_unit->outer = mk_sub_address_fromc(interp, $3);
-           mem_sys_free($3);
+           mem_gc_free(interp, $3);
          }
     | OUTER '(' IDENTIFIER ')'
          {
            $$ = 0;
            IMCC_INFO(interp)->cur_unit->outer = mk_const(interp, $3, 'S');
-           mem_sys_free($3);
+           mem_gc_free(interp, $3);
          }
    ;
 
@@ -1525,7 +1525,7 @@
            $$ = 0;
            IMCC_INFO(interp)->cur_unit->subid = mk_const(interp, $3, 'S');
            IMCC_INFO(interp)->cur_unit->instructions->symregs[0]->subid = str_dup_remove_quotes($3);
-           mem_sys_free($3);
+           mem_gc_free(interp, $3);
          }
    ;
 
@@ -1559,7 +1559,7 @@
            else {
                r = mk_const(interp, "PMC", 'S');
            }
-           mem_sys_free($1);
+           mem_gc_free(interp, $1);
            $$ = r;
          }
    | STRINGC
@@ -1570,7 +1570,7 @@
            else {
                r = mk_const(interp, "PMC", 'S');
            }
-           mem_sys_free($1);
+           mem_gc_free(interp, $1);
            $$ = r;
          }
    | '[' keylist ']'           { $$ = $2; }
@@ -1732,8 +1732,8 @@
    | ADV_OPTIONAL               { $$ = VT_OPTIONAL; }
    | ADV_OPT_FLAG               { $$ = VT_OPT_FLAG; }
    | ADV_NAMED                  { $$ = VT_NAMED; }
-   | ADV_NAMED '(' STRINGC ')'  { adv_named_set(interp, $3);   $$ = 0; mem_sys_free($3); }
-   | ADV_NAMED '(' USTRINGC ')' { adv_named_set_u(interp, $3); $$ = 0; mem_sys_free($3); }
+   | ADV_NAMED '(' STRINGC ')'  { adv_named_set(interp, $3);   $$ = 0; mem_gc_free(interp, $3); }
+   | ADV_NAMED '(' USTRINGC ')' { adv_named_set_u(interp, $3); $$ = 0; mem_gc_free(interp, $3); }
    | UNIQUE_REG                 { $$ = VT_UNIQUE_REG; }
    | ADV_CALL_SIG               { $$ = VT_CALL_SIG; }
    ;
@@ -1886,7 +1886,7 @@
      LABEL
          {
              Instruction * const i = iLABEL(interp, IMCC_INFO(interp)->cur_unit, mk_local_label(interp, $1));
-             mem_sys_free($1);
+             mem_gc_free(interp, $1);
              $$ = i;
          }
    ;
@@ -1951,15 +1951,15 @@
                    mk_ident(interp, l->id, $3);
                l1 = l;
                l  = l->next;
-               mem_sys_free(l1->id);
-               mem_sys_free(l1);
+               mem_gc_free(interp, l1->id);
+               mem_gc_free(interp, l1);
            }
            IMCC_INFO(interp)->is_def = 0; $$ = 0;
          }
    | LEXICAL STRINGC COMMA target
          {
             if ($4->set != 'P') {
-                mem_sys_free($2);
+                mem_gc_free(interp, $2);
                 IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                     "Cannot use %c register with .lex", $4->set);
             }
@@ -1969,28 +1969,28 @@
                name[strlen(name) - 1] = 0;
                n = mk_const(interp, name, 'S');
                set_lexical(interp, $4, n); $$ = 0;
-               mem_sys_free($2);
-               mem_sys_free(name);
+               mem_gc_free(interp, $2);
+               mem_gc_free(interp, name);
             }
          }
    | LEXICAL USTRINGC COMMA target
          {
             if ($4->set != 'P') {
-                mem_sys_free($2);
+                mem_gc_free(interp, $2);
                 IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                     "Cannot use %c register with .lex", $4->set);
             }
             else {
                SymReg *n = mk_const(interp, $2, 'U');
                set_lexical(interp, $4, n); $$ = 0;
-               mem_sys_free($2);
+               mem_gc_free(interp, $2);
             }
          }
    | CONST { IMCC_INFO(interp)->is_def = 1; } type IDENTIFIER '=' const
          {
            mk_const_ident(interp, $4, $3, $6, 0);
            IMCC_INFO(interp)->is_def = 0;
-           mem_sys_free($4);
+           mem_gc_free(interp, $4);
          }
 
    | pmc_const
@@ -1998,7 +1998,7 @@
          {
            mk_const_ident(interp, $4, $3, $6, 1);
            IMCC_INFO(interp)->is_def = 0;
-           mem_sys_free($4);
+           mem_gc_free(interp, $4);
          }
    | TAILCALL sub_call
          {
@@ -2020,7 +2020,7 @@
                     IMCC_INFO(interp)->nargs,
                     IMCC_INFO(interp)->keyvec,
                     1);
-           mem_sys_free($1);
+           mem_gc_free(interp, $1);
          }
    | PNULL var                 { $$ = MK_I(interp, IMCC_INFO(interp)->cur_unit, "null", 1, $2); }
    | sub_call                  { $$ = 0; IMCC_INFO(interp)->cur_call = NULL; }
@@ -2166,14 +2166,14 @@
                       IMCC_INFO(interp) -> regs,
                       IMCC_INFO(interp) -> nargs,
                       IMCC_INFO(interp) -> keyvec, 1);
-         mem_sys_free($3);
+         mem_gc_free(interp, $3);
        }
    ;
 
 the_sub:
-     IDENTIFIER     { $$ = mk_sub_address(interp, $1);       mem_sys_free($1); }
-     | STRINGC      { $$ = mk_sub_address_fromc(interp, $1); mem_sys_free($1); }
-     | USTRINGC     { $$ = mk_sub_address_u(interp, $1);     mem_sys_free($1); }
+     IDENTIFIER     { $$ = mk_sub_address(interp, $1);       mem_gc_free(interp, $1); }
+     | STRINGC      { $$ = mk_sub_address_fromc(interp, $1); mem_gc_free(interp, $1); }
+     | USTRINGC     { $$ = mk_sub_address_u(interp, $1);     mem_gc_free(interp, $1); }
    | target
          {
            $$ = $1;
@@ -2198,13 +2198,13 @@
          {
             IMCC_INFO(interp)->cur_obj = $1;
             $$                         = mk_const(interp, $3, 'U');
-            mem_sys_free($3);
+            mem_gc_free(interp, $3);
          }
    | target DOT STRINGC
          {
             IMCC_INFO(interp)->cur_obj = $1;
             $$                         = mk_const(interp, $3, 'S');
-            mem_sys_free($3);
+            mem_gc_free(interp, $3);
          }
    | target DOT target         { IMCC_INFO(interp)->cur_obj = $1; $$ = $3; }
    ;
@@ -2246,7 +2246,7 @@
            $$ = 0;
            add_pcc_named_arg(interp, IMCC_INFO(interp)->cur_call,
                 mk_const(interp, $3, 'S'), $5);
-           mem_sys_free($3);
+           mem_gc_free(interp, $3);
          }
    | var ADV_ARROW var
          {
@@ -2258,7 +2258,7 @@
            $$ = 0;
            add_pcc_named_arg(interp, IMCC_INFO(interp)->cur_call,
                 mk_const(interp, $1, 'S'), $3);
-           mem_sys_free($1);
+           mem_gc_free(interp, $1);
          }
    ;
 
@@ -2300,7 +2300,7 @@
          {
             add_pcc_named_result(interp, IMCC_INFO(interp)->cur_call,
                     mk_const(interp, $3, 'S'), $5);
-            mem_sys_free($3);
+            mem_gc_free(interp, $3);
          }
    | result
          {
@@ -2315,7 +2315,7 @@
    | STRINGC ADV_ARROW target
          {
            add_pcc_named_result(interp, IMCC_INFO(interp)->cur_call, mk_const(interp, $1, 'S'), $3);
-           mem_sys_free($1);
+           mem_gc_free(interp, $1);
          }
    | /* empty */                { $$ = 0; }
    ;
@@ -2401,18 +2401,18 @@
    ;
 sub_label_op_c:
      sub_label_op
-   | STRINGC                   { $$ = mk_sub_address_fromc(interp, $1); mem_sys_free($1); }
-   | USTRINGC                  { $$ = mk_sub_address_u(interp, $1);  mem_sys_free($1); }
+   | STRINGC                   { $$ = mk_sub_address_fromc(interp, $1); mem_gc_free(interp, $1); }
+   | USTRINGC                  { $$ = mk_sub_address_u(interp, $1);  mem_gc_free(interp, $1); }
    ;
 
 sub_label_op:
-     IDENTIFIER                { $$ = mk_sub_address(interp, $1); mem_sys_free($1); }
-   | PARROT_OP                 { $$ = mk_sub_address(interp, $1); mem_sys_free($1); }
+     IDENTIFIER                { $$ = mk_sub_address(interp, $1); mem_gc_free(interp, $1); }
+   | PARROT_OP                 { $$ = mk_sub_address(interp, $1); mem_gc_free(interp, $1); }
    ;
 
 label_op:
-     IDENTIFIER                { $$ = mk_label_address(interp, $1); mem_sys_free($1); }
-   | PARROT_OP                 { $$ = mk_label_address(interp, $1); mem_sys_free($1); }
+     IDENTIFIER                { $$ = mk_label_address(interp, $1); mem_gc_free(interp, $1); }
+   | PARROT_OP                 { $$ = mk_label_address(interp, $1); mem_gc_free(interp, $1); }
    ;
 
 var_or_i:
@@ -2470,14 +2470,14 @@
    | NREG                      { $$ = mk_symreg(interp, $1, 'N'); }
    | SREG                      { $$ = mk_symreg(interp, $1, 'S'); }
    | PREG                      { $$ = mk_symreg(interp, $1, 'P'); }
-   | REG                       { $$ = mk_pasm_reg(interp, $1); mem_sys_free($1); }
+   | REG                       { $$ = mk_pasm_reg(interp, $1); mem_gc_free(interp, $1); }
    ;
 
 const:
-     INTC                      { $$ = mk_const(interp, $1, 'I'); mem_sys_free($1); }
-   | FLOATC                    { $$ = mk_const(interp, $1, 'N'); mem_sys_free($1); }
-   | STRINGC                   { $$ = mk_const(interp, $1, 'S'); mem_sys_free($1); }
-   | USTRINGC                  { $$ = mk_const(interp, $1, 'U'); mem_sys_free($1); }
+     INTC                      { $$ = mk_const(interp, $1, 'I'); mem_gc_free(interp, $1); }
+   | FLOATC                    { $$ = mk_const(interp, $1, 'N'); mem_gc_free(interp, $1); }
+   | STRINGC                   { $$ = mk_const(interp, $1, 'S'); mem_gc_free(interp, $1); }
+   | USTRINGC                  { $$ = mk_const(interp, $1, 'U'); mem_gc_free(interp, $1); }
    ;
 
 

Modified: branches/boehm_gc_2/compilers/imcc/imclexer.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/imclexer.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/imclexer.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -2449,7 +2449,7 @@
 static void scan_file(PARROT_INTERP, ARGIN(struct macro_frame_t *frame), ARGMOD(FILE *file),
         ARGMOD(void *yyscanner));
 
-static int destroy_frame(macro_frame_t *frame, ARGMOD(void *yyscanner));
+static int destroy_frame(PARROT_INTERP, macro_frame_t *frame, ARGMOD(void *yyscanner));
 
 static int yylex_skip(YYSTYPE *valp, PARROT_INTERP, ARGIN(const char *skip),
         ARGMOD(void *yyscanner));
@@ -2473,7 +2473,7 @@
 #define DUP_AND_RET_FREE(valp, token)        \
   do {                                       \
       if (valp) {                            \
-          mem_sys_free((valp)->s);           \
+          mem_gc_free(interp, (valp)->s);           \
           (valp)->s = Parrot_gc_strdup(interp, yytext);       \
           return (token);                    \
       }                                      \
@@ -2853,16 +2853,17 @@
         /* Newline in the heredoc. Realloc and cat on. */
         IMCC_INFO(interp)->line++;
         IMCC_INFO(interp)->heredoc_content =
-            (char*)mem_sys_realloc(IMCC_INFO(interp)->heredoc_content,
-                            strlen(IMCC_INFO(interp)->heredoc_content) +
-                            strlen(yytext) + 2);
+            (char*)Parrot_gc_reallocate_memory_chunk(interp,
+                        IMCC_INFO(interp)->heredoc_content,
+                        strlen(IMCC_INFO(interp)->heredoc_content) +
+                        strlen(yytext) + 2);
         strcpy(IMCC_INFO(interp)->heredoc_content +
                strlen(IMCC_INFO(interp)->heredoc_content), yytext);
     }
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 189 "compilers/imcc/imcc.l"
+#line 190 "compilers/imcc/imcc.l"
 {
         /* Are we at the end of the heredoc? */
         if (STREQ(IMCC_INFO(interp)->heredoc_end, yytext)) {
@@ -2876,7 +2877,7 @@
 
             IMCC_INFO(interp)->heredoc_content[len + 1] = 0;
 
-            mem_sys_free(IMCC_INFO(interp)->heredoc_end);
+            mem_gc_free(interp, IMCC_INFO(interp)->heredoc_end);
             IMCC_INFO(interp)->heredoc_end = NULL;
 
             IMCC_INFO(interp)->frames->buffer = YY_CURRENT_BUFFER;
@@ -2893,9 +2894,10 @@
         else {
             /* Part of the heredoc. Realloc and cat the line on. */
             IMCC_INFO(interp)->heredoc_content =
-                (char *)mem_sys_realloc(IMCC_INFO(interp)->heredoc_content,
-                                strlen(IMCC_INFO(interp)->heredoc_content) +
-                                strlen(yytext) + 2);
+                (char *)Parrot_gc_reallocate_memory_chunk(interp,
+                            IMCC_INFO(interp)->heredoc_content,
+                            strlen(IMCC_INFO(interp)->heredoc_content) +
+                            strlen(yytext) + 2);
             strcpy(IMCC_INFO(interp)->heredoc_content +
                    strlen(IMCC_INFO(interp)->heredoc_content), yytext);
         }
@@ -2904,7 +2906,7 @@
 case 4:
 /* rule 4 can match eol */
 YY_RULE_SETUP
-#line 227 "compilers/imcc/imcc.l"
+#line 229 "compilers/imcc/imcc.l"
 {
         yy_pop_state(yyscanner);
         yy_push_state(cmt3, yyscanner);
@@ -2917,7 +2919,7 @@
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 237 "compilers/imcc/imcc.l"
+#line 239 "compilers/imcc/imcc.l"
 {
         yy_pop_state(yyscanner);
         yy_push_state(cmt4, yyscanner);
@@ -2925,17 +2927,17 @@
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 242 "compilers/imcc/imcc.l"
+#line 244 "compilers/imcc/imcc.l"
 { yy_push_state(cmt2, yyscanner); }
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 244 "compilers/imcc/imcc.l"
+#line 246 "compilers/imcc/imcc.l"
 { yy_push_state(cmt1, yyscanner);  }
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 246 "compilers/imcc/imcc.l"
+#line 248 "compilers/imcc/imcc.l"
 {
         IMCC_INFO(interp)->line = atoi(yytext);
         yy_pop_state(yyscanner);
@@ -2946,7 +2948,7 @@
 case 9:
 /* rule 9 can match eol */
 YY_RULE_SETUP
-#line 253 "compilers/imcc/imcc.l"
+#line 255 "compilers/imcc/imcc.l"
 {
         yy_pop_state(yyscanner);
         IMCC_INFO(interp)->line++;
@@ -2955,7 +2957,7 @@
 case 10:
 /* rule 10 can match eol */
 YY_RULE_SETUP
-#line 258 "compilers/imcc/imcc.l"
+#line 260 "compilers/imcc/imcc.l"
 {
         if (IMCC_INFO(interp)->expect_pasm == 2)
             BEGIN(INITIAL);
@@ -2968,7 +2970,7 @@
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 268 "compilers/imcc/imcc.l"
+#line 270 "compilers/imcc/imcc.l"
 {
         yy_push_state(cmt5, yyscanner);
     }
@@ -2976,7 +2978,7 @@
 case 12:
 /* rule 12 can match eol */
 YY_RULE_SETUP
-#line 272 "compilers/imcc/imcc.l"
+#line 274 "compilers/imcc/imcc.l"
 {
         if (IMCC_INFO(interp)->expect_pasm == 2)
             BEGIN(INITIAL);
@@ -2992,7 +2994,7 @@
 case 13:
 /* rule 13 can match eol */
 YY_RULE_SETUP
-#line 285 "compilers/imcc/imcc.l"
+#line 287 "compilers/imcc/imcc.l"
 {
     /* this is a stand-alone =cut, but we're not in POD mode, so ignore.  */
     IMCC_INFO(interp)->line++;
@@ -3000,7 +3002,7 @@
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 290 "compilers/imcc/imcc.l"
+#line 292 "compilers/imcc/imcc.l"
 {
         IMCC_INFO(interp)->in_pod = 1;
         yy_push_state(pod, yyscanner);
@@ -3009,7 +3011,7 @@
 case 15:
 /* rule 15 can match eol */
 YY_RULE_SETUP
-#line 295 "compilers/imcc/imcc.l"
+#line 297 "compilers/imcc/imcc.l"
 {
         IMCC_INFO(interp)->in_pod = 0;
         yy_pop_state(yyscanner);
@@ -3018,478 +3020,478 @@
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 301 "compilers/imcc/imcc.l"
+#line 303 "compilers/imcc/imcc.l"
 { /*ignore*/ }
 	YY_BREAK
 case 17:
 /* rule 17 can match eol */
 YY_RULE_SETUP
-#line 303 "compilers/imcc/imcc.l"
+#line 305 "compilers/imcc/imcc.l"
 { IMCC_INFO(interp)->line++; }
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 305 "compilers/imcc/imcc.l"
+#line 307 "compilers/imcc/imcc.l"
 return TK_LINE;
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 306 "compilers/imcc/imcc.l"
+#line 308 "compilers/imcc/imcc.l"
 return TK_FILE;
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 307 "compilers/imcc/imcc.l"
+#line 309 "compilers/imcc/imcc.l"
 return ANNOTATE;
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 308 "compilers/imcc/imcc.l"
+#line 310 "compilers/imcc/imcc.l"
 return LEXICAL;
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 309 "compilers/imcc/imcc.l"
+#line 311 "compilers/imcc/imcc.l"
 return ARG;
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 310 "compilers/imcc/imcc.l"
+#line 312 "compilers/imcc/imcc.l"
 return SUB;
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 311 "compilers/imcc/imcc.l"
+#line 313 "compilers/imcc/imcc.l"
 return ESUB;
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 312 "compilers/imcc/imcc.l"
+#line 314 "compilers/imcc/imcc.l"
 return PCC_BEGIN;
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 313 "compilers/imcc/imcc.l"
+#line 315 "compilers/imcc/imcc.l"
 return PCC_END;
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 314 "compilers/imcc/imcc.l"
+#line 316 "compilers/imcc/imcc.l"
 return PCC_CALL;
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 315 "compilers/imcc/imcc.l"
+#line 317 "compilers/imcc/imcc.l"
 return NCI_CALL;
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 316 "compilers/imcc/imcc.l"
+#line 318 "compilers/imcc/imcc.l"
 return METH_CALL;
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 317 "compilers/imcc/imcc.l"
+#line 319 "compilers/imcc/imcc.l"
 return INVOCANT;
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 318 "compilers/imcc/imcc.l"
+#line 320 "compilers/imcc/imcc.l"
 return PCC_SUB;
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 319 "compilers/imcc/imcc.l"
+#line 321 "compilers/imcc/imcc.l"
 return PCC_BEGIN_RETURN;
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 320 "compilers/imcc/imcc.l"
+#line 322 "compilers/imcc/imcc.l"
 return PCC_END_RETURN;
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 321 "compilers/imcc/imcc.l"
+#line 323 "compilers/imcc/imcc.l"
 return PCC_BEGIN_YIELD;
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 322 "compilers/imcc/imcc.l"
+#line 324 "compilers/imcc/imcc.l"
 return PCC_END_YIELD;
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 324 "compilers/imcc/imcc.l"
+#line 326 "compilers/imcc/imcc.l"
 return METHOD;
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 325 "compilers/imcc/imcc.l"
+#line 327 "compilers/imcc/imcc.l"
 return MULTI;
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 326 "compilers/imcc/imcc.l"
+#line 328 "compilers/imcc/imcc.l"
 return MAIN;
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 327 "compilers/imcc/imcc.l"
+#line 329 "compilers/imcc/imcc.l"
 return LOAD;
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 328 "compilers/imcc/imcc.l"
+#line 330 "compilers/imcc/imcc.l"
 return INIT;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 329 "compilers/imcc/imcc.l"
+#line 331 "compilers/imcc/imcc.l"
 return IMMEDIATE;
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 330 "compilers/imcc/imcc.l"
+#line 332 "compilers/imcc/imcc.l"
 return POSTCOMP;
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 331 "compilers/imcc/imcc.l"
+#line 333 "compilers/imcc/imcc.l"
 return ANON;
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 332 "compilers/imcc/imcc.l"
+#line 334 "compilers/imcc/imcc.l"
 return OUTER;
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 333 "compilers/imcc/imcc.l"
+#line 335 "compilers/imcc/imcc.l"
 return NEED_LEX;
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 334 "compilers/imcc/imcc.l"
+#line 336 "compilers/imcc/imcc.l"
 return VTABLE_METHOD;
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 335 "compilers/imcc/imcc.l"
+#line 337 "compilers/imcc/imcc.l"
 return NS_ENTRY;
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 336 "compilers/imcc/imcc.l"
+#line 338 "compilers/imcc/imcc.l"
 return UNIQUE_REG;
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 337 "compilers/imcc/imcc.l"
+#line 339 "compilers/imcc/imcc.l"
 return SUB_INSTANCE_OF;
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 338 "compilers/imcc/imcc.l"
+#line 340 "compilers/imcc/imcc.l"
 return SUBID;
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 340 "compilers/imcc/imcc.l"
+#line 342 "compilers/imcc/imcc.l"
 return RESULT;
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 341 "compilers/imcc/imcc.l"
+#line 343 "compilers/imcc/imcc.l"
 return GET_RESULTS;
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 342 "compilers/imcc/imcc.l"
+#line 344 "compilers/imcc/imcc.l"
 return YIELDT;
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 343 "compilers/imcc/imcc.l"
+#line 345 "compilers/imcc/imcc.l"
 return SET_YIELD;
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 344 "compilers/imcc/imcc.l"
+#line 346 "compilers/imcc/imcc.l"
 return RETURN;
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 345 "compilers/imcc/imcc.l"
+#line 347 "compilers/imcc/imcc.l"
 return SET_RETURN;
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 346 "compilers/imcc/imcc.l"
+#line 348 "compilers/imcc/imcc.l"
 return TAILCALL;
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 347 "compilers/imcc/imcc.l"
+#line 349 "compilers/imcc/imcc.l"
 return LOADLIB;
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 349 "compilers/imcc/imcc.l"
+#line 351 "compilers/imcc/imcc.l"
 return ADV_FLAT;
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 350 "compilers/imcc/imcc.l"
+#line 352 "compilers/imcc/imcc.l"
 return ADV_SLURPY;
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 351 "compilers/imcc/imcc.l"
+#line 353 "compilers/imcc/imcc.l"
 return ADV_OPTIONAL;
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 352 "compilers/imcc/imcc.l"
+#line 354 "compilers/imcc/imcc.l"
 return ADV_OPT_FLAG;
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 353 "compilers/imcc/imcc.l"
+#line 355 "compilers/imcc/imcc.l"
 return ADV_NAMED;
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 354 "compilers/imcc/imcc.l"
+#line 356 "compilers/imcc/imcc.l"
 return ADV_ARROW;
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 355 "compilers/imcc/imcc.l"
+#line 357 "compilers/imcc/imcc.l"
 return ADV_INVOCANT;
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 356 "compilers/imcc/imcc.l"
+#line 358 "compilers/imcc/imcc.l"
 return ADV_CALL_SIG;
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 358 "compilers/imcc/imcc.l"
+#line 360 "compilers/imcc/imcc.l"
 return NAMESPACE;
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 359 "compilers/imcc/imcc.l"
+#line 361 "compilers/imcc/imcc.l"
 return HLL;
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 361 "compilers/imcc/imcc.l"
+#line 363 "compilers/imcc/imcc.l"
 return LOCAL;
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 362 "compilers/imcc/imcc.l"
+#line 364 "compilers/imcc/imcc.l"
 return CONST;
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 363 "compilers/imcc/imcc.l"
+#line 365 "compilers/imcc/imcc.l"
 return GLOBAL_CONST;
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 364 "compilers/imcc/imcc.l"
+#line 366 "compilers/imcc/imcc.l"
 return PARAM;
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 365 "compilers/imcc/imcc.l"
+#line 367 "compilers/imcc/imcc.l"
 return GOTO;
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 366 "compilers/imcc/imcc.l"
+#line 368 "compilers/imcc/imcc.l"
 return IF;
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 367 "compilers/imcc/imcc.l"
+#line 369 "compilers/imcc/imcc.l"
 return UNLESS;
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 368 "compilers/imcc/imcc.l"
+#line 370 "compilers/imcc/imcc.l"
 return PNULL;
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 369 "compilers/imcc/imcc.l"
+#line 371 "compilers/imcc/imcc.l"
 return INTV;
 	YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 370 "compilers/imcc/imcc.l"
+#line 372 "compilers/imcc/imcc.l"
 return FLOATV;
 	YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 372 "compilers/imcc/imcc.l"
+#line 374 "compilers/imcc/imcc.l"
 return PMCV;
 	YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 373 "compilers/imcc/imcc.l"
+#line 375 "compilers/imcc/imcc.l"
 return STRINGV;
 	YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 374 "compilers/imcc/imcc.l"
+#line 376 "compilers/imcc/imcc.l"
 return SHIFT_LEFT;
 	YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 375 "compilers/imcc/imcc.l"
+#line 377 "compilers/imcc/imcc.l"
 return SHIFT_RIGHT;
 	YY_BREAK
 case 83:
 YY_RULE_SETUP
-#line 376 "compilers/imcc/imcc.l"
+#line 378 "compilers/imcc/imcc.l"
 return SHIFT_RIGHT_U;
 	YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 377 "compilers/imcc/imcc.l"
+#line 379 "compilers/imcc/imcc.l"
 return LOG_AND;
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 378 "compilers/imcc/imcc.l"
+#line 380 "compilers/imcc/imcc.l"
 return LOG_OR;
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 379 "compilers/imcc/imcc.l"
+#line 381 "compilers/imcc/imcc.l"
 return LOG_XOR;
 	YY_BREAK
 case 87:
 YY_RULE_SETUP
-#line 380 "compilers/imcc/imcc.l"
+#line 382 "compilers/imcc/imcc.l"
 return RELOP_LT;
 	YY_BREAK
 case 88:
 YY_RULE_SETUP
-#line 381 "compilers/imcc/imcc.l"
+#line 383 "compilers/imcc/imcc.l"
 return RELOP_LTE;
 	YY_BREAK
 case 89:
 YY_RULE_SETUP
-#line 382 "compilers/imcc/imcc.l"
+#line 384 "compilers/imcc/imcc.l"
 return RELOP_GT;
 	YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 383 "compilers/imcc/imcc.l"
+#line 385 "compilers/imcc/imcc.l"
 return RELOP_GTE;
 	YY_BREAK
 case 91:
 YY_RULE_SETUP
-#line 384 "compilers/imcc/imcc.l"
+#line 386 "compilers/imcc/imcc.l"
 return RELOP_EQ;
 	YY_BREAK
 case 92:
 YY_RULE_SETUP
-#line 385 "compilers/imcc/imcc.l"
+#line 387 "compilers/imcc/imcc.l"
 return RELOP_NE;
 	YY_BREAK
 case 93:
 YY_RULE_SETUP
-#line 386 "compilers/imcc/imcc.l"
+#line 388 "compilers/imcc/imcc.l"
 return POW;
 	YY_BREAK
 case 94:
 YY_RULE_SETUP
-#line 388 "compilers/imcc/imcc.l"
+#line 390 "compilers/imcc/imcc.l"
 return CONCAT;
 	YY_BREAK
 case 95:
 YY_RULE_SETUP
-#line 389 "compilers/imcc/imcc.l"
+#line 391 "compilers/imcc/imcc.l"
 return DOT;
 	YY_BREAK
 case 96:
 YY_RULE_SETUP
-#line 391 "compilers/imcc/imcc.l"
+#line 393 "compilers/imcc/imcc.l"
 return PLUS_ASSIGN;
 	YY_BREAK
 case 97:
 YY_RULE_SETUP
-#line 392 "compilers/imcc/imcc.l"
+#line 394 "compilers/imcc/imcc.l"
 return MINUS_ASSIGN;
 	YY_BREAK
 case 98:
 YY_RULE_SETUP
-#line 393 "compilers/imcc/imcc.l"
+#line 395 "compilers/imcc/imcc.l"
 return MUL_ASSIGN;
 	YY_BREAK
 case 99:
 YY_RULE_SETUP
-#line 394 "compilers/imcc/imcc.l"
+#line 396 "compilers/imcc/imcc.l"
 return DIV_ASSIGN;
 	YY_BREAK
 case 100:
 YY_RULE_SETUP
-#line 395 "compilers/imcc/imcc.l"
+#line 397 "compilers/imcc/imcc.l"
 return MOD_ASSIGN;
 	YY_BREAK
 case 101:
 YY_RULE_SETUP
-#line 396 "compilers/imcc/imcc.l"
+#line 398 "compilers/imcc/imcc.l"
 return FDIV;
 	YY_BREAK
 case 102:
 YY_RULE_SETUP
-#line 397 "compilers/imcc/imcc.l"
+#line 399 "compilers/imcc/imcc.l"
 return FDIV_ASSIGN;
 	YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 398 "compilers/imcc/imcc.l"
+#line 400 "compilers/imcc/imcc.l"
 return BAND_ASSIGN;
 	YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 399 "compilers/imcc/imcc.l"
+#line 401 "compilers/imcc/imcc.l"
 return BOR_ASSIGN;
 	YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 400 "compilers/imcc/imcc.l"
+#line 402 "compilers/imcc/imcc.l"
 return BXOR_ASSIGN;
 	YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 401 "compilers/imcc/imcc.l"
+#line 403 "compilers/imcc/imcc.l"
 return SHR_ASSIGN;
 	YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 402 "compilers/imcc/imcc.l"
+#line 404 "compilers/imcc/imcc.l"
 return SHL_ASSIGN;
 	YY_BREAK
 case 108:
 YY_RULE_SETUP
-#line 403 "compilers/imcc/imcc.l"
+#line 405 "compilers/imcc/imcc.l"
 return SHR_U_ASSIGN;
 	YY_BREAK
 case 109:
 YY_RULE_SETUP
-#line 404 "compilers/imcc/imcc.l"
+#line 406 "compilers/imcc/imcc.l"
 return CONCAT_ASSIGN;
 	YY_BREAK
 case 110:
 YY_RULE_SETUP
-#line 406 "compilers/imcc/imcc.l"
+#line 408 "compilers/imcc/imcc.l"
 {
         char *macro_name   = NULL;
         int   start_cond   = YY_START;
@@ -3521,11 +3523,11 @@
             macro_exists = 1;
 
         define_macro(interp, macro_name, NULL, valp->s, start_line);
-        mem_sys_free(valp->s);
+        mem_gc_free(interp, valp->s);
 
         /* don't leak these */
         if (macro_exists)
-            mem_sys_free(macro_name);
+            mem_gc_free(interp, macro_name);
 
         IMCC_INFO(interp)->cur_macro_name = NULL;
 
@@ -3535,14 +3537,14 @@
 	YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 449 "compilers/imcc/imcc.l"
+#line 451 "compilers/imcc/imcc.l"
 {
         return read_macro(valp, interp, yyscanner);
     }
 	YY_BREAK
 case 112:
 YY_RULE_SETUP
-#line 453 "compilers/imcc/imcc.l"
+#line 455 "compilers/imcc/imcc.l"
 {
         const int c = yylex(valp,yyscanner,interp);
 
@@ -3557,7 +3559,7 @@
 	YY_BREAK
 case 113:
 YY_RULE_SETUP
-#line 465 "compilers/imcc/imcc.l"
+#line 467 "compilers/imcc/imcc.l"
 {
         if (valp) {
             char *label;
@@ -3570,7 +3572,7 @@
                     IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR, "missing space?");
 
             len = yyleng + 10;
-            label = (char *)mem_sys_allocate(len);
+            label = mem_gc_allocate_n_typed(interp, len, char);
             snprintf(label, len, "%s%d", yytext, IMCC_INFO(interp)->frames->label);
 
             /* XXX: free valp->s if it exists? */
@@ -3582,7 +3584,7 @@
 	YY_BREAK
 case 114:
 YY_RULE_SETUP
-#line 487 "compilers/imcc/imcc.l"
+#line 489 "compilers/imcc/imcc.l"
 {
 
         if (valp) {
@@ -3594,7 +3596,7 @@
                 IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR, "missing space?");
 
             len = yyleng + 10;
-            label = (char *)mem_sys_allocate(len);
+            label = mem_gc_allocate_n_typed(interp, len, char);
             snprintf(label, len, "%s%d", yytext, IMCC_INFO(interp)->frames->label);
 
             /* XXX: free valp->s if it exists? */
@@ -3606,12 +3608,12 @@
 	YY_BREAK
 case 115:
 YY_RULE_SETUP
-#line 508 "compilers/imcc/imcc.l"
+#line 510 "compilers/imcc/imcc.l"
 return COMMA;
 	YY_BREAK
 case 116:
 YY_RULE_SETUP
-#line 510 "compilers/imcc/imcc.l"
+#line 512 "compilers/imcc/imcc.l"
 {
         /* trim last ':' */
         YYCHOP();
@@ -3624,11 +3626,11 @@
 	YY_BREAK
 case 117:
 YY_RULE_SETUP
-#line 520 "compilers/imcc/imcc.l"
+#line 522 "compilers/imcc/imcc.l"
 {
         char   * const macro_name = Parrot_gc_strdup(interp, yytext + 1);
         int failed = expand_macro(interp, macro_name, yyscanner);
-        mem_sys_free(macro_name);
+        mem_gc_free(interp, macro_name);
         if (!failed) {
             yyless(1);
             return DOT;
@@ -3637,32 +3639,32 @@
 	YY_BREAK
 case 118:
 YY_RULE_SETUP
-#line 532 "compilers/imcc/imcc.l"
+#line 534 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, FLOATC);
 	YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 533 "compilers/imcc/imcc.l"
+#line 535 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, INTC);
 	YY_BREAK
 case 120:
 YY_RULE_SETUP
-#line 534 "compilers/imcc/imcc.l"
+#line 536 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, INTC);
 	YY_BREAK
 case 121:
 YY_RULE_SETUP
-#line 535 "compilers/imcc/imcc.l"
+#line 537 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, INTC);
 	YY_BREAK
 case 122:
 YY_RULE_SETUP
-#line 536 "compilers/imcc/imcc.l"
+#line 538 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, INTC);
 	YY_BREAK
 case 123:
 YY_RULE_SETUP
-#line 538 "compilers/imcc/imcc.l"
+#line 540 "compilers/imcc/imcc.l"
 {
         valp->s = Parrot_gc_strdup(interp, yytext);
 
@@ -3675,7 +3677,7 @@
 	YY_BREAK
 case 124:
 YY_RULE_SETUP
-#line 548 "compilers/imcc/imcc.l"
+#line 550 "compilers/imcc/imcc.l"
 {
         valp->s = Parrot_gc_strdup(interp, yytext);
 
@@ -3684,7 +3686,7 @@
 	YY_BREAK
 case 125:
 YY_RULE_SETUP
-#line 554 "compilers/imcc/imcc.l"
+#line 556 "compilers/imcc/imcc.l"
 {
         macro_frame_t *frame;
 
@@ -3703,7 +3705,7 @@
         IMCC_INFO(interp)->frames = frame;
 
         /* Start slurping up the heredoc. */
-        IMCC_INFO(interp)->heredoc_content    = (char *)mem_sys_allocate(2);
+        IMCC_INFO(interp)->heredoc_content    = mem_gc_allocate_n_typed(interp, 2, char);
 
         /* preserve delim */
         IMCC_INFO(interp)->heredoc_content[0] = yytext[2];
@@ -3715,7 +3717,7 @@
 	YY_BREAK
 case 126:
 YY_RULE_SETUP
-#line 582 "compilers/imcc/imcc.l"
+#line 584 "compilers/imcc/imcc.l"
 {
         /* charset:"..." */
         valp->s = Parrot_gc_strdup(interp, yytext);
@@ -3726,7 +3728,7 @@
 	YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 590 "compilers/imcc/imcc.l"
+#line 592 "compilers/imcc/imcc.l"
 {
         if (valp) (valp)->s = yytext;
         if (IMCC_INFO(interp)->state->pasm_file)
@@ -3737,7 +3739,7 @@
 	YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 598 "compilers/imcc/imcc.l"
+#line 600 "compilers/imcc/imcc.l"
 {
         if (valp) (valp)->s = yytext;
         if (IMCC_INFO(interp)->state->pasm_file)
@@ -3748,7 +3750,7 @@
 	YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 606 "compilers/imcc/imcc.l"
+#line 608 "compilers/imcc/imcc.l"
 {
         if (valp) (valp)->s = yytext;
         if (IMCC_INFO(interp)->state->pasm_file)
@@ -3759,7 +3761,7 @@
 	YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 614 "compilers/imcc/imcc.l"
+#line 616 "compilers/imcc/imcc.l"
 {
         if (valp) (valp)->s = yytext;
         if (IMCC_INFO(interp)->state->pasm_file)
@@ -3770,7 +3772,7 @@
 	YY_BREAK
 case 131:
 YY_RULE_SETUP
-#line 622 "compilers/imcc/imcc.l"
+#line 624 "compilers/imcc/imcc.l"
 {
         IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
             "'%s' is not a valid register name", yytext);
@@ -3778,7 +3780,7 @@
 	YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 627 "compilers/imcc/imcc.l"
+#line 629 "compilers/imcc/imcc.l"
 {
         if (IMCC_INFO(interp)->state->pasm_file == 0)
             IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
@@ -3792,7 +3794,7 @@
 	YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 638 "compilers/imcc/imcc.l"
+#line 640 "compilers/imcc/imcc.l"
 {
         if (!IMCC_INFO(interp)->is_def) {
             SymReg *r = find_sym(interp, yytext);
@@ -3823,19 +3825,19 @@
 	YY_BREAK
 case 134:
 YY_RULE_SETUP
-#line 667 "compilers/imcc/imcc.l"
+#line 669 "compilers/imcc/imcc.l"
 /* skip */;
 	YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 669 "compilers/imcc/imcc.l"
+#line 671 "compilers/imcc/imcc.l"
 {
         /* catch all except for state macro */
         return yytext[0];
     }
 	YY_BREAK
 case YY_STATE_EOF(emit):
-#line 674 "compilers/imcc/imcc.l"
+#line 676 "compilers/imcc/imcc.l"
 {
         BEGIN(INITIAL);
 
@@ -3848,18 +3850,18 @@
     }
 	YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 685 "compilers/imcc/imcc.l"
+#line 687 "compilers/imcc/imcc.l"
 yyterminate();
 	YY_BREAK
 case 136:
 YY_RULE_SETUP
-#line 687 "compilers/imcc/imcc.l"
+#line 689 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, ENDM);
 	YY_BREAK
 case 137:
 /* rule 137 can match eol */
 YY_RULE_SETUP
-#line 689 "compilers/imcc/imcc.l"
+#line 691 "compilers/imcc/imcc.l"
 {
         IMCC_INFO(interp)->line++;
         DUP_AND_RET(valp, '\n');
@@ -3867,12 +3869,12 @@
 	YY_BREAK
 case 138:
 YY_RULE_SETUP
-#line 694 "compilers/imcc/imcc.l"
+#line 696 "compilers/imcc/imcc.l"
 return LABEL;
 	YY_BREAK
 case 139:
 YY_RULE_SETUP
-#line 696 "compilers/imcc/imcc.l"
+#line 698 "compilers/imcc/imcc.l"
 {
 
         if (yylex(valp,yyscanner,interp) != LABEL)
@@ -3884,13 +3886,13 @@
             YYCHOP();
 
             len = strlen(IMCC_INFO(interp)->cur_macro_name) + yyleng + 15;
-            label = (char *)mem_sys_allocate(len);
+            label = mem_gc_allocate_n_typed(interp, len, char);
 
             snprintf(label, len, "local__%s__%s__$:",
                 IMCC_INFO(interp)->cur_macro_name, yytext+1);
 
             if (valp->s)
-                mem_sys_free(valp->s);
+                mem_gc_free(interp, valp->s);
             valp->s = label;
         }
 
@@ -3899,12 +3901,12 @@
 	YY_BREAK
 case 140:
 YY_RULE_SETUP
-#line 720 "compilers/imcc/imcc.l"
+#line 722 "compilers/imcc/imcc.l"
 {
     if (valp) {
         if (!IMCC_INFO(interp)->cur_macro_name) {
             if (valp->s)
-                mem_sys_free(valp->s);
+                mem_gc_free(interp, valp->s);
             IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                 "Invalid LABEL outside of macro");
         }
@@ -3913,14 +3915,14 @@
             const size_t fmtlen = strlen(fmt) - (2 * strlen("%s"));
             const size_t len    = strlen(IMCC_INFO(interp)->cur_macro_name)
                                 + yyleng + fmtlen;
-            char * const label  = (char *)mem_sys_allocate(len);
+            char * const label  = mem_gc_allocate_n_typed(interp, len, char);
 
             /* skip over ".$" prefix with the +2 */
             snprintf(label, len, fmt,
                 IMCC_INFO(interp)->cur_macro_name, yytext + 2);
 
             if (valp->s)
-                mem_sys_free(valp->s);
+                mem_gc_free(interp, valp->s);
             valp->s = label;
         }
     }
@@ -3930,49 +3932,49 @@
 	YY_BREAK
 case 141:
 YY_RULE_SETUP
-#line 748 "compilers/imcc/imcc.l"
+#line 750 "compilers/imcc/imcc.l"
 /* skip leading ws */;
 	YY_BREAK
 case 142:
 YY_RULE_SETUP
-#line 749 "compilers/imcc/imcc.l"
+#line 751 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, ' ');
 	YY_BREAK
 case 143:
 YY_RULE_SETUP
-#line 750 "compilers/imcc/imcc.l"
+#line 752 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, REG);
 	YY_BREAK
 case 144:
 YY_RULE_SETUP
-#line 751 "compilers/imcc/imcc.l"
+#line 753 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, REG);
 	YY_BREAK
 case 145:
 YY_RULE_SETUP
-#line 752 "compilers/imcc/imcc.l"
+#line 754 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, IDENTIFIER);
 	YY_BREAK
 case 146:
 YY_RULE_SETUP
-#line 753 "compilers/imcc/imcc.l"
+#line 755 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, MACRO);
 	YY_BREAK
 case 147:
 YY_RULE_SETUP
-#line 754 "compilers/imcc/imcc.l"
+#line 756 "compilers/imcc/imcc.l"
 DUP_AND_RET(valp, yytext[0]);
 	YY_BREAK
 case YY_STATE_EOF(macro):
-#line 755 "compilers/imcc/imcc.l"
+#line 757 "compilers/imcc/imcc.l"
 yyterminate();
 	YY_BREAK
 case 148:
 YY_RULE_SETUP
-#line 757 "compilers/imcc/imcc.l"
+#line 759 "compilers/imcc/imcc.l"
 ECHO;
 	YY_BREAK
-#line 3976 "compilers/imcc/imclexer.c"
+#line 3978 "compilers/imcc/imclexer.c"
 case YY_STATE_EOF(pod):
 case YY_STATE_EOF(cmt1):
 case YY_STATE_EOF(cmt2):
@@ -5174,7 +5176,7 @@
 
 #define YYTABLES_NAME "yytables"
 
-#line 757 "compilers/imcc/imcc.l"
+#line 759 "compilers/imcc/imcc.l"
 
 
 
@@ -5240,25 +5242,25 @@
 }
 
 static int
-destroy_frame(struct macro_frame_t *frame, void *yyscanner)
+destroy_frame(PARROT_INTERP, struct macro_frame_t *frame, void *yyscanner)
 {
     YY_BUFFER_STATE buffer = frame->buffer;
     int             ret    = 0;
     int             i;
 
     for (i = 0; i < frame->expansion.num_param; i++) {
-        mem_sys_free(frame->expansion.name[i]);
+        mem_gc_free(interp, frame->expansion.name[i]);
         frame->expansion.name[i] = NULL;
     }
 
     if (frame->heredoc_rest) {
-        mem_sys_free(frame->heredoc_rest);
+        mem_gc_free(interp, frame->heredoc_rest);
         frame->heredoc_rest = NULL;
     } else
         ret = frame->s.line;
 
-    mem_sys_free(frame->s.file);
-    mem_sys_free(frame);
+    mem_gc_free(interp, frame->s.file);
+    mem_gc_free(interp, frame);
 
     if (buffer != NULL)
         yy_switch_to_buffer(buffer,yyscanner);
@@ -5317,21 +5319,21 @@
                         macro_name);
 
         len     += strlen(val.s);
-        current  = (char *)mem_sys_realloc(current, len + 1);
+        current  = mem_gc_realloc_n_typed(interp, current, len + 1, char);
         strcat(current,val.s);
 
-        mem_sys_free(val.s);
+        mem_gc_free(interp, val.s);
         val.s = NULL;
         c = yylex(&val,yyscanner,interp);
     }
 
     if (valp) {
         if (valp->s)
-            mem_sys_free(valp->s);
+            mem_gc_free(interp, valp->s);
         *valp = val;
     }
     else
-        mem_sys_free(val.s);
+        mem_gc_free(interp, val.s);
 
     return current;
 }
@@ -5368,7 +5370,7 @@
             len                               = 0;
 
             if (val.s)
-                mem_sys_free(val.s);
+                mem_gc_free(interp, val.s);
             c = yylex_skip(&val, interp, " \n", yyscanner);
         }
         else if (need_id && (*current || c != IDENTIFIER) && c != ' ') {
@@ -5378,18 +5380,18 @@
         }
         else if (c == '{') {
             current = read_braced(&val, interp, macro_name, current, yyscanner);
-            mem_sys_free(val.s);
+            mem_gc_free(interp, val.s);
             c       = yylex_skip(&val, interp, " \n", yyscanner);
             len     = strlen(current);
         }
         else {
             if (!need_id || c != ' ') {
                 len     += strlen(val.s);
-                current  = (char *)mem_sys_realloc(current, len + 1);
+                current  = mem_gc_realloc_n_typed(interp, current, len + 1, char);
                 strcat(current, val.s);
             }
 
-            mem_sys_free(val.s);
+            mem_gc_free(interp, val.s);
             val.s = NULL;
             c = yylex(&val,yyscanner,interp);
         }
@@ -5400,7 +5402,7 @@
     if (valp)
         *valp = val;
     else
-        mem_sys_free(val.s);
+        mem_gc_free(interp, val.s);
 
     return c;
 }
@@ -5431,7 +5433,7 @@
     c = yylex_skip(valp, interp, " ", yyscanner);
 
     if (c == '(') {
-        mem_sys_free(valp->s);
+        mem_gc_free(interp, valp->s);
         valp->s = NULL;
 
         c = read_params(NULL, interp, &params,
@@ -5445,7 +5447,7 @@
         int   elem_len;
 
         if (c <= 0) {
-            mem_sys_free(valp->s);
+            mem_gc_free(interp, valp->s);
             IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                         "File ended before macro '%s' was complete",
                         IMCC_INFO(interp)->cur_macro_name);
@@ -5460,27 +5462,27 @@
                     buffer_size <<= 1;
 
                     IMCC_INFO(interp)->macro_buffer =
-                        (char *)mem_sys_realloc(IMCC_INFO(interp)->macro_buffer,
-                            buffer_size);
+                        mem_gc_realloc_n_typed(interp, IMCC_INFO(interp)->macro_buffer,
+                            buffer_size, char);
                 }
             }
             else {
                 buffer_size = (elem_len << 1) > 1024 ? elem_len << 1 : 1024;
 
                 IMCC_INFO(interp)->macro_buffer =
-                    (char *)mem_sys_allocate_zeroed(buffer_size);
+                    mem_gc_allocate_n_zeroed_typed(interp, buffer_size, char);
             }
 
             strcat(IMCC_INFO(interp)->macro_buffer, valp->s);
             buffer_used += elem_len;
 
-            mem_sys_free(valp->s);
+            mem_gc_free(interp, valp->s);
             valp->s = NULL;
         }
         c = yylex(valp,yyscanner,interp);
     }
 
-    mem_sys_free(valp->s);
+    mem_gc_free(interp, valp->s);
     valp->s = NULL;
 
     BEGIN(start_cond);
@@ -5488,7 +5490,7 @@
     define_macro(interp, IMCC_INFO(interp)->cur_macro_name,
                  &params, IMCC_INFO(interp)->macro_buffer, start_line);
 
-    mem_sys_free(IMCC_INFO(interp)->macro_buffer);
+    mem_gc_free(interp, IMCC_INFO(interp)->macro_buffer);
     IMCC_INFO(interp)->macro_buffer   = NULL;
     IMCC_INFO(interp)->cur_macro_name = NULL;
 
@@ -5525,7 +5527,7 @@
     macro_t *m = find_macro(interp, name);
 
     if (m) {
-        mem_sys_free(m->expansion);
+        mem_gc_free(interp, m->expansion);
         m->expansion = NULL;
     }
     else {
@@ -5584,7 +5586,7 @@
         /* remember macro name for error reporting
          * first free any filename allocated in new_frame() */
         if (frame->s.file)
-            mem_sys_free(frame->s.file);
+            mem_gc_free(interp, frame->s.file);
 
         frame->s.file            = Parrot_gc_strdup(interp, name);
 
@@ -5635,7 +5637,7 @@
 
                 if (s) {
                     frame->expansion.name[i] = Parrot_gc_strdup(interp, s);
-                    mem_sys_free(current);
+                    mem_gc_free(interp, current);
                 }
 
             }
@@ -5643,14 +5645,14 @@
                 const size_t len = strlen(current);
                 if (len && (current[len - 1] == '$')) { /* local label */
                     const size_t slen = len + 10;
-                    char * const s    = (char *)mem_sys_allocate(slen);
+                    char * const s    = mem_gc_allocate_n_typed(interp, slen, char);
 
                     current[len - 1] = '\0';
 
                     snprintf(s, slen, "%s%d", current, IMCC_INFO(interp)->frames->label);
 
                     frame->expansion.name[i] = s;
-                    mem_sys_free(current);
+                    mem_gc_free(interp, current);
                 }
             }
         }
@@ -5677,13 +5679,13 @@
 
     if (!s || !(file = fopen(s, "r"))) {
         if (frame->s.file)
-            mem_sys_free(frame->s.file);
+            mem_gc_free(interp, frame->s.file);
         IMCC_fataly(interp, EXCEPTION_EXTERNAL_ERROR, strerror(errno));
     }
 
     if (frame->s.file)
-        mem_sys_free(frame->s.file);
-    mem_sys_free(s);
+        mem_gc_free(interp, frame->s.file);
+    mem_gc_free(interp, s);
     frame->s.file            = Parrot_gc_strdup(interp, file_name);
     frame->s.handle          = file;
     ext                      = strrchr(file_name, '.');
@@ -5739,7 +5741,7 @@
         IMCC_INFO(interp)->frames =
             (macro_frame_t *)IMCC_INFO(interp)->frames->s.next;
 
-        l = destroy_frame(tmp, yyscanner);
+        l = destroy_frame(interp, tmp, yyscanner);
 
         if (l)
             IMCC_INFO(interp)->line = l;

Modified: branches/boehm_gc_2/compilers/imcc/imcparser.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/imcparser.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/imcparser.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -805,7 +805,7 @@
     r[1]          = rhs;
     rhs->pmc_type = type_enum;
 
-    mem_sys_free(name);
+    mem_gc_free(interp, name);
 
     return INS(interp, unit, "set_p_pc", "", r, 2, 0, 1);
 }
@@ -871,8 +871,8 @@
     rhs->pmc_type = Parrot_pmc_get_type_str(interp,
         Parrot_str_new(interp, unquoted_name, name_length));
 
-    mem_sys_free(unquoted_name);
-    mem_sys_free(const_name);
+    mem_gc_free(interp, unquoted_name);
+    mem_gc_free(interp, const_name);
 
     return INS(interp, unit, "set_p_pc", "", r, 2, 0, 1);
 }
@@ -1121,7 +1121,7 @@
     }
 
     r = mk_sub_address(interp, name_copy + 1);
-    mem_sys_free(name_copy);
+    mem_gc_free(interp, name_copy);
 
     return r;
 }
@@ -3304,7 +3304,7 @@
     {
            (yyval.i) = 0;
            do_loadlib(interp, (yyvsp[(2) - (3)].s));
-           mem_sys_free((yyvsp[(2) - (3)].s));
+           mem_gc_free(interp, (yyvsp[(2) - (3)].s));
          }
     break;
 
@@ -3332,7 +3332,7 @@
            * store annotation like it's an instruction. */
           SymReg * const key = mk_const(interp, (yyvsp[(2) - (4)].s), 'S');
           (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, ".annotate", 2, key, (yyvsp[(4) - (4)].sr));
-          mem_sys_free((yyvsp[(2) - (4)].s));
+          mem_gc_free(interp, (yyvsp[(2) - (4)].s));
         }
     break;
 
@@ -3344,7 +3344,7 @@
                 Parrot_register_HLL(interp, hll_name));
 
             IMCC_INFO(interp)->cur_namespace = NULL;
-            mem_sys_free((yyvsp[(2) - (2)].s));
+            mem_gc_free(interp, (yyvsp[(2) - (2)].s));
             (yyval.t) = 0;
          }
     break;
@@ -3358,7 +3358,7 @@
 #line 1250 "compilers/imcc/imcc.y"
     {
              mk_const_ident(interp, (yyvsp[(4) - (6)].s), (yyvsp[(3) - (6)].t), (yyvsp[(6) - (6)].sr), 1);
-             mem_sys_free((yyvsp[(4) - (6)].s));
+             mem_gc_free(interp, (yyvsp[(4) - (6)].s));
              IMCC_INFO(interp)->is_def = 0;
          }
     break;
@@ -3372,7 +3372,7 @@
 #line 1259 "compilers/imcc/imcc.y"
     {
            (yyval.i) = mk_pmc_const(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(3) - (6)].s), (yyvsp[(4) - (6)].sr), (yyvsp[(6) - (6)].s));
-           mem_sys_free((yyvsp[(6) - (6)].s));
+           mem_gc_free(interp, (yyvsp[(6) - (6)].s));
            IMCC_INFO(interp)->is_def = 0;
          }
     break;
@@ -3386,8 +3386,8 @@
 #line 1266 "compilers/imcc/imcc.y"
     {
            (yyval.i) = mk_pmc_const_named(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(3) - (6)].s), (yyvsp[(4) - (6)].sr), (yyvsp[(6) - (6)].s));
-           mem_sys_free((yyvsp[(3) - (6)].s));
-           mem_sys_free((yyvsp[(6) - (6)].s));
+           mem_gc_free(interp, (yyvsp[(3) - (6)].s));
+           mem_gc_free(interp, (yyvsp[(6) - (6)].s));
            IMCC_INFO(interp)->is_def = 0;
          }
     break;
@@ -3428,7 +3428,7 @@
            (yyval.i) = INS(interp, IMCC_INFO(interp)->cur_unit,
                     (yyvsp[(2) - (3)].s), 0, IMCC_INFO(interp)->regs,
                     IMCC_INFO(interp)->nargs, IMCC_INFO(interp) -> keyvec, 1);
-            mem_sys_free((yyvsp[(2) - (3)].s));
+            mem_gc_free(interp, (yyvsp[(2) - (3)].s));
          }
     break;
 
@@ -3447,7 +3447,7 @@
                     IMCC_INFO(interp)->cur_unit,
                     mk_sub_label(interp, (yyvsp[(4) - (4)].s)));
            IMCC_INFO(interp)->cur_call->pcc_sub->pragma = (yyvsp[(3) - (4)].t);
-           mem_sys_free((yyvsp[(4) - (4)].s));
+           mem_gc_free(interp, (yyvsp[(4) - (4)].s));
          }
     break;
 
@@ -3468,9 +3468,9 @@
            n = mk_const(interp, name, 'S');
            set_lexical(interp, r, n);
            (yyval.i) = 0;
-           mem_sys_free(name);
-           mem_sys_free((yyvsp[(2) - (4)].s));
-           mem_sys_free((yyvsp[(4) - (4)].s));
+           mem_gc_free(interp, name);
+           mem_gc_free(interp, (yyvsp[(2) - (4)].s));
+           mem_gc_free(interp, (yyvsp[(4) - (4)].s));
          }
     break;
 
@@ -3605,7 +3605,7 @@
            else
                (yyval.sr) = mk_ident(interp, (yyvsp[(2) - (3)].s), (yyvsp[(1) - (3)].t));
            (yyval.sr)->type |= (yyvsp[(3) - (3)].t);
-           mem_sys_free((yyvsp[(2) - (3)].s));
+           mem_gc_free(interp, (yyvsp[(2) - (3)].s));
           }
     break;
 
@@ -3619,7 +3619,7 @@
     {
            (yyval.t) = 0;
            IMCC_INFO(interp)->cur_unit->outer = mk_sub_address_fromc(interp, (yyvsp[(3) - (4)].s));
-           mem_sys_free((yyvsp[(3) - (4)].s));
+           mem_gc_free(interp, (yyvsp[(3) - (4)].s));
          }
     break;
 
@@ -3628,7 +3628,7 @@
     {
            (yyval.t) = 0;
            IMCC_INFO(interp)->cur_unit->outer = mk_const(interp, (yyvsp[(3) - (4)].s), 'S');
-           mem_sys_free((yyvsp[(3) - (4)].s));
+           mem_gc_free(interp, (yyvsp[(3) - (4)].s));
          }
     break;
 
@@ -3708,7 +3708,7 @@
            (yyval.t) = 0;
            IMCC_INFO(interp)->cur_unit->subid = mk_const(interp, (yyvsp[(3) - (4)].s), 'S');
            IMCC_INFO(interp)->cur_unit->instructions->symregs[0]->subid = str_dup_remove_quotes((yyvsp[(3) - (4)].s));
-           mem_sys_free((yyvsp[(3) - (4)].s));
+           mem_gc_free(interp, (yyvsp[(3) - (4)].s));
          }
     break;
 
@@ -3764,7 +3764,7 @@
            else {
                r = mk_const(interp, "PMC", 'S');
            }
-           mem_sys_free((yyvsp[(1) - (1)].s));
+           mem_gc_free(interp, (yyvsp[(1) - (1)].s));
            (yyval.sr) = r;
          }
     break;
@@ -3778,7 +3778,7 @@
            else {
                r = mk_const(interp, "PMC", 'S');
            }
-           mem_sys_free((yyvsp[(1) - (1)].s));
+           mem_gc_free(interp, (yyvsp[(1) - (1)].s));
            (yyval.sr) = r;
          }
     break;
@@ -4028,12 +4028,12 @@
 
   case 130:
 #line 1735 "compilers/imcc/imcc.y"
-    { adv_named_set(interp, (yyvsp[(3) - (4)].s));   (yyval.t) = 0; mem_sys_free((yyvsp[(3) - (4)].s)); }
+    { adv_named_set(interp, (yyvsp[(3) - (4)].s));   (yyval.t) = 0; mem_gc_free(interp, (yyvsp[(3) - (4)].s)); }
     break;
 
   case 131:
 #line 1736 "compilers/imcc/imcc.y"
-    { adv_named_set_u(interp, (yyvsp[(3) - (4)].s)); (yyval.t) = 0; mem_sys_free((yyvsp[(3) - (4)].s)); }
+    { adv_named_set_u(interp, (yyvsp[(3) - (4)].s)); (yyval.t) = 0; mem_gc_free(interp, (yyvsp[(3) - (4)].s)); }
     break;
 
   case 132:
@@ -4243,7 +4243,7 @@
 #line 1887 "compilers/imcc/imcc.y"
     {
              Instruction * const i = iLABEL(interp, IMCC_INFO(interp)->cur_unit, mk_local_label(interp, (yyvsp[(1) - (1)].s)));
-             mem_sys_free((yyvsp[(1) - (1)].s));
+             mem_gc_free(interp, (yyvsp[(1) - (1)].s));
              (yyval.i) = i;
          }
     break;
@@ -4319,8 +4319,8 @@
                    mk_ident(interp, l->id, (yyvsp[(3) - (4)].t));
                l1 = l;
                l  = l->next;
-               mem_sys_free(l1->id);
-               mem_sys_free(l1);
+               mem_gc_free(interp, l1->id);
+               mem_gc_free(interp, l1);
            }
            IMCC_INFO(interp)->is_def = 0; (yyval.i) = 0;
          }
@@ -4330,7 +4330,7 @@
 #line 1960 "compilers/imcc/imcc.y"
     {
             if ((yyvsp[(4) - (4)].sr)->set != 'P') {
-                mem_sys_free((yyvsp[(2) - (4)].s));
+                mem_gc_free(interp, (yyvsp[(2) - (4)].s));
                 IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                     "Cannot use %c register with .lex", (yyvsp[(4) - (4)].sr)->set);
             }
@@ -4340,8 +4340,8 @@
                name[strlen(name) - 1] = 0;
                n = mk_const(interp, name, 'S');
                set_lexical(interp, (yyvsp[(4) - (4)].sr), n); (yyval.i) = 0;
-               mem_sys_free((yyvsp[(2) - (4)].s));
-               mem_sys_free(name);
+               mem_gc_free(interp, (yyvsp[(2) - (4)].s));
+               mem_gc_free(interp, name);
             }
          }
     break;
@@ -4350,14 +4350,14 @@
 #line 1977 "compilers/imcc/imcc.y"
     {
             if ((yyvsp[(4) - (4)].sr)->set != 'P') {
-                mem_sys_free((yyvsp[(2) - (4)].s));
+                mem_gc_free(interp, (yyvsp[(2) - (4)].s));
                 IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                     "Cannot use %c register with .lex", (yyvsp[(4) - (4)].sr)->set);
             }
             else {
                SymReg *n = mk_const(interp, (yyvsp[(2) - (4)].s), 'U');
                set_lexical(interp, (yyvsp[(4) - (4)].sr), n); (yyval.i) = 0;
-               mem_sys_free((yyvsp[(2) - (4)].s));
+               mem_gc_free(interp, (yyvsp[(2) - (4)].s));
             }
          }
     break;
@@ -4372,7 +4372,7 @@
     {
            mk_const_ident(interp, (yyvsp[(4) - (6)].s), (yyvsp[(3) - (6)].t), (yyvsp[(6) - (6)].sr), 0);
            IMCC_INFO(interp)->is_def = 0;
-           mem_sys_free((yyvsp[(4) - (6)].s));
+           mem_gc_free(interp, (yyvsp[(4) - (6)].s));
          }
     break;
 
@@ -4386,7 +4386,7 @@
     {
            mk_const_ident(interp, (yyvsp[(4) - (6)].s), (yyvsp[(3) - (6)].t), (yyvsp[(6) - (6)].sr), 1);
            IMCC_INFO(interp)->is_def = 0;
-           mem_sys_free((yyvsp[(4) - (6)].s));
+           mem_gc_free(interp, (yyvsp[(4) - (6)].s));
          }
     break;
 
@@ -4417,7 +4417,7 @@
                     IMCC_INFO(interp)->nargs,
                     IMCC_INFO(interp)->keyvec,
                     1);
-           mem_sys_free((yyvsp[(1) - (2)].s));
+           mem_gc_free(interp, (yyvsp[(1) - (2)].s));
          }
     break;
 
@@ -4756,23 +4756,23 @@
                       IMCC_INFO(interp) -> regs,
                       IMCC_INFO(interp) -> nargs,
                       IMCC_INFO(interp) -> keyvec, 1);
-         mem_sys_free((yyvsp[(3) - (4)].s));
+         mem_gc_free(interp, (yyvsp[(3) - (4)].s));
        }
     break;
 
   case 258:
 #line 2174 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_sub_address(interp, (yyvsp[(1) - (1)].s));       mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_sub_address(interp, (yyvsp[(1) - (1)].s));       mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 259:
 #line 2175 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_sub_address_fromc(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_sub_address_fromc(interp, (yyvsp[(1) - (1)].s)); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 260:
 #line 2176 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_sub_address_u(interp, (yyvsp[(1) - (1)].s));     mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_sub_address_u(interp, (yyvsp[(1) - (1)].s));     mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 261:
@@ -4806,7 +4806,7 @@
     {
             IMCC_INFO(interp)->cur_obj = (yyvsp[(1) - (3)].sr);
             (yyval.sr)                         = mk_const(interp, (yyvsp[(3) - (3)].s), 'U');
-            mem_sys_free((yyvsp[(3) - (3)].s));
+            mem_gc_free(interp, (yyvsp[(3) - (3)].s));
          }
     break;
 
@@ -4815,7 +4815,7 @@
     {
             IMCC_INFO(interp)->cur_obj = (yyvsp[(1) - (3)].sr);
             (yyval.sr)                         = mk_const(interp, (yyvsp[(3) - (3)].s), 'S');
-            mem_sys_free((yyvsp[(3) - (3)].s));
+            mem_gc_free(interp, (yyvsp[(3) - (3)].s));
          }
     break;
 
@@ -4874,7 +4874,7 @@
            (yyval.sr) = 0;
            add_pcc_named_arg(interp, IMCC_INFO(interp)->cur_call,
                 mk_const(interp, (yyvsp[(3) - (5)].s), 'S'), (yyvsp[(5) - (5)].sr));
-           mem_sys_free((yyvsp[(3) - (5)].s));
+           mem_gc_free(interp, (yyvsp[(3) - (5)].s));
          }
     break;
 
@@ -4892,7 +4892,7 @@
            (yyval.sr) = 0;
            add_pcc_named_arg(interp, IMCC_INFO(interp)->cur_call,
                 mk_const(interp, (yyvsp[(1) - (3)].s), 'S'), (yyvsp[(3) - (3)].sr));
-           mem_sys_free((yyvsp[(1) - (3)].s));
+           mem_gc_free(interp, (yyvsp[(1) - (3)].s));
          }
     break;
 
@@ -4959,7 +4959,7 @@
     {
             add_pcc_named_result(interp, IMCC_INFO(interp)->cur_call,
                     mk_const(interp, (yyvsp[(3) - (5)].s), 'S'), (yyvsp[(5) - (5)].sr));
-            mem_sys_free((yyvsp[(3) - (5)].s));
+            mem_gc_free(interp, (yyvsp[(3) - (5)].s));
          }
     break;
 
@@ -4980,7 +4980,7 @@
 #line 2316 "compilers/imcc/imcc.y"
     {
            add_pcc_named_result(interp, IMCC_INFO(interp)->cur_call, mk_const(interp, (yyvsp[(1) - (3)].s), 'S'), (yyvsp[(3) - (3)].sr));
-           mem_sys_free((yyvsp[(1) - (3)].s));
+           mem_gc_free(interp, (yyvsp[(1) - (3)].s));
          }
     break;
 
@@ -5121,32 +5121,32 @@
 
   case 314:
 #line 2404 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_sub_address_fromc(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_sub_address_fromc(interp, (yyvsp[(1) - (1)].s)); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 315:
 #line 2405 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_sub_address_u(interp, (yyvsp[(1) - (1)].s));  mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_sub_address_u(interp, (yyvsp[(1) - (1)].s));  mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 316:
 #line 2409 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_sub_address(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_sub_address(interp, (yyvsp[(1) - (1)].s)); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 317:
 #line 2410 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_sub_address(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_sub_address(interp, (yyvsp[(1) - (1)].s)); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 318:
 #line 2414 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_label_address(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_label_address(interp, (yyvsp[(1) - (1)].s)); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 319:
 #line 2415 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_label_address(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_label_address(interp, (yyvsp[(1) - (1)].s)); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 324:
@@ -5223,27 +5223,27 @@
 
   case 335:
 #line 2473 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_pasm_reg(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_pasm_reg(interp, (yyvsp[(1) - (1)].s)); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 336:
 #line 2477 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'I'); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'I'); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 337:
 #line 2478 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'N'); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'N'); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 338:
 #line 2479 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'S'); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'S'); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
   case 339:
 #line 2480 "compilers/imcc/imcc.y"
-    { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'U'); mem_sys_free((yyvsp[(1) - (1)].s)); }
+    { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'U'); mem_gc_free(interp, (yyvsp[(1) - (1)].s)); }
     break;
 
 

Modified: branches/boehm_gc_2/compilers/imcc/instructions.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/instructions.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/instructions.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -102,7 +102,7 @@
     ASSERT_ARGS(_mk_instruction)
     const size_t reg_space  = (n > 1) ? (sizeof (SymReg *) * (n - 1)) : 0;
     Instruction * const ins =
-        (Instruction*)mem_sys_allocate_zeroed(sizeof (Instruction) + reg_space);
+        (Instruction*)Parrot_gc_allocate_memory_chunk_with_interior_pointers(interp, sizeof (Instruction) + reg_space);
     int i;
 
     ins->opname       = Parrot_gc_strdup(interp, op);
@@ -431,7 +431,8 @@
 
 /*
 
-=item C<Instruction * delete_ins(IMC_Unit *unit, Instruction *ins)>
+=item C<Instruction * delete_ins(PARROT_INTERP, IMC_Unit *unit, Instruction
+*ins)>
 
 Delete instruction ins, and then free it.
 
@@ -444,13 +445,13 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
 Instruction *
-delete_ins(ARGMOD(IMC_Unit *unit), ARGMOD(Instruction *ins))
+delete_ins(PARROT_INTERP, ARGMOD(IMC_Unit *unit), ARGMOD(Instruction *ins))
 {
     ASSERT_ARGS(delete_ins)
     Instruction * next = _delete_ins(unit, ins);
 
 
-    free_ins(ins);
+    free_ins(interp, ins);
 
     return next;
 }
@@ -543,8 +544,8 @@
 
 /*
 
-=item C<void subst_ins(IMC_Unit *unit, Instruction *ins, Instruction *tmp, int
-needs_freeing)>
+=item C<void subst_ins(PARROT_INTERP, IMC_Unit *unit, Instruction *ins,
+Instruction *tmp, int needs_freeing)>
 
 Substitute Instruction C<tmp> for Instruction C<ins>.
 Free C<ins> if C<needs_freeing> is true.
@@ -554,7 +555,7 @@
 */
 
 void
-subst_ins(ARGMOD(IMC_Unit *unit), ARGMOD(Instruction *ins),
+subst_ins(PARROT_INTERP, ARGMOD(IMC_Unit *unit), ARGMOD(Instruction *ins),
           ARGMOD(Instruction *tmp), int needs_freeing)
 {
     ASSERT_ARGS(subst_ins)
@@ -578,7 +579,7 @@
         tmp->line = ins->line;
 
     if (needs_freeing)
-        free_ins(ins);
+        free_ins(interp, ins);
 }
 
 /*
@@ -639,7 +640,7 @@
 
 /*
 
-=item C<void free_ins(Instruction *ins)>
+=item C<void free_ins(PARROT_INTERP, Instruction *ins)>
 
 Free the Instruction structure ins.
 
@@ -648,12 +649,12 @@
 */
 
 void
-free_ins(ARGMOD(Instruction *ins))
+free_ins(PARROT_INTERP, ARGMOD(Instruction *ins))
 {
     ASSERT_ARGS(free_ins)
-    mem_sys_free(ins->format);
-    mem_sys_free(ins->opname);
-    mem_sys_free(ins);
+    mem_gc_free(interp, ins->format);
+    mem_gc_free(interp, ins->opname);
+    mem_gc_free(interp, ins);
 }
 
 /*

Modified: branches/boehm_gc_2/compilers/imcc/instructions.h
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/instructions.h	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/instructions.h	Tue Feb 23 21:02:00 2010	(r44404)
@@ -128,9 +128,12 @@
 
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
-Instruction * delete_ins(ARGMOD(IMC_Unit *unit), ARGMOD(Instruction *ins))
+Instruction * delete_ins(PARROT_INTERP,
+    ARGMOD(IMC_Unit *unit),
+    ARGMOD(Instruction *ins))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
+        __attribute__nonnull__(3)
         FUNC_MODIFIES(*unit)
         FUNC_MODIFIES(*ins);
 
@@ -141,8 +144,9 @@
         __attribute__nonnull__(1)
         FUNC_MODIFIES(*unit);
 
-void free_ins(ARGMOD(Instruction *ins))
+void free_ins(PARROT_INTERP, ARGMOD(Instruction *ins))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*ins);
 
 PARROT_WARN_UNUSED_RESULT
@@ -210,7 +214,7 @@
         FUNC_MODIFIES(*ins)
         FUNC_MODIFIES(*tmp);
 
-void subst_ins(
+void subst_ins(PARROT_INTERP,
     ARGMOD(IMC_Unit *unit),
     ARGMOD(Instruction *ins),
     ARGMOD(Instruction *tmp),
@@ -218,6 +222,7 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
         __attribute__nonnull__(3)
+        __attribute__nonnull__(4)
         FUNC_MODIFIES(*unit)
         FUNC_MODIFIES(*ins)
         FUNC_MODIFIES(*tmp);
@@ -238,12 +243,14 @@
     , PARROT_ASSERT_ARG(fmt) \
     , PARROT_ASSERT_ARG(r))
 #define ASSERT_ARGS_delete_ins __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit) \
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(ins))
 #define ASSERT_ARGS_emitb __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_free_ins __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(ins))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(ins))
 #define ASSERT_ARGS_get_branch_reg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(ins))
 #define ASSERT_ARGS_get_branch_regno __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -273,7 +280,8 @@
        PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(tmp))
 #define ASSERT_ARGS_subst_ins __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(unit) \
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(ins) \
     , PARROT_ASSERT_ARG(tmp))
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */

Modified: branches/boehm_gc_2/compilers/imcc/main.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/main.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/main.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -521,7 +521,7 @@
     size = PackFile_pack_size(interp, interp->code->base.pf) *
         sizeof (opcode_t);
     IMCC_info(interp, 1, "packed code %d bytes\n", size);
-    packed = (opcode_t*) mem_sys_allocate(size);
+    packed = (opcode_t*) Parrot_gc_allocate_memory_chunk(interp, size);
     PackFile_pack(interp, interp->code->base.pf, packed);
     if (STREQ(output_file, "-"))
         fp = stdout;
@@ -534,7 +534,7 @@
             "Couldn't write %s\n", output_file);
     fclose(fp);
     IMCC_info(interp, 1, "%s written.\n", output_file);
-    mem_sys_free(packed);
+    mem_gc_free(interp, packed);
 }
 
 /*

Modified: branches/boehm_gc_2/compilers/imcc/optimizer.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/optimizer.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/optimizer.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -366,13 +366,13 @@
                               last->symregs, args, 0, 0);
                     last->opnum = tmp->opnum;
                     last->opsize = tmp->opsize;
-                    mem_sys_free(last->opname);
+                    mem_gc_free(interp, last->opname);
                     last->opname = Parrot_gc_strdup(interp, tmp->opname);
-                    free_ins(tmp);
+                    free_ins(interp, tmp);
 
                     /* delete branch */
                     unit->ostat.deleted_ins++;
-                    ins = delete_ins(unit, ins);
+                    ins = delete_ins(interp, unit, ins);
                     unit->ostat.if_branch++;
                     changed = 1;
                 }
@@ -463,7 +463,7 @@
             }
             tmp = INS(interp, unit, ins->opname, "", ins->symregs, 2, 0, 0);
             IMCC_debug(interp, DEBUG_OPT1, "%I\n", tmp);
-            subst_ins(unit, ins, tmp, 1);
+            subst_ins(interp, unit, ins, tmp, 1);
             ins = tmp;
             changes = 1;
         }
@@ -494,7 +494,7 @@
                 ins->opnum == PARROT_OP_fdiv_n_nc) &&
                       atof(ins->symregs[1]->name) == 1.0)) {
             IMCC_debug(interp, DEBUG_OPT1, "opt1 %I => ", ins);
-            ins = delete_ins(unit, ins);
+            ins = delete_ins(interp, unit, ins);
             if (ins)
                 ins = ins->prev ? ins->prev : unit->instructions;
             else
@@ -522,7 +522,7 @@
                 tmp = INS(interp, unit, "inc", "", ins->symregs, 1, 0, 0);
             else
                 tmp = INS(interp, unit, "dec", "", ins->symregs, 1, 0, 0);
-            subst_ins(unit, ins, tmp, 1);
+            subst_ins(interp, unit, ins, tmp, 1);
             IMCC_debug(interp, DEBUG_OPT1, "%I\n", tmp);
             ins = tmp;
             changes = 1;
@@ -576,7 +576,7 @@
             }
             tmp = INS(interp, unit, "set", "", ins->symregs, 2, 0, 0);
             IMCC_debug(interp, DEBUG_OPT1, "%I\n", tmp);
-            subst_ins(unit, ins, tmp, 1);
+            subst_ins(interp, unit, ins, tmp, 1);
             ins = tmp;
             changes = 1;
             continue;
@@ -604,7 +604,7 @@
             ins->symregs[1] = r;
             tmp = INS(interp, unit, "set", "", ins->symregs, 2, 0, 0);
             IMCC_debug(interp, DEBUG_OPT1, "%I\n", tmp);
-            subst_ins(unit, ins, tmp, 1);
+            subst_ins(interp, unit, ins, tmp, 1);
             ins = tmp;
             changes = 1;
         }
@@ -620,7 +620,7 @@
             IMCC_debug(interp, DEBUG_OPT1, "opt1 %I => ", ins);
             --ins->symregs[1]->use_count;
             tmp = INS(interp, unit, "null", "", ins->symregs, 1, 0, 0);
-            subst_ins(unit, ins, tmp, 1);
+            subst_ins(interp, unit, ins, tmp, 1);
             IMCC_debug(interp, DEBUG_OPT1, "%I\n", tmp);
             ins = tmp;
             changes = 1;
@@ -701,7 +701,7 @@
                             if (found) {
                                 const Instruction * const prev = ins2->prev;
                                 if (prev) {
-                                    subst_ins(unit, ins2, tmp, 1);
+                                    subst_ins(interp, unit, ins2, tmp, 1);
                                     any = 1;
                                     IMCC_debug(interp, DEBUG_OPT2,
                                             " reduced to %I\n", tmp);
@@ -1209,7 +1209,7 @@
 
                         /* unconditional jump can be eliminated */
                         unit->ostat.deleted_ins++;
-                        ins = delete_ins(unit, ins);
+                        ins = delete_ins(interp, unit, ins);
                         return 1;
                     }
                 }
@@ -1240,7 +1240,7 @@
     const char * const neg_op = get_neg_op(cond->opname, &args);
     if (neg_op) {
         const size_t size  = strlen(branch->symregs[0]->name) + 10; /* + '_post999' */
-        char * const label = (char *)mem_sys_allocate(size);
+        char * const label = mem_gc_allocate_n_typed(interp, size, char);
         int count;
         int found = 0;
 
@@ -1288,12 +1288,12 @@
                 "loop %s -> %s converted to post-test, added label %s\n",
                 branch->symregs[0]->name, get_branch_reg(cond)->name, label);
 
-            subst_ins(unit, branch, tmp, 1);
+            subst_ins(interp, unit, branch, tmp, 1);
             unit->ostat.branch_cond_loop++;
             changed = 1;
         }
 
-        mem_sys_free(label);
+        mem_gc_free(interp, label);
     }
 
     return changed;
@@ -1448,7 +1448,7 @@
                 IMCC_debug(interp, DEBUG_OPT1,
                            "block %d label %s deleted\n", i, lab->name);
                 unit->ostat.deleted_ins++;
-                ins = delete_ins(unit, ins);
+                ins = delete_ins(interp, unit, ins);
                 changed = 1;
             }
 
@@ -1494,7 +1494,7 @@
             for (ins = bb->start; ins && ins->bbindex == bbi;) {
                 IMCC_debug(interp, DEBUG_OPT1,
                         "\tins deleted (dead block) %I\n", ins);
-                ins = delete_ins(unit, ins);
+                ins = delete_ins(interp, unit, ins);
                 unit->ostat.deleted_ins++;
                 changed++;
             }
@@ -1512,7 +1512,7 @@
             STREQ(last->opname, "branch")) {
             IMCC_debug(interp, DEBUG_OPT1,
                     "unreachable ins deleted (after branch) %I\n", ins);
-            ins = delete_ins(unit, ins);
+            ins = delete_ins(interp, unit, ins);
             unit->ostat.deleted_ins++;
             changed++;
         }
@@ -1525,7 +1525,7 @@
                 STREQ(last->opname, "branch") &&
                 STREQ(last->symregs[0]->name, ins->symregs[0]->name)) {
             IMCC_debug(interp, DEBUG_OPT1, "dead branch deleted %I\n", ins);
-            ins = delete_ins(unit, last);
+            ins = delete_ins(interp, unit, last);
             unit->ostat.deleted_ins++;
             changed++;
         }
@@ -1557,7 +1557,7 @@
             SymReg * const r = ins->symregs[0];
             if (r && (r->use_count == 1 && r->lhs_use_count == 1)) {
                 IMCC_debug(interp, DEBUG_OPT2, "used once '%I' deleted\n", ins);
-                ins = delete_ins(unit, ins);
+                ins = delete_ins(interp, unit, ins);
 
                 /* find previous instruction or first instruction of this CU
                  * ... but only the latter if it wasn't deleted */

Modified: branches/boehm_gc_2/compilers/imcc/parser_util.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/parser_util.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/parser_util.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -67,8 +67,9 @@
         __attribute__nonnull__(3)
         FUNC_MODIFIES(*error_message);
 
-static void imcc_destroy_macro_values(ARGMOD(void *value))
+static void imcc_destroy_macro_values(PARROT_INTERP, ARGMOD(void *value))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*value);
 
 PARROT_WARN_UNUSED_RESULT
@@ -103,7 +104,8 @@
     , PARROT_ASSERT_ARG(fullname) \
     , PARROT_ASSERT_ARG(error_message))
 #define ASSERT_ARGS_imcc_destroy_macro_values __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(value))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(value))
 #define ASSERT_ARGS_try_rev_cmp __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(name) \
     , PARROT_ASSERT_ARG(r))
@@ -719,12 +721,12 @@
     if (imc_info) {
         SymReg *ns                  = IMCC_INFO(interp)->cur_namespace;
         IMCC_INFO(interp)           = imc_info->prev;
-        mem_sys_free(imc_info);
+        mem_gc_free(interp, imc_info);
         imc_info                    = IMCC_INFO(interp);
         IMCC_INFO(interp)->cur_unit = imc_info->last_unit;
 
         if (ns && ns != imc_info->cur_namespace)
-            free_sym(ns);
+            free_sym(interp, ns);
 
         IMCC_INFO(interp)->cur_namespace = imc_info->cur_namespace;
     }
@@ -985,9 +987,9 @@
     if (imc_info) {
         IMCC_INFO(interp) = imc_info->prev;
         if (imc_info->globals)
-            mem_sys_free(imc_info->globals);
+            mem_gc_free(interp, imc_info->globals);
 
-        mem_sys_free(imc_info);
+        mem_gc_free(interp, imc_info);
     }
 
     return cs;
@@ -1289,7 +1291,7 @@
 
 /*
 
-=item C<static void imcc_destroy_macro_values(void *value)>
+=item C<static void imcc_destroy_macro_values(PARROT_INTERP, void *value)>
 
 A callback for parrot_chash_destroy_values() to free all macro-allocated memory.
 
@@ -1298,7 +1300,7 @@
 */
 
 static void
-imcc_destroy_macro_values(ARGMOD(void *value))
+imcc_destroy_macro_values(PARROT_INTERP, ARGMOD(void *value))
 {
     ASSERT_ARGS(imcc_destroy_macro_values)
     macro_t *  const m      = (macro_t *)value;
@@ -1309,11 +1311,11 @@
     for (i = 0; i < params->num_param; ++i) {
         char * const name = params->name[i];
         if (name)
-            mem_sys_free(name);
+            mem_gc_free(interp, name);
     }
 
-    mem_sys_free(m->expansion);
-    mem_sys_free(m);
+    mem_gc_free(interp, m->expansion);
+    mem_gc_free(interp, m);
 }
 
 
@@ -1336,9 +1338,9 @@
         parrot_chash_destroy_values(interp, macros, imcc_destroy_macro_values);
 
     if (IMCC_INFO(interp)->globals)
-        mem_sys_free(IMCC_INFO(interp)->globals);
+        mem_gc_free(interp, IMCC_INFO(interp)->globals);
 
-    mem_sys_free(IMCC_INFO(interp));
+    mem_gc_free(interp, IMCC_INFO(interp));
     IMCC_INFO(interp) = NULL;
 
     if (eval_nr != 0)

Modified: branches/boehm_gc_2/compilers/imcc/pbc.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/pbc.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/pbc.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -319,13 +319,13 @@
 
             while (s) {
                 subs_t * const prev_s = s->prev;
-                clear_sym_hash(&s->fixup);
-                mem_sys_free(s);
+                clear_sym_hash(interp, &s->fixup);
+                mem_gc_free(interp, s);
                 s = prev_s;
             }
 
-            clear_sym_hash(&cs->key_consts);
-            mem_sys_free(cs);
+            clear_sym_hash(interp, &cs->key_consts);
+            mem_gc_free(interp, cs);
             cs = prev_cs;
         }
         IMCC_INFO(interp)->globals->cs = NULL;
@@ -438,7 +438,7 @@
         IMCC_INFO(interp)->globals = mem_gc_allocate_zeroed_typed(interp, imcc_globals);
 
     if (IMCC_INFO(interp)->globals->cs)
-        clear_sym_hash(&IMCC_INFO(interp)->globals->cs->key_consts);
+        clear_sym_hash(interp, &IMCC_INFO(interp)->globals->cs->key_consts);
     else {
         /* register cleanup code */
         Parrot_on_exit(interp, imcc_globals_destroy, NULL);
@@ -1236,7 +1236,7 @@
 
 #define UNIT_FREE_CHAR(x) \
   do { \
-    mem_sys_free((x)); \
+    mem_gc_free(interp, (x)); \
     (x) = NULL; \
   } while (0);
 
@@ -1276,7 +1276,7 @@
 
         if (real_name) {
             char * const p = Parrot_gc_strdup(interp, real_name + 1);
-            mem_sys_free(r->name);
+            mem_gc_free(interp, r->name);
             r->name = p;
         }
     }
@@ -1483,7 +1483,7 @@
             interp->code->const_table, pfc, key);
 
     if (!rc) {
-        mem_sys_free(pfc);
+        mem_gc_free(interp, pfc);
         IMCC_fatal(interp, 1,
             "add_const_key: PackFile_Constant error\n");
     }
@@ -1498,7 +1498,7 @@
     IMCC_debug(interp, DEBUG_PBC_CONST, "\t %x /%x %x/ /%x %x/\n",
                key[0], key[1], key[2], key[3], key[4]);
 
-    mem_sys_free(pfc);
+    mem_gc_free(interp, pfc);
 
     return k;
 }
@@ -2147,7 +2147,7 @@
 
         /* allocate code */
         interp->code->base.data       = (opcode_t *)
-            mem_sys_realloc(interp->code->base.data, bytes);
+            Parrot_gc_reallocate_memory_chunk(interp, interp->code->base.data, bytes);
 
         /* reallocating this removes its mmaped-ness; needs encapsulation */
         interp->code->base.pf->is_mmap_ped = 0;

Modified: branches/boehm_gc_2/compilers/imcc/pcc.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/pcc.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/pcc.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -357,8 +357,8 @@
     ins     = insINS(interp, unit, ins, op_name, regs, n + 1);
 
     if (n >= PCC_GET_ARGS_LIMIT) {
-        mem_sys_free(regs);
-        mem_sys_free(buf);
+        mem_gc_free(interp, regs);
+        mem_gc_free(interp, buf);
     }
     return ins;
     #undef PCC_GET_ARGS_LIMIT
@@ -614,7 +614,7 @@
     if (!n)
         return ins;
 
-    move_list      = (unsigned char *)mem_sys_allocate(2 * n);
+    move_list      = mem_gc_allocate_n_typed(interp, 2 * n, unsigned char);
     move_info.unit = unit;
     move_info.ins  = ins;
     move_info.n    = n;
@@ -644,7 +644,7 @@
     Parrot_register_move(interp, n, move_list, move_list + n, 255,
         pcc_reg_mov, NULL, &move_info);
 
-    mem_sys_free(move_list);
+    mem_gc_free(interp, move_list);
     return move_info.ins;
 }
 

Modified: branches/boehm_gc_2/compilers/imcc/reg_alloc.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/reg_alloc.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/reg_alloc.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -85,7 +85,8 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_MALLOC
 PARROT_CANNOT_RETURN_NULL
-static unsigned int* ig_allocate(int N);
+static unsigned int* ig_allocate(PARROT_INTERP, int N)
+        __attribute__nonnull__(1);
 
 PARROT_WARN_UNUSED_RESULT
 static int ig_find_color(
@@ -192,7 +193,8 @@
 #define ASSERT_ARGS_first_avail __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit))
-#define ASSERT_ARGS_ig_allocate __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
+#define ASSERT_ARGS_ig_allocate __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_ig_find_color __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(avail))
@@ -291,7 +293,7 @@
 
 /*
 
-=item C<static unsigned int* ig_allocate(int N)>
+=item C<static unsigned int* ig_allocate(PARROT_INTERP, int N)>
 
 =cut
 
@@ -301,7 +303,7 @@
 PARROT_MALLOC
 PARROT_CANNOT_RETURN_NULL
 static unsigned int*
-ig_allocate(int N)
+ig_allocate(PARROT_INTERP, int N)
 {
     ASSERT_ARGS(ig_allocate)
     /* size is N*N bits, but we want don't want to allocate a partial
@@ -309,7 +311,7 @@
      */
     const int need_bits = N * N;
     const int num_words = (need_bits + sizeof (int) - 1) / sizeof (int);
-    return (unsigned int *)mem_sys_allocate_zeroed(num_words * sizeof (int));
+    return mem_gc_allocate_n_zeroed_typed(interp, num_words, unsigned int);
 }
 
 /*
@@ -421,21 +423,21 @@
 
 /*
 
-=item C<void free_reglist(IMC_Unit *unit)>
+=item C<void free_reglist(PARROT_INTERP, IMC_Unit *unit)>
 
 =cut
 
 */
 
 void
-free_reglist(ARGMOD(IMC_Unit *unit))
+free_reglist(PARROT_INTERP, ARGMOD(IMC_Unit *unit))
 {
     ASSERT_ARGS(free_reglist)
 #if IMC_TRACE
     fprintf(stderr, "reg_alloc.c: free_reglist\n");
 #endif
     if (unit->interference_graph) {
-        mem_sys_free(unit->interference_graph);
+        mem_gc_free(interp, unit->interference_graph);
         unit->interference_graph = NULL;
     }
 
@@ -443,9 +445,9 @@
         unsigned int i;
 
         for (i = 0; i < unit->n_symbols; i++)
-            free_life_info(unit, unit->reglist[i]);
+            free_life_info(interp, unit, unit->reglist[i]);
 
-        mem_sys_free(unit->reglist);
+        mem_gc_free(interp, unit->reglist);
         unit->reglist   = NULL;
         unit->n_symbols = 0;
     }
@@ -670,7 +672,7 @@
 
     /* count symbols */
     if (unit->reglist)
-        free_reglist(unit);
+        free_reglist(interp, unit);
 
     count = unit->hash.entries;
     if (count == 0)
@@ -788,7 +790,7 @@
 
     /* Construct a graph N x N where N = number of symbolics.
      * This piece can be rewritten without the N x N array */
-    interference_graph       = ig_allocate(n_symbols);
+    interference_graph       = ig_allocate(interp, n_symbols);
     unit->interference_graph = interference_graph;
 
     /* Calculate interferences between each chain and populate the the Y-axis */
@@ -1078,7 +1080,7 @@
         color = ig_find_color(unit, avail);
 
         if (color == -1) {
-            mem_sys_free(avail);
+            mem_gc_free(interp, avail);
             IMCC_fatal(interp, DEBUG_IMC,
                     "# no more colors - this should not happen\n");
         }
@@ -1090,7 +1092,7 @@
             r->name, color);
     }
 
-    mem_sys_free(avail);
+    mem_gc_free(interp, avail);
     /* we are totally finished */
 }
 
@@ -1160,7 +1162,7 @@
             if (r->set == reg_set)
                 if (REG_NEEDS_ALLOC(r))
                     if (r->color >= (int)0)
-                        set_add(allocated, (unsigned int)r->color);
+                        set_add(interp, allocated, (unsigned int)r->color);
         }
     }
 
@@ -1169,7 +1171,7 @@
     if (avail)
         *avail = allocated;
     else
-        set_free(allocated);
+        set_free(interp, allocated);
 
     return first;
 }
@@ -1214,7 +1216,7 @@
                 unsigned int first_reg = avail
                                        ? set_first_zero(avail)
                                        : first_avail(interp, unit, (int)r->set, &avail);
-                set_add(avail, first_reg);
+                set_add(interp, avail, first_reg);
                 r->color = first_reg++;
 
                 IMCC_debug(interp, DEBUG_IMC,
@@ -1233,7 +1235,7 @@
 
     for (i = 0; i < 4; ++i) {
         if (sets[i])
-            set_free(sets[i]);
+            set_free(interp, sets[i]);
     }
 
     /*
@@ -1286,13 +1288,13 @@
                     if (set_contains(avail, first_reg))
                         first_reg = first_avail(interp, unit, reg_set, NULL);
 
-                    set_add(avail, first_reg);
+                    set_add(interp, avail, first_reg);
                     r->color = first_reg++;
                 }
             }
         }
 
-        set_free(avail);
+        set_free(interp, avail);
         unit->first_avail[j] = first_reg;
     }
 }

Modified: branches/boehm_gc_2/compilers/imcc/sets.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/sets.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/sets.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -89,7 +89,7 @@
 
 /*
 
-=item C<void set_free(Set *s)>
+=item C<void set_free(PARROT_INTERP, Set *s)>
 
 Frees the given Set and its allocated memory.
 
@@ -98,13 +98,13 @@
 */
 
 void
-set_free(ARGMOD(Set *s))
+set_free(PARROT_INTERP, ARGMOD(Set *s))
 {
     ASSERT_ARGS(set_free)
     if (s->bmp)
-        mem_sys_free(s->bmp);
+        mem_gc_free(interp, s->bmp);
 
-    mem_sys_free(s);
+    mem_gc_free(interp, s);
 }
 
 
@@ -190,7 +190,7 @@
 
 /*
 
-=item C<void set_add(Set *s, unsigned int element)>
+=item C<void set_add(PARROT_INTERP, Set *s, unsigned int element)>
 
 Adds to set C<s> the element C<element>.
 
@@ -199,14 +199,15 @@
 */
 
 void
-set_add(ARGMOD(Set *s), unsigned int element)
+set_add(PARROT_INTERP, ARGMOD(Set *s), unsigned int element)
 {
     ASSERT_ARGS(set_add)
     const int elem_byte_in_set = BYTE_IN_SET(element);
     const int bytes_in_set     = BYTE_IN_SET(s->length);
 
     if (bytes_in_set < elem_byte_in_set) {
-        s->bmp = (unsigned char *)mem_sys_realloc_zeroed(s->bmp,
+        s->bmp = (unsigned char *)Parrot_gc_reallocate_memory_chunk_with_interior_pointers(
+            interp, s->bmp,
             NUM_BYTES(element), NUM_BYTES(s->length));
         s->length += 8;
     }

Modified: branches/boehm_gc_2/compilers/imcc/sets.h
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/sets.h	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/sets.h	Tue Feb 23 21:02:00 2010	(r44404)
@@ -14,8 +14,9 @@
 /* HEADERIZER BEGIN: compilers/imcc/sets.c */
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 
-void set_add(ARGMOD(Set *s), unsigned int element)
+void set_add(PARROT_INTERP, ARGMOD(Set *s), unsigned int element)
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*s);
 
 void set_clear(ARGMOD(Set *s))
@@ -42,8 +43,9 @@
 unsigned int set_first_zero(ARGIN(const Set *s))
         __attribute__nonnull__(1);
 
-void set_free(ARGMOD(Set *s))
+void set_free(PARROT_INTERP, ARGMOD(Set *s))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*s);
 
 PARROT_MALLOC
@@ -78,7 +80,8 @@
         __attribute__nonnull__(3);
 
 #define ASSERT_ARGS_set_add __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(s))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(s))
 #define ASSERT_ARGS_set_clear __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(s))
 #define ASSERT_ARGS_set_contains __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -92,7 +95,8 @@
 #define ASSERT_ARGS_set_first_zero __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(s))
 #define ASSERT_ARGS_set_free __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(s))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(s))
 #define ASSERT_ARGS_set_intersec __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(s1) \

Modified: branches/boehm_gc_2/compilers/imcc/symreg.c
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/symreg.c	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/symreg.c	Tue Feb 23 21:02:00 2010	(r44404)
@@ -180,11 +180,11 @@
     while (ns->idents) {
         Identifier * const ident = ns->idents;
         ns->idents               = ident->next;
-        mem_sys_free(ident);
+        mem_gc_free(interp, ident);
     }
 
     IMCC_INFO(interp)->namespace_stack = ns->parent;
-    mem_sys_free(ns);
+    mem_gc_free(interp, ns);
 }
 
 
@@ -309,7 +309,7 @@
 
 /*
 
-=item C<char * symreg_to_str(const SymReg *s)>
+=item C<char * symreg_to_str(PARROT_INTERP, const SymReg *s)>
 
 Dumps a SymReg to a printable format.
 
@@ -321,12 +321,12 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 char *
-symreg_to_str(ARGIN(const SymReg *s))
+symreg_to_str(PARROT_INTERP, ARGIN(const SymReg *s))
 {
     ASSERT_ARGS(symreg_to_str)
     /* NOTE: the below magic number encompasses all the quoted strings which
      * may be included in the sprintf output (for now) */
-    char * const buf = (char *)mem_sys_allocate(250 + strlen(s->name));
+    char * const buf = mem_gc_allocate_n_typed(interp, 250 + strlen(s->name), char);
     const int    t   = s->type;
 
     sprintf(buf, "symbol [%s]  set [%c]  color [" INTVAL_FMT "]  type [",
@@ -663,7 +663,7 @@
         IMCC_INFO(interp)->namespace_stack->idents = ident;
     }
     else
-        mem_sys_free(fullname);
+        mem_gc_free(interp, fullname);
 
     if (t == 'P') {
         r->pmc_type                     = IMCC_INFO(interp)->cur_pmc_type;
@@ -731,7 +731,7 @@
     len           = strlen(name);
     name[len - 1] = '\0';
 
-    mem_sys_free(rhs->name);
+    mem_gc_free(interp, rhs->name);
 
     rhs->name     = name;
     rhs->set      = 'P';
@@ -943,7 +943,7 @@
 
     /* TODO keyed syntax */
     len     = strlen(name) + l  + 4;
-    ns_name = (char*)mem_sys_allocate(len);
+    ns_name = mem_gc_allocate_n_typed(interp, len, char);
 
     strcpy(ns_name, IMCC_INFO(interp)->cur_namespace->name);
     *ns_name       = '_';
@@ -1014,7 +1014,7 @@
                 IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                     "Label '%s' already defined\n", sub_name);
             else if (uniq == U_add_uniq_sub) {
-                mem_sys_free(aux_name);
+                mem_gc_free(interp, aux_name);
                 IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                         "Subroutine '%s' already defined\n", name);
             }
@@ -1026,7 +1026,7 @@
         if (uniq) {
             r->lhs_use_count++;
             if (uniq == U_add_uniq_sub)
-                mem_sys_free(aux_name);
+                mem_gc_free(interp, aux_name);
         }
     }
 
@@ -1228,7 +1228,7 @@
         len += 1 + strlen(keys[i]->name);
     }
 
-    key_str  = (char *)mem_sys_allocate(len);
+    key_str  = mem_gc_allocate_n_typed(interp, len, char);
     *key_str = '\0';
 
     /* first look, if we already have this exact key chain */
@@ -1240,7 +1240,7 @@
     }
 
     if ((keychain = _get_sym(h, key_str)) != NULL) {
-        mem_sys_free(key_str);
+        mem_gc_free(interp, key_str);
         return keychain;
     }
 
@@ -1279,7 +1279,7 @@
 
 /*
 
-=item C<void free_sym(SymReg *r)>
+=item C<void free_sym(PARROT_INTERP, SymReg *r)>
 
 Frees all memory of the specified SymReg.  If it has a pcc_sub_t entry, frees
 all memory of that structure as well.
@@ -1289,32 +1289,32 @@
 */
 
 void
-free_sym(ARGMOD(SymReg *r))
+free_sym(PARROT_INTERP, ARGMOD(SymReg *r))
 {
     ASSERT_ARGS(free_sym)
     pcc_sub_t * const sub = r->pcc_sub;
 
     if (sub) {
-        mem_sys_free(sub->multi);
-        mem_sys_free(sub->args);
-        mem_sys_free(sub->arg_flags);
-        mem_sys_free(sub->ret);
-        mem_sys_free(sub->ret_flags);
-        mem_sys_free(sub);
+        mem_gc_free(interp, sub->multi);
+        mem_gc_free(interp, sub->args);
+        mem_gc_free(interp, sub->arg_flags);
+        mem_gc_free(interp, sub->ret);
+        mem_gc_free(interp, sub->ret_flags);
+        mem_gc_free(interp, sub);
     }
 
     if (r->set == 'K') {
         SymReg *key     = r->nextkey;
         while (key) {
             SymReg *nextkey = key->nextkey;
-            free_sym(key);
+            free_sym(interp, key);
             key = nextkey;
         }
     }
 
-    mem_sys_free(r->subid);
-    mem_sys_free(r->name);
-    mem_sys_free(r);
+    mem_gc_free(interp, r->subid);
+    mem_gc_free(interp, r->name);
+    mem_gc_free(interp, r);
 }
 
 /*
@@ -1394,8 +1394,8 @@
     }
 
     /* free memory of old hash table */
-    mem_sys_free(hsh->data);
-    mem_sys_free(next_r);
+    mem_gc_free(interp, hsh->data);
+    mem_gc_free(interp, next_r);
 
     /* let the hashtable's data pointers point to the new data */
     hsh->data = nh.data;
@@ -1524,7 +1524,7 @@
         char * const fullname = _mk_fullname(interp, ns, name);
         p                     = _get_sym(hsh, fullname);
 
-        mem_sys_free(fullname);
+        mem_gc_free(interp, fullname);
 
         if (p)
             return p;
@@ -1571,7 +1571,7 @@
 
 /*
 
-=item C<void clear_sym_hash(SymHash *hsh)>
+=item C<void clear_sym_hash(PARROT_INTERP, SymHash *hsh)>
 
 Frees all memory of the symbols in the specified hash table.
 
@@ -1580,7 +1580,7 @@
 */
 
 void
-clear_sym_hash(ARGMOD(SymHash *hsh))
+clear_sym_hash(PARROT_INTERP, ARGMOD(SymHash *hsh))
 {
     ASSERT_ARGS(clear_sym_hash)
     unsigned int i;
@@ -1592,14 +1592,14 @@
         SymReg *p;
         for (p = hsh->data[i]; p;) {
             SymReg * const next = p->next;
-            free_sym(p);
+            free_sym(interp, p);
             p = next;
         }
 
         hsh->data[i] = NULL;
     }
 
-    mem_sys_free(hsh->data);
+    mem_gc_free(interp, hsh->data);
 
     hsh->data    = NULL;
     hsh->entries = 0;
@@ -1635,7 +1635,7 @@
 
 /*
 
-=item C<void clear_locals(IMC_Unit *unit)>
+=item C<void clear_locals(PARROT_INTERP, IMC_Unit *unit)>
 
 Deletes all local symbols and clears life info from the given IMC_Unit.
 
@@ -1644,7 +1644,7 @@
 */
 
 void
-clear_locals(ARGIN_NULLOK(IMC_Unit *unit))
+clear_locals(PARROT_INTERP, ARGIN_NULLOK(IMC_Unit *unit))
 {
     ASSERT_ARGS(clear_locals)
     SymHash * const hsh = &unit->hash;
@@ -1657,9 +1657,9 @@
             SymReg * const next = p->next;
 
             if (unit && p->life_info)
-                free_life_info(unit, p);
+                free_life_info(interp, unit, p);
 
-            free_sym(p);
+            free_sym(interp, p);
             p = next;
         }
 
@@ -1687,7 +1687,7 @@
     SymHash * const hsh = &IMCC_INFO(interp)->ghash;
 
     if (hsh->data)
-        clear_sym_hash(hsh);
+        clear_sym_hash(interp, hsh);
 }
 
 

Modified: branches/boehm_gc_2/compilers/imcc/symreg.h
==============================================================================
--- branches/boehm_gc_2/compilers/imcc/symreg.h	Tue Feb 23 20:58:26 2010	(r44403)
+++ branches/boehm_gc_2/compilers/imcc/symreg.h	Tue Feb 23 21:02:00 2010	(r44404)
@@ -193,9 +193,12 @@
 void clear_globals(PARROT_INTERP)
         __attribute__nonnull__(1);
 
-void clear_locals(ARGIN_NULLOK(IMC_Unit *unit));
-void clear_sym_hash(ARGMOD(SymHash *hsh))
+void clear_locals(PARROT_INTERP, ARGIN_NULLOK(IMC_Unit *unit))
+        __attribute__nonnull__(1);
+
+void clear_sym_hash(PARROT_INTERP, ARGMOD(SymHash *hsh))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*hsh);
 
 void create_symhash(PARROT_INTERP, ARGOUT(SymHash *hash))
@@ -218,8 +221,9 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
-void free_sym(ARGMOD(SymReg *r))
+void free_sym(PARROT_INTERP, ARGMOD(SymReg *r))
         __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
         FUNC_MODIFIES(*r);
 
 PARROT_CAN_RETURN_NULL
@@ -335,8 +339,9 @@
 PARROT_MALLOC
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
-char * symreg_to_str(ARGIN(const SymReg *s))
-        __attribute__nonnull__(1);
+char * symreg_to_str(PARROT_INTERP, ARGIN(const SymReg *s))
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2);
 
 #define ASSERT_ARGS__find_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
@@ -379,9 +384,11 @@
     , PARROT_ASSERT_ARG(arg))
 #define ASSERT_ARGS_clear_globals __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_clear_locals __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
+#define ASSERT_ARGS_clear_locals __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_clear_sym_hash __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(hsh))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(hsh))
 #define ASSERT_ARGS_create_symhash __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(hash))
@@ -394,7 +401,8 @@
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(name))
 #define ASSERT_ARGS_free_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(r))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(r))
 #define ASSERT_ARGS_get_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(name))
@@ -449,7 +457,8 @@
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(r))
 #define ASSERT_ARGS_symreg_to_str __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(s))
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(s))
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 /* HEADERIZER END: compilers/imcc/symreg.c */
 


More information about the parrot-commits mailing list