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);