summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeon Timmermans <fawaka@gmail.com>2021-01-12 23:47:55 +0100
committerLeon Timmermans <fawaka@gmail.com>2021-06-02 01:38:31 +0200
commit55f5e7656892bb5ab03f4f19defe887167db7236 (patch)
treecae18826d99951815bc6cc949fad48de091b9c13
parent307a07c2d5f032a3d666d0548847166330d702b4 (diff)
downloadperl-55f5e7656892bb5ab03f4f19defe887167db7236.tar.gz
Call magic on all elements on %SIG delocalization
-rw-r--r--embed.fnc1
-rw-r--r--embed.h1
-rw-r--r--mg.c18
-rw-r--r--mg_raw.h2
-rw-r--r--mg_vtable.h4
-rw-r--r--pod/perlguts.pod2
-rw-r--r--proto.h3
-rw-r--r--regen/mg_vtable.pl4
-rw-r--r--t/op/magic.t7
9 files changed, 38 insertions, 4 deletions
diff --git a/embed.fnc b/embed.fnc
index 94d0f6b317..93801ec41f 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -1331,6 +1331,7 @@ p |int |magic_setnkeys |NN SV* sv|NN MAGIC* mg
p |int |magic_setpack |NN SV* sv|NN MAGIC* mg
p |int |magic_setpos |NN SV* sv|NN MAGIC* mg
p |int |magic_setregexp|NN SV* sv|NN MAGIC* mg
+p |int |magic_setsigall|NN SV* sv|NN MAGIC* mg
p |int |magic_setsig |NULLOK SV* sv|NN MAGIC* mg
p |int |magic_setsubstr|NN SV* sv|NN MAGIC* mg
p |int |magic_settaint |NN SV* sv|NN MAGIC* mg
diff --git a/embed.h b/embed.h
index a1dfb267fb..bbd8fd207e 100644
--- a/embed.h
+++ b/embed.h
@@ -1388,6 +1388,7 @@
#define magic_setpos(a,b) Perl_magic_setpos(aTHX_ a,b)
#define magic_setregexp(a,b) Perl_magic_setregexp(aTHX_ a,b)
#define magic_setsig(a,b) Perl_magic_setsig(aTHX_ a,b)
+#define magic_setsigall(a,b) Perl_magic_setsigall(aTHX_ a,b)
#define magic_setsubstr(a,b) Perl_magic_setsubstr(aTHX_ a,b)
#define magic_settaint(a,b) Perl_magic_settaint(aTHX_ a,b)
#define magic_setutf8(a,b) Perl_magic_setutf8(aTHX_ a,b)
diff --git a/mg.c b/mg.c
index 3355df1b4b..bd71ce15b7 100644
--- a/mg.c
+++ b/mg.c
@@ -1827,6 +1827,24 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
#endif /* !PERL_MICRO */
int
+Perl_magic_setsigall(pTHX_ SV* sv, MAGIC* mg)
+{
+ PERL_ARGS_ASSERT_MAGIC_SETSIGALL;
+ PERL_UNUSED_ARG(mg);
+
+ if (PL_localizing == 2) {
+ HV* hv = (HV*)sv;
+ HE* current;
+ hv_iterinit(hv);
+ while ((current = hv_iternext(hv))) {
+ SV* sigelem = hv_iterval(hv, current);
+ mg_set(sigelem);
+ }
+ }
+ return 0;
+}
+
+int
Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
{
PERL_ARGS_ASSERT_MAGIC_SETISA;
diff --git a/mg_raw.h b/mg_raw.h
index 2f4863b08e..c55e64372c 100644
--- a/mg_raw.h
+++ b/mg_raw.h
@@ -62,7 +62,7 @@
"/* tiedscalar 'q' Tied scalar or handle */" },
{ 'r', "want_vtbl_regexp | PERL_MAGIC_READONLY_ACCEPTABLE | PERL_MAGIC_VALUE_MAGIC",
"/* qr 'r' Precompiled qr// regex */" },
- { 'S', "magic_vtable_max",
+ { 'S', "want_vtbl_sig",
"/* sig 'S' %SIG hash */" },
{ 's', "want_vtbl_sigelem",
"/* sigelem 's' %SIG hash element */" },
diff --git a/mg_vtable.h b/mg_vtable.h
index e5c8cba37c..8f59573ca1 100644
--- a/mg_vtable.h
+++ b/mg_vtable.h
@@ -85,6 +85,7 @@ enum { /* pass one of these to get_vtbl */
want_vtbl_regdata,
want_vtbl_regdatum,
want_vtbl_regexp,
+ want_vtbl_sig,
want_vtbl_sigelem,
want_vtbl_substr,
want_vtbl_sv,
@@ -122,6 +123,7 @@ EXTCONST char * const PL_magic_vtable_names[magic_vtable_max] = {
"regdata",
"regdatum",
"regexp",
+ "sig",
"sigelem",
"substr",
"sv",
@@ -182,6 +184,7 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable_max] = {
{ 0, 0, Perl_magic_regdata_cnt, 0, 0, 0, 0, 0 },
{ Perl_magic_regdatum_get, Perl_magic_regdatum_set, 0, 0, 0, 0, 0, 0 },
{ 0, Perl_magic_setregexp, 0, 0, 0, 0, 0, 0 },
+ { 0, Perl_magic_setsigall, 0, 0, 0, 0, 0, 0 },
#ifndef PERL_MICRO
{ Perl_magic_getsig, Perl_magic_setsig, 0, Perl_magic_clearsig, 0, 0, 0, 0 },
#else
@@ -228,6 +231,7 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable_max];
#define PL_vtbl_regdata PL_magic_vtables[want_vtbl_regdata]
#define PL_vtbl_regdatum PL_magic_vtables[want_vtbl_regdatum]
#define PL_vtbl_regexp PL_magic_vtables[want_vtbl_regexp]
+#define PL_vtbl_sig PL_magic_vtables[want_vtbl_sig]
#define PL_vtbl_sigelem PL_magic_vtables[want_vtbl_sigelem]
#define PL_vtbl_substr PL_magic_vtables[want_vtbl_substr]
#define PL_vtbl_sv PL_magic_vtables[want_vtbl_sv]
diff --git a/pod/perlguts.pod b/pod/perlguts.pod
index f1fd7da34a..fc848bce6c 100644
--- a/pod/perlguts.pod
+++ b/pod/perlguts.pod
@@ -1415,7 +1415,7 @@ will be lost.
p PERL_MAGIC_tiedelem vtbl_packelem Tied array or hash element
q PERL_MAGIC_tiedscalar vtbl_packelem Tied scalar or handle
r PERL_MAGIC_qr vtbl_regexp Precompiled qr// regex
- S PERL_MAGIC_sig (none) %SIG hash
+ S PERL_MAGIC_sig vtbl_sig %SIG hash
s PERL_MAGIC_sigelem vtbl_sigelem %SIG hash element
t PERL_MAGIC_taint vtbl_taint Taintedness
U PERL_MAGIC_uvar vtbl_uvar Available for use by
diff --git a/proto.h b/proto.h
index 37736a0d14..455e3ce34b 100644
--- a/proto.h
+++ b/proto.h
@@ -1998,6 +1998,9 @@ PERL_CALLCONV int Perl_magic_setregexp(pTHX_ SV* sv, MAGIC* mg);
PERL_CALLCONV int Perl_magic_setsig(pTHX_ SV* sv, MAGIC* mg);
#define PERL_ARGS_ASSERT_MAGIC_SETSIG \
assert(mg)
+PERL_CALLCONV int Perl_magic_setsigall(pTHX_ SV* sv, MAGIC* mg);
+#define PERL_ARGS_ASSERT_MAGIC_SETSIGALL \
+ assert(sv); assert(mg)
PERL_CALLCONV int Perl_magic_setsubstr(pTHX_ SV* sv, MAGIC* mg);
#define PERL_ARGS_ASSERT_MAGIC_SETSUBSTR \
assert(sv); assert(mg)
diff --git a/regen/mg_vtable.pl b/regen/mg_vtable.pl
index ebd3413082..0dd27301b5 100644
--- a/regen/mg_vtable.pl
+++ b/regen/mg_vtable.pl
@@ -168,7 +168,8 @@ my %mg =
desc => 'Tied scalar or handle' },
qr => { char => 'r', vtable => 'regexp', value_magic => 1,
readonly_acceptable => 1, desc => 'Precompiled qr// regex' },
- sig => { char => 'S', desc => '%SIG hash' },
+ sig => { char => 'S', vtable => 'sig',
+ desc => '%SIG hash' },
sigelem => { char => 's', vtable => 'sigelem',
desc => '%SIG hash element' },
taint => { char => 't', vtable => 'taint', value_magic => 1,
@@ -251,6 +252,7 @@ my %sig =
'sv' => {get => 'get', set => 'set'},
'env' => {set => 'set_all_env', clear => 'clear_all_env'},
'envelem' => {set => 'setenv', clear => 'clearenv'},
+ 'sig' => { set => 'setsigall' },
'sigelem' => {get => 'getsig', set => 'setsig', clear => 'clearsig',
cond => '#ifndef PERL_MICRO'},
'pack' => {len => 'sizepack', clear => 'wipepack'},
diff --git a/t/op/magic.t b/t/op/magic.t
index c2180afb9d..0d8e32a543 100644
--- a/t/op/magic.t
+++ b/t/op/magic.t
@@ -5,7 +5,7 @@ BEGIN {
chdir 't' if -d 't';
require './test.pl';
set_up_inc( '../lib' );
- plan (tests => 196); # some tests are run in BEGIN block
+ plan (tests => 197); # some tests are run in BEGIN block
}
# Test that defined() returns true for magic variables created on the fly,
@@ -852,6 +852,11 @@ SKIP: {
}
}
+{
+ local %SIG = (%SIG, ALRM => sub {})
+};
+is $SIG{ALRM}, undef;
+
# test case-insignificance of %ENV (these tests must be enabled only
# when perl is compiled with -DENV_IS_CASELESS)
SKIP: {