/* "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 - 2021 */
/* */
/* Inform is free software: you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
#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 */
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);
value += code_offset/scale_factor;
break;
case ARRAY_T: value += variables_offset; break;
+ case STATIC_ARRAY_T: value += static_arrays_offset; break;
}
}
break;
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:
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 +
break;
case CONSTANT_T:
case INDIVIDUAL_PROPERTY_T:
+ case PROPERTY_T:
/* value is unchanged */
break;
default:
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"))
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"))
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;
}
extern void bpatch_free_arrays(void)
{ deallocate_memory_block(&zcode_backpatch_table);
+ deallocate_memory_block(&staticarray_backpatch_table);
deallocate_memory_block(&zmachine_backpatch_table);
}