Ticket #299: attributes.patch

File attributes.patch, 5.7 KB (added by NotFound, 5 years ago)
  • src/pmc/object.pmc

     
    104104    return -1; 
    105105} 
    106106 
     107/* Get the first PMCProxy parent class, 
     108 * (works for single inheritance from a PMC, other usages untested) 
     109 * or PMCNULL if nothing appropiate is found 
     110 */ 
     111static PMC * 
     112getPMCProxy(PARROT_INTERP, PMC *self, STRING *name) 
     113{ 
     114    PMC *result = PMCNULL; 
     115    PMC *parents = PARROT_CLASS(PARROT_OBJECT(self)->_class)->all_parents; 
     116    INTVAL numparents = VTABLE_get_integer(interp, parents); 
     117    INTVAL i; 
     118    for (i= 0; i < numparents; ++i) { 
     119        if ((VTABLE_get_pmc_keyed_int(interp, parents, i)->vtable->base_type) 
     120                    == enum_class_PMCProxy) { 
     121            STRING * const attrproxy = CONST_STRING(interp, "proxy"); 
     122            if (Parrot_str_not_equal(interp, name, attrproxy)) { 
     123                    PMC *prx = VTABLE_get_attr_str(interp, self, attrproxy); 
     124                    if (!(PMC_IS_NULL(prx) || prx == self)) 
     125                        result = prx; 
     126            } 
     127            break; 
     128        } 
     129    } 
     130    return result; 
     131} 
     132 
    107133pmclass Object need_ext { 
    108134    ATTR PMC *_class;       /* The class this is an instance of. */ 
    109135    ATTR PMC *attrib_store; /* The attributes store - a resizable PMC array. */ 
     
    221247        /* Look up the index. */ 
    222248        index = get_attrib_index(interp, obj->_class, name); 
    223249 
    224         /* If lookup failed, exception. */ 
    225         if (index == -1) 
     250        /* If lookup failed, use proxy PMC or exception. */ 
     251        if (index == -1) { 
     252            PMC *prx = getPMCProxy(interp, SELF, name); 
     253            if (! PMC_IS_NULL(prx)) 
     254                return VTABLE_get_attr_str(interp, prx, name); 
    226255            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_ATTRIB_NOT_FOUND, 
    227256                "No such attribute '%S'", name); 
     257        } 
    228258 
    229259        return VTABLE_get_pmc_keyed_int(interp, obj->attrib_store, index); 
    230260    } 
     
    281311 
    282312        index = get_attrib_index(interp, obj->_class, name); 
    283313 
    284         /* If lookup failed, exception. */ 
    285         if (index == -1) 
     314        /* If lookup failed, use proxy PMC or exception. */ 
     315        if (index == -1) { 
     316            PMC *prx = getPMCProxy(interp, SELF, name); 
     317            if (! PMC_IS_NULL(prx)) { 
     318                VTABLE_set_attr_str(interp, prx, name, value); 
     319                return; 
     320            } 
    286321            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_ATTRIB_NOT_FOUND, 
    287322                "No such attribute '%S'", name); 
     323        } 
    288324 
    289325        VTABLE_set_pmc_keyed_int(interp, obj->attrib_store, index, value); 
    290326    } 
  • src/pmc/exceptionhandler.pmc

     
    192192        STRING * const sev    = CONST_STRING(interp, "severity"); 
    193193        STRING * const ex_str = CONST_STRING(interp, "Exception"); 
    194194 
     195/* 
    195196        Parrot_ExceptionHandler_attributes * const core_struct = 
    196197                    PARROT_EXCEPTIONHANDLER(SELF); 
     198*/ 
    197199        INTVAL severity = VTABLE_get_integer_keyed_str(interp, exception, sev); 
    198200 
    199201        if (exception->vtable->base_type == enum_class_Exception 
    200202        ||  VTABLE_isa(INTERP, exception, ex_str)) { 
    201             PMC * handled_types; 
     203            PMC *handled_types; 
     204            PMC *handled_types_except; 
     205            INTVAL min_severity; 
     206            INTVAL max_severity; 
    202207            GET_ATTR_handled_types(INTERP, SELF, handled_types); 
     208            GET_ATTR_handled_types_except(INTERP, SELF, handled_types_except); 
     209            GET_ATTR_min_severity(INTERP, SELF, min_severity); 
     210            GET_ATTR_max_severity(INTERP, SELF, max_severity); 
    203211 
    204             if (severity < core_struct->min_severity) { 
     212            if (severity < min_severity) { 
    205213                RETURN(INTVAL 0); 
    206214            } 
    207             if (core_struct->max_severity > 0 
    208                  &&  severity                  > core_struct->max_severity) { 
     215            if (max_severity > 0 
     216                 &&  severity                  > max_severity) { 
    209217                RETURN(INTVAL 0); 
    210218            } 
    211219            if (! PMC_IS_NULL(handled_types)) { 
     
    222230 
    223231                RETURN(INTVAL 0); 
    224232            } 
    225             if (core_struct->handled_types_except != PMCNULL) { 
    226                 const INTVAL elems = VTABLE_elements(interp, core_struct->handled_types_except); 
     233            if (handled_types_except != PMCNULL) { 
     234                const INTVAL elems = VTABLE_elements(interp, handled_types_except); 
    227235                const INTVAL type  = VTABLE_get_integer_keyed_str(interp, exception, CONST_STRING(interp, "type")); 
    228236                INTVAL i; 
    229237 
    230238                for (i = 0; i < elems; i++) { 
    231239                    const INTVAL handled_type = VTABLE_get_integer_keyed_int(interp, 
    232                             core_struct->handled_types_except, i); 
     240                            handled_types_except, i); 
    233241                    if (handled_type == type) 
    234242                        RETURN(INTVAL 0); 
    235243                } 
    236244 
    237245                RETURN(INTVAL 1); 
    238246            } 
    239             else if (core_struct->max_severity > 0 || 
    240                     core_struct->min_severity > 0) { 
     247            else if (max_severity > 0 || 
     248                    min_severity > 0) { 
    241249                RETURN(INTVAL 1); 
    242250            } 
    243251 
  • t/pmc/exceptionhandler.t

     
    200200    throw $P0 
    201201 
    202202  subclassed_failed: 
     203    .get_results($P1) 
    203204    .return(0) 
    204205 
    205206  subclassed_handler: 
     207    .get_results($P1) 
    206208    .return(1) 
    207209.end 
    208210