diff --git a/src/svalue.c b/src/svalue.c index 33779ef0b49f2b589efbeda60ce8c9300b9ae67f..40edf996f19217d75f08bdbacf08bd8b98784c35 100644 --- a/src/svalue.c +++ b/src/svalue.c @@ -17,6 +17,10 @@ #include "dynamic_buffer.h" #include "interpret.h" + +struct svalue dest_ob_zero = { T_INT, 0, 0 }; + + /* * This routine frees a short svalue given a pointer to it and * its type. @@ -383,13 +387,10 @@ int svalue_is_true(struct svalue *s) return 0; case T_FUNCTION: - check_destructed(s); - if(s->type==T_INT) return 0; + if(!s->u.object->prog) return 0; return 1; case T_OBJECT: - check_destructed(s); - if(s->type==T_INT) return 0; if(!s->u.object->prog) return 0; if(s->u.object->prog->lfuns[LFUN_NOT]!=-1) @@ -410,7 +411,6 @@ int svalue_is_true(struct svalue *s) } - int is_eq(struct svalue *a, struct svalue *b) { check_type(a->type); @@ -418,8 +418,8 @@ int is_eq(struct svalue *a, struct svalue *b) check_refs(a); check_refs(b); - check_destructed(a); - check_destructed(b); + safe_check_destructed(a); + safe_check_destructed(b); if (a->type != b->type) { @@ -579,6 +579,9 @@ int is_lt(struct svalue *a,struct svalue *b) check_refs(a); check_refs(b); + safe_check_destructed(a); + safe_check_destructed(b); + if (a->type != b->type) { if(a->type == T_FLOAT && b->type==T_INT) @@ -832,7 +835,6 @@ TYPE_FIELD gc_check_svalues(struct svalue *s, int num) f=0; for(e=0;e<num;e++,s++) { - f|= 1 << s->type; switch(s->type) { case T_FUNCTION: @@ -856,6 +858,7 @@ TYPE_FIELD gc_check_svalues(struct svalue *s, int num) gc_check(s->u.refs); break; } + f|= 1 << s->type; } return f; diff --git a/src/svalue.h b/src/svalue.h index 397ae0dfda00c452d237d7c59a8a1e836534086f..f0d04d039a4cd0212e87266353d58f141025de33 100644 --- a/src/svalue.h +++ b/src/svalue.h @@ -108,6 +108,12 @@ do{ \ } \ }while(0) +/* var MUST be a variable!!! */ +#define safe_check_destructed(var) do{ \ + if((var->type == T_OBJECT || var->type==T_FUNCTION) && !var->u.object->prog) \ + var=&dest_ob_zero; \ +}while(0) + #define check_short_destructed(U,T) \ do{ \ union anything *_u=(U); \ @@ -131,6 +137,7 @@ do{ \ #endif +extern struct svalue dest_ob_zero; /* Prototypes begin here */ void free_short_svalue(union anything *s,TYPE_T type);