X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Fbpatch.c;h=c1bd1bbb5c48e77417ec39481771775c416f8ccd;hb=ee3b3a0cb830792c0569230872a0af20eab8bb7b;hp=1fd984b0c9b8ebf8c51a25b8287afca0f9a12a83;hpb=8e63120c630c94c598d4e2d6ba823dac59bce8fa;p=inform.git diff --git a/src/bpatch.c b/src/bpatch.c index 1fd984b..c1bd1bb 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 */ /* */ -/* Part of Inform 6.40 */ +/* Part of Inform 6.41 */ /* copyright (c) Graham Nelson 1993 - 2022 */ /* */ /* Inform is free software: you can redistribute it and/or modify */ @@ -31,6 +31,41 @@ memory_list zcode_backpatch_table_memlist; int32 zcode_backpatch_size, staticarray_backpatch_size, zmachine_backpatch_size; +/* ------------------------------------------------------------------------- */ +/* Marker values */ +/* ------------------------------------------------------------------------- */ + +extern char *describe_mv(int mval) +{ switch(mval) + { case NULL_MV: return("null"); + + /* Marker values used in ordinary story file backpatching */ + + case DWORD_MV: return("dictionary word"); + case STRING_MV: return("string literal"); + case INCON_MV: return("system constant"); + case IROUTINE_MV: return("routine"); + case VROUTINE_MV: return("veneer routine"); + case ARRAY_MV: return("internal array"); + case NO_OBJS_MV: return("the number of objects"); + case INHERIT_MV: return("inherited common p value"); + case INDIVPT_MV: return("indiv prop table address"); + case INHERIT_INDIV_MV: return("inherited indiv p value"); + case MAIN_MV: return("ref to Main"); + case SYMBOL_MV: return("ref to symbol value"); + + /* Additional marker values used in Glulx backpatching + (IDENT_MV is not really used at all any more) */ + + case VARIABLE_MV: return("global variable"); + case IDENT_MV: return("prop identifier number"); + case ACTION_MV: return("action"); + case OBJECT_MV: return("internal object"); + + } + return("** No such MV **"); +} + /* ------------------------------------------------------------------------- */ /* The mending operation */ /* ------------------------------------------------------------------------- */ @@ -60,7 +95,7 @@ static int32 backpatch_value_z(int32 value) break; case VROUTINE_MV: if ((value<0) || (value>=VENEER_ROUTINES)) - { if (no_link_errors > 0) break; + { if (compiler_error ("Backpatch veneer routine number out of range")) { printf("Illegal BP veneer routine number: %d\n", value); @@ -78,7 +113,7 @@ static int32 backpatch_value_z(int32 value) value = no_objects; break; case INCON_MV: if ((value<0) || (value>=NO_SYSTEM_CONSTANTS)) - { if (no_link_errors > 0) break; + { if (compiler_error ("Backpatch system constant number out of range")) { printf("Illegal BP system constant number: %d\n", value); @@ -119,7 +154,7 @@ static int32 backpatch_value_z(int32 value) break; case SYMBOL_MV: if ((value<0) || (value>=no_symbols)) - { if (no_link_errors > 0) break; + { if (compiler_error("Backpatch symbol number out of range")) { printf("Illegal BP symbol number: %d\n", value); backpatch_error_flag = TRUE; @@ -141,12 +176,10 @@ static int32 backpatch_value_z(int32 value) if ((backpatch_marker < 0) || (backpatch_marker > LARGEST_BPATCH_MV)) { - if (no_link_errors == 0) - { compiler_error_named( + compiler_error_named( "Illegal backpatch marker attached to symbol", symbols[value].name); - backpatch_error_flag = TRUE; - } + backpatch_error_flag = TRUE; } else symbols[value].value = backpatch_value_z((symbols[value].value) % 0x10000); @@ -167,7 +200,6 @@ static int32 backpatch_value_z(int32 value) } break; default: - if (no_link_errors > 0) break; if (compiler_error("Illegal backpatch marker")) { printf("Illegal backpatch marker %d value %04x\n", backpatch_marker, value); @@ -213,7 +245,7 @@ static int32 backpatch_value_g(int32 value) break; case VROUTINE_MV: if ((value<0) || (value>=VENEER_ROUTINES)) - { if (no_link_errors > 0) break; + { if (compiler_error ("Backpatch veneer routine number out of range")) { printf("Illegal BP veneer routine number: %d\n", value); @@ -231,7 +263,7 @@ static int32 backpatch_value_g(int32 value) value = no_objects; break; case INCON_MV: if ((value<0) || (value>=NO_SYSTEM_CONSTANTS)) - { if (no_link_errors > 0) break; + { if (compiler_error ("Backpatch system constant number out of range")) { printf("Illegal BP system constant number: %d\n", value); @@ -269,7 +301,7 @@ static int32 backpatch_value_g(int32 value) break; case SYMBOL_MV: if ((value<0) || (value>=no_symbols)) - { if (no_link_errors > 0) break; + { if (compiler_error("Backpatch symbol number out of range")) { printf("Illegal BP symbol number: %d\n", value); backpatch_error_flag = TRUE; @@ -291,12 +323,10 @@ static int32 backpatch_value_g(int32 value) if ((backpatch_marker < 0) || (backpatch_marker > LARGEST_BPATCH_MV)) { - if (no_link_errors == 0) - { compiler_error_named( + compiler_error_named( "Illegal backpatch marker attached to symbol", symbols[value].name); - backpatch_error_flag = TRUE; - } + backpatch_error_flag = TRUE; } else symbols[value].value = backpatch_value_g(symbols[value].value); @@ -335,7 +365,6 @@ symbol"); } break; default: - if (no_link_errors > 0) break; if (compiler_error("Illegal backpatch marker")) { printf("Illegal backpatch marker %d value %04x\n", backpatch_marker, value); @@ -358,14 +387,10 @@ extern int32 backpatch_value(int32 value) } static void backpatch_zmachine_z(int mv, int zmachine_area, int32 offset) -{ if (module_switch) - { if (zmachine_area == PROP_DEFAULTS_ZA) return; - } - else - { if (mv == OBJECT_MV) return; - if (mv == IDENT_MV) return; - if (mv == ACTION_MV) return; - } +{ + if (mv == OBJECT_MV) return; + if (mv == IDENT_MV) return; + if (mv == ACTION_MV) return; if (bpatch_trace_setting >= 2) printf("BP added: MV %d ZA %d Off %04x\n", mv, zmachine_area, offset); @@ -378,13 +403,9 @@ static void backpatch_zmachine_z(int mv, int zmachine_area, int32 offset) } static void backpatch_zmachine_g(int mv, int zmachine_area, int32 offset) -{ if (module_switch) - { if (zmachine_area == PROP_DEFAULTS_ZA) return; - } - else - { if (mv == IDENT_MV) return; - if (mv == ACTION_MV) return; - } +{ + if (mv == IDENT_MV) return; + if (mv == ACTION_MV) return; /* The backpatch table format for Glulx: First, the marker byte. @@ -433,9 +454,8 @@ extern void backpatch_zmachine_image_z(void) 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")) - backpatch_error_flag = TRUE; + if (compiler_error("Illegal area to backpatch")) + backpatch_error_flag = TRUE; } addr += offset; @@ -447,9 +467,8 @@ extern void backpatch_zmachine_image_z(void) if (backpatch_error_flag) { backpatch_error_flag = FALSE; - if (no_link_errors == 0) - printf("*** MV %d ZA %d Off %04x ***\n", - backpatch_marker, zmachine_area, offset); + printf("*** MV %d ZA %d Off %04x ***\n", + backpatch_marker, zmachine_area, offset); } } } @@ -480,7 +499,6 @@ extern void backpatch_zmachine_image_g(void) 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")) backpatch_error_flag = TRUE; } @@ -498,9 +516,8 @@ extern void backpatch_zmachine_image_g(void) if (backpatch_error_flag) { backpatch_error_flag = FALSE; - if (no_link_errors == 0) - printf("*** MV %d ZA %d Off %04x ***\n", - backpatch_marker, zmachine_area, offset); + printf("*** MV %d ZA %d Off %04x ***\n", + backpatch_marker, zmachine_area, offset); } } }