X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Fbpatch.c;h=4e6aa4be6ed5acf0269b7a13c693600e2302d7fb;hb=8760c1ba6442153afe76bcac742e086f90c59fe8;hp=ccc87badabc23049659ce1bf93f754e3487620b9;hpb=81ffe9a7de1db0b3a318a053b38882d1b7ab304c;p=inform.git diff --git a/src/bpatch.c b/src/bpatch.c index ccc87ba..4e6aa4b 100644 --- a/src/bpatch.c +++ b/src/bpatch.c @@ -2,9 +2,8 @@ /* "bpatch" : Keeps track of, and finally acts on, backpatch markers, */ /* correcting symbol values not known at compilation time */ /* */ -/* Copyright (c) Graham Nelson 1993 - 2018 */ -/* */ -/* This file is part of Inform. */ +/* Part of Inform 6.35 */ +/* copyright (c) Graham Nelson 1993 - 2020 */ /* */ /* Inform is free software: you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ @@ -23,8 +22,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 +47,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 +158,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 +200,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 +309,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 +432,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 +479,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 +514,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 +530,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); }