From 70f511a803cdb074058839083590bc4dcbf60a4b Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 1 Jul 2021 23:56:49 +0200 Subject: [PATCH] [MIRROR] Fix forensic component inheritance inserting null entries into lists and causing to_chat errors. (#6630) * Fix forensic component inheritance inserting null entries into lists and causing to_chat errors. (#59873) Fixing the following runtime: [17:13:04] Runtime in to_chat.dm,88: Empty or null string in to_chat proc call. proc name: to chat (/proc/to_chat) usr: Cowboy_penis_monster/(Zackary Mason) usr.loc: (Telecomms Control Room (105,89,2)) src: null call stack: to chat(Zackary Mason (/mob/living/carbon/human), "", null, "", 0, 1, 1, 0) the forensic scanner (/obj/item/detective_scanner): add log("", 1) the forensic scanner (/obj/item/detective_scanner): scan(Control Room (/obj/machinery/door/airlock/command/glass), Zackary Mason (/mob/living/carbon/human)) Forensic scanner attempting to add "" to the logs, which eventually gets output to_chat. Tracked error down to forensic component lazylists and the fun of trying to OR two lazylists together. * Fix forensic component inheritance inserting null entries into lists and causing to_chat errors. Co-authored-by: Timberpoes --- code/__HELPERS/_lists.dm | 10 ++++++++++ code/datums/components/forensics.dm | 8 ++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index a3a874f9f07..557e6198750 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -571,3 +571,13 @@ return FALSE return TRUE + +#define LAZY_LISTS_OR(left_list, right_list)\ + ( length(left_list)\ + ? length(right_list)\ + ? (left_list | right_list)\ + : left_list.Copy()\ + : length(right_list)\ + ? right_list.Copy()\ + : null\ + ) diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm index a45c0f4bb72..55244d83a7d 100644 --- a/code/datums/components/forensics.dm +++ b/code/datums/components/forensics.dm @@ -7,10 +7,10 @@ var/list/fibers //assoc print = print /datum/component/forensics/InheritComponent(datum/component/forensics/F, original) //Use of | and |= being different here is INTENTIONAL. - fingerprints = fingerprints | F.fingerprints - hiddenprints = hiddenprints | F.hiddenprints - blood_DNA = blood_DNA | F.blood_DNA - fibers = fibers | F.fibers + fingerprints = LAZY_LISTS_OR(fingerprints, F.fingerprints) + hiddenprints = LAZY_LISTS_OR(hiddenprints, F.hiddenprints) + blood_DNA = LAZY_LISTS_OR(blood_DNA, F.blood_DNA) + fibers = LAZY_LISTS_OR(fibers, F.fibers) check_blood() return ..()