]> granicus.if.org Git - nethack/commitdiff
Instance variable work.
authorBart House <bart@barthouse.com>
Fri, 23 Nov 2018 13:13:06 +0000 (05:13 -0800)
committerBart House <bart@barthouse.com>
Fri, 23 Nov 2018 23:22:53 +0000 (15:22 -0800)
include/decl.h
src/decl.c
src/save.c

index e0597efe34882351ec9767544f59da4fb803e180..e8a8dfab5a4426c553cc03b6a91a0c7824f29f5c 100644 (file)
@@ -460,6 +460,11 @@ struct instance_variables {
     boolean m_using; /* kludge to use mondided instead of killed */
     /* pickup.c */
     int oldcap; /* last encumberance */
+    /* save.c */
+    boolean havestate;
+    unsigned ustuck_id; /* need to preserve during save */
+    unsigned usteed_id; /* need to preserve during save */
+
     /* trap.c */
     int force_mintrap; /* mintrap() should take a flags argument, but for time
                           being we use this */
index a6c65196584689e3758ef1f41f8a9d5bb83290f1..c517edaa50010ab72ab4bab50ccdae4c8e658469 100644 (file)
@@ -344,6 +344,10 @@ const struct instance_variables iv_init = {
     FALSE, /* m_using */
     /* pickup.c */
     0,  /* oldcap */
+    /* save.c */
+    TRUE, /* havestate*/
+    0, /* ustuck_id */
+    0, /* usteed_id */
     /* trap.c */
     0, /* force_mintrap */
     /* u_init.c */
@@ -370,6 +374,7 @@ instance_variable_init()
     iv = iv_init;
 
     nhassert(iv_init.magic == IVMAGIC);
+    nhassert(iv.havestate == TRUE);
 
     sfcap = default_sfinfo;
     sfrestinfo = default_sfinfo;
index bca03c49ec86d0ca9cb7c52ad29bb1312ddbb340..de2c99b744962ed77db20791045a041560e461fb 100644 (file)
@@ -71,9 +71,6 @@ static struct save_procs {
 #define HUP
 #endif
 
-/* need to preserve these during save to avoid accessing freed memory */
-static unsigned ustuck_id = 0, usteed_id = 0;
-
 int
 dosave()
 {
@@ -213,8 +210,8 @@ dosave0()
     store_version(fd);
     store_savefileinfo(fd);
     store_plname_in_file(fd);
-    ustuck_id = (u.ustuck ? u.ustuck->m_id : 0);
-    usteed_id = (u.usteed ? u.usteed->m_id : 0);
+    iv.ustuck_id = (u.ustuck ? u.ustuck->m_id : 0);
+    iv.usteed_id = (u.usteed ? u.usteed->m_id : 0);
     savelev(fd, ledger_no(&u.uz), WRITE_SAVE | FREE_SAVE);
     savegamestate(fd, WRITE_SAVE | FREE_SAVE);
 
@@ -336,10 +333,10 @@ register int fd, mode;
            sizeof(struct spell) * (MAXSPELL + 1));
     save_artifacts(fd);
     save_oracles(fd, mode);
-    if (ustuck_id)
-        bwrite(fd, (genericptr_t) &ustuck_id, sizeof ustuck_id);
-    if (usteed_id)
-        bwrite(fd, (genericptr_t) &usteed_id, sizeof usteed_id);
+    if (iv.ustuck_id)
+        bwrite(fd, (genericptr_t) &iv.ustuck_id, sizeof iv.ustuck_id);
+    if (iv.usteed_id)
+        bwrite(fd, (genericptr_t) &iv.usteed_id, sizeof iv.usteed_id);
     bwrite(fd, (genericptr_t) pl_character, sizeof pl_character);
     bwrite(fd, (genericptr_t) pl_fruit, sizeof pl_fruit);
     savefruitchn(fd, mode);
@@ -369,7 +366,6 @@ void
 savestateinlock()
 {
     int fd, hpid;
-    static boolean havestate = TRUE;
     char whynot[BUFSZ];
 
     /* When checkpointing is on, the full state needs to be written
@@ -383,7 +379,7 @@ savestateinlock()
      * noop pid rewriting will take place on the first "checkpoint" after
      * the game is started or restored, if checkpointing is off.
      */
-    if (flags.ins_chkpt || havestate) {
+    if (flags.ins_chkpt || iv.havestate) {
         /* save the rest of the current game state in the lock file,
          * following the original int pid, the current level number,
          * and the current savefile name, which should not be subject
@@ -421,13 +417,13 @@ savestateinlock()
             store_savefileinfo(fd);
             store_plname_in_file(fd);
 
-            ustuck_id = (u.ustuck ? u.ustuck->m_id : 0);
-            usteed_id = (u.usteed ? u.usteed->m_id : 0);
+            iv.ustuck_id = (u.ustuck ? u.ustuck->m_id : 0);
+            iv.usteed_id = (u.usteed ? u.usteed->m_id : 0);
             savegamestate(fd, WRITE_SAVE);
         }
         bclose(fd);
     }
-    havestate = flags.ins_chkpt;
+    iv.havestate = flags.ins_chkpt;
 }
 #endif