diff --git a/src/constants.c b/src/constants.c
index f1372f418980154e51e96be9962d31495f7a7f86..090cb93f2234abaa810ae2a8b809860550a893af 100644
--- a/src/constants.c
+++ b/src/constants.c
@@ -15,7 +15,7 @@
 #include "error.h"
 #include "block_alloc.h"
 
-RCSID("$Id: constants.c,v 1.14 1999/02/10 21:46:39 hubbe Exp $");
+RCSID("$Id: constants.c,v 1.15 1999/03/02 03:13:13 hubbe Exp $");
 
 static INT32 num_callable=0;
 static struct mapping *builtin_constants = 0;
@@ -158,6 +158,7 @@ void cleanup_added_efuns(void)
     free_mapping(builtin_constants);
     builtin_constants=0;
   }
+  free_all_callable_blocks();
 }
 void count_memory_in_callables(INT32 *num_, INT32 *size_)
 {
diff --git a/src/global.h b/src/global.h
index d439dcffb1694c6c6845566e8b547093727c3845..c65a6f2c27f3c2d6e1eb465e7c1edaccc68f1a03 100644
--- a/src/global.h
+++ b/src/global.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: global.h,v 1.27 1999/02/27 17:19:12 grubba Exp $
+ * $Id: global.h,v 1.28 1999/03/02 03:13:14 hubbe Exp $
  */
 #ifndef GLOBAL_H
 #define GLOBAL_H
@@ -143,6 +143,9 @@ char *alloca ();
 #endif
 #endif
 
+#define MAX_INT32 2147483647
+#define MIN_INT32 -2147483648
+
 #define INT16 short
 #define INT8 char
 
diff --git a/src/interpret.c b/src/interpret.c
index 45731c622870992064cdf1855dca626001aa8d7a..a797e157458b14f05359b78ec7885f941b6e8fd8 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: interpret.c,v 1.115 1999/02/28 17:07:42 grubba Exp $");
+RCSID("$Id: interpret.c,v 1.116 1999/03/02 03:13:16 hubbe Exp $");
 #include "interpret.h"
 #include "object.h"
 #include "program.h"
@@ -1323,3 +1323,8 @@ void cleanup_interpret(void)
   mark_stack_malloced=0;
   evaluator_stack_malloced=0;
 }
+
+void really_clean_up_interpret(void)
+{
+  free_all_pike_frame_blocks();
+}
diff --git a/src/interpret.h b/src/interpret.h
index 93b229aac7377a4994222567b55952064229445e..642225e03c31922857ac55975b0ab60504aa1264 100644
--- a/src/interpret.h
+++ b/src/interpret.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: interpret.h,v 1.26 1999/01/31 09:01:49 hubbe Exp $
+ * $Id: interpret.h,v 1.27 1999/03/02 03:13:17 hubbe Exp $
  */
 #ifndef INTERPRET_H
 #define INTERPRET_H
@@ -194,6 +194,7 @@ void apply(struct object *o, char *fun, int args);
 void apply_svalue(struct svalue *s, INT32 args);
 void slow_check_stack(void);
 void cleanup_interpret(void);
+void really_clean_up_interpret(void);
 /* Prototypes end here */
 
 extern struct svalue *sp;
diff --git a/src/language.yacc b/src/language.yacc
index b287d5da042619db756a749a2ca48864e3933a68..7cb826e13aacdfbe13a844734393c0cc8c72c86b 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -181,7 +181,7 @@
 /* This is the grammar definition of Pike. */
 
 #include "global.h"
-RCSID("$Id: language.yacc,v 1.110 1999/02/20 17:43:39 grubba Exp $");
+RCSID("$Id: language.yacc,v 1.111 1999/03/02 03:13:19 hubbe Exp $");
 #ifdef HAVE_MEMORY_H
 #include <memory.h>
 #endif
@@ -298,7 +298,6 @@ int yylex(YYSTYPE *yylval);
 %type <number> modifier
 %type <number> modifier_list
 %type <number> modifiers
-%type <number> opt_string_type
 %type <number> optional_dot_dot_dot
 %type <number> optional_stars
 
@@ -827,12 +826,12 @@ type2: type2 '|' type3 { push_type(T_OR); }
   | type3 
   ;
 
-type3: F_INT_ID      { push_type(T_INT); }
+type3: F_INT_ID  opt_int_range    { push_type(T_INT); }
   | F_FLOAT_ID    { push_type(T_FLOAT); }
   | F_PROGRAM_ID  { push_type(T_PROGRAM); }
   | F_VOID_ID     { push_type(T_VOID); }
   | F_MIXED_ID    { push_type(T_MIXED); }
-  | F_STRING_ID opt_string_type { push_type(T_STRING); }
+  | F_STRING_ID { push_type(T_STRING); }
   | F_OBJECT_ID   opt_object_type { push_type(T_OBJECT); }
   | F_MAPPING_ID opt_mapping_type { push_type(T_MAPPING); }
   | F_ARRAY_ID opt_array_type { push_type(T_ARRAY); }
@@ -840,11 +839,11 @@ type3: F_INT_ID      { push_type(T_INT); }
   | F_FUNCTION_ID opt_function_type { push_type(T_FUNCTION); }
   ;
 
-opt_string_type:  /* Empty */ { $$=1; }
-  | '(' F_NUMBER ')'
+opt_int_range:  { push_type_int(MAX_INT32); push_type_int(MIN_INT32);  }
+  | '(' F_NUMBER F_DOT_DOT F_NUMBER ')'
   {
-    if ($2 != 1) yyerror("Wide strings are not supported.");
-    $$=1;
+    push_type_int($4);
+    push_type_int($2);
   }
   ;
 
@@ -1804,7 +1803,7 @@ typeof: F_TYPEOF '(' expr0 ')'
     node *tmp;
     tmp=mknode(F_ARG_LIST,$3,0);
 
-    s=describe_type( $3 && $3->type ? $3->type : mixed_type_string);
+    s=describe_type( tmp && CAR(tmp) && CAR(tmp)->type ? CAR(tmp)->type : mixed_type_string);
     $$=mkstrnode(s);
     free_string(s);
     free_node(tmp);
diff --git a/src/las.c b/src/las.c
index 61f0ff7f271b8bc6f75f3583216a76d1cecfd4b6..ed75209809b63c3c2c1a334d6f9d17f0e6dd485f 100644
--- a/src/las.c
+++ b/src/las.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: las.c,v 1.74 1999/02/01 06:13:15 hubbe Exp $");
+RCSID("$Id: las.c,v 1.75 1999/03/02 03:13:21 hubbe Exp $");
 
 #include "language.h"
 #include "interpret.h"
@@ -454,14 +454,11 @@ node *mkintnode(int nr)
 {
   node *res = mkemptynode();
   res->token = F_CONSTANT;
-  if(nr)
-    copy_shared_string(res->type, int_type_string);
-  else
-    copy_shared_string(res->type, mixed_type_string);
   res->node_info = 0; 
   res->u.sval.type = T_INT;
   res->u.sval.subtype = NUMBER_NUMBER;
   res->u.sval.u.integer = nr;
+  res->type=get_type_of_svalue( & res->u.sval);
   return res;
 }
 
diff --git a/src/main.c b/src/main.c
index 97c261519ec2e0ad91d8e7c51c577a70d03fd142..50634987bb9106c27ff37e6208b3895ea4d914ea 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: main.c,v 1.63 1999/02/20 17:44:04 grubba Exp $");
+RCSID("$Id: main.c,v 1.64 1999/03/02 03:13:22 hubbe Exp $");
 #include "fdlib.h"
 #include "backend.h"
 #include "module.h"
@@ -584,5 +584,6 @@ void low_exit_main(void)
   cleanup_shared_string_table();
 #endif
   cleanup_callbacks();
+  really_clean_up_interpret();
 }
 
diff --git a/src/modules/Gmp/mpz_glue.c b/src/modules/Gmp/mpz_glue.c
index 879edaab93756264908dda99f173277c9c8f1244..7a29c9b89f41b5dc9d0575758b36f85affce9a10 100644
--- a/src/modules/Gmp/mpz_glue.c
+++ b/src/modules/Gmp/mpz_glue.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: mpz_glue.c,v 1.39 1999/02/10 21:47:33 hubbe Exp $");
+RCSID("$Id: mpz_glue.c,v 1.40 1999/03/02 03:13:35 hubbe Exp $");
 #include "gmp_machine.h"
 
 #if defined(HAVE_GMP2_GMP_H) && defined(HAVE_LIBGMP2)
@@ -305,7 +305,7 @@ static void mpzmod_cast(INT32 args)
   switch(s->str[0])
   {
   case 'i':
-    if(!strcmp(s->str, "int"))
+    if(!strncmp(s->str, "int", 3))
     {
       free_string(s);
       mpzmod_get_int(0);
diff --git a/src/operators.c b/src/operators.c
index 9b0d17da946666a6b85177df819e64dceb14120b..8c8472bd8e2b601eed3059ad77851172df27556f 100644
--- a/src/operators.c
+++ b/src/operators.c
@@ -5,7 +5,7 @@
 \*/
 #include "global.h"
 #include <math.h>
-RCSID("$Id: operators.c,v 1.47 1999/02/10 21:46:46 hubbe Exp $");
+RCSID("$Id: operators.c,v 1.48 1999/03/02 03:13:24 hubbe Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "multiset.h"
@@ -1940,9 +1940,9 @@ void init_operators(void)
   /* function(mixed...:int) */
   ADD_EFUN2("`!=",f_ne,tFuncV(,tMix,tInt),OPT_TRY_OPTIMIZE,0,generate_comparison);
   /* function(mixed:int) */
-  ADD_EFUN2("`!",f_not,tFunc(tMix,tInt),OPT_TRY_OPTIMIZE,optimize_not,generate_not);
+  add_efun2("`!",f_not,"!function(int(0..0):mixed)&function(mixed:int(0..0))|function(int(0..0):int(1..1))",OPT_TRY_OPTIMIZE,optimize_not,generate_not);
 
-#define CMP_TYPE "!function(!object...:mixed)&function(mixed...:int)|function(int|float...:int)|function(string...:int)"
+#define CMP_TYPE "!function(!object...:mixed)&function(mixed...:int(0..1))|function(int|float...:int(0..1))|function(string...:int(0..1))"
   add_efun2("`<", f_lt,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison);
   add_efun2("`<=",f_le,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison);
   add_efun2("`>", f_gt,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison);
diff --git a/src/pike_types.c b/src/pike_types.c
index 1aa744b27cd2168f2698477b8c98069c431339ad..a6f91b7a83e276db81f7e5af063d14413e1c9af7 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.53 1999/02/28 17:07:43 grubba Exp $");
+RCSID("$Id: pike_types.c,v 1.54 1999/03/02 03:13:25 hubbe Exp $");
 #include <ctype.h>
 #include "svalue.h"
 #include "pike_types.h"
@@ -158,7 +158,6 @@ one_more_type:
     case '7':
     case '8':
     case '9':
-    case T_INT:
     case T_FLOAT:
     case T_STRING:
     case T_PROGRAM:
@@ -166,6 +165,10 @@ one_more_type:
     case T_VOID:
     case T_UNKNOWN:
       break;
+
+    case T_INT:
+      t+=sizeof(INT32)*2;
+      break;
       
     case T_OBJECT:
       t++;
@@ -214,11 +217,20 @@ void type_stack_reverse(void)
   reverse((char *)(type_stackp-a),a,1);
 }
 
-void push_type_int(unsigned INT32 i)
+void push_type_int(INT32 i)
 {
   int e;
-  for(e=sizeof(i)-1;e>=0;e--)
-    push_type(((unsigned char *)&i)[e]);
+  for(e=0;e<(int)sizeof(i);e++)
+    push_type( (i>>(e*8)) & 0xff );
+}
+
+INT32 extract_type_int(char *p)
+{
+  int e;
+  INT32 ret=0;
+  for(e=0;e<(int)sizeof(INT32);e++)
+    ret=(ret<<8) | EXTRACT_UCHAR(p+e);
+  return ret;
 }
 
 void push_unfinished_type(char *s)
@@ -230,7 +242,7 @@ void push_unfinished_type(char *s)
 
 static void push_unfinished_type_with_markers(char *s, struct pike_string **am)
 {
-  int e,c,len=type_length(s);
+  int d,e,c,len=type_length(s);
   type_stack_mark();
   for(e=0;e<len;e++)
   {
@@ -247,14 +259,16 @@ static void push_unfinished_type_with_markers(char *s, struct pike_string **am)
 	}
 	break;
 #endif
+
+      case T_INT:
+	push_type(c);
+	for(d=0;d<(int)sizeof(INT32)*2;d++)
+	  push_type(EXTRACT_UCHAR(s+ ++e));
+	break;
 	
       case T_OBJECT:
 	push_type(c);
-	push_type(EXTRACT_UCHAR(s+ ++e));
-	push_type(EXTRACT_UCHAR(s+ ++e));
-	push_type(EXTRACT_UCHAR(s+ ++e));
-	push_type(EXTRACT_UCHAR(s+ ++e));
-	push_type(EXTRACT_UCHAR(s+ ++e));
+	for(d=0;d<(int)sizeof(INT32)+1;d++) push_type(EXTRACT_UCHAR(s+ ++e));
 	break;
 	
       default:
@@ -342,7 +356,36 @@ static void internal_parse_typeA(char **_s)
   switch(buf[0])
   {
     case 'i':
-      if(!strcmp(buf,"int")) { push_type(T_INT); break; }
+      if(!strcmp(buf,"int"))
+      {
+	while(ISSPACE(**s)) ++*s;
+	if(**s=='(')
+	{
+	  INT32 min,max;
+	  ++*s;
+	  while(ISSPACE(**s)) ++*s;
+	  min=STRTOL(*s,(char **)s,0);
+	  while(ISSPACE(**s)) ++*s;
+	  if(s[0][0]=='.' && s[0][1]=='.')
+	    s[0]+=2;
+	  else
+	    error("Missing .. in integer type.\n");
+	  
+	  while(ISSPACE(**s)) ++*s;
+	  max=STRTOL(*s,(char **)s,0);
+	  while(ISSPACE(**s)) ++*s;
+
+	  if(**s != ')') error("Missing ')' in integer range.\n");
+	  ++*s;
+	  push_type_int(max);
+	  push_type_int(min);
+	}else{
+	  push_type_int(MAX_INT32);
+	  push_type_int(MIN_INT32);
+	}
+	push_type(T_INT);
+	break;
+      }
       goto bad_type;
 
     case 'f':
@@ -646,14 +689,23 @@ void stupid_describe_type(char *a,INT32 len)
 	break;
 	
       case T_ASSIGN: printf("="); break;
-      case T_INT: printf("int"); break;
+      case T_INT:
+	{
+	  INT32 min=extract_type_int(a+e+1);
+	  INT32 max=extract_type_int(a+e+1+sizeof(INT32));
+	  printf("int");
+	  if(min!=MIN_INT32 || max!=MAX_INT32)
+	    printf("(%ld..%ld)",(long)min,(long)max);
+	  e+=sizeof(INT32)*2;
+	  break;
+	}
       case T_FLOAT: printf("float"); break;
       case T_STRING: printf("string"); break;
       case T_PROGRAM: printf("program"); break;
       case T_OBJECT:
 	printf("object(%s %ld)",
 	       EXTRACT_UCHAR(a+e+1)?"clone of":"inherits",
-	       (long)EXTRACT_INT(a+e+2));
+	       (long)extract_type_int(a+e+2));
 	e+=sizeof(INT32)+1;
 	break;
       case T_FUNCTION: printf("function"); break;
@@ -701,14 +753,29 @@ char *low_describe_type(char *t)
     case T_VOID: my_strcat("void"); break;
     case T_MIXED: my_strcat("mixed"); break;
     case T_UNKNOWN: my_strcat("unknown"); break;
-    case T_INT: my_strcat("int"); break;
+    case T_INT:
+    {
+      INT32 min=extract_type_int(t);
+      INT32 max=extract_type_int(t+sizeof(INT32));
+      my_strcat("int");
+      
+      if(min!=MIN_INT32 || max!=MAX_INT32)
+      {
+	char buffer[100];
+	sprintf(buffer,"(%ld..%ld)",(long)min,(long)max);
+	my_strcat(buffer);
+      }
+      t+=sizeof(INT32)*2;
+      
+      break;
+    }
     case T_FLOAT: my_strcat("float"); break;
     case T_PROGRAM: my_strcat("program"); break;
     case T_OBJECT:
-      if(EXTRACT_INT(t+1))
+      if(extract_type_int(t+1))
       {
 	char buffer[100];
-	sprintf(buffer,"object(%s %ld)",*t?"is":"implements",(long)EXTRACT_INT(t+1));
+	sprintf(buffer,"object(%s %ld)",*t?"is":"implements",(long)extract_type_int(t+1));
 	my_strcat(buffer);
       }else{
 	my_strcat("object");
@@ -804,6 +871,7 @@ char *low_describe_type(char *t)
 
 struct pike_string *describe_type(struct pike_string *type)
 {
+  check_type_string(type);
   if(!type) return make_shared_string("mixed");
   init_buf();
   low_describe_type(type->str);
@@ -895,6 +963,19 @@ static void low_or_pike_types(char *t1, char *t2)
   {
     push_type(T_MIXED);
   }
+  else if(EXTRACT_UCHAR(t1)==T_INT && EXTRACT_UCHAR(t2)==T_INT)
+  {
+    INT32 i1,i2;
+    i1=extract_type_int(t1+1+sizeof(INT32));
+    i2=extract_type_int(t2+1+sizeof(INT32));
+    push_type_int(MAXIMUM(i1,i2));
+
+    i1=extract_type_int(t1+1);
+    i2=extract_type_int(t2+1);
+    push_type_int(MINIMUM(i1,i2));
+
+    push_type(T_INT);
+  }
   else
   {
     push_unfinished_type(t1);
@@ -920,7 +1001,7 @@ static struct pike_string *low_object_lfun_type(char *t, short lfun)
 {
   struct program *p;
   int i;
-  p=id_to_program(EXTRACT_INT(t+2));
+  p=id_to_program(extract_type_int(t+2));
   if(!p) return 0;
   i=FIND_LFUN(p, lfun);
   if(i==-1) return 0;
@@ -1125,7 +1206,7 @@ static char *low_match_types(char *a,char *b, int flags)
 
   case T_OBJECT:
 #if 0
-    if(EXTRACT_INT(a+2) || EXTRACT_INT(b+2))
+    if(extract_type_int(a+2) || extract_type_int(b+2))
     {
       fprintf(stderr,"Type match1: ");
       stupid_describe_type(a,type_length(a));
@@ -1135,7 +1216,7 @@ static char *low_match_types(char *a,char *b, int flags)
 #endif
 
     /* object(* 0) matches any object */
-    if(!EXTRACT_INT(a+2) || !EXTRACT_INT(b+2)) break;
+    if(!extract_type_int(a+2) || !extract_type_int(b+2)) break;
 
     /* object(x *) =? object(x *) */
     if(EXTRACT_UCHAR(a+1) == EXTRACT_UCHAR(b+1))
@@ -1144,7 +1225,7 @@ static char *low_match_types(char *a,char *b, int flags)
       if(EXTRACT_UCHAR(a+1))
       {
 	/* object(1 x) =? object(1 x) */
-	if(EXTRACT_INT(a+2) != EXTRACT_INT(b+2)) return 0;
+	if(extract_type_int(a+2) != extract_type_int(b+2)) return 0;
       }else{
 	/* object(0 *) =? object(0 *) */
 	break;
@@ -1153,8 +1234,8 @@ static char *low_match_types(char *a,char *b, int flags)
 
     {
       struct program *ap,*bp;
-      ap=id_to_program(EXTRACT_INT(a+2));
-      bp=id_to_program(EXTRACT_INT(b+2));
+      ap=id_to_program(extract_type_int(a+2));
+      bp=id_to_program(extract_type_int(b+2));
 
       if(!ap || !bp) break;
 
@@ -1170,11 +1251,23 @@ static char *low_match_types(char *a,char *b, int flags)
     
     break;
 
+  case T_INT:
+  {
+    INT32 amin=extract_type_int(a+1);
+    INT32 amax=extract_type_int(a+1+sizeof(INT32));
+
+    INT32 bmin=extract_type_int(b+1);
+    INT32 bmax=extract_type_int(b+1+sizeof(INT32));
+    
+    if(amin > bmax || bmin > amax) return 0;
+    break;
+  }
+    
+
   case T_MULTISET:
   case T_ARRAY:
     if(!low_match_types(++a,++b,flags)) return 0;
 
-  case T_INT:
   case T_FLOAT:
   case T_STRING:
   case T_PROGRAM:
@@ -1290,7 +1383,7 @@ static struct pike_string *debug_low_index_type(char *t, node *n)
   {
   case T_OBJECT:
   {
-    struct program *p=id_to_program(EXTRACT_INT(t+1));
+    struct program *p=id_to_program(extract_type_int(t+1));
     if(p && n)
     {
       if(n->token == F_ARROW)
@@ -1423,7 +1516,7 @@ static int low_check_indexing(char *type, char *index_type, node *n)
 
   case T_OBJECT:
   {
-    struct program *p=id_to_program(EXTRACT_INT(type+1));
+    struct program *p=id_to_program(extract_type_int(type+1));
     if(p)
     {
       if(n->token == F_ARROW)
@@ -1442,7 +1535,12 @@ static int low_check_indexing(char *type, char *index_type, node *n)
 
   case T_MULTISET:
   case T_MAPPING:
+#if 0
     return !!low_match_types(type,index_type,0);
+#else
+    /* FIXME: Compiler warning here!!!! */
+    return 1;
+#endif
 
   case T_PROGRAM:
     /* FIXME: Should check that the index is a string. */
@@ -1602,7 +1700,12 @@ struct pike_string *get_type_of_svalue(struct svalue *s)
   case T_INT:
     if(s->u.integer)
     {
-      ret=int_type_string;
+      type_stack_mark();
+      /* Fixme, check that the integer is in range of MIN_INT32 .. MAX_INT32!*/
+      push_type_int(s->u.integer);
+      push_type_int(s->u.integer);
+      push_type(T_INT);
+      return pop_unfinished_type();
     }else{
       ret=mixed_type_string;
     }
@@ -1720,7 +1823,7 @@ int type_may_overload(char *type, int lfun)
       
     case T_OBJECT:
     {
-      struct program *p=id_to_program(EXTRACT_INT(type+1));
+      struct program *p=id_to_program(extract_type_int(type+1));
       if(!p) return 1;
       return FIND_LFUN(p, lfun)!=-1;
     }
diff --git a/src/pike_types.h b/src/pike_types.h
index 60827c83c43beb2f838016c92efd0815ff848886..6bab1535a078fcf981e4e34cb186da271ddc3ec5 100644
--- a/src/pike_types.h
+++ b/src/pike_types.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: pike_types.h,v 1.17 1999/02/10 21:46:49 hubbe Exp $
+ * $Id: pike_types.h,v 1.18 1999/03/02 03:13:27 hubbe Exp $
  */
 #ifndef PIKE_TYPES_H
 #define PIKE_TYPES_H
@@ -104,7 +104,8 @@ INT32 pop_stack_mark(void);
 void pop_type_stack(void);
 void type_stack_pop_to_mark(void);
 void type_stack_reverse(void);
-void push_type_int(unsigned INT32 i);
+void push_type_int(INT32 i);
+INT32 extract_type_int(char *p);
 void push_unfinished_type(char *s);
 void push_finished_type(struct pike_string *type);
 void push_finished_type_backwards(struct pike_string *type);
diff --git a/src/stralloc.h b/src/stralloc.h
index 483550f9e692d53da2bbe8fe4b342b64df6d0f70..8f3eec2b61114db779b8d6ab6131592d7ba55aff 100644
--- a/src/stralloc.h
+++ b/src/stralloc.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: stralloc.h,v 1.32 1999/03/01 05:32:37 hubbe Exp $
+ * $Id: stralloc.h,v 1.33 1999/03/02 03:13:28 hubbe Exp $
  */
 #ifndef STRALLOC_H
 #define STRALLOC_H
@@ -38,7 +38,7 @@ struct string_builder
 struct pike_string *debug_findstring(const struct pike_string *foo);
 #endif
 
-#define free_string(s) do{ struct pike_string *_=(s); if(--_->refs<=0) really_free_string(_); }while(0)
+#define free_string(s) do{ struct pike_string *_=(s); debug_malloc_touch(_); if(--_->refs<=0) really_free_string(_); }while(0)
 
 #define my_hash_string(X) ((unsigned long)(X))
 #define my_order_strcmp(X,Y) ((char *)(X)-(char *)(Y))
diff --git a/src/svalue.h b/src/svalue.h
index 0774c3d35d29cc1864af2252b9708f50f719c9dd..6f37172ac90f0c8d4590379b305c2dc2ac267cd1 100644
--- a/src/svalue.h
+++ b/src/svalue.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: svalue.h,v 1.21 1999/02/10 21:46:56 hubbe Exp $
+ * $Id: svalue.h,v 1.22 1999/03/02 03:13:30 hubbe Exp $
  */
 #ifndef SVALUE_H
 #define SVALUE_H
@@ -119,7 +119,7 @@ struct svalue
 #define tString "\006"
 #define tFlt "\007"
 #define tFloat "\007"
-#define tInt "\010"
+#define tInt "\010\200\000\000\000\177\377\377\377"
 
 #define tVoid "\020"
 #define tVar(X) #X
diff --git a/src/testsuite.in b/src/testsuite.in
index 3f65dfe247d54ee8ee9ab43a6d0bd6ee156818a0..4c6f4c177d6562a3edd56c7491da54865a4f48b0 100644
--- a/src/testsuite.in
+++ b/src/testsuite.in
@@ -1,4 +1,4 @@
-stest_true([["$Id: testsuite.in,v 1.150 1999/03/01 21:30:17 grubba Exp $"]])
+stest_true([["$Id: testsuite.in,v 1.151 1999/03/02 03:13:31 hubbe Exp $"]])
 cond([[all_constants()->_verify_internals]],
 [[
   test_do(_verify_internals())
@@ -901,16 +901,16 @@ cond([[all_constants()->kill && (cpp("__NT__")/"\n")[1]=="__NT__" ]],
 ]])
 
 // typeof
-test_eq(typeof(1),"int")
+test_eq(typeof(1),"int(1..1)")
 test_eq(typeof(""),"string")
 test_eq(typeof(""[0]),"int")
 test_eq(typeof(0.0),"float")
 test_eq(typeof(all_constants()["all_constants"]),"mixed")
 
 // _typeof
-test_eq(_typeof(1),"int")
+test_eq(_typeof(1),"int(1..1)")
 test_eq(_typeof(""),"string")
-test_eq(_typeof("x"[0]),"int")
+test_eq(_typeof("x"[0]),"int(120..120)")
 test_eq(_typeof(0.0),"float")
 test_eq(_typeof(this_object)-" ","function(:object)")
 
@@ -2891,7 +2891,7 @@ void test_dir(string dir)
     {
       test_dir(file);
     }else if(stat[1]>=0){
-      if(glob(file,"*.pike") || glob(file,"*.pmod"))
+      if(glob("*.pike",file) || glob("*.pmod",file))
         (program)file;
     }
   }