From fdec6615b5832b7cecbb10b8782630b054a8de4a Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Fri, 4 Nov 2022 10:26:11 +0100 Subject: scope.* - revert and rework SAVECOPWARNINGS change We can't put PL_compiling or PL_curcop on the save stack as we don't have a way to ensure they cross threads properly. This showed up as a win32 t/op/fork.t failure in the thread based fork emulation layer. This adds a new save type SAVEt_CURCOP_WARNINGS and macro SAVECURCOPWARNINGS() to complement SAVEt_COMPILER_WARNINGS and SAVECOMPILEWARNINGS(). By simply hard coding where the pointers should be restored to we side step the issue of which thread we are in. Thanks to Graham Knop for help identifying that one of my commits was responsible. --- scope.h | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'scope.h') diff --git a/scope.h b/scope.h index 2b81f36170..3d643a3df6 100644 --- a/scope.h +++ b/scope.h @@ -215,13 +215,11 @@ scope has the given name. C must be a literal string. PL_curstackinfo->si_stack = (t); \ } STMT_END -/* Need to do the cop warnings like this, rather than a "SAVEFREESHAREDPV", - because realloc() means that the value can actually change. Possibly - could have done savefreesharedpvREF, but this way actually seems cleaner, - as it simplifies the code that does the saves, and reduces the load on the - save stack. */ -#define SAVECOPWARNINGS(cop) save_pushptrptr((cop),(cop)->cop_warnings, SAVEt_COMPILE_WARNINGS) -#define SAVECOMPILEWARNINGS() SAVECOPWARNINGS(&PL_compiling) +/* Note these are special, we can't just use a save_pushptrptr() on them + * as the target might change after a fork or thread start. */ +#define SAVECOMPILEWARNINGS() save_pushptr(PL_compiling.cop_warnings, SAVEt_COMPILE_WARNINGS) +#define SAVECURCOPWARNINGS() save_pushptr(PL_curcop->cop_warnings, SAVEt_CURCOP_WARNINGS) + #define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER) -- cgit v1.2.1