From fd7f5884d13bb2cf7d0eeea20c6419873c46fa59 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Sat, 3 Dec 2016 13:00:27 +0100
Subject: [PATCH] Compiler: Fixed the types for ::_indices() et al.

The types now match the documentation.
---
 src/las.c    | 11 +++++++----
 src/object.c | 17 ++++++++++++++++-
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/src/las.c b/src/las.c
index 324aa8a6ef..68cf144145 100644
--- a/src/las.c
+++ b/src/las.c
@@ -3918,18 +3918,21 @@ void fix_type_field(node *n)
   case F_MAGIC_SET_INDEX:
     /* FIXME: Could have a stricter type for ::`->=(). */
     /* FIXME: */
-    MAKE_CONSTANT_TYPE(n->type, tFunc(tMix tSetvar(0,tMix) tOr(tVoid,tInt), tVar(0)));
+    MAKE_CONSTANT_TYPE(n->type, tFunc(tStr tMix tOr(tVoid,tInt), tVoid));
     break;
   case F_MAGIC_INDICES:
-    MAKE_CONSTANT_TYPE(n->type, tFunc(tOr(tVoid,tInt), tArr(tString)));
+    MAKE_CONSTANT_TYPE(n->type, tFunc(tOr3(tVoid,tObj,tDeprecated(tInt))
+				      tOr(tVoid,tInt), tArr(tStr)));
     break;
   case F_MAGIC_VALUES:
     /* FIXME: Could have a stricter type for ::_values. */
-    MAKE_CONSTANT_TYPE(n->type, tFunc(tOr(tVoid,tInt), tArray));
+    MAKE_CONSTANT_TYPE(n->type, tFunc(tOr3(tVoid,tObj,tDeprecated(tInt))
+				      tOr(tVoid,tInt), tArray));
     break;
   case F_MAGIC_TYPES:
     /* FIXME: Could have a stricter type for ::_types. */
-    MAKE_CONSTANT_TYPE(n->type, tFunc(tOr(tVoid,tInt), tArr(tType(tMix))));
+    MAKE_CONSTANT_TYPE(n->type, tFunc(tOr3(tVoid,tObj,tDeprecated(tInt))
+				      tOr(tVoid,tInt), tArr(tType(tMix))));
     break;
 
   case F_CATCH:
diff --git a/src/object.c b/src/object.c
index 9e61cfb39a..d9017aeda6 100644
--- a/src/object.c
+++ b/src/object.c
@@ -3266,6 +3266,9 @@ void init_object(void)
   offset=ADD_STORAGE(struct magic_index_struct);
   MAP_VARIABLE("__obj", tObj, ID_PROTECTED,
 	       offset + OFFSETOF(magic_index_struct, o), T_OBJECT);
+  /* NB: The type for this function is duplicated in las.c for
+   *     opcode F_MAGIC_INDEX.
+   */
   ADD_FUNCTION("`()", f_magic_index,
 	       tFunc(tStr tOr3(tVoid,tObj,tDeprecated(tInt)) tOr(tVoid,tInt),
 		     tMix), ID_PROTECTED);
@@ -3276,6 +3279,9 @@ void init_object(void)
   offset=ADD_STORAGE(struct magic_index_struct);
   MAP_VARIABLE("__obj", tObj, ID_PROTECTED,
 	       offset + OFFSETOF(magic_index_struct, o), T_OBJECT);
+  /* NB: The type for this function is duplicated in las.c for
+   *     opcode F_MAGIC_SET_INDEX.
+   */
   ADD_FUNCTION("`()", f_magic_set_index,
 	       tFunc(tStr tMix tOr3(tVoid,tObj,tDeprecated(tInt))
 		     tOr(tVoid,tInt), tVoid), ID_PROTECTED);
@@ -3286,6 +3292,9 @@ void init_object(void)
   offset=ADD_STORAGE(struct magic_index_struct);
   MAP_VARIABLE("__obj", tObj, ID_PROTECTED,
 	       offset + OFFSETOF(magic_index_struct, o), T_OBJECT);
+  /* NB: The type for this function is duplicated in las.c for
+   *     opcode F_MAGIC_INDICES.
+   */
   ADD_FUNCTION("`()", f_magic_indices,
 	       tFunc(tOr3(tVoid,tObj,tDeprecated(tInt)) tOr(tVoid,tInt),
 		     tArr(tStr)), ID_PROTECTED);
@@ -3296,6 +3305,9 @@ void init_object(void)
   offset=ADD_STORAGE(struct magic_index_struct);
   MAP_VARIABLE("__obj", tObj, ID_PROTECTED,
 	       offset + OFFSETOF(magic_index_struct, o), T_OBJECT);
+  /* NB: The type for this function is duplicated in las.c for
+   *     opcode F_MAGIC_VALUES.
+   */
   ADD_FUNCTION("`()", f_magic_values,
 	       tFunc(tOr3(tVoid,tObj,tDeprecated(tInt)) tOr(tVoid,tInt),
 		     tArray), ID_PROTECTED);
@@ -3306,9 +3318,12 @@ void init_object(void)
   offset=ADD_STORAGE(struct magic_index_struct);
   MAP_VARIABLE("__obj", tObj, ID_PROTECTED,
 	       offset + OFFSETOF(magic_index_struct, o), T_OBJECT);
+  /* NB: The type for this function is duplicated in las.c for
+   *     opcode F_MAGIC_TYPES.
+   */
   ADD_FUNCTION("`()", f_magic_types,
 	       tFunc(tOr3(tVoid,tObj,tDeprecated(tInt)) tOr(tVoid,tInt),
-		     tArray), ID_PROTECTED);
+		     tArr(tType(tMix))), ID_PROTECTED);
   magic_types_program=end_program();
 
   exit_compiler();
-- 
GitLab