From b208a12410bcc2e7aeb213e21d2169e7b15d571b Mon Sep 17 00:00:00 2001 From: glx22 Date: Sat, 10 Oct 2026 14:45:47 +0200 Subject: [PATCH] Fix: Procedure calls reference counting --- nml/actions/action2var.py | 3 + regression/033_procedure.nml | 5 ++ regression/expected/033_procedure.grf | Bin 833 -> 930 bytes regression/expected/033_procedure.nfo | 77 +++++++++++++++++--------- 4 files changed, 58 insertions(+), 27 deletions(-) diff --git a/nml/actions/action2var.py b/nml/actions/action2var.py index 128e6237e..974b01d91 100644 --- a/nml/actions/action2var.py +++ b/nml/actions/action2var.py @@ -1068,6 +1068,9 @@ def parse_sg_ref_result(result, action_list, parent_action, var_range): action2.add_ref(ref, varaction2, True) action2.add_ref(ref, varaction2, True) + for proc in varact2parser.proc_call_list: + action2.add_ref(proc, varaction2, True) + ref = expression.SpriteGroupRef(expression.Identifier(name), [], None, varaction2) action_list.append(varaction2) action2.add_ref(ref, parent_action) diff --git a/regression/033_procedure.nml b/regression/033_procedure.nml index ea37668c5..20f6a84a0 100644 --- a/regression/033_procedure.nml +++ b/regression/033_procedure.nml @@ -6,6 +6,10 @@ grf { min_compatible_version: 0; } +switch(FEAT_INDUSTRIES, SELF, fc1, founder_colour1) { return; } + +switch(FEAT_INDUSTRIES, SELF, fc2, founder_colour2) { return; } + switch(FEAT_INDUSTRIES, SELF, dumb_add, a, b, a + b) { return; } /* some computation that requires registers for intermediate values */ @@ -29,5 +33,6 @@ item(FEAT_INDUSTRIES, coal_mine) { graphics { build_prod_change: return caller1; control_special: return caller2; + colour: return dumb_add(fc1(), fc2()); } } diff --git a/regression/expected/033_procedure.grf b/regression/expected/033_procedure.grf index d6ea541c2ee156493138f883a671dd5f25dc02b8..7eac57a96fb83506a6c7e43574ea477f945bd68b 100644 GIT binary patch delta 357 zcmYk0F;2rk5Jms2fk+lfC`f`VkX)q+f`$q@q$H9{M9&Q(Q6)`+MU}0<@(t*?0}ZEv zGsNCq{(2pWFU{=RKYyh8KKkekfceAhwHqh#dj#NsL4KFlheq=&>_@iP)rxUp2_SZ+>h zrh_W{hUl(b$Sud8@+hXXa>+hX*K`&#ET7c{=}md}OJ%F!V|l%8XcdH;)aQh{s2DyV6XrH delta 292 zcmX|5I}XAy40Xb%Qp9J0B4sLw5vc=g-55Y(K|<^tgQ*lT02xtkz{Ji8H~@EG(Oc4Tx#>859Y7*aWTu$8<(>X=DZ=oOpw46c return 0 -\wx00FE // Non-graphics callback, return graphics result +\wx00FC // Non-graphics callback, return graphics result // Name: @return_action_0 -6 * 66 02 0A FD 89 +8 * 66 02 0A FB 89 1A 20 \dx00000005 \2sto 1A 20 \dx00000088 \2r 7D 86 20 \dxFFFFFFFF // a \2sto 1A 20 \dx00000089 -\2r 7E FF 20 \dxFFFFFFFF // dumb_add(5, a) +\2r 7E FD 20 \dxFFFFFFFF // dumb_add(5, a) \2sto 1A 20 \dx00000087 \2r 7D 86 20 \dxFFFFFFFF // a \2+ 7D 87 00 \dxFFFFFFFF @@ -50,7 +62,7 @@ // Name: callee // a : register 86 -7 * 67 02 0A FD 89 +9 * 67 02 0A FB 89 45 30 \dx00000003 \2+ 45 38 \dx0000000F \2sto 1A 20 \dx00000087 @@ -59,11 +71,11 @@ \2* 7D 87 20 \dxFFFFFFFF \2+ 7D 86 00 \dxFFFFFFFF // a \b1 -\wx00FE \dx00000001 \dx00000000 // Bogus range to avoid nvar == 0 -\wx00FD // default: return (a + dumb_add(5, a)) +\wx00FC \dx00000001 \dx00000000 // Bogus range to avoid nvar == 0 +\wx00FB // default: return (a + dumb_add(5, a)) // Name: caller2 -8 * 232 02 0A FC 89 +10 * 232 02 0A FA 89 B3 20 \dx00000003 \2+ AA 20 \dx0000FFFF \2sto 1A 20 \dx00000080 @@ -72,7 +84,7 @@ B3 20 \dx00000003 \2sto 1A 20 \dx00000081 \2r 1A 20 \dx00000001 \2sto 1A 20 \dx00000086 -\2r 7E FD 20 \dxFFFFFFFF // callee(1) +\2r 7E FB 20 \dxFFFFFFFF // callee(1) \2+ 5F 28 \dx0000FFFF \2sto 1A 20 \dx00000082 \2r 43 20 \dxFFFFFFFF @@ -84,13 +96,13 @@ B3 20 \dx00000003 \2sto 1A 20 \dx00000088 \2r 46 20 \dxFFFFFFFF \2sto 1A 20 \dx00000089 -\2r 7E FF 20 \dxFFFFFFFF // dumb_add(var[0x45, 28, 15], var[0x46, 0, -1]) +\2r 7E FD 20 \dxFFFFFFFF // dumb_add(var[0x45, 28, 15], var[0x46, 0, -1]) \2sto 1A 20 \dx00000085 \2r 7D 84 20 \dxFFFFFFFF \2sto 1A 20 \dx00000088 \2r 7D 85 20 \dxFFFFFFFF \2sto 1A 20 \dx00000089 -\2r 7E FF 20 \dxFFFFFFFF // dumb_add(1, dumb_add(var[0x45, 28, 15], var[0x46, 0, -1])) +\2r 7E FD 20 \dxFFFFFFFF // dumb_add(1, dumb_add(var[0x45, 28, 15], var[0x46, 0, -1])) \2* 7D 83 20 \dxFFFFFFFF \2* 7D 82 20 \dxFFFFFFFF \2* 7D 81 20 \dxFFFFFFFF @@ -99,7 +111,7 @@ B3 20 \dx00000003 \wx8000 // Return computed value // Name: caller1 -9 * 145 02 0A FF 89 +11 * 145 02 0A FB 89 B3 20 \dx00000003 \2+ AA 20 \dx0000FFFF \2sto 1A 20 \dx00000080 @@ -107,13 +119,13 @@ B3 20 \dx00000003 \2sto 1A 20 \dx00000081 \2r 1A 20 \dx00000000 \2sto 1A 20 \dx00000086 -\2r 7E FD 20 \dxFFFFFFFF // callee(0) +\2r 7E FB 20 \dxFFFFFFFF // callee(0) \2sto 1A 20 \dx00000082 \2r 7D 81 20 \dxFFFFFFFF \2sto 1A 20 \dx00000088 \2r 7D 82 20 \dxFFFFFFFF \2sto 1A 20 \dx00000089 -\2r 7E FF 20 \dxFFFFFFFF // dumb_add(var[0x5F, 8, 65535], callee(0)) +\2r 7E FD 20 \dxFFFFFFFF // dumb_add(var[0x5F, 8, 65535], callee(0)) \2sto 1A 20 \dx00000083 \2r 45 3C \dx0000000F \2+ 46 20 \dxFFFFFFFF @@ -122,21 +134,32 @@ B3 20 \dx00000003 \b0 \wx8000 // Return computed value -10 * 11 00 0A \b2 01 FF \wx0000 +12 * 11 00 0A \b2 01 FF \wx0000 08 00 09 00 -11 * 9 00 0A \b1 01 FF \wx0000 -22 42 +13 * 9 00 0A \b1 01 FF \wx0000 +22 4A + +// Name: @return_action_0 +14 * 46 02 0A FE 89 +7E FF 20 \dxFFFFFFFF // fc1 +\2sto 1A 20 \dx00000088 +\2r 7E FE 20 \dxFFFFFFFF // fc2 +\2sto 1A 00 \dx00000089 +\b1 +\wx00FD \dx00000000 \dx00000000 // dumb_add +\wx00FD // dumb_add // Name: @action3_0 -12 * 33 02 0A FE 89 +15 * 43 02 0A FC 89 0C 00 \dx0000FFFF -\b2 -\wx00FC \dx0000003B \dx0000003B // caller2; -\wx00FF \dx0000015F \dx0000015F // caller1; -\wx00FE // @CB_FAILED0A; +\b3 +\wx00FA \dx0000003B \dx0000003B // caller2; +\wx00FE \dx0000014A \dx0000014A // @return_action_0; +\wx00FB \dx0000015F \dx0000015F // caller1; +\wx00FC // @CB_FAILED0A; -13 * 7 03 0A 01 00 \b0 -\wx00FE // @action3_0; +16 * 7 03 0A 01 00 \b0 +\wx00FC // @action3_0;