[m-rev.] diff: handle user defined equality in rtti_implementation__deconstruct

Peter Ross pro at missioncriticalit.com
Sun Dec 1 02:10:12 AEDT 2002


fjh wrote:

> On 30-Nov-2002, Peter Ross <pro at missioncriticalit.com> wrote:
> > fjh wrote:
> > > On 29-Nov-2002, Peter Ross <pro at missioncriticalit.com> wrote:
> > > > fjh wrote:
> > > > > On 29-Nov-2002, Peter Ross <pro at missioncriticalit.com> wrote:
> > > > > > +handle_usereq_type(Term, TypeInfo, TypeCtorInfo,
> > > > > > + TypeCtorRep, NonCanon, Functor, Arity, Arguments) :-
> > > > > > + ( NonCanon = do_not_allow,
> > > > > > + error("attempt to deconstruct noncanonical term")
> > > > > > + ; NonCanon = canonicalize,
> > > > > > + Functor = expand_type_name(TypeCtorInfo, yes),
> > > > > > + Arity = 0,
> > > > > > + Arguments = []
> > > > >
> > > > > The two lines above look wrong -- there should at least be an XXX
> > comment
> > > > > there.
> > > > >
> > > >         case MR_TYPECTOR_REP_ENUM_USEREQ:
> > > >             if (noncanon == MR_NONCANON_ABORT) {
> > > >                 /* XXX should throw an exception */
> > > >                 MR_fatal_error(MR_STRINGIFY(EXPAND_FUNCTION_NAME)
> > > >                     ": attempt to deconstruct noncanonical term");
> > > >                 break;
> > > >             } else if (noncanon == MR_NONCANON_ALLOW) {
> > > >                 handle_noncanonical_name(type_ctor_info);
> > > >                 handle_zero_arity_args();
> > > >                 break;
> > > >             }
> > > >             /* else fall through */
> > > >
> > > >         case MR_TYPECTOR_REP_ENUM:
> > > >             handle_functor_name(MR_type_ctor_layout(type_ctor_info).
> > > >
> > MR_layout_enum[*data_word_ptr]->MR_enum_functor_name);
> > > >             handle_zero_arity_args();
> > > >             break;
> > > >
> > > > Here is the C code from mercury_ml_expand_body.  As you can see in
> > > > MR_NONCANON_ALLOW case, we expand the type name and return 0 arity.
> > > > Consequently the Arguments should be the empty list.
> > >
> > > For enums, fine -- all values of enumeration types are constants
> > > and thus have zero arity.
> > >
> > > But the procedure you are defining here doesn't say anything in its
> > > name about only being valid for enums, and in your code it gets called
> > > for du types, not just enum types.
> > >
> > If you examine the code for all the other cases in
mercury_ml_expand_body.h
> > it does exactly the same thing.  It may not be the correct thing to do,
but
> > that is what the code in ml_expand_body.h does.
>
> No it doesn't.
>
> See line 424 (in case MR_TYPECTOR_REP_DU):
>
That is in the case MR_TYPECTOR_REP_DU, but we are trying to replicate the
behaviour for MR_TYPECTOR_REP_DU_USEREQ.  I have copied the respective piece
of code below.  The important line is handle_zero_arity_args();

        case MR_TYPECTOR_REP_DU_USEREQ:
            if (noncanon == MR_NONCANON_ABORT) {
                /* XXX should throw an exception */
                MR_fatal_error(MR_STRINGIFY(EXPAND_FUNCTION_NAME)
                    ": attempt to deconstruct noncanonical term");
                break;
            } else if (noncanon == MR_NONCANON_ALLOW) {
                handle_noncanonical_name(type_ctor_info);
                handle_zero_arity_args();
                break;
            }

> expand_info->arity = functor_desc->MR_du_functor_orig_arity;
>


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.423 / Virus Database: 238 - Release Date: 28/11/2002

--------------------------------------------------------------------------
mercury-reviews mailing list
post:  mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the reviews mailing list