Ticket #544: fix_attr_parsing.patch

File fix_attr_parsing.patch, 3.9 KB (added by whiteknight, 5 years ago)

a first attempt to fix ATTR parsing, causes some test failures

  • src/pmc/managedstruct.pmc

     
    2929     * custom_free_func is called before the normal destroy() function does any 
    3030     * work. 
    3131     */ 
    32     ATTR void *custom_free_func; 
     32    ATTR void (*custom_free_func)(PARROT_INTERP, void *, void *); 
    3333    ATTR void *custom_free_priv; 
    3434    /* if custom_clone_func is set, it will be called *instead* of the normal 
    3535     * clone() function logic. 
    3636     */ 
    37     ATTR void *custom_clone_func; 
     37    ATTR PMC * (*custom_clone_func)(PARROT_INTERP, PMC *ptr, void *priv); 
    3838    ATTR void *custom_clone_priv; 
    3939 
    4040/* 
     
    8686    VTABLE void destroy() { 
    8787        void *ptr = PARROT_MANAGEDSTRUCT(SELF)->ptr; 
    8888        if (ptr) { 
    89             custom_free_func_t free_func = 
    90                 (custom_free_func_t)PARROT_MANAGEDSTRUCT(SELF)->custom_free_func; 
     89            custom_free_func_t free_func = PARROT_MANAGEDSTRUCT(SELF)->custom_free_func; 
    9190            if (free_func) { 
    9291                void *free_data = PARROT_MANAGEDSTRUCT(SELF)->custom_free_priv; 
    9392                free_func(interp, ptr, free_data); 
     
    144143*/ 
    145144 
    146145    VTABLE PMC *clone() { 
    147         custom_clone_func_t clone_func = 
    148             (custom_clone_func_t)PARROT_MANAGEDSTRUCT(SELF)->custom_clone_func; 
     146        custom_clone_func_t clone_func = PARROT_MANAGEDSTRUCT(SELF)->custom_clone_func; 
    149147        PMC *dest; 
    150148        if (clone_func) { 
    151149            void *clone_data = PARROT_MANAGEDSTRUCT(SELF)->custom_clone_priv; 
  • lib/Parrot/Pmc2c/Parser.pm

     
    135135 
    136136        # name 
    137137        \s* 
    138         (\w+) 
     138        ( 
     139            \w+ 
     140          | \(\*\w*\)\(.*?\) 
     141        ) 
    139142 
    140143        # modifiers 
    141144        \s* 
  • lib/Parrot/Pmc2c/Attribute.pm

     
    9999    my $pmcname        = $pmc->{name}; 
    100100    my $attrtype       = $self->{type}; 
    101101    my $attrname       = $self->{name}; 
     102    my $isfuncptr      = 0; 
     103    my $origtype       = $attrtype; 
     104    if($attrname =~ m/\(\*(\w*)\)\((.*?)\)/) { 
     105        $isfuncptr = 1; 
     106        $origtype = $attrtype . " (*)(" . $2 . ")"; 
     107        $attrname = $1; 
     108    } 
    102109 
    103110    # Store regexes used to check some types to avoid repetitions 
    104111    my $isptrtostring = qr/STRING\s*\*$/; 
     
    113120        if (PObj_is_object_TEST(pmc)) { \\ 
    114121EOA 
    115122 
    116     if ($attrtype eq "INTVAL") { 
     123    if ($isfuncptr == 1) { 
    117124        $decl .= <<"EOA"; 
     125            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION, \\ 
     126                "Attributes of type '$origtype' cannot be " \\ 
     127                "subclassed from a high-level PMC."); \\ 
     128EOA 
     129    } 
     130    elsif ($attrtype eq "INTVAL") { 
     131        $decl .= <<"EOA"; 
    118132            PMC *attr_value = VTABLE_get_attr_str(interp, \\ 
    119133                              pmc, Parrot_str_new_constant(interp, "$attrname")); \\ 
    120134            (dest) = (PMC_IS_NULL(attr_value) ? (INTVAL) 0: VTABLE_get_integer(interp, attr_value)); \\ 
     
    161175        if (PObj_is_object_TEST(pmc)) { \\ 
    162176EOA 
    163177 
    164     if ($attrtype eq "INTVAL") { 
     178    if ($isfuncptr == 1) { 
    165179        $decl .= <<"EOA"; 
     180            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION, \\ 
     181                "Attributes of type '$origtype' cannot be " \\ 
     182                "subclassed from a high-level PMC."); \\ 
     183EOA 
     184    } 
     185    elsif ($attrtype eq "INTVAL") { 
     186        $decl .= <<"EOA"; 
    166187            PMC *attr_value = pmc_new(interp, enum_class_Integer); \\ 
    167188            VTABLE_set_integer_native(interp, attr_value, value); \\ 
    168189            VTABLE_set_attr_str(interp, pmc, \\