From c3eefefc991999ef2f322dabd439d3bca601fe32 Mon Sep 17 00:00:00 2001 From: Bart House Date: Fri, 23 Nov 2018 15:13:22 -0800 Subject: [PATCH] Modified objects initialization to support re-entry. --- include/decl.h | 2 +- include/extern.h | 4 ++-- src/allmain.c | 2 -- src/decl.c | 9 +-------- src/objects.c | 13 +++++++------ src/sys.c | 3 +++ sys/share/pcmain.c | 1 - sys/winnt/stubs.c | 3 +-- util/lev_main.c | 10 ++++++---- util/makedefs.c | 5 +++-- win/share/tile2bmp.c | 2 ++ win/share/tilemap.c | 1 - win/win32/winhack.c | 1 - 13 files changed, 26 insertions(+), 30 deletions(-) diff --git a/include/decl.h b/include/decl.h index 50f015fd5..5c7356c5d 100644 --- a/include/decl.h +++ b/include/decl.h @@ -545,7 +545,7 @@ struct instance_globals { E struct instance_globals g; -E void instance_globals_init(); +E void decl_globals_init(); #undef E diff --git a/include/extern.h b/include/extern.h index 89910b0bb..deb6941e7 100644 --- a/include/extern.h +++ b/include/extern.h @@ -250,7 +250,7 @@ E void FDECL(destroy_drawbridge, (int, int)); /* ### decl.c ### */ -E void NDECL(decl_init); +E void NDECL(decl_globals_init); /* ### detect.c ### */ @@ -1651,7 +1651,7 @@ E void NDECL(rename_disco); /* ### objects.c ### */ -E void NDECL(objects_init); +E void NDECL(objects_globals_init); /* ### objnam.c ### */ diff --git a/src/allmain.c b/src/allmain.c index 9aa2f93c4..41e59d157 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -33,9 +33,7 @@ boolean resuming; /* Note: these initializers don't do anything except guarantee that we're linked properly. */ - decl_init(); monst_init(); - objects_init(); /* if a save file created in normal mode is now being restored in explore mode, treat it as normal restore followed by 'X' command diff --git a/src/decl.c b/src/decl.c index fde96e40b..f6c3524be 100644 --- a/src/decl.c +++ b/src/decl.c @@ -318,13 +318,6 @@ const char *ARGV0; /* support for lint.h */ unsigned nhUse_dummy = 0; -/* dummy routine used to force linkage */ -void -decl_init() -{ - return; -} - #define IVMAGIC 0xdeadbeef const struct instance_globals g_init = { @@ -420,7 +413,7 @@ const struct instance_globals g_init = { struct instance_globals g; void -instance_globals_init() +decl_globals_init() { g = g_init; diff --git a/src/objects.c b/src/objects.c index fcca3b0f7..984a67e3e 100644 --- a/src/objects.c +++ b/src/objects.c @@ -61,7 +61,7 @@ struct monst { struct monst *dummy; }; /* lint: struct obj's union */ cost,sdam,ldam,oc1,oc2,nut,color) { obj } #define None (char *) 0 /* less visual distraction for 'no description' */ -NEARDATA struct objdescr obj_descr[] = +NEARDATA struct objdescr obj_descr_init[] = #else /* second pass -- object definitions */ #define BITS(nmkn,mrg,uskn,ctnr,mgc,chrg,uniq,nwsh,big,tuf,dir,sub,mtrl) \ @@ -75,7 +75,7 @@ NEARDATA struct objdescr obj_descr[] = #define HARDGEM(n) (0) #endif -NEARDATA struct objclass objects[] = +NEARDATA struct objclass obj_init[] = #endif { /* dummy object[0] -- description [2nd arg] *must* be NULL */ @@ -1169,13 +1169,14 @@ OBJECT(OBJ(None, None), /* clang-format on */ /* *INDENT-ON* */ -void NDECL(objects_init); +struct objdescr obj_descr[SIZE(obj_descr_init)]; +struct objclass objects[SIZE(obj_init)]; -/* dummy routine used to force linkage */ void -objects_init() +objects_globals_init() { - return; + memcpy(obj_descr, obj_descr_init, sizeof(obj_descr)); + memcpy(objects, obj_init, sizeof(objects)); } #endif /* !OBJECTS_PASS_2_ */ diff --git a/src/sys.c b/src/sys.c index 6adc8f71f..51b966ff2 100644 --- a/src/sys.c +++ b/src/sys.c @@ -20,6 +20,9 @@ struct sysopt sysopt; void sys_early_init() { + decl_globals_init(); + objects_globals_init(); + sysopt.support = (char *) 0; sysopt.recover = (char *) 0; #ifdef SYSCF diff --git a/sys/share/pcmain.c b/sys/share/pcmain.c index ce95d3fdf..da516713a 100644 --- a/sys/share/pcmain.c +++ b/sys/share/pcmain.c @@ -97,7 +97,6 @@ char *argv[]; nethack_enter(argc, argv); - instance_globals_init(); sys_early_init(); #if defined(WIN32) && defined(TTY_GRAPHICS) diff --git a/sys/winnt/stubs.c b/sys/winnt/stubs.c index 9e16c6dce..9241864b1 100644 --- a/sys/winnt/stubs.c +++ b/sys/winnt/stubs.c @@ -37,8 +37,7 @@ char *argv[]; { boolean resuming; - icontext_init(); - sys_early_init(); + early_init(); Strcpy(default_window_sys, "tty"); resuming = pcmain(argc, argv); moveloop(resuming); diff --git a/util/lev_main.c b/util/lev_main.c index 729549791..e1b946489 100644 --- a/util/lev_main.c +++ b/util/lev_main.c @@ -109,8 +109,7 @@ struct lc_vardefs *FDECL(vardef_defined, (struct lc_vardefs *, char *, int)); void FDECL(splev_add_from, (sp_lev *, sp_lev *)); extern void NDECL(monst_init); -extern void NDECL(objects_init); -extern void NDECL(decl_init); +extern void NDECL(objects_globals_init); void FDECL(add_opcode, (sp_lev *, int, genericptr_t)); @@ -256,12 +255,15 @@ char **argv; argc = SIZE(mac_argv); argv = mac_argv; #endif + + decl_globals_init(); + objects_globals_init(); + /* Note: these initializers don't do anything except guarantee that * we're linked properly. */ monst_init(); - objects_init(); - decl_init(); + /* this one does something... */ init_obj_classes(); diff --git a/util/makedefs.c b/util/makedefs.c index 0b97a8bcb..7504ca7b0 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -164,7 +164,7 @@ void NDECL(do_oracles); void NDECL(do_vision); extern void NDECL(monst_init); /* monst.c */ -extern void NDECL(objects_init); /* objects.c */ +extern void NDECL(objects_globals_init); /* objects.c */ static void NDECL(link_sanity_check); static char *FDECL(name_file, (const char *, const char *)); @@ -296,7 +296,6 @@ link_sanity_check() we're linked properly. */ monst_init(); - objects_init(); } @@ -306,6 +305,8 @@ char *options; { boolean more_than_one; + objects_globals_init(); + link_sanity_check(); /* construct the current version number */ diff --git a/win/share/tile2bmp.c b/win/share/tile2bmp.c index 6722bbc26..8fb16e425 100644 --- a/win/share/tile2bmp.c +++ b/win/share/tile2bmp.c @@ -203,6 +203,8 @@ char *argv[]; } #endif + objects_globals_init(); + tilecount = 0; xoffset = yoffset = 0; initflag = 0; diff --git a/win/share/tilemap.c b/win/share/tilemap.c index f859f44e8..1e59381b7 100644 --- a/win/share/tilemap.c +++ b/win/share/tilemap.c @@ -113,7 +113,6 @@ int set, entry; we're linked properly. */ monst_init(); - objects_init(); (void) def_char_to_objclass(']'); condnum = tilenum = 0; diff --git a/win/win32/winhack.c b/win/win32/winhack.c index 43bca5a5d..9dcbb4e4b 100644 --- a/win/win32/winhack.c +++ b/win/win32/winhack.c @@ -97,7 +97,6 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, win10_init(); - instance_globals_init(); sys_early_init(); /* init applicatio structure */ -- 2.40.0