From 453f4cabd24eb1d9a0d65874ab9f463bd48f72ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Mon, 12 Aug 1996 18:56:30 +0200 Subject: [PATCH] bugfixes... Rev: src/svalue.c:1.15 Rev: src/svalue.h:1.11 --- src/svalue.c | 19 +++++++++++-------- src/svalue.h | 7 +++++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/svalue.c b/src/svalue.c index 33779ef0b4..40edf996f1 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 397ae0dfda..f0d04d039a 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); -- GitLab