X-Git-Url: https://jxself.org/git/?p=inform.git;a=blobdiff_plain;f=src%2Fbpatch.c;fp=src%2Fbpatch.c;h=43078d2d16796d7d89d70e099f5102e263555809;hp=ccc87badabc23049659ce1bf93f754e3487620b9;hb=e536ce9e39cc1bfa82ecd1d6d73f874af655f9db;hpb=18379907e684280f6e70bf5c2205c2968e56fa67 diff --git a/src/bpatch.c b/src/bpatch.c index ccc87ba..43078d2 100644 --- a/src/bpatch.c +++ b/src/bpatch.c @@ -2,7 +2,7 @@ /* "bpatch" : Keeps track of, and finally acts on, backpatch markers, */ /* correcting symbol values not known at compilation time */ /* */ -/* Copyright (c) Graham Nelson 1993 - 2018 */ +/* Copyright (c) Graham Nelson 1993 - 2020 */ /* */ /* This file is part of Inform. */ /* */ @@ -23,8 +23,10 @@ #include "header.h" -memory_block zcode_backpatch_table, zmachine_backpatch_table; -int32 zcode_backpatch_size, zmachine_backpatch_size; +memory_block zcode_backpatch_table, staticarray_backpatch_table, + zmachine_backpatch_table; +int32 zcode_backpatch_size, staticarray_backpatch_size, + zmachine_backpatch_size; /* ------------------------------------------------------------------------- */ /* The mending operation */ @@ -46,6 +48,8 @@ static int32 backpatch_value_z(int32 value) value += strings_offset/scale_factor; break; case ARRAY_MV: value += variables_offset; break; + case STATIC_ARRAY_MV: + value += static_arrays_offset; break; case IROUTINE_MV: if (OMIT_UNUSED_ROUTINES) value = df_stripped_address_for_address(value); @@ -155,6 +159,7 @@ static int32 backpatch_value_z(int32 value) value += code_offset/scale_factor; break; case ARRAY_T: value += variables_offset; break; + case STATIC_ARRAY_T: value += static_arrays_offset; break; } } break; @@ -196,6 +201,8 @@ static int32 backpatch_value_g(int32 value) break; case ARRAY_MV: value += arrays_offset; break; + case STATIC_ARRAY_MV: + value += static_arrays_offset; break; case VARIABLE_MV: value = variables_offset + (4*value); break; case OBJECT_MV: @@ -303,6 +310,7 @@ static int32 backpatch_value_g(int32 value) value += code_offset; break; case ARRAY_T: value += arrays_offset; break; + case STATIC_ARRAY_T: value += static_arrays_offset; break; case OBJECT_T: case CLASS_T: value = object_tree_offset + @@ -425,6 +433,7 @@ extern void backpatch_zmachine_image_z(void) case PROP_ZA: addr = prop_values_offset; break; case INDIVIDUAL_PROP_ZA: addr = individuals_offset; break; case DYNAMIC_ARRAY_ZA: addr = variables_offset; break; + case STATIC_ARRAY_ZA: addr = static_arrays_offset; break; default: if (no_link_errors == 0) if (compiler_error("Illegal area to backpatch")) @@ -471,8 +480,9 @@ extern void backpatch_zmachine_image_g(void) case PROP_DEFAULTS_ZA: addr = prop_defaults_offset+4; break; case PROP_ZA: addr = prop_values_offset; break; case INDIVIDUAL_PROP_ZA: addr = individuals_offset; break; - case ARRAY_ZA: addr = arrays_offset; break; + case DYNAMIC_ARRAY_ZA: addr = arrays_offset; break; case GLOBALVAR_ZA: addr = variables_offset; break; + /* STATIC_ARRAY_ZA is in ROM and therefore not handled here */ default: if (no_link_errors == 0) if (compiler_error("Illegal area to backpatch")) @@ -505,11 +515,13 @@ extern void backpatch_zmachine_image_g(void) extern void init_bpatch_vars(void) { initialise_memory_block(&zcode_backpatch_table); + initialise_memory_block(&staticarray_backpatch_table); initialise_memory_block(&zmachine_backpatch_table); } extern void bpatch_begin_pass(void) { zcode_backpatch_size = 0; + staticarray_backpatch_size = 0; zmachine_backpatch_size = 0; } @@ -519,6 +531,7 @@ extern void bpatch_allocate_arrays(void) extern void bpatch_free_arrays(void) { deallocate_memory_block(&zcode_backpatch_table); + deallocate_memory_block(&staticarray_backpatch_table); deallocate_memory_block(&zmachine_backpatch_table); }