Skip to content

Commit 9da1157

Browse files
author
Branislav Zahradník
committed
[pad] pad_find_my_symbol_sv - pad_findmy_sv alternative with explicit symbol table
1 parent 435bb85 commit 9da1157

File tree

6 files changed

+58
-9
lines changed

6 files changed

+58
-9
lines changed

embed.fnc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2510,6 +2510,10 @@ Adp |PADOFFSET|pad_find_my_symbol_pvn \
25102510
|NN const char *namepv \
25112511
|STRLEN namelen \
25122512
|U32 flags
2513+
Adp |PADOFFSET|pad_find_my_symbol_sv \
2514+
|perl_symbol_table_id find_symbol_table \
2515+
|NN SV *name \
2516+
|U32 flags
25132517
dp |void |pad_fixup_inner_anons \
25142518
|NN PADLIST *padlist \
25152519
|NN CV *old_cv \

embed.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@
514514
# define pad_alloc(a,b) Perl_pad_alloc(aTHX_ a,b)
515515
# define pad_find_my_symbol_pv(a,b,c) Perl_pad_find_my_symbol_pv(aTHX_ a,b,c)
516516
# define pad_find_my_symbol_pvn(a,b,c,d) Perl_pad_find_my_symbol_pvn(aTHX_ a,b,c,d)
517+
# define pad_find_my_symbol_sv(a,b,c) Perl_pad_find_my_symbol_sv(aTHX_ a,b,c)
517518
# define pad_findmy_pv(a,b) Perl_pad_findmy_pv(aTHX_ a,b)
518519
# define pad_findmy_pvn(a,b,c) Perl_pad_findmy_pvn(aTHX_ a,b,c)
519520
# define pad_findmy_sv(a,b) Perl_pad_findmy_sv(aTHX_ a,b)

ext/XS-APItest/APItest.xs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,7 @@ enum Pad_Find_Method {
794794
PAD_FIND_MY_SYMBOL_FOO,
795795
PAD_FIND_MY_SYMBOL_PV,
796796
PAD_FIND_MY_SYMBOL_PVN,
797+
PAD_FIND_MY_SYMBOL_SV,
797798
};
798799

799800
STATIC OP *
@@ -851,6 +852,9 @@ THX_ck_entersub_pad_scalar(pTHX_ OP *entersubop, GV *namegv, SV *ckobj)
851852
padoff = pad_find_my_symbol_pvn (Perl_Symbol_Table_Scalar, namepv, namelen, SvUTF8(a1));
852853
break;
853854
}
855+
case PAD_FIND_MY_SYMBOL_SV: {
856+
padoff = pad_find_my_symbol_sv (Perl_Symbol_Table_Scalar, a1, 0);
857+
} break;
854858
default: croak("bad type value for pad_scalar()");
855859
}
856860
op_free(entersubop);
@@ -4388,6 +4392,7 @@ BOOT:
43884392
EXPORT_ENUM (stash, PAD_FIND_MY_SYMBOL_FOO);
43894393
EXPORT_ENUM (stash, PAD_FIND_MY_SYMBOL_PV);
43904394
EXPORT_ENUM (stash, PAD_FIND_MY_SYMBOL_PVN);
4395+
EXPORT_ENUM (stash, PAD_FIND_MY_SYMBOL_SV);
43914396
}
43924397

43934398
BOOT:

ext/XS-APItest/t/pad_scalar.t

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use warnings;
22
use strict;
33

4-
use Test::More tests => 113;
4+
use Test::More tests => 139;
55

66
use XS::APItest qw (
77
PAD_FINDMY_FOO
@@ -11,6 +11,7 @@ use XS::APItest qw (
1111
PAD_FIND_MY_SYMBOL_FOO
1212
PAD_FIND_MY_SYMBOL_PV
1313
PAD_FIND_MY_SYMBOL_PVN
14+
PAD_FIND_MY_SYMBOL_SV
1415
pad_scalar
1516
);
1617

@@ -21,12 +22,14 @@ is pad_scalar (PAD_FINDMY_FOO, "foo"), "NOT_IN_PAD", q (undeclared '$foo
2122
is pad_scalar (PAD_FIND_MY_SYMBOL_FOO, "foo"), "NOT_IN_PAD", q (undeclared '$foo'; pad_find_my_symbol_pvs ());
2223
is pad_scalar (PAD_FIND_MY_SYMBOL_PV, "foo"), "NOT_IN_PAD", q (undeclared '$foo'; pad_find_my_symbol_pv ());
2324
is pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "foo"), "NOT_IN_PAD", q (undeclared '$foo'; pad_find_my_symbol_pvn ());
25+
is pad_scalar (PAD_FIND_MY_SYMBOL_SV, "foo"), "NOT_IN_PAD", q (undeclared '$foo'; pad_find_my_symbol_sv ());
2426

2527
is pad_scalar (PAD_FINDMY_SV, "bar"), "NOT_IN_PAD", q (undeclared '$bar'; pad_findmy_sv ());
2628
is pad_scalar (PAD_FINDMY_PVN, "bar"), "NOT_IN_PAD", q (undeclared '$bar'; pad_findmy_pvn ());
2729
is pad_scalar (PAD_FINDMY_PV, "bar"), "NOT_IN_PAD", q (undeclared '$bar'; pad_findmy_pv ());
2830
is pad_scalar (PAD_FIND_MY_SYMBOL_PV, "bar"), "NOT_IN_PAD", q (undeclared '$bar'; pad_find_my_symbol_pv ());
2931
is pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "bar"), "NOT_IN_PAD", q (undeclared '$bar'; pad_find_my_symbol_pvn ());
32+
is pad_scalar (PAD_FIND_MY_SYMBOL_SV, "bar"), "NOT_IN_PAD", q (undeclared '$bar'; pad_find_my_symbol_sv ());
3033

3134
our $foo = "wibble";
3235
my $bar = "wobble";
@@ -37,12 +40,14 @@ is pad_scalar (PAD_FINDMY_FOO, "foo"), "NOT_MY", q ('our $foo'; pad_find
3740
is pad_scalar (PAD_FIND_MY_SYMBOL_FOO, "foo"), "NOT_MY", q ('our $foo'; pad_find_my_symbol_pvs ());
3841
is pad_scalar (PAD_FIND_MY_SYMBOL_PV, "foo"), "NOT_MY", q ('our $foo'; pad_find_my_symbol_pv ());
3942
is pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "foo"), "NOT_MY", q ('our $foo'; pad_find_my_symbol_pvn ());
43+
is pad_scalar (PAD_FIND_MY_SYMBOL_SV, "foo"), "NOT_MY", q ('our $foo'; pad_find_my_symbol_sv ());
4044

4145
is pad_scalar (PAD_FINDMY_SV, "bar"), "wobble", q ('my $bar'; pad_findmy_sv ());
4246
is pad_scalar (PAD_FINDMY_PVN, "bar"), "wobble", q ('my $bar'; pad_findmy_pvn ());
4347
is pad_scalar (PAD_FINDMY_PV, "bar"), "wobble", q ('my $bar'; pad_findmy_pv ());
4448
is pad_scalar (PAD_FIND_MY_SYMBOL_PV, "bar"), "wobble", q ('my $bar'; pad_find_my_symbol_pv ());
4549
is pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "bar"), "wobble", q ('my $bar'; pad_find_my_symbol_pvn ());
50+
is pad_scalar (PAD_FIND_MY_SYMBOL_SV, "bar"), "wobble", q ('my $bar'; pad_find_my_symbol_sv ());
4651

4752
sub aa($);
4853
sub aa($) {
@@ -57,6 +62,7 @@ sub aa($) {
5762
ok \pad_scalar (PAD_FINDMY_PV, "xyz") == \$xyz, $prefix . q (private variable; pad_findmy_pv ());
5863
ok \pad_scalar (PAD_FIND_MY_SYMBOL_PV, "xyz") == \$xyz, $prefix . q (private variable; pad_find_my_symbol_pv ());
5964
ok \pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "xyz") == \$xyz, $prefix . q (private variable; pad_find_my_symbol_pvn ());
65+
ok \pad_scalar (PAD_FIND_MY_SYMBOL_SV, "xyz") == \$xyz, $prefix . q (private variable; pad_find_my_symbol_sv ());
6066

6167
if ($_[0]) {
6268
aa(0); # recursive call
@@ -65,13 +71,15 @@ sub aa($) {
6571
ok \pad_scalar (PAD_FINDMY_PV, "xyz") == \$xyz, q (private variable (after recursive call); pad_findmy_pv ());
6672
ok \pad_scalar (PAD_FIND_MY_SYMBOL_PV, "xyz") == \$xyz, q (private variable (after recursive call); pad_find_my_symbol_pv ());
6773
ok \pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "xyz") == \$xyz, q (private variable (after recursive call); pad_find_my_symbol_pvn ());
74+
ok \pad_scalar (PAD_FIND_MY_SYMBOL_SV, "xyz") == \$xyz, q (private variable (after recursive call); pad_find_my_symbol_sv ());
6875
}
6976

7077
is pad_scalar (PAD_FINDMY_SV, "bar"), "wobble", $prefix . q (Global 'my $bar'; pad_findmy_sv ());
7178
is pad_scalar (PAD_FINDMY_PVN, "bar"), "wobble", $prefix . q (Global 'my $bar'; pad_findmy_pvn ());
7279
is pad_scalar (PAD_FINDMY_PV, "bar"), "wobble", $prefix . q (Global 'my $bar'; pad_findmy_pv ());
7380
is pad_scalar (PAD_FIND_MY_SYMBOL_PV, "bar"), "wobble", $prefix . q (Global 'my $bar'; pad_find_my_symbol_pv ());
7481
is pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "bar"), "wobble", $prefix . q (Global 'my $bar'; pad_find_my_symbol_pvn ());
82+
is pad_scalar (PAD_FIND_MY_SYMBOL_SV, "bar"), "wobble", $prefix . q (Global 'my $bar'; pad_find_my_symbol_sv ());
7583
}
7684

7785
aa(1);
@@ -82,14 +90,15 @@ sub bb() {
8290
my $counter = 0;
8391
my $foo = \$counter;
8492
return sub {
85-
ok pad_scalar (PAD_FINDMY_SV, "foo") == \pad_scalar (PAD_FINDMY_SV, "counter");
86-
ok pad_scalar (PAD_FINDMY_PVN, "foo") == \pad_scalar (PAD_FINDMY_SV, "counter");
87-
ok pad_scalar (PAD_FINDMY_PV, "foo") == \pad_scalar (PAD_FINDMY_SV, "counter");
88-
ok pad_scalar (PAD_FINDMY_FOO, "foo") == \pad_scalar (PAD_FINDMY_SV, "counter");
89-
ok pad_scalar (PAD_FIND_MY_SYMBOL_PV, "foo") == \pad_scalar (PAD_FINDMY_SV, "counter");
90-
ok pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "foo") == \pad_scalar (PAD_FINDMY_SV, "counter");
93+
ok pad_scalar (PAD_FINDMY_SV, "foo") == \pad_scalar(PAD_FINDMY_SV, "counter");
94+
ok pad_scalar (PAD_FINDMY_PVN, "foo") == \pad_scalar(PAD_FINDMY_SV, "counter");
95+
ok pad_scalar (PAD_FINDMY_PV, "foo") == \pad_scalar(PAD_FINDMY_SV, "counter");
96+
ok pad_scalar (PAD_FINDMY_FOO, "foo") == \pad_scalar(PAD_FINDMY_SV, "counter");
97+
ok pad_scalar (PAD_FIND_MY_SYMBOL_PV, "foo") == \pad_scalar(PAD_FINDMY_SV, "counter");
98+
ok pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "foo") == \pad_scalar(PAD_FINDMY_SV, "counter");
99+
ok pad_scalar (PAD_FIND_MY_SYMBOL_SV, "foo") == \pad_scalar(PAD_FINDMY_SV, "counter");
91100

92-
my $modulus = pad_scalar (PAD_FINDMY_SV, "counter") % 5;
101+
my $modulus = pad_scalar (PAD_FINDMY_SV, "counter") % 6;
93102

94103
return pad_scalar (PAD_FINDMY_SV, "counter")++
95104
if $modulus == 0;
@@ -103,8 +112,11 @@ sub bb() {
103112
return pad_scalar (PAD_FIND_MY_SYMBOL_PV, "counter")++
104113
if $modulus == 3;
105114

115+
return pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "counter")++
116+
if $modulus == 4;
117+
106118
$all_increment_called = 1;
107-
return pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "counter")++;
119+
return pad_scalar (PAD_FIND_MY_SYMBOL_SV, "counter")++;
108120
};
109121
}
110122
my $a = bb();
@@ -117,6 +129,7 @@ is $b->(), 0;
117129
is $b->(), 1;
118130
is $a->(), 4;
119131
is $b->(), 2;
132+
is $a->(), 5;
120133

121134
ok $all_increment_called, q (all pad scalar methods called for increment);
122135

@@ -127,5 +140,6 @@ is pad_scalar (PAD_FINDMY_FOO, "foo"), "NOT_MY", q ('my $foo' still unde
127140
is pad_scalar (PAD_FIND_MY_SYMBOL_FOO, "foo"), "NOT_MY", q ('my $foo' still undeclared; pad_find_my_symbol_pvs ());
128141
is pad_scalar (PAD_FIND_MY_SYMBOL_PV, "foo"), "NOT_MY", q ('my $foo' still undeclared; pad_find_my_symbol_pv ());
129142
is pad_scalar (PAD_FIND_MY_SYMBOL_PVN, "foo"), "NOT_MY", q ('my $foo' still undeclared; pad_find_my_symbol_pvn ());
143+
is pad_scalar (PAD_FIND_MY_SYMBOL_SV, "foo"), "NOT_MY", q ('my $foo' still undeclared; pad_find_my_symbol_sv ());
130144

131145
1;

pad.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,7 @@ C<flags> is reserved and must be zero.
10381038
=for apidoc pad_find_my_symbol_pv
10391039
=for apidoc_item pad_find_my_symbol_pvn
10401040
=for apidoc_item pad_find_my_symbol_pvs
1041+
=for apidoc_item pad_find_my_symbol_sv
10411042
10421043
Similar to C<pad_findmy_pv> but with explicit symbol table parameter.
10431044
@@ -1052,6 +1053,10 @@ Similar to C<pad_findmy_pv> but with explicit symbol table parameter.
10521053
pad_findmy_pvs ("$self", 0);
10531054
pad_find_my_symbol_pvs (Perl_Symbol_Scalar, "self", 0);
10541055
1056+
// sv (string) means SV * with context "string"
1057+
pad_findmy_sv (sv ("$self"), 0);
1058+
pad_find_my_symbol_pvs (Perl_Symbol_Scalar, sv ("self"), 0);
1059+
10551060
=cut
10561061
*/
10571062

@@ -1147,6 +1152,21 @@ Perl_pad_findmy_sv(pTHX_ SV *name, U32 flags)
11471152
return pad_find_my_symbol_pvn (*namepv, namepv + 1, namelen - 1, flags);
11481153
}
11491154

1155+
PADOFFSET
1156+
Perl_pad_find_my_symbol_sv(
1157+
pTHX_
1158+
perl_symbol_table_id find_symbol_table,
1159+
SV * name,
1160+
U32 flags
1161+
)
1162+
{
1163+
char *namepv;
1164+
STRLEN namelen;
1165+
PERL_ARGS_ASSERT_PAD_FIND_MY_SYMBOL_SV;
1166+
namepv = SvPVutf8(name, namelen);
1167+
return pad_find_my_symbol_pvn (find_symbol_table, namepv, namelen, flags);
1168+
}
1169+
11501170
/*
11511171
=for apidoc find_rundefsv
11521172

proto.h

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)