diff --git a/C/adtdefs.c b/C/adtdefs.c index 2a978cc0f..7aed2769d 100755 --- a/C/adtdefs.c +++ b/C/adtdefs.c @@ -1032,10 +1032,9 @@ Yap_PutValue(Atom a, Term v) WRITE_UNLOCK(ae->ARWLock); return; } - p->NextOfPE = RepAtom(a)->PropsOfAE; - RepAtom(a)->PropsOfAE = AbsValProp(p); p->KindOfPE = ValProperty; p->ValueOfVE = TermNil; + AddPropToAtom(RepAtom(a), (PropEntry *)p); /* take care that the lock for the property will be inited even if someone else searches for the property */ INIT_RWLOCK(p->VRWLock); diff --git a/C/userpreds.c b/C/userpreds.c index dc29f4ee8..325693a55 100644 --- a/C/userpreds.c +++ b/C/userpreds.c @@ -686,9 +686,8 @@ p_softfunctor() WRITE_LOCK(RepAtom(a)->ARWLock); if ((p0 = Yap_GetAProp(a, SFProperty)) == NIL) { pe = (SFEntry *) Yap_AllocAtomSpace(sizeof(*pe)); - pe->NextOfPE = RepAtom(a)->PropsOfAE; pe->KindOfPE = SFProperty; - RepAtom(a)->PropsOfAE = AbsSFProp(pe); + AddPropToAtom(RepAtom(a), (PropEntry *)pe); } else pe = RepSFProp(p0); WRITE_UNLOCK(RepAtom(a)->ARWLock); diff --git a/H/Yatom.h b/H/Yatom.h index dbdb1d78c..d5f4a5dc3 100755 --- a/H/Yatom.h +++ b/H/Yatom.h @@ -1606,17 +1606,22 @@ PredPropByAtom (Atom at, Term cur_mod) #define UNLOCKPE(I,Z) UNLOCK((Z)->PELock) #endif -#endif +EXTERN inline void STD_PROTO(AddPropToAtom, (AtomEntry *, PropEntry *p)); -static inline void +EXTERN inline void AddPropToAtom(AtomEntry *ae, PropEntry *p) { - if (ae->PropsOfAE != NIL) { + /* old properties should be always last, and wide atom properties + should always be first */ + if (ae->PropsOfAE != NIL && + RepProp(ae->PropsOfAE)->KindOfPE != HoldProperty) { PropEntry *pp = RepProp(ae->PropsOfAE); p->NextOfPE = pp->NextOfPE; - pp->NextOfPE = AbsProp( p); + pp->NextOfPE = AbsProp(p); } else { p->NextOfPE = ae->PropsOfAE; ae->PropsOfAE = AbsProp(p); } } +#endif +