From 99946cb8c71a6ce769d928dc2a0f396151f11365 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Sat, 17 Feb 1996 16:55:54 +0100
Subject: [PATCH] Completed removing compact arrays

Rev: src/array.c:1.5
Rev: src/array.h:1.3
Rev: src/builtin_efuns.c:1.8
Rev: src/call_out.c:1.2
Rev: src/interpret.c:1.6
Rev: src/list.c:1.2
Rev: src/lpc_types.c:1.2
Rev: src/main.c:1.2
Rev: src/mapping.c:1.2
Rev: src/modules/files/efuns.c:1.3
Rev: src/modules/regexp/glue.c:1.2
Rev: src/object.c:1.4
Rev: src/svalue.c:1.5
Rev: src/svalue.h:1.3
---
 src/array.c               |  57 +++++++++----------
 src/array.h               |  15 +++--
 src/builtin_efuns.c       | 113 +++++++++++++++-----------------------
 src/call_out.c            |   9 +--
 src/interpret.c           |   2 +-
 src/list.c                |   2 +-
 src/lpc_types.c           |  29 +---------
 src/main.c                |  15 +++--
 src/mapping.c             |   8 +--
 src/modules/files/efuns.c |  24 ++++----
 src/modules/regexp/glue.c |   2 +-
 src/object.c              |   7 ++-
 src/svalue.c              |  13 +++--
 src/svalue.h              |   5 +-
 14 files changed, 133 insertions(+), 168 deletions(-)

diff --git a/src/array.c b/src/array.c
index 41101879f8..46e51f1d2b 100644
--- a/src/array.c
+++ b/src/array.c
@@ -40,7 +40,7 @@ struct array *allocate_array_no_init(INT32 size,INT32 extra_space)
 {
   struct array *v;
 
-  if(size == 0 && type == T_MIXED)
+  if(size == 0)
   {
     empty_array.refs++;
     return &empty_array;
@@ -309,7 +309,7 @@ struct array *array_shrink(struct array *v,INT32 size)
     free_array(v);
     return a;
   }else{
-    free_svalues(ITEM(v) + size, v->size - size);
+    free_svalues(ITEM(v) + size, v->size - size, v->type_field);
     v->size=size;
     return v;
   }
@@ -486,16 +486,6 @@ INT32 array_find_destructed_object(struct array *v)
   return -1;
 }
 
-
-static short_cmpfun current_short_cmpfun;
-static union anything *current_short_array_p;
-
-static int internal_short_cmpfun(INT32 *a,INT32 *b)
-{
-  return current_short_cmpfun(current_short_array_p + *a,
-			      current_short_array_p + *b);
-}
-
 static struct svalue *current_array_p;
 static cmpfun current_cmpfun;
 
@@ -617,12 +607,12 @@ static INT32 low_lookup(struct array *v,
 INT32 set_lookup(struct array *a, struct svalue *s)
 {
   /* face it, it's not there */
-  if( (((2 << s->type) -1) & s->type_field) == 0)
+  if( (((2 << s->type) -1) & a->type_field) == 0)
     return -1;
 
   /* face it, it's not there */
-  if( ((BIT_MIXED << s->type) & BIT_MIXED & s->type_field) == 0)
-    return ~v->size;
+  if( ((BIT_MIXED << s->type) & BIT_MIXED & a->type_field) == 0)
+    return ~a->size;
 
   return low_lookup(a,s,set_svalue_cmpfun);
 }
@@ -630,12 +620,12 @@ INT32 set_lookup(struct array *a, struct svalue *s)
 INT32 switch_lookup(struct array *a, struct svalue *s)
 {
   /* face it, it's not there */
-  if( (((2 << s->type) -1) & s->type_field) == 0)
+  if( (((2 << s->type) -1) & a->type_field) == 0)
     return -1;
 
   /* face it, it's not there */
-  if( ((BIT_MIXED << s->type) & BIT_MIXED & s->type_field) == 0)
-    return ~v->size;
+  if( ((BIT_MIXED << s->type) & BIT_MIXED & a->type_field) == 0)
+    return ~a->size;
 
   return low_lookup(a,s,switch_svalue_cmpfun);
 }
@@ -785,7 +775,7 @@ struct array *array_zip(struct array *a, struct array *b,INT32 *zipper)
   size=zipper[0];
   zipper++;
 
-  ret=allocate_array_no_init(size,0, T_MIXED);
+  ret=allocate_array_no_init(size,0);
   for(e=0; e<size; e++)
   {
     if(*zipper >= 0)
@@ -803,6 +793,9 @@ struct array *add_arrays(struct svalue *argp, INT32 args)
   INT32 e, size;
   struct array *v;
 
+  for(size=e=0;e<args;e++)
+    size+=argp[e].u.array->size;
+
   if(args && argp[0].u.array->refs==1)
   {
     e=argp[0].u.array->size;
@@ -971,7 +964,7 @@ struct array *and_arrays(struct array *a, struct array *b)
   {
     return merge_array_without_order(a, b, OP_AND);
   }else{
-    return allocate_array_no_init(0,0,T_MIXED);
+    return allocate_array_no_init(0,0);
   }
 }
 
@@ -986,7 +979,6 @@ int check_that_array_is_constant(struct array *a)
 node *make_node_from_array(struct array *a)
 {
   struct svalue s;
-  char *str;
   INT32 e;
 
   array_fix_type_field(a);
@@ -1031,7 +1023,7 @@ void push_array_items(struct array *a)
     free_array(a);
     return;
   }else{
-    assign_svalues_no_free(sp, ITEM(a), a->size);
+    assign_svalues_no_free(sp, ITEM(a), a->size, a->type_field);
   }
   sp += a->size;
   free_array(a);
@@ -1120,10 +1112,13 @@ struct array *explode(struct lpc_string *str,
 
   if(!del->len)
   {
-    ret=allocate_array_no_init(str->len,0,T_STRING);
+    ret=allocate_array_no_init(str->len,0);
     ret->type_field |= 1<<T_STRING;
     for(e=0;e<str->len;e++)
-      SHORT_ITEM(ret)[e].string=make_shared_binary_string(str->str+e,1);
+    {
+      ITEM(ret)[e].type=T_STRING;
+      ITEM(ret)[e].u.string=make_shared_binary_string(str->str+e,1);
+    }
   }else{
 
     s=str->str;
@@ -1136,17 +1131,19 @@ struct array *explode(struct lpc_string *str,
       e++;
     }
 
-    ret=allocate_array_no_init(e+1,0,T_STRING);
+    ret=allocate_array_no_init(e+1,0);
     ret->type_field |= 1<<T_STRING;
 
     s=str->str;
     for(d=0;d<e;d++)
     {
       tmp=MEMMEM((char *)(del->str), del->len, (char *)s, end-s);
-      SHORT_ITEM(ret)[d].string=make_shared_binary_string(s,tmp-s);
+      ITEM(ret)[d].type=T_STRING;
+      ITEM(ret)[d].u.string=make_shared_binary_string(s,tmp-s);
       s=tmp+del->len;
     }
-    SHORT_ITEM(ret)[d].string=make_shared_binary_string(s,end-s);
+    ITEM(ret)[d].type=T_STRING;
+    ITEM(ret)[d].u.string=make_shared_binary_string(s,end-s);
   }
   return ret;
 }
@@ -1218,11 +1215,11 @@ void apply_array(struct array *a, INT32 args)
   argp=sp-args;
   for(e=0;e<a->size;e++)
   {
-    assign_svalues_no_free(sp,argp,args);
+    assign_svalues_no_free(sp,argp,args,BIT_MIXED);
     sp+=args;
     apply_svalue(ITEM(a)+e,args);
   }
-  ret=aggregate_array(a->size,T_MIXED);
+  ret=aggregate_array(a->size);
   pop_n_elems(args);
   push_array(ret);
 }
@@ -1267,7 +1264,7 @@ void array_gc_clear_mark()
   } while (a != & empty_array);
 }
 
-void array_gc_mark(array *a)
+void array_gc_mark(struct array *a)
 {
   INT e;
   if(a->flags & ARRAY_FLAG_MARK) return;
diff --git a/src/array.h b/src/array.h
index 4d4687072c..34f74e4baa 100644
--- a/src/array.h
+++ b/src/array.h
@@ -54,8 +54,8 @@ typedef short_cmpfun (*cmpfun_getter)(TYPE_T);
 
 
 /* Prototypes begin here */
-struct array *allocate_array_no_init(INT32 size,INT32 extra_space,TYPE_T type);
-struct array *allocate_array(INT32 size,TYPE_T type);
+struct array *allocate_array_no_init(INT32 size,INT32 extra_space);
+struct array *allocate_array(INT32 size);
 void really_free_array(struct array *v);
 void array_index_no_free(struct svalue *s,struct array *v,INT32 index);
 void array_index(struct svalue *s,struct array *v,INT32 index);
@@ -72,7 +72,7 @@ struct array *slice_array(struct array *v,INT32 start,INT32 end);
 struct array *copy_array(struct array *v);
 void check_array_for_destruct(struct array *v);
 INT32 array_find_destructed_object(struct array *v);
-INT32 *get_order(struct array *v, cmpfun fun,cmpfun_getter backfun);
+INT32 *get_order(struct array *v, cmpfun fun);
 INT32 *get_set_order(struct array *a);
 INT32 *get_switch_order(struct array *a);
 INT32 set_lookup(struct array *a, struct svalue *s);
@@ -107,7 +107,7 @@ void describe_index(struct array *a,
 		    struct processing *p,
 		    int indent);
 void describe_array(struct array *a,struct processing *p,int indent);
-struct array *aggregate_array(INT32 args, TYPE_T type);
+struct array *aggregate_array(INT32 args);
 struct array *explode(struct lpc_string *str,
 		       struct lpc_string *del);
 struct lpc_string *implode(struct array *a,struct lpc_string *del);
@@ -117,7 +117,12 @@ struct array *reverse_array(struct array *a);
 void array_replace(struct array *a,
 		   struct svalue *from,
 		   struct svalue *to);
-void check_all_arrays();
+void array_gc_clear_mark();
+void array_gc_mark(struct array *a);
+void array_gc_sweep();
+void array_gc_sweep2();
+void check_array(struct array *a, int pass);
+void check_all_arrays(int pass);
 /* Prototypes end here */
 
 
diff --git a/src/builtin_efuns.c b/src/builtin_efuns.c
index 90507b5a82..28120bf6e9 100644
--- a/src/builtin_efuns.c
+++ b/src/builtin_efuns.c
@@ -47,7 +47,7 @@ void f_aggregate(INT32 args)
   if(args < 0) fatal("Negative args to f_aggregate()\n");
 #endif
 
-  a=aggregate_array(args,T_MIXED);
+  a=aggregate_array(args);
   push_array(a); /* beware, macro */
 }
 
@@ -290,7 +290,7 @@ void f_backtrace(INT32 args)
   for(f=fp;f;f=f->parent_frame) frames++;
 
   sp->type=T_ARRAY;
-  sp->u.array=a=allocate_array_no_init(frames,0,T_ARRAY);
+  sp->u.array=a=allocate_array_no_init(frames,0);
   sp++;
 
   for(f=fp;f;f=f->parent_frame)
@@ -301,7 +301,8 @@ void f_backtrace(INT32 args)
 
     if(f->current_object && f->current_object->prog)
     {
-      SHORT_ITEM(a)[frames].array=i=allocate_array_no_init(3,0,T_MIXED);
+      ITEM(a)[frames].u.array=i=allocate_array_no_init(3,0);
+      ITEM(a)[frames].type=T_ARRAY;
       ITEM(i)[2].type=T_FUNCTION;
       ITEM(i)[2].subtype=f->fun;
       ITEM(i)[2].u.object=f->current_object;
@@ -328,7 +329,8 @@ void f_backtrace(INT32 args)
 	ITEM(i)[0].type=T_INT;
       }
     }else{
-      SHORT_ITEM(a)[frames].refs=0;
+      ITEM(a)[frames].type=T_INT;
+      ITEM(a)[frames].u.integer=0;
     }
   }
 }
@@ -562,7 +564,6 @@ void f_all_efuns(INT32 args)
 
 void f_allocate(INT32 args)
 {
-  TYPE_T t;
   INT32 size;
 
   if(args < 1)
@@ -571,25 +572,12 @@ void f_allocate(INT32 args)
   if(sp[-args].type!=T_INT)
     error("Bad argument 1 to allocate.\n");
 
-  if(args > 1)
-  {
-    struct lpc_string *s;
-    if(sp[1-args].type != T_STRING)
-      error("Bad argument 2 to allocate.\n");
-
-    s=sp[1-args].u.string;
-    s=parse_type(s->str);
-    t=compile_type_to_runtime_type(s);
-    free_string(s);
-  }else{
-    t=T_MIXED;
-  }
 
   size=sp[-args].u.integer;
   if(size < 0)
     error("Allocate on negative number.\n");
   pop_n_elems(args);
-  push_array( allocate_array(size, t) );
+  push_array( allocate_array(size) );
 }
 
 void f_sizeof(INT32 args)
@@ -632,14 +620,21 @@ void f_sizeof(INT32 args)
 
 void f_rusage(INT32 args)
 {
-  INT32 *rus;
+  INT32 *rus,e;
   struct array *v;
   pop_n_elems(args);
   rus=low_rusage();
   if(!rus)
     error("System rusage information not available.\n");
-  v=allocate_array_no_init(29,0,T_INT);
-  MEMCPY((char *)SHORT_ITEM(v),(char *)rus,sizeof(INT32)*29);
+  v=allocate_array_no_init(29,0);
+
+  for(e=0;e<29;e++)
+  {
+    ITEM(v)[e].type=T_INT;
+    ITEM(v)[e].subtype=NUMBER_NUMBER;
+    ITEM(v)[e].u.integer=rus[e];
+  }
+
   sp->u.array=v;
   sp->type=T_ARRAY;
   sp++;
@@ -798,9 +793,13 @@ void f_indices(INT32 args)
     size=sp[-args].u.array->size;
 
   qjump:
-    a=allocate_array_no_init(size,0,T_INT);
+    a=allocate_array_no_init(size,0);
     while(--size>=0)
-      SHORT_ITEM(a)[size].integer=size;
+    {
+      ITEM(a)[size].type=T_INT;
+      ITEM(a)[size].subtype=NUMBER_NUMBER;
+      ITEM(a)[size].u.integer=size;
+    }
     break;
 
   case T_MAPPING:
@@ -834,9 +833,13 @@ void f_values(INT32 args)
   {
   case T_STRING:
     size=sp[-args].u.string->len;
-    a=allocate_array_no_init(size,0,T_INT);
+    a=allocate_array_no_init(size,0);
     while(--size>=0)
-      SHORT_ITEM(a)[size].integer=EXTRACT_UCHAR(sp[-args].u.string->str+size);
+    {
+      ITEM(a)[size].type=T_INT;
+      ITEM(a)[size].subtype=NUMBER_NUMBER;
+      ITEM(a)[size].u.integer=EXTRACT_UCHAR(sp[-args].u.string->str+size);
+    }
     break;
 
   case T_ARRAY:
@@ -849,9 +852,13 @@ void f_values(INT32 args)
 
   case T_LIST:
     size=sp[-args].u.list->ind->size;
-    a=allocate_array_no_init(size,0,T_INT);
-    while(size>0)
-      SHORT_ITEM(a)[--size].integer=1;
+    a=allocate_array_no_init(size,0);
+    while(--size>=0)
+    {
+      ITEM(a)[size].type=T_INT;
+      ITEM(a)[size].subtype=NUMBER_NUMBER;
+      ITEM(a)[size].u.integer=1;
+    }
     break;
 
   case T_OBJECT:
@@ -990,50 +997,18 @@ struct lpc_string * replace_many(struct lpc_string *str,
 
   v=(struct tupel *)xalloc(sizeof(struct tupel)*from->size);
 
-  if(from->array_type == T_MIXED)
-  {
-    for(e=0;e<from->size;e++)
-    {
-      if(ITEM(from)[e].type != T_STRING)
-	error("Replace: from array not string *\n");
-      v[e].ind=ITEM(from)[e].u.string;
-    }
-  }
-  else if(from->array_type == T_STRING)
-  {
-    for(e=0;e<from->size;e++)
-    {
-      if(!SHORT_ITEM(from)[e].string)
-	error("Replace: from array not string *\n");
-      v[e].ind=SHORT_ITEM(from)[e].string;
-    }
-  }
-  else
+  for(e=0;e<from->size;e++)
   {
-    error("Replace: from array is not string *\n");
+    if(ITEM(from)[e].type != T_STRING)
+      error("Replace: from array not string *\n");
+    v[e].ind=ITEM(from)[e].u.string;
   }
 
-  if(to->array_type == T_MIXED)
-  {
-    for(e=0;e<to->size;e++)
-    {
-      if(ITEM(to)[e].type != T_STRING)
-	error("Replace: to array not string *\n");
-      v[e].val=ITEM(to)[e].u.string;
-    }
-  }
-  else if(to->array_type == T_STRING)
-  {
-    for(e=0;e<to->size;e++)
-    {
-      if(!SHORT_ITEM(to)[e].string)
-	error("Replace: to array not string *\n");
-      v[e].val=SHORT_ITEM(to)[e].string;
-    }
-  }
-  else
+  for(e=0;e<to->size;e++)
   {
-    error("Replace: to array is not string *\n");
+    if(ITEM(to)[e].type != T_STRING)
+      error("Replace: to array not string *\n");
+    v[e].val=ITEM(to)[e].u.string;
   }
 
   fsort((char *)v,from->size,sizeof(struct tupel),(fsortfun)replace_sortfun);
diff --git a/src/call_out.c b/src/call_out.c
index da5c6fd47f..cfda6cc071 100644
--- a/src/call_out.c
+++ b/src/call_out.c
@@ -246,11 +246,11 @@ struct array *get_all_call_outs()
   struct array *ret;
 
   verify_call_outs();
-  ret=allocate_array_no_init(num_pending_calls,0,T_ARRAY);
+  ret=allocate_array_no_init(num_pending_calls,0);
   for(e=0;e<num_pending_calls;e++)
   {
     struct array *v;
-    v=allocate_array_no_init(pending_calls[e]->args->size+2, 0, T_MIXED);
+    v=allocate_array_no_init(pending_calls[e]->args->size+2, 0);
     ITEM(v)[0].type=T_INT;
     ITEM(v)[0].subtype=NUMBER_NUMBER;
     ITEM(v)[0].u.integer=pending_calls[e]->time-current_time;
@@ -265,9 +265,10 @@ struct array *get_all_call_outs()
       ITEM(v)[1].u.integer=0;
     }
 
-    assign_svalues_no_free(ITEM(v)+2,ITEM(pending_calls[e]->args),pending_calls[e]->args->size);
+    assign_svalues_no_free(ITEM(v)+2,ITEM(pending_calls[e]->args),pending_calls[e]->args->size,BIT_MIXED);
 
-    SHORT_ITEM(ret)[e].array=v;
+    ITEM(ret)[e].type=T_ARRAY;
+    ITEM(ret)[e].u.array=v;
   }
   return ret;
 }
diff --git a/src/interpret.c b/src/interpret.c
index d1a9cb69be..ce61e6db18 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -196,7 +196,7 @@ void pop_n_elems(INT32 x)
 
   if(x < 0) fatal("Popping negative number of args....\n");
 #endif
-  free_svalues(sp-x,x);
+  free_svalues(sp-x,x,BIT_MIXED);
   sp-=x;
 }
 
diff --git a/src/list.c b/src/list.c
index 439b89c0c1..c2a968482e 100644
--- a/src/list.c
+++ b/src/list.c
@@ -136,7 +136,7 @@ struct list *add_lists(struct svalue *argp,INT32 args)
   switch(args)
   {
   case 0:
-    ret=allocate_list(allocate_array_no_init(0,0,T_MIXED));
+    ret=allocate_list(allocate_array_no_init(0,0));
     break;
 
   case 1:
diff --git a/src/lpc_types.c b/src/lpc_types.c
index 3a2aa02d6f..4cf28ef120 100644
--- a/src/lpc_types.c
+++ b/src/lpc_types.c
@@ -744,34 +744,7 @@ struct lpc_string *check_call(struct lpc_string *args,
 
 void check_array_type(struct array *a)
 {
-  int t;
-  t=my_log2(a->array_type);
-  if( ( 1 << t ) == a->array_type )
-  {
-    switch(t)
-    {
-    case T_ARRAY:
-      push_type(T_MIXED);
-      push_type(T_ARRAY);
-      break;
-
-    case T_LIST:
-      push_type(T_MIXED);
-      push_type(T_LIST);
-      break;
-
-    case T_MAPPING:
-      push_type(T_MIXED);
-      push_type(T_MIXED);
-      push_type(T_MAPPING);
-      break;
-
-    default:
-      push_type(t);
-    }
-  }else{
-    push_type(T_MIXED);
-  }
+  push_type(T_MIXED);
 }
 
 struct lpc_string *get_type_of_svalue(struct svalue *s)
diff --git a/src/main.c b/src/main.c
index 3afa0c7152..a5c0b77ef3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -158,15 +158,22 @@ void main(int argc, char **argv, char **env)
   call_and_free_callback_list(& post_master_callbacks);
   init_modules_programs();
 
-  a=allocate_array_no_init(argc-e,0,T_STRING);
+  a=allocate_array_no_init(argc-e,0);
   for(num=0;e<argc;e++)
-    SHORT_ITEM(a)[num++].string=make_shared_string(argv[e]);
+  {
+    ITEM(a)[num].u.string=make_shared_string(argv[e]);
+    ITEM(a)[num].type=T_STRING;
+    num++;
+  }
   push_array(a);
 
   for(num=0;env[num];num++);
-  a=allocate_array_no_init(num,0,T_STRING);
+  a=allocate_array_no_init(num,0);
   for(num=0;env[num];num++)
-    SHORT_ITEM(a)[num].string=make_shared_string(env[num]);
+  {
+    ITEM(a)[num].u.string=make_shared_string(env[num]);
+    ITEM(a)[num].type=T_STRING;
+  }
   push_array(a);
 
   if(SETJMP(back))
diff --git a/src/mapping.c b/src/mapping.c
index f41b731ae1..de252f7fbf 100644
--- a/src/mapping.c
+++ b/src/mapping.c
@@ -219,8 +219,8 @@ struct mapping *add_mappings(struct svalue *argp,INT32 args)
   switch(args)
   {
   case 0:
-    ret=allocate_mapping(allocate_array_no_init(0,0,T_MIXED),
-			 allocate_array_no_init(0,0,T_MIXED));
+    ret=allocate_mapping(allocate_array_no_init(0,0),
+			 allocate_array_no_init(0,0));
     break;
 
   case 1:
@@ -334,8 +334,8 @@ void f_aggregate_mapping(INT32 args)
   if(args & 1)
     error("Uneven number of arguments to aggregage_mapping.\n");
 
-  ind=allocate_array_no_init(args/2,0,T_MIXED);
-  val=allocate_array_no_init(args/2,0,T_MIXED);
+  ind=allocate_array_no_init(args/2,0);
+  val=allocate_array_no_init(args/2,0);
 
   s=sp-args;
   for(e=0;e<args/2;e++)
diff --git a/src/modules/files/efuns.c b/src/modules/files/efuns.c
index b0a07205d0..b2172ad6c4 100644
--- a/src/modules/files/efuns.c
+++ b/src/modules/files/efuns.c
@@ -41,20 +41,20 @@
 struct array *encode_stat(struct stat *s)
 {
   struct array *a;
-  a=allocate_array_no_init(7,0,T_INT);
-  SHORT_ITEM(a)[0].integer=s->st_mode;
+  a=allocate_array(7);
+  ITEM(a)[0].u.integer=s->st_mode;
   switch(S_IFMT & s->st_mode)
   {
-  case S_IFREG: SHORT_ITEM(a)[1].integer=s->st_size; break;
-  case S_IFDIR: SHORT_ITEM(a)[1].integer=-2; break;
-  case S_IFLNK: SHORT_ITEM(a)[1].integer=-3; break;
-  default: SHORT_ITEM(a)[1].integer=-4; break;
+  case S_IFREG: ITEM(a)[1].u.integer=s->st_size; break;
+  case S_IFDIR: ITEM(a)[1].u.integer=-2; break;
+  case S_IFLNK: ITEM(a)[1].u.integer=-3; break;
+  default: ITEM(a)[1].u.integer=-4; break;
   }
-  SHORT_ITEM(a)[2].integer=s->st_atime;
-  SHORT_ITEM(a)[3].integer=s->st_mtime;
-  SHORT_ITEM(a)[4].integer=s->st_ctime;
-  SHORT_ITEM(a)[5].integer=s->st_uid;
-  SHORT_ITEM(a)[6].integer=s->st_gid;
+  ITEM(a)[2].u.integer=s->st_atime;
+  ITEM(a)[3].u.integer=s->st_mtime;
+  ITEM(a)[4].u.integer=s->st_ctime;
+  ITEM(a)[5].u.integer=s->st_uid;
+  ITEM(a)[6].u.integer=s->st_gid;
   return a;
 }
 
@@ -170,7 +170,7 @@ void f_get_dir(INT32 args)
       push_string(make_shared_binary_string(d->d_name,NAMLEN(d)));
     }
     closedir(dir);
-    a=aggregate_array(sp-save_sp, T_STRING);
+    a=aggregate_array(sp-save_sp);
   }
 
   pop_n_elems(args);
diff --git a/src/modules/regexp/glue.c b/src/modules/regexp/glue.c
index f378f797ba..4a728f2102 100644
--- a/src/modules/regexp/glue.c
+++ b/src/modules/regexp/glue.c
@@ -84,7 +84,7 @@ static void regexp_split(INT32 args)
       }
     }
     if(j<i-1) pop_n_elems(i-j-1);
-    push_array(aggregate_array(j,T_STRING));
+    push_array(aggregate_array(j));
     free_string(s);
   }else{
     pop_n_elems(args);
diff --git a/src/object.c b/src/object.c
index 44883029ea..d0a2784a3a 100644
--- a/src/object.c
+++ b/src/object.c
@@ -655,11 +655,12 @@ struct array *object_indices(struct object *o)
   if(!p)
     error("indices() on destructed object.\n");
 
-  a=allocate_array_no_init(p->num_identifier_indexes,0, T_STRING);
+  a=allocate_array_no_init(p->num_identifier_indexes,0);
   for(e=0;e<(int)p->num_identifier_indexes;e++)
   {
-    copy_shared_string(SHORT_ITEM(a)[e].string,
+    copy_shared_string(ITEM(a)[e].u.string,
 		       ID_FROM_INT(p,p->identifier_index[e])->name);
+    ITEM(a)[e].type=T_STRING;
   }
   return a;
 }
@@ -674,7 +675,7 @@ struct array *object_values(struct object *o)
   if(!p)
     error("values() on destructed object.\n");
 
-  a=allocate_array_no_init(p->num_identifier_indexes,0, T_MIXED);
+  a=allocate_array_no_init(p->num_identifier_indexes,0);
   for(e=0;e<(int)p->num_identifier_indexes;e++)
   {
     low_object_index(ITEM(a)+e, o, p->identifier_index[e]);
diff --git a/src/svalue.c b/src/svalue.c
index a9dd15e646..04af973f0b 100644
--- a/src/svalue.c
+++ b/src/svalue.c
@@ -168,7 +168,7 @@ void free_svalues(struct svalue *s,INT32 num, INT32 type_hint)
 	  really_free_object(s->u.object);
       }
     }
-    return
+    return;
 
 #undef DOTYPE
   default:
@@ -194,7 +194,7 @@ void assign_svalues_no_free(struct svalue *to,
 {
   if((type_hint & ~(BIT_INT | BIT_FLOAT))==0)
   {
-    MEMCPY((char *)to, (char *)from, sizeof(svalue) * num);
+    MEMCPY((char *)to, (char *)from, sizeof(struct svalue) * num);
     return;
   }
 
@@ -219,10 +219,13 @@ void assign_svalue(struct svalue *to, struct svalue *from)
   assign_svalue_no_free(to,from);
 }
 
-void assign_svalues(struct svalue *to, struct svalue *from, INT32 num)
+void assign_svalues(struct svalue *to,
+		    struct svalue *from,
+		    INT32 num,
+		    TYPE_FIELD types)
 {
-  free_svalues(to,num);
-  assign_svalues_no_free(to,from,num);
+  free_svalues(to,num,BIT_MIXED);
+  assign_svalues_no_free(to,from,num,types);
 }
 
 void assign_to_short_svalue(union anything *u,
diff --git a/src/svalue.h b/src/svalue.h
index 290d10307d..0978075478 100644
--- a/src/svalue.h
+++ b/src/svalue.h
@@ -132,7 +132,10 @@ void assign_svalues_no_free(struct svalue *to,
 			    INT32 num,
 			    INT32 type_hint);
 void assign_svalue(struct svalue *to, struct svalue *from);
-void assign_svalues(struct svalue *to, struct svalue *from, INT32 num);
+void assign_svalues(struct svalue *to,
+		    struct svalue *from,
+		    INT32 num,
+		    TYPE_FIELD types);
 void assign_to_short_svalue(union anything *u,
 			    TYPE_T type,
 			    struct svalue *s);
-- 
GitLab