diff --git a/.gitattributes b/.gitattributes
index 8c1f83a12c22d31aac2c891d580959a1495bb722..720708a95faebafc9f28d7844c1f95083bafb56a 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -85,6 +85,7 @@ testfont binary
 /lib/modules/MIME.pmod foreign_ident
 /lib/modules/Parser.pmod/XML.pmod/Tree.pmod foreign_ident
 /lib/modules/Parser.pmod/module.pmod foreign_ident
+/lib/modules/Pike.pmod foreign_ident
 /lib/modules/Protocols.pmod/DNS.pmod foreign_ident
 /lib/modules/Protocols.pmod/IMAP.pmod/imap_server.pike foreign_ident
 /lib/modules/Protocols.pmod/IMAP.pmod/requests.pmod foreign_ident
@@ -167,6 +168,7 @@ testfont binary
 /src/backend.h foreign_ident
 /src/block_alloc.h foreign_ident
 /src/build_modlist_h foreign_ident
+/src/builtin.cmod foreign_ident
 /src/builtin_functions.c foreign_ident
 /src/builtin_functions.h foreign_ident
 /src/builtin_functions_t.c foreign_ident
diff --git a/lib/modules/Pike.pmod b/lib/modules/Pike.pmod
new file mode 100644
index 0000000000000000000000000000000000000000..fa9f9a8f041bb7ddb0f6fd805e9a4fd5bcee9218
--- /dev/null
+++ b/lib/modules/Pike.pmod
@@ -0,0 +1,9 @@
+// Pike core things that don't belong anywhere else.
+//
+// $Id: Pike.pmod,v 1.1 2001/06/05 00:03:56 mast Exp $
+
+constant WEAK_INDICES = __builtin.PIKE_WEAK_INDICES;
+constant WEAK_VALUES = __builtin.PIKE_WEAK_VALUES;
+constant WEAK = WEAK_INDICES|WEAK_VALUES;
+//! Flags for use together with @[set_weak_flag] and @[get_weak_flag].
+//! See @[set_weak_flag] for details.
diff --git a/src/builtin.cmod b/src/builtin.cmod
index cb9d00e28ce91291d8b69a77af40ad88adf9fc32..ba23cc5239eb49b4636fa05e0d6e91f964be2677 100644
--- a/src/builtin.cmod
+++ b/src/builtin.cmod
@@ -1,4 +1,6 @@
-/* -*- c -*- */
+/* -*- c -*-
+ * $Id: builtin.cmod,v 1.30 2001/06/05 00:03:57 mast Exp $
+ */
 
 #include "global.h"
 #include "interpret.h"
@@ -23,6 +25,7 @@
 #include "bignum.h"
 #include "main.h"
 #include "operators.h"
+#include "builtin_functions.h"
 
 /*! @decl array column(array data, mixed index)
  *!
@@ -394,24 +397,26 @@ PIKEFUN mixed m_delete(object|mapping map, mixed index)
   }
 }
 
-/*! @decl int(0..1) get_weak_flag(array|mapping|multiset m)
+/*! @decl int get_weak_flag(array|mapping|multiset m)
  *!
- *! Returns 1 if the weak flag has been set for @[m].
+ *! Returns the weak flag settings for @[m]. It's a combination of
+ *! @[Pike.WEAK_INDICES] and @[Pike.WEAK_VALUES].
  */
-PIKEFUN int(0 .. 1) get_weak_flag(array|mapping|multiset m)
+PIKEFUN int get_weak_flag(array|mapping|multiset m)
   efun;
   optflags OPT_EXTERNAL_DEPEND;
 {
   int flag = 0;
   switch (m->type) {
     case T_ARRAY:
-      flag = !!(m->u.array->flags & ARRAY_WEAK_FLAG);
+      flag = (m->u.array->flags & ARRAY_WEAK_FLAG) ? PIKE_WEAK_VALUES : 0;
       break;
     case T_MAPPING:
-      flag = !!(mapping_get_flags(m->u.mapping) & MAPPING_FLAG_WEAK);
+      flag = mapping_get_flags(m->u.mapping) & MAPPING_WEAK;
       break;
     case T_MULTISET:
-      flag = !!(m->u.multiset->ind->flags & (ARRAY_WEAK_FLAG|ARRAY_WEAK_SHRINK));
+      flag = (m->u.multiset->ind->flags & (ARRAY_WEAK_FLAG|ARRAY_WEAK_SHRINK)) ?
+	PIKE_WEAK_INDICES : 0;
       break;
     default:
       SIMPLE_BAD_ARG_ERROR("get_weak_flag",1,"array|mapping|multiset");
diff --git a/src/builtin_functions.h b/src/builtin_functions.h
index 05bf7f857732ad5070cb1bc7fd16b5e44cb7f987..3cbd72f90760e18d36b7d3ff3f2d1c9aadc793ae 100644
--- a/src/builtin_functions.h
+++ b/src/builtin_functions.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: builtin_functions.h,v 1.16 2001/04/30 00:53:11 mast Exp $
+ * $Id: builtin_functions.h,v 1.17 2001/06/05 00:03:57 mast Exp $
  */
 #ifndef BUILTIN_EFUNS_H
 #define BUILTIN_EFUNS_H
@@ -14,6 +14,12 @@
 
 #include "callback.h"
 
+/* Weak flags for arrays, multisets and mappings. 1 is avoided for
+ * compatibility reasons. */
+#define PIKE_WEAK_INDICES 2
+#define PIKE_WEAK_VALUES 4
+#define PIKE_WEAK_BOTH 6
+
 /* Prototypes begin here */
 PMOD_EXPORT void debug_f_aggregate(INT32 args);
 #ifdef DEBUG_MALLOC
diff --git a/src/testsuite.in b/src/testsuite.in
index 5f32e3d14d7ac3406ea76f9c80cb50b9378b9d7f..edcfa091a831c92e44a2814218897ce2a917d5d3 100644
--- a/src/testsuite.in
+++ b/src/testsuite.in
@@ -1,4 +1,4 @@
-test_true([["$Id: testsuite.in,v 1.419 2001/05/31 22:16:37 grubba Exp $"]]);
+test_true([["$Id: testsuite.in,v 1.420 2001/06/05 00:03:57 mast Exp $"]]);
 
 cond([[all_constants()->_verify_internals]],
 [[
@@ -2517,7 +2517,21 @@ ifefun(gc,
     gc();
     return !sizeof (m);
   ]])
-    test_true([[
+  test_true([[
+    object o = class{}();
+    mapping m = ([class{}(): o, o: class{}()]);
+    set_weak_flag (m, Pike.WEAK_INDICES);
+    gc();
+    return sizeof (m);
+  ]])
+  test_true([[
+    object o = class{}();
+    mapping m = ([class{}(): o, o: class{}()]);
+    set_weak_flag (m, Pike.WEAK_VALUES);
+    gc();
+    return sizeof (m);
+  ]])
+  test_true([[
     object o = class{}();
     multiset m = (<o>);
     set_weak_flag (m, 1);
@@ -3663,6 +3677,114 @@ ifefun(gc,
              o=o2=0;
              gc();
           ]])
+
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag (([o: "x"]), Pike.WEAK_INDICES);
+    gc();
+    return sizeof (m);
+  ]], 1)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag (([o: "x"]), Pike.WEAK_VALUES);
+    gc();
+    return sizeof (m);
+  ]], 1)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag ((["x": o]), Pike.WEAK_INDICES);
+    gc();
+    return sizeof (m);
+  ]], 1)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag ((["x": o]), Pike.WEAK_VALUES);
+    gc();
+    return sizeof (m);
+  ]], 1)
+  test_any([[
+    mapping m = set_weak_flag (([class{}(): "x"]), Pike.WEAK_INDICES);
+    gc();
+    return sizeof (m);
+  ]], 0)
+  test_any([[
+    mapping m = set_weak_flag (([class{}(): "x"]), Pike.WEAK_VALUES);
+    gc();
+    return sizeof (m);
+  ]], 1)
+  test_any([[
+    mapping m = set_weak_flag ((["x": class{}()]), Pike.WEAK_INDICES);
+    gc();
+    return sizeof (m);
+  ]], 1)
+  test_any([[
+    mapping m = set_weak_flag ((["x": class{}()]), Pike.WEAK_VALUES);
+    gc();
+    return sizeof (m);
+  ]], 0)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag (([o: o]), Pike.WEAK_INDICES);
+    o = 0;
+    gc();
+    return sizeof (m);
+  ]], 1)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag (([o: o]), Pike.WEAK_VALUES);
+    o = 0;
+    gc();
+    return sizeof (m);
+  ]], 1)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag (([o: o]), Pike.WEAK);
+    o = 0;
+    gc();
+    return sizeof (m);
+  ]], 0)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag (([o: "x"]), Pike.WEAK_INDICES);
+    destruct (o);
+    gc();
+    return sizeof (m);
+  ]], 0)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag (([o: "x"]), Pike.WEAK_VALUES);
+    destruct (o);
+    gc();
+    return sizeof (m);
+  ]], 0)
+  test_any([[
+    object o = class{}();
+    mapping m = ([o: "x"]);
+    destruct (o);
+    gc();
+    return sizeof (m);
+  ]], 0)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag ((["x": o]), Pike.WEAK_INDICES);
+    destruct (o);
+    gc();
+    return sizeof (m);
+  ]], 1)
+  test_any([[
+    object o = class{}();
+    mapping m = set_weak_flag ((["x": o]), Pike.WEAK_VALUES);
+    destruct (o);
+    gc();
+    return sizeof (m);
+  ]], 0)
+  test_any([[
+    object o = class{}();
+    mapping m = (["x": o]);
+    destruct (o);
+    gc();
+    return sizeof (m);
+  ]], 1)
 ]])
 
 cond([[ sizeof( cpp("__AUTO_BIGNUM__")/"__AUTO_BIGNUM__" ) == 1 ]],