diff --git a/src/operators.c b/src/operators.c
index abd2e30dfbd6a29785f85e9b089ae1b997afa64d..cb8f8f8737f879c16a05f525a26111bea230143e 100644
--- a/src/operators.c
+++ b/src/operators.c
@@ -6,7 +6,7 @@
 /**/
 #include "global.h"
 #include <math.h>
-RCSID("$Id: operators.c,v 1.57 1999/08/16 18:35:22 hubbe Exp $");
+RCSID("$Id: operators.c,v 1.58 1999/08/16 20:43:07 mast Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "multiset.h"
@@ -1920,6 +1920,48 @@ void f_arrow(INT32 args)
   }
 }
 
+void f_index_assign(INT32 args)
+{
+  switch (args) {
+    case 0:
+    case 1:
+    case 2:
+      PIKE_ERROR("`[]=", "Too few arguments.\n", sp, args);
+      break;
+    case 3:
+      switch (sp[-3].type) {
+	case T_STRING: {
+	  INT32 i, c;
+	  get_all_args ("`[]=", 2, "%i%i", &i, &c);
+	  modify_shared_string (sp[-3].u.string, i, c);
+	  break;
+	}
+	case T_OBJECT:
+	  object_set_index (sp[-3].u.object, sp-2, sp-1);
+	  break;
+	case T_ARRAY:
+	  simple_set_index (sp[-3].u.array, sp-2, sp-1);
+	  break;
+	case T_MAPPING:
+	  mapping_insert (sp[-3].u.mapping, sp-2, sp-1);
+	  break;
+	case T_MULTISET:
+	  if (svalue_is_true (sp-1))
+	    multiset_insert (sp[-3].u.multiset, sp-2);
+	  else
+	    multiset_delete (sp[-3].u.multiset, sp-2);
+	  break;
+	default:
+	  SIMPLE_BAD_ARG_ERROR ("`[]=", 1, "string|object|array|mapping|multiset");
+      }
+      assign_svalue (sp-3, sp-1);
+      pop_n_elems (args-1);
+      break;
+    default:
+      PIKE_ERROR("`[]=", "Too many arguments.\n", sp, args);
+  }
+}
+
 void f_sizeof(INT32 args)
 {
   INT32 tmp;
@@ -2021,6 +2063,14 @@ void init_operators(void)
   /* function(array(object|mapping|multiset|array),string:array(mixed))|function(object|mapping|multiset|program,string:mixed) */
   ADD_EFUN2("`->",f_arrow,tOr(tFunc(tArr(tOr4(tObj,tMapping,tMultiset,tArray)) tStr,tArr(tMix)),tFunc(tOr4(tObj,tMapping,tMultiset,tPrg) tStr,tMix)),OPT_TRY_OPTIMIZE,0,0);
 
+  ADD_EFUN("`[]=", f_index_assign,
+	   tOr5(tFunc(tStr tInt tInt, tInt),
+		tFunc(tObj tStr tSetvar(0,tMix), tVar(0)),
+		tFunc(tArr(tSetvar(1,tMix)) tInt tVar(1), tVar(1)),
+		tFunc(tMap(tSetvar(2,tMix), tSetvar(3,tMix)) tVar(2) tVar(3), tVar(3)),
+		tFunc(tSet(tSetvar(4,tMix)) tVar(4) tSetvar(5,tMix), tVar(5))),
+	   0); /* OPT_ASSIGNMENT|OPT_TRY_OPTIMIZE); ? */
+
   /* function(mixed...:int) */
   ADD_EFUN2("`==",f_eq,tFuncV(tNone,tMix,tInt),OPT_TRY_OPTIMIZE,optimize_eq,generate_comparison);
   /* function(mixed...:int) */