diff --git a/src/pike_types.c b/src/pike_types.c
index a2e52e6fad3669eca3dd6b4af033650c43a69c7c..60894ac1ea4646b62d4dd3f077b92c5be02b9fe7 100644
--- a/src/pike_types.c
+++ b/src/pike_types.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: pike_types.c,v 1.92 1999/12/13 12:08:12 mast Exp $");
+RCSID("$Id: pike_types.c,v 1.93 1999/12/13 21:42:29 grubba Exp $");
 #include <ctype.h>
 #include "svalue.h"
 #include "pike_types.h"
@@ -76,6 +76,7 @@ struct pike_string *mixed_type_string;
 struct pike_string *void_type_string;
 struct pike_string *zero_type_string;
 struct pike_string *any_type_string;
+struct pike_string *weak_type_string;	/* array|mapping|multiset */
 
 static struct pike_string *a_markers[10],*b_markers[10];
 
@@ -126,6 +127,7 @@ void init_types(void)
   void_type_string=CONSTTYPE(tVoid);
   zero_type_string=CONSTTYPE(tZero);
   any_type_string=CONSTTYPE(tOr(tVoid,tMix));
+  weak_type_string=CONSTTYPE(tOr3(tArray,tMultiset,tMapping));
 }
 
 static int type_length(char *t)
@@ -2963,7 +2965,7 @@ struct pike_string *get_type_of_svalue(struct svalue *s)
       p=s->u.object->prog;
       if(!p)
       {
-	ret=int_type_string;
+	ret=zero_type_string;
       }else{
 	ret=ID_FROM_INT(p,s->subtype)->type;
       }
@@ -2971,17 +2973,38 @@ struct pike_string *get_type_of_svalue(struct svalue *s)
     reference_shared_string(ret);
     return ret;
        
+  case T_MULTISET:
   case T_ARRAY:
-    type_stack_mark();
-    push_type(T_MIXED);
-    push_type(T_ARRAY);
-    return pop_unfinished_type();
+    {
+      struct pike_string *arg_type;
+#if 0
+      struct array *a;
+      int i;
+
+      if (s->type == T_MULTISET) {
+	a = s->u.multiset->ind;
+      } else {
+	a = s->u.array;
+      }
+      /* FIXME: Circular structures? */
+      copy_shared_string(arg_type, zero_type_string);
+      for (i = 0; i < a->size; i++) {
+	struct pike_string *tmp1 = get_type_of_svalue(a->item+i);
+	struct pike_string *tmp2 = or_pike_types(arg_type, tmp1, 1);
+	free_string(arg_type);
+	free_string(tmp1);
+	arg_type = tmp2;
+      }
+#else /* !0 */
+      copy_shared_string(arg_type, mixed_type_string);
+#endif /* 0 */
+      type_stack_mark();
+      push_unfinished_type(arg_type->str);
+      free_string(arg_type);
+      push_type(s->type);
+      return pop_unfinished_type();
+    }
 
-  case T_MULTISET:
-    type_stack_mark();
-    push_type(T_MIXED);
-    push_type(T_MULTISET);
-    return pop_unfinished_type();
 
   case T_MAPPING:
     type_stack_mark();
@@ -3009,9 +3032,8 @@ struct pike_string *get_type_of_svalue(struct svalue *s)
 	push_type(T_OBJECT);
       }
     }else{
-      push_type_int(0);
-      push_type(0);
-      push_type(T_OBJECT);
+      /* Destructed object */
+      push_type(T_ZERO);
     }
     return pop_unfinished_type();
 
@@ -3095,6 +3117,7 @@ void cleanup_pike_types(void)
   free_string(void_type_string);
   free_string(zero_type_string);
   free_string(any_type_string);
+  free_string(weak_type_string);
 }
 
 
diff --git a/src/pike_types.h b/src/pike_types.h
index 91a960f5becab767f522bdf362cab3abfc9c171b..52478a364afe158e7b99391d4c72bf79b5fe9745 100644
--- a/src/pike_types.h
+++ b/src/pike_types.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: pike_types.h,v 1.29 1999/12/13 12:08:13 mast Exp $
+ * $Id: pike_types.h,v 1.30 1999/12/13 21:40:53 grubba Exp $
  */
 #ifndef PIKE_TYPES_H
 #define PIKE_TYPES_H
@@ -77,6 +77,7 @@ extern struct pike_string *mixed_type_string;
 extern struct pike_string *void_type_string;
 extern struct pike_string *zero_type_string;
 extern struct pike_string *any_type_string;
+extern struct pike_string *weak_type_string;
 
 #define CONSTTYPE(X) make_shared_binary_string(X,CONSTANT_STRLEN(X))