If I build parrot with --gc=libc on OS X I see some warnings about bad
pointers being passed to free(). It's happening in a call from dod.c:

#ifdef GC_IS_MALLOC
                    /* free allocated space at (int*)bufstart - 1,
                     * but not if it is used COW or external
                     */
                    if (PObj_bufstart(b) &&
                            !PObj_is_external_or_free_TESTALL(b)) {
                        if (PObj_COW_TEST(b)) {
                            INTVAL *refcount = ((INTVAL *)PObj_bufstart(b) - 1);

                            if (!--(*refcount))
                                free(refcount); /* the actual bufstart */
                        }
                        else
                            free((INTVAL*)PObj_bufstart(b) - 1);
                    }
#else

and the PMC in question appears to be the PMC morphed from Undef to String
by the concat in this pasm:

        new P0, .String
        new P1, .Undef
        set P0, "foo"
        concat  P1, P0, P0
        end

As far as I can tell the only difference between a PMC that started as
String, and one that started as Undef is that for the String PMC the
PMC flags are 512 on entry to the String PMC's init

    /* PObj is a string */
    PObj_is_string_FLAG = 1 << 8,


whereas the flags are set to 0 in pmc_reuse and so are 0 on its call
to the String PMC's init the PMC flags are zero.

What sets the flags to 512 on creation of the String PMC?
This functionality seems to be missing from the morph code.

Nicholas Clark

Reply via email to