diff --git a/src/.cvsignore b/src/.cvsignore
index 052a12327b9cb318aae4d16a08687e8bbad361f3..f693a5edb4eb8e42a4ac2f92136df5455fddbd59 100644
--- a/src/.cvsignore
+++ b/src/.cvsignore
@@ -4,6 +4,7 @@ config.h.in
 config.log
 config.status
 configure
+conftest.c
 conftest.h
 dependencies
 language.c
diff --git a/src/.gitignore b/src/.gitignore
index 48b552bef05757a3756b88d9e6c299ae669bcced..51c6f0f67c8e2dcd4a76d4f2aeeaf38726821332 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -4,6 +4,7 @@
 /config.log
 /config.status
 /configure
+/conftest.c
 /conftest.h
 /dependencies
 /language.c
diff --git a/src/ChangeLog b/src/ChangeLog
index 802458d4c5c882b3bcdde865ece4a9abb0c28744..fab8219ccf2708eb5d1a02013ee763038f5aab66 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+Tue Jul  8 17:51:06 1997  Fredrik Hubinette  <hubbe@cytocin.hubbe.net>
+
+	* stralloc.c: fixed a bug in replace() (if 'from' is an empty string)
+	* testsuite.in: added a test for the above
+	* configure.in: added more debug to dynamic module tests
+
 Fri Jun 27 19:30:52 1997  Henrik Grubbstr�m  <grubba@infovav.se>
 
 	* modules/Sql/sql.pike (create): The host argument can now use the
diff --git a/src/configure.in b/src/configure.in
index c189b15cea2c46f2d0f1e24d1f92a5a96604a3bb..f2cb9eb11e3a6c2d86ca5f87d8a2f6e28a74eddf 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -1,4 +1,4 @@
-AC_REVISION("$Id: configure.in,v 1.101 1997/06/12 14:59:05 grubba Exp $")
+AC_REVISION("$Id: configure.in,v 1.102 1997/07/09 00:57:04 hubbe Exp $")
 AC_INIT(interpret.c)
 AC_CONFIG_HEADER(machine.h)
 
@@ -1507,7 +1507,13 @@ AC_MSG_RESULT($LINKFORSHARED)
 #############################################################################
 
 cat >conftest.c <<EOF
-void testfunc(void) { testfunc2(); exit(1); }
+#include <stdio.h>
+void testfunc(void) {
+  fprintf(stderr,"Calling testfunc2\n");
+  testfunc2();
+  fprintf(stderr,"testfunc2 returned!\n");
+  exit(1);
+}
 EOF
 
 AC_MSG_CHECKING(if dynamic loading works)
diff --git a/src/dynamic_load.c b/src/dynamic_load.c
index 93d4896b9e1038ac4f12bcfc0ee71ffe3e680df4..e9d8478ccbbf0940cffe26e6482d646f1cec3a00 100644
--- a/src/dynamic_load.c
+++ b/src/dynamic_load.c
@@ -183,7 +183,9 @@ int main()
     fprintf(stderr,"Failed to find function testfunc: %s\n",dlerror());
     exit(1);
   }
+  fprintf(stderr,"Calling testfunc\n");
   ((void (*)(void))fun)();
+  fprintf(stderr,"testfunc returned!\n");
   exit(1);
 }
 #endif
diff --git a/src/gc.c b/src/gc.c
index 6b33fc6d70450f4edfbd49277d4e0f1ca6aa34ee..c857796a234b32a2919d93bf845b32f568fc29d9 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -257,7 +257,8 @@ void do_gc()
   hash=(struct marker **)xalloc(sizeof(struct marker **)*hashsize);
   MEMSET((char *)hash,0,sizeof(struct marker **)*hashsize);
   markers_left_in_chunk=0;
-  
+
+  /* First we count internal references */
   gc_check_all_arrays();
   gc_check_all_multisets();
   gc_check_all_mappings();
@@ -265,6 +266,7 @@ void do_gc()
   gc_check_all_objects();
   call_callback(& gc_callbacks, (void *)0);
 
+  /* Next we mark anything with external references */
   gc_mark_all_arrays();
   gc_mark_all_multisets();
   gc_mark_all_mappings();
@@ -274,6 +276,7 @@ void do_gc()
   if(d_flag)
     gc_mark_all_strings();
 
+  /* Now we free the unused stuff */
   gc_free_all_unreferenced_arrays();
   gc_free_all_unreferenced_multisets();
   gc_free_all_unreferenced_mappings();
diff --git a/src/stralloc.c b/src/stralloc.c
index ba03109b9e207f8f07722e035458ef0a48b6af6f..4e71ee19dd92f9d3b0a6ba5fd957d6ebc4ac520e 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -510,6 +510,27 @@ struct pike_string *string_replace(struct pike_string *str,
   char *s,*tmp,*r,*end;
   struct mem_searcher searcher;
 
+  if(!str->len)
+  {
+    str->refs++;
+    return str;
+  }
+
+  if(!del->len)
+  {
+    int e;
+    ret=begin_shared_string(str->len + to->len * (str->len -1));
+    s=ret->str;
+    *(s++)=str->str[0];
+    for(e=1;e<str->len;e++)
+    {
+      MEMCPY(s,to->str,to->len);
+      s+=to->len;
+      *(s++)=str->str[e];
+    }
+    return end_shared_string(ret);
+  }
+
   s=str->str;
   end=s+str->len;
 
diff --git a/src/testsuite.in b/src/testsuite.in
index b5c18f0fa2bff38847735250f5ae28fed68e0365..94f40bda808e3c646c72c95df13818a1640bd407 100644
--- a/src/testsuite.in
+++ b/src/testsuite.in
@@ -1,4 +1,4 @@
-test_true([["$Id: testsuite.in,v 1.44 1997/06/12 23:08:10 grubba Exp $"]])
+test_true([["$Id: testsuite.in,v 1.45 1997/07/09 00:57:07 hubbe Exp $"]])
 test_eq(1e1,10.0)
 test_eq(1E1,10.0)
 test_eq(1e+1,10.0)
@@ -20,6 +20,7 @@ test_compile_error([[int a() { switch(random(2)) { case 3: if(random(2)) { case
 test_true(encode_value(0))
 test_true(encode_value(0)[0]=='\266')
 define(test_encode, [[ test_equal($1, decode_value(encode_value($1))) ]])
+test_eq(replace("foobar","","X"),"fXoXoXbXaXr")
 test_encode(0)
 test_encode("")
 test_encode(0.0)