Branch: Tag:

2000-08-22

2000-08-22 11:33:34 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Fix for bug a=a;.
FIXME: Should probably do something similar in assign_svalues().
FIXME: Should probably have a case in the peephole optimizer.

Rev: src/svalue.h:1.66

5:   \*/      /* -  * $Id: svalue.h,v 1.65 2000/08/10 19:33:06 grubba Exp $ +  * $Id: svalue.h,v 1.66 2000/08/22 11:33:34 grubba Exp $    */   #ifndef SVALUE_H   #define SVALUE_H
318:   #define free_short_svalue(X,T) do { union anything *_s=(X); TYPE_T _t=(T); check_type(_t); check_refs2(_s,_t); if(_t<=MAX_REF_TYPE && _s->refs) if(--*(_s->refs) <= 0) { really_free_short_svalue(_s,_t); } DO_IF_DMALLOC(_s->refs=(void *)-1;) }while(0)   #define add_ref_svalue(X) do { struct svalue *_tmp=(X); check_type(_tmp->type); check_refs(_tmp); if(_tmp->type <= MAX_REF_TYPE) { debug_malloc_touch(_tmp->u.refs); _tmp->u.refs[0]++; } }while(0)   #define assign_svalue_no_free(X,Y) do { struct svalue _tmp, *_to=(X), *_from=(Y); check_type(_from->type); check_refs(_from); *_to=_tmp=*_from; if(_tmp.type <= MAX_REF_TYPE) { debug_malloc_touch(_tmp.u.refs); _tmp.u.refs[0]++; } }while(0) - #define assign_svalue(X,Y) do { struct svalue *_to2=(X), *_from2=(Y); free_svalue(_to2); assign_svalue_no_free(_to2, _from2); }while(0) + #define assign_svalue(X,Y) do { struct svalue *_to2=(X), *_from2=(Y); if (_to2 != _from2) { free_svalue(_to2); assign_svalue_no_free(_to2, _from2); } }while(0)      extern struct svalue dest_ob_zero;