From 5e960e1fd332b5aaa1e99c3e0bc8e30fe19999b1 Mon Sep 17 00:00:00 2001 From: kichik Date: Sat, 25 Sep 2004 13:35:03 +0000 Subject: [PATCH] relative jumps now work with instructions that add multiple entries (including plug-in calls) git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3670 212acab6-be3b-0410-9dea-997c60f758d6 --- Docs/src/jumps.but | 2 -- Source/build.cpp | 28 +++++++++++++++++++++++++++- Source/build.h | 2 ++ Source/script.cpp | 2 ++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Docs/src/jumps.but b/Docs/src/jumps.but index 2e3dcd36..e69cda82 100644 --- a/Docs/src/jumps.but +++ b/Docs/src/jumps.but @@ -16,5 +16,3 @@ Examples: \c MessageBox MB_OK "You will never ever see this message box" \c Goto -3 \c MessageBox MB_OK "Done" - -\\Note:\\ relative jumps don't work with \R{Exch}{Exch}, \R{file}{File}, \R{plugindlls}{plug-ins (Plugin::Function)}, \R{initpluginsdir}{InitPluginsDir}, \R{getfiletimelocal}{GetFileTimeLocal} or \R{getdllversionlocal}{GetDLLVersionLocal}. Do \e{not} try to jump over them using relative jumps, you will not get the result you were expecting. \ No newline at end of file diff --git a/Source/build.cpp b/Source/build.cpp index 418e5c0e..63aae1ed 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -76,6 +76,7 @@ CEXEBuild::CEXEBuild() cur_ifblock=NULL; last_line_had_slash=0; inside_comment=false; + multiple_entries_instruction=0; build_include_depth=0; @@ -275,6 +276,7 @@ definedlist.add("NSIS_SUPPORT_LANG_IN_STRINGS"); build_compress_dict_size=1<<23; cur_entries=&build_entries; + cur_instruction_entry_map=&build_instruction_entry_map; cur_datablock=&build_datablock; cur_datablock_cache=&build_datablock_cache; cur_functions=&build_functions; @@ -1278,9 +1280,12 @@ int CEXEBuild::add_entry(const entry *ent) } cur_entries->add(ent,sizeof(entry)); + cur_instruction_entry_map->add(&multiple_entries_instruction,sizeof(int)); build_cursection->code_size++; cur_header->blocks[NB_ENTRIES].num++; + multiple_entries_instruction=1; + return PS_OK; } @@ -1304,7 +1309,26 @@ int CEXEBuild::resolve_jump_int(const char *fn, int *a, int offs, int start, int char *lname=(char*)ns_label.get()+*a; if (lname[0] == '-' || lname[0]=='+') { - *a=offs+atoi(lname)+1; + int jump = atoi(lname); + int *skip_map = (int *) cur_instruction_entry_map->get(); + + int direction = 1; + if (jump < 0) + direction = -1; + + for (; jump != 0; jump -= direction) + { + offs += direction; + if (offs >= 0 && offs < cur_instruction_entry_map->getlen() * sizeof(int)) + { + while (skip_map[offs]) + { + offs += direction; + } + } + } + + *a = offs + 1; } else { @@ -3014,6 +3038,7 @@ void CEXEBuild::set_uninstall_mode(int un) cur_datablock=&ubuild_datablock; cur_datablock_cache=&ubuild_datablock_cache; cur_entries=&ubuild_entries; + cur_instruction_entry_map=&ubuild_instruction_entry_map; cur_functions=&ubuild_functions; cur_labels=&ubuild_labels; cur_pages=&ubuild_pages; @@ -3028,6 +3053,7 @@ void CEXEBuild::set_uninstall_mode(int un) cur_datablock=&build_datablock; cur_datablock_cache=&build_datablock_cache; cur_entries=&build_entries; + cur_instruction_entry_map=&build_instruction_entry_map; cur_functions=&build_functions; cur_labels=&build_labels; cur_pages=&build_pages; diff --git a/Source/build.h b/Source/build.h index e94b320e..de6debc1 100644 --- a/Source/build.h +++ b/Source/build.h @@ -158,6 +158,7 @@ class CEXEBuild { int last_line_had_slash; bool inside_comment; + int multiple_entries_instruction; void ERROR_MSG(const char *s, ...); void SCRIPT_MSG(const char *s, ...); @@ -321,6 +322,7 @@ class CEXEBuild { section *build_cursection; TinyGrowBuf build_sections, ubuild_sections, *cur_sections; GrowBuf build_entries,ubuild_entries, *cur_entries; + GrowBuf build_instruction_entry_map,ubuild_instruction_entry_map, *cur_instruction_entry_map; TinyGrowBuf build_functions, ubuild_functions, *cur_functions; TinyGrowBuf build_labels, ubuild_labels, *cur_labels; StringList build_strlist, ubuild_strlist, *cur_strlist; diff --git a/Source/script.cpp b/Source/script.cpp index ad92190a..fd4f3b78 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -804,6 +804,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) build_plugin_table(); #endif + multiple_entries_instruction=0; + entry ent={0,}; switch (which_token) {