Skip to content

Commit 55f5e76

Browse files
committed
Call magic on all elements on %SIG delocalization
1 parent 307a07c commit 55f5e76

File tree

9 files changed

+38
-4
lines changed

9 files changed

+38
-4
lines changed

embed.fnc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,6 +1331,7 @@ p |int |magic_setnkeys |NN SV* sv|NN MAGIC* mg
13311331
p |int |magic_setpack |NN SV* sv|NN MAGIC* mg
13321332
p |int |magic_setpos |NN SV* sv|NN MAGIC* mg
13331333
p |int |magic_setregexp|NN SV* sv|NN MAGIC* mg
1334+
p |int |magic_setsigall|NN SV* sv|NN MAGIC* mg
13341335
p |int |magic_setsig |NULLOK SV* sv|NN MAGIC* mg
13351336
p |int |magic_setsubstr|NN SV* sv|NN MAGIC* mg
13361337
p |int |magic_settaint |NN SV* sv|NN MAGIC* mg

embed.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,7 @@
13881388
#define magic_setpos(a,b) Perl_magic_setpos(aTHX_ a,b)
13891389
#define magic_setregexp(a,b) Perl_magic_setregexp(aTHX_ a,b)
13901390
#define magic_setsig(a,b) Perl_magic_setsig(aTHX_ a,b)
1391+
#define magic_setsigall(a,b) Perl_magic_setsigall(aTHX_ a,b)
13911392
#define magic_setsubstr(a,b) Perl_magic_setsubstr(aTHX_ a,b)
13921393
#define magic_settaint(a,b) Perl_magic_settaint(aTHX_ a,b)
13931394
#define magic_setutf8(a,b) Perl_magic_setutf8(aTHX_ a,b)

mg.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,6 +1826,24 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
18261826
}
18271827
#endif /* !PERL_MICRO */
18281828

1829+
int
1830+
Perl_magic_setsigall(pTHX_ SV* sv, MAGIC* mg)
1831+
{
1832+
PERL_ARGS_ASSERT_MAGIC_SETSIGALL;
1833+
PERL_UNUSED_ARG(mg);
1834+
1835+
if (PL_localizing == 2) {
1836+
HV* hv = (HV*)sv;
1837+
HE* current;
1838+
hv_iterinit(hv);
1839+
while ((current = hv_iternext(hv))) {
1840+
SV* sigelem = hv_iterval(hv, current);
1841+
mg_set(sigelem);
1842+
}
1843+
}
1844+
return 0;
1845+
}
1846+
18291847
int
18301848
Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
18311849
{

mg_raw.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
"/* tiedscalar 'q' Tied scalar or handle */" },
6363
{ 'r', "want_vtbl_regexp | PERL_MAGIC_READONLY_ACCEPTABLE | PERL_MAGIC_VALUE_MAGIC",
6464
"/* qr 'r' Precompiled qr// regex */" },
65-
{ 'S', "magic_vtable_max",
65+
{ 'S', "want_vtbl_sig",
6666
"/* sig 'S' %SIG hash */" },
6767
{ 's', "want_vtbl_sigelem",
6868
"/* sigelem 's' %SIG hash element */" },

mg_vtable.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ enum { /* pass one of these to get_vtbl */
8585
want_vtbl_regdata,
8686
want_vtbl_regdatum,
8787
want_vtbl_regexp,
88+
want_vtbl_sig,
8889
want_vtbl_sigelem,
8990
want_vtbl_substr,
9091
want_vtbl_sv,
@@ -122,6 +123,7 @@ EXTCONST char * const PL_magic_vtable_names[magic_vtable_max] = {
122123
"regdata",
123124
"regdatum",
124125
"regexp",
126+
"sig",
125127
"sigelem",
126128
"substr",
127129
"sv",
@@ -182,6 +184,7 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable_max] = {
182184
{ 0, 0, Perl_magic_regdata_cnt, 0, 0, 0, 0, 0 },
183185
{ Perl_magic_regdatum_get, Perl_magic_regdatum_set, 0, 0, 0, 0, 0, 0 },
184186
{ 0, Perl_magic_setregexp, 0, 0, 0, 0, 0, 0 },
187+
{ 0, Perl_magic_setsigall, 0, 0, 0, 0, 0, 0 },
185188
#ifndef PERL_MICRO
186189
{ Perl_magic_getsig, Perl_magic_setsig, 0, Perl_magic_clearsig, 0, 0, 0, 0 },
187190
#else
@@ -228,6 +231,7 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable_max];
228231
#define PL_vtbl_regdata PL_magic_vtables[want_vtbl_regdata]
229232
#define PL_vtbl_regdatum PL_magic_vtables[want_vtbl_regdatum]
230233
#define PL_vtbl_regexp PL_magic_vtables[want_vtbl_regexp]
234+
#define PL_vtbl_sig PL_magic_vtables[want_vtbl_sig]
231235
#define PL_vtbl_sigelem PL_magic_vtables[want_vtbl_sigelem]
232236
#define PL_vtbl_substr PL_magic_vtables[want_vtbl_substr]
233237
#define PL_vtbl_sv PL_magic_vtables[want_vtbl_sv]

pod/perlguts.pod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1415,7 +1415,7 @@ will be lost.
14151415
p PERL_MAGIC_tiedelem vtbl_packelem Tied array or hash element
14161416
q PERL_MAGIC_tiedscalar vtbl_packelem Tied scalar or handle
14171417
r PERL_MAGIC_qr vtbl_regexp Precompiled qr// regex
1418-
S PERL_MAGIC_sig (none) %SIG hash
1418+
S PERL_MAGIC_sig vtbl_sig %SIG hash
14191419
s PERL_MAGIC_sigelem vtbl_sigelem %SIG hash element
14201420
t PERL_MAGIC_taint vtbl_taint Taintedness
14211421
U PERL_MAGIC_uvar vtbl_uvar Available for use by

proto.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,6 +1998,9 @@ PERL_CALLCONV int Perl_magic_setregexp(pTHX_ SV* sv, MAGIC* mg);
19981998
PERL_CALLCONV int Perl_magic_setsig(pTHX_ SV* sv, MAGIC* mg);
19991999
#define PERL_ARGS_ASSERT_MAGIC_SETSIG \
20002000
assert(mg)
2001+
PERL_CALLCONV int Perl_magic_setsigall(pTHX_ SV* sv, MAGIC* mg);
2002+
#define PERL_ARGS_ASSERT_MAGIC_SETSIGALL \
2003+
assert(sv); assert(mg)
20012004
PERL_CALLCONV int Perl_magic_setsubstr(pTHX_ SV* sv, MAGIC* mg);
20022005
#define PERL_ARGS_ASSERT_MAGIC_SETSUBSTR \
20032006
assert(sv); assert(mg)

regen/mg_vtable.pl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ BEGIN
168168
desc => 'Tied scalar or handle' },
169169
qr => { char => 'r', vtable => 'regexp', value_magic => 1,
170170
readonly_acceptable => 1, desc => 'Precompiled qr// regex' },
171-
sig => { char => 'S', desc => '%SIG hash' },
171+
sig => { char => 'S', vtable => 'sig',
172+
desc => '%SIG hash' },
172173
sigelem => { char => 's', vtable => 'sigelem',
173174
desc => '%SIG hash element' },
174175
taint => { char => 't', vtable => 'taint', value_magic => 1,
@@ -251,6 +252,7 @@ BEGIN
251252
'sv' => {get => 'get', set => 'set'},
252253
'env' => {set => 'set_all_env', clear => 'clear_all_env'},
253254
'envelem' => {set => 'setenv', clear => 'clearenv'},
255+
'sig' => { set => 'setsigall' },
254256
'sigelem' => {get => 'getsig', set => 'setsig', clear => 'clearsig',
255257
cond => '#ifndef PERL_MICRO'},
256258
'pack' => {len => 'sizepack', clear => 'wipepack'},

t/op/magic.t

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ BEGIN {
55
chdir 't' if -d 't';
66
require './test.pl';
77
set_up_inc( '../lib' );
8-
plan (tests => 196); # some tests are run in BEGIN block
8+
plan (tests => 197); # some tests are run in BEGIN block
99
}
1010

1111
# Test that defined() returns true for magic variables created on the fly,
@@ -852,6 +852,11 @@ SKIP: {
852852
}
853853
}
854854

855+
{
856+
local %SIG = (%SIG, ALRM => sub {})
857+
};
858+
is $SIG{ALRM}, undef;
859+
855860
# test case-insignificance of %ENV (these tests must be enabled only
856861
# when perl is compiled with -DENV_IS_CASELESS)
857862
SKIP: {

0 commit comments

Comments
 (0)