| struct PMC { |
| unsigned flags; |
| }; |
| |
| typedef struct Pcc_cell |
| { |
| struct PMC *p; |
| long bla; |
| long type; |
| } Pcc_cell; |
| |
| extern void abort (); |
| extern void Parrot_gc_mark_PMC_alive_fun(int * interp, struct PMC *pmc) |
| __attribute__((noinline)); |
| |
| void Parrot_gc_mark_PMC_alive_fun (int * interp, struct PMC *pmc) |
| { |
| abort (); |
| } |
| |
| static void mark_cell(int * interp, Pcc_cell *c) |
| __attribute__((__nonnull__(1))) |
| __attribute__((__nonnull__(2))) |
| __attribute__((noinline)); |
| |
| static void |
| mark_cell(int * interp, Pcc_cell *c) |
| { |
| if (c->type == 4 && c->p |
| && !(c->p->flags & (1<<18))) |
| Parrot_gc_mark_PMC_alive_fun(interp, c->p); |
| } |
| |
| void foo(int * interp, Pcc_cell *c); |
| |
| void |
| foo(int * interp, Pcc_cell *c) |
| { |
| mark_cell(interp, c); |
| } |
| |
| int main() |
| { |
| int i; |
| Pcc_cell c; |
| c.p = 0; |
| c.bla = 42; |
| c.type = 4; |
| foo (&i, &c); |
| return 0; |
| } |