| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Constant::Export::Lazy; |
|
2
|
|
|
|
|
|
|
BEGIN { |
|
3
|
7
|
|
|
7
|
|
34300
|
$Constant::Export::Lazy::AUTHORITY = 'cpan:AVAR'; |
|
4
|
|
|
|
|
|
|
} |
|
5
|
|
|
|
|
|
|
{ |
|
6
|
|
|
|
|
|
|
$Constant::Export::Lazy::VERSION = '0.15'; |
|
7
|
|
|
|
|
|
|
} |
|
8
|
7
|
|
|
7
|
|
169
|
use 5.006; |
|
|
7
|
|
|
|
|
16
|
|
|
9
|
7
|
|
|
7
|
|
21
|
use strict; |
|
|
7
|
|
|
|
|
7
|
|
|
|
7
|
|
|
|
|
112
|
|
|
10
|
7
|
|
|
7
|
|
20
|
use warnings; |
|
|
7
|
|
|
|
|
5
|
|
|
|
7
|
|
|
|
|
149
|
|
|
11
|
7
|
|
|
7
|
|
17
|
use warnings FATAL => "recursion"; |
|
|
7
|
|
|
|
|
8
|
|
|
|
7
|
|
|
|
|
1011
|
|
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
our $_CALL_SHOULD_ALIAS_FROM_TO = {}; |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
sub import { |
|
16
|
14
|
|
|
14
|
|
1069
|
my ($class, %args) = @_; |
|
17
|
14
|
|
|
|
|
25
|
my $caller = caller; |
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
# Are we wrapping an existing import subroutine? |
|
20
|
|
|
|
|
|
|
my $wrap_existing_import = ( |
|
21
|
|
|
|
|
|
|
exists $args{options} |
|
22
|
|
|
|
|
|
|
? exists $args{options}->{wrap_existing_import} |
|
23
|
|
|
|
|
|
|
? $args{options}->{wrap_existing_import} |
|
24
|
|
|
|
|
|
|
: undef |
|
25
|
|
|
|
|
|
|
: undef |
|
26
|
14
|
100
|
|
|
|
38
|
); |
|
|
|
100
|
|
|
|
|
|
|
27
|
14
|
|
|
|
|
101
|
my $existing_import = $caller->can("import"); |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
# Sanity check whether we do or don't have an existing 'import' |
|
30
|
|
|
|
|
|
|
# sub with the wrap_existing_import option: |
|
31
|
14
|
100
|
|
|
|
24
|
if ($wrap_existing_import) { |
|
32
|
4
|
100
|
|
|
|
18
|
die "PANIC: We need an existing 'import' with the wrap_existing_import option" unless $existing_import; |
|
33
|
|
|
|
|
|
|
} else { |
|
34
|
10
|
100
|
|
|
|
27
|
die "PANIC: We're trying to clobber an existing 'import' subroutine without having the 'wrap_existing_import' option" if $existing_import; |
|
35
|
|
|
|
|
|
|
} |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
# Munge the %args we're given so users can be lazy and give sub { |
|
38
|
|
|
|
|
|
|
# ... } as the value for the constants, but internally we support |
|
39
|
|
|
|
|
|
|
# them being a HashRef with options for each one. Allows us to be |
|
40
|
|
|
|
|
|
|
# lazy later by flattening this whole thing now. |
|
41
|
12
|
|
|
|
|
28
|
my $normalized_args = _normalize_arguments(%args); |
|
42
|
10
|
|
|
|
|
13
|
my $constants = $normalized_args->{constants}; |
|
43
|
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
# This is a callback that can be used to munge the import list, to |
|
45
|
|
|
|
|
|
|
# e.g. provide a facility to provide import tags. |
|
46
|
|
|
|
|
|
|
my $buildargs = ( |
|
47
|
|
|
|
|
|
|
exists $args{options} |
|
48
|
|
|
|
|
|
|
? exists $args{options}->{buildargs} |
|
49
|
|
|
|
|
|
|
? $args{options}->{buildargs} |
|
50
|
|
|
|
|
|
|
: undef |
|
51
|
|
|
|
|
|
|
: undef |
|
52
|
10
|
100
|
|
|
|
28
|
); |
|
|
|
100
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
|
|
54
|
7
|
|
|
7
|
|
25
|
no strict 'refs'; |
|
|
7
|
|
|
|
|
7
|
|
|
|
7
|
|
|
|
|
181
|
|
|
55
|
7
|
|
|
7
|
|
22
|
no warnings 'redefine'; # In case of $wrap_existing_import |
|
|
7
|
|
|
|
|
8
|
|
|
|
7
|
|
|
|
|
241
|
|
|
56
|
10
|
|
|
|
|
35
|
*{$caller . '::import'} = sub { |
|
57
|
7
|
|
|
7
|
|
19
|
use strict; |
|
|
7
|
|
|
|
|
5
|
|
|
|
7
|
|
|
|
|
110
|
|
|
58
|
7
|
|
|
7
|
|
18
|
use warnings; |
|
|
7
|
|
|
|
|
7
|
|
|
|
7
|
|
|
|
|
4960
|
|
|
59
|
|
|
|
|
|
|
|
|
60
|
21
|
|
|
21
|
|
47890
|
my (undef, @gimme) = @_; |
|
61
|
21
|
|
|
|
|
32
|
my $pkg_importer = caller; |
|
62
|
|
|
|
|
|
|
|
|
63
|
21
|
|
|
|
|
101
|
my $ctx = bless { |
|
64
|
|
|
|
|
|
|
constants => $constants, |
|
65
|
|
|
|
|
|
|
pkg_importer => $pkg_importer, |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
# Note that when unpacking @_ above we threw away the |
|
68
|
|
|
|
|
|
|
# package we're imported as from the user's perspective |
|
69
|
|
|
|
|
|
|
# and are using our "real" calling package for $pkg_stash |
|
70
|
|
|
|
|
|
|
# instead. |
|
71
|
|
|
|
|
|
|
# |
|
72
|
|
|
|
|
|
|
# This is because if we have a My::Constants package as |
|
73
|
|
|
|
|
|
|
# $caller but someone subclasses My::Constants for |
|
74
|
|
|
|
|
|
|
# whatever reason as say My::Constants::Subclass we don't |
|
75
|
|
|
|
|
|
|
# want to be sticking generated subroutines in both the |
|
76
|
|
|
|
|
|
|
# My::Constants and My::Constants::Subclass namespaces. |
|
77
|
|
|
|
|
|
|
# |
|
78
|
|
|
|
|
|
|
# This is because we want to guarantee that we only ever |
|
79
|
|
|
|
|
|
|
# call each generator subroutine once, even in the face of |
|
80
|
|
|
|
|
|
|
# subclassing. Maybe I should lift this restriction or |
|
81
|
|
|
|
|
|
|
# make it an option, e.g. if you want to have a constant |
|
82
|
|
|
|
|
|
|
# for "when I was compiled" it would be useful if |
|
83
|
|
|
|
|
|
|
# subclassing actually re-generated constants. |
|
84
|
|
|
|
|
|
|
pkg_stash => $caller, |
|
85
|
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
# If we're not wrapping an existing import subroutine we |
|
87
|
|
|
|
|
|
|
# don't need to bend over backwards to support constants |
|
88
|
|
|
|
|
|
|
# generated by e.g. constant.pm, we know we've made all |
|
89
|
|
|
|
|
|
|
# the constants in the package to our liking. |
|
90
|
|
|
|
|
|
|
wrap_existing_import => $wrap_existing_import, |
|
91
|
|
|
|
|
|
|
} => 'Constant::Export::Lazy::Ctx'; |
|
92
|
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
# We've been provided with a callback to be used to munge |
|
94
|
|
|
|
|
|
|
# whatever we actually got provided with in @gimme to a list |
|
95
|
|
|
|
|
|
|
# of constants, or if $wrap_existing_import is enabled any |
|
96
|
|
|
|
|
|
|
# leftover non-$gimme names it's going to handle. |
|
97
|
21
|
100
|
|
|
|
57
|
if ($buildargs) { |
|
98
|
4
|
|
|
|
|
6
|
my @overriden_gimme = $buildargs->(\@gimme, $constants); |
|
99
|
4
|
100
|
|
|
|
152
|
die "PANIC: We only support subs that return zero or one values with buildargs, yours returns " . @overriden_gimme . " values" |
|
100
|
|
|
|
|
|
|
if @overriden_gimme > 1; |
|
101
|
3
|
100
|
|
|
|
12
|
@gimme = @{$overriden_gimme[0]} if @overriden_gimme; |
|
|
2
|
|
|
|
|
9
|
|
|
102
|
|
|
|
|
|
|
} |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
# Just doing ->call() like you would when you're using the API |
|
105
|
|
|
|
|
|
|
# will fleshen the constant, do this for all the constants |
|
106
|
|
|
|
|
|
|
# we've been requested to export. |
|
107
|
20
|
|
|
|
|
24
|
my @leftover_gimme; |
|
108
|
20
|
|
|
|
|
29
|
for my $gimme (@gimme) { |
|
109
|
106
|
100
|
|
|
|
166
|
if (exists $constants->{$gimme}) { |
|
|
|
100
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
# We only want to alias constants into the importer's |
|
111
|
|
|
|
|
|
|
# package if the constant is on the import list, not |
|
112
|
|
|
|
|
|
|
# if it's just needed within some $ctx->call() when |
|
113
|
|
|
|
|
|
|
# defining another constant. |
|
114
|
|
|
|
|
|
|
# |
|
115
|
|
|
|
|
|
|
# To disambiguate these two cases we maintain a |
|
116
|
|
|
|
|
|
|
# globally dynamically scoped variable with the |
|
117
|
|
|
|
|
|
|
# constants that have been requested, and we note |
|
118
|
|
|
|
|
|
|
# who've they've been requested by. |
|
119
|
98
|
|
|
|
|
140
|
local $_CALL_SHOULD_ALIAS_FROM_TO->{$pkg_importer}->{$gimme} = undef; |
|
120
|
|
|
|
|
|
|
|
|
121
|
98
|
|
|
|
|
128
|
$ctx->call($gimme); |
|
122
|
|
|
|
|
|
|
} elsif ($wrap_existing_import) { |
|
123
|
|
|
|
|
|
|
# We won't even die on $wrap_existing_import if that |
|
124
|
|
|
|
|
|
|
# importer doesn't know about this $gimme, but |
|
125
|
|
|
|
|
|
|
# hopefully they're just about to die with an error |
|
126
|
|
|
|
|
|
|
# similar to ours if they don't know about the |
|
127
|
|
|
|
|
|
|
# requested constant. |
|
128
|
7
|
|
|
|
|
10
|
push @leftover_gimme => $gimme; |
|
129
|
|
|
|
|
|
|
} else { |
|
130
|
1
|
|
|
|
|
9
|
die "PANIC: We don't have the constant '$gimme' to export to you"; |
|
131
|
|
|
|
|
|
|
} |
|
132
|
|
|
|
|
|
|
} |
|
133
|
|
|
|
|
|
|
|
|
134
|
16
|
100
|
100
|
|
|
55
|
if ($wrap_existing_import and @leftover_gimme) { |
|
135
|
|
|
|
|
|
|
# Because if we want to eliminate a stack frame *AND* only |
|
136
|
|
|
|
|
|
|
# dispatch to this for some things we have to partition |
|
137
|
|
|
|
|
|
|
# the import list into shit we can handle and shit we |
|
138
|
|
|
|
|
|
|
# can't. The list of things we're making the function |
|
139
|
|
|
|
|
|
|
# we're overriding handle is @leftover_gimme. |
|
140
|
4
|
|
|
|
|
9
|
@_ = ($caller, @leftover_gimme); |
|
141
|
4
|
|
|
|
|
1521
|
goto &$existing_import; |
|
142
|
|
|
|
|
|
|
} |
|
143
|
|
|
|
|
|
|
|
|
144
|
12
|
|
|
|
|
2372
|
return; |
|
145
|
10
|
|
|
|
|
43
|
}; |
|
146
|
|
|
|
|
|
|
|
|
147
|
10
|
|
|
|
|
287
|
return; |
|
148
|
|
|
|
|
|
|
} |
|
149
|
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
sub _normalize_arguments { |
|
151
|
12
|
|
|
12
|
|
21
|
my (%args) = @_; |
|
152
|
|
|
|
|
|
|
|
|
153
|
12
|
100
|
|
|
|
12
|
my %default_options = %{ $args{options} || {} }; |
|
|
12
|
|
|
|
|
60
|
|
|
154
|
12
|
|
|
|
|
17
|
my $constants = $args{constants}; |
|
155
|
12
|
|
|
|
|
10
|
my %new_constants; |
|
156
|
12
|
|
|
|
|
31
|
for my $constant_name (keys %$constants) { |
|
157
|
102
|
|
|
|
|
72
|
my $value = $constants->{$constant_name}; |
|
158
|
102
|
100
|
|
|
|
140
|
if (ref $value eq 'CODE') { |
|
|
|
100
|
|
|
|
|
|
|
159
|
61
|
|
|
|
|
112
|
$new_constants{$constant_name} = { |
|
160
|
|
|
|
|
|
|
call => $value, |
|
161
|
|
|
|
|
|
|
options => \%default_options, |
|
162
|
|
|
|
|
|
|
}; |
|
163
|
|
|
|
|
|
|
} elsif (ref $value eq 'HASH') { |
|
164
|
|
|
|
|
|
|
$new_constants{$constant_name} = { |
|
165
|
|
|
|
|
|
|
call => $value->{call}, |
|
166
|
|
|
|
|
|
|
options => { |
|
167
|
|
|
|
|
|
|
%default_options, |
|
168
|
39
|
100
|
|
|
|
34
|
%{ $value->{options} || {} }, |
|
|
39
|
|
|
|
|
143
|
|
|
169
|
|
|
|
|
|
|
}, |
|
170
|
|
|
|
|
|
|
}; |
|
171
|
|
|
|
|
|
|
} else { |
|
172
|
2
|
|
100
|
|
|
20
|
die sprintf "PANIC: The constant <$constant_name> has some value type we don't know about (ref = %s)", |
|
173
|
|
|
|
|
|
|
ref $value || 'Undef'; |
|
174
|
|
|
|
|
|
|
} |
|
175
|
|
|
|
|
|
|
} |
|
176
|
|
|
|
|
|
|
|
|
177
|
10
|
|
|
|
|
16
|
$args{constants} = \%new_constants; |
|
178
|
|
|
|
|
|
|
|
|
179
|
10
|
|
|
|
|
19
|
return \%args; |
|
180
|
|
|
|
|
|
|
} |
|
181
|
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
our $_GETTING_VALUE_FOR_OVERRIDE = {}; |
|
183
|
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
sub Constant::Export::Lazy::Ctx::call { |
|
185
|
227
|
|
|
227
|
|
646
|
my ($ctx, $gimme) = @_; |
|
186
|
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
# Unpack our options |
|
188
|
227
|
|
|
|
|
241
|
my $pkg_importer = $ctx->{pkg_importer}; |
|
189
|
227
|
|
|
|
|
167
|
my $pkg_stash = $ctx->{pkg_stash}; |
|
190
|
227
|
|
|
|
|
146
|
my $constants = $ctx->{constants}; |
|
191
|
227
|
|
|
|
|
147
|
my $wrap_existing_import = $ctx->{wrap_existing_import}; |
|
192
|
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
# Unless we're wrapping an existing import ->call($gimme) should |
|
194
|
|
|
|
|
|
|
# always be called with a $gimme that we know about. |
|
195
|
227
|
100
|
|
|
|
318
|
unless (exists $constants->{$gimme}) { |
|
196
|
18
|
100
|
|
|
|
30
|
die "PANIC: You're trying to get the value of an unknown constant ($gimme), and wrap_existing_import isn't set" unless $wrap_existing_import; |
|
197
|
|
|
|
|
|
|
} |
|
198
|
|
|
|
|
|
|
|
|
199
|
226
|
|
|
|
|
142
|
my ($private_name, $glob_name, $alias_as); |
|
200
|
|
|
|
|
|
|
my $make_private_glob_and_alias_name = sub { |
|
201
|
|
|
|
|
|
|
# Checking "exists $constants->{$gimme}" here to avoid |
|
202
|
|
|
|
|
|
|
# autovivification would be redundant since we won't call this |
|
203
|
|
|
|
|
|
|
# if $wrap_existing_import is true, otherwise |
|
204
|
|
|
|
|
|
|
# $constants->{$gimme} is guaranteed to exist. See the |
|
205
|
|
|
|
|
|
|
# assertion just a few lines above this code. |
|
206
|
|
|
|
|
|
|
# |
|
207
|
|
|
|
|
|
|
# If $wrap_existing_import is true and we're handling a |
|
208
|
|
|
|
|
|
|
# constant we don't know about we'll have called the import() |
|
209
|
|
|
|
|
|
|
# we're wrapping, or we're being called from ->call(), in |
|
210
|
|
|
|
|
|
|
# which case we won't be calling this sub unless |
|
211
|
|
|
|
|
|
|
# $constants->{$gimme} exists. |
|
212
|
|
|
|
|
|
|
$private_name = exists $constants->{$gimme}->{options}->{private_name_munger} |
|
213
|
209
|
100
|
|
209
|
|
303
|
? $constants->{$gimme}->{options}->{private_name_munger}->($gimme) |
|
214
|
|
|
|
|
|
|
: $gimme; |
|
215
|
209
|
100
|
|
|
|
219
|
$private_name = defined $private_name ? $private_name : $gimme; |
|
216
|
209
|
|
|
|
|
293
|
$glob_name = "${pkg_stash}::${private_name}"; |
|
217
|
209
|
|
|
|
|
191
|
$alias_as = "${pkg_importer}::${gimme}"; |
|
218
|
209
|
|
|
|
|
151
|
return; |
|
219
|
226
|
|
|
|
|
501
|
}; |
|
220
|
|
|
|
|
|
|
|
|
221
|
226
|
|
|
|
|
159
|
my $value; |
|
222
|
226
|
100
|
100
|
|
|
478
|
if ($wrap_existing_import and not exists $constants->{$gimme}) { |
|
|
|
100
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
# This is in case $ctx->call() is used on a constant defined |
|
224
|
|
|
|
|
|
|
# by constant.pm. See the giant comment about constant.pm |
|
225
|
|
|
|
|
|
|
# below. |
|
226
|
17
|
100
|
|
|
|
78
|
if (my $code = $pkg_stash->can($gimme)) { |
|
227
|
16
|
|
|
|
|
26
|
my @value = $code->(); |
|
228
|
16
|
100
|
|
|
|
52
|
die "PANIC: We only support subs that return one value with wrap_existing_import, $gimme returns " . @value . " values" if @value > 1; |
|
229
|
14
|
|
|
|
|
14
|
$value = $value[0]; |
|
230
|
|
|
|
|
|
|
} else { |
|
231
|
1
|
|
|
|
|
8
|
die "PANIC: We're trying to fallback to a constant we don't know about under wrap_existing_import, but $gimme has no symbol table entry"; |
|
232
|
|
|
|
|
|
|
} |
|
233
|
|
|
|
|
|
|
} elsif (do { |
|
234
|
|
|
|
|
|
|
# Check if this is a constant we've defined already, in which |
|
235
|
|
|
|
|
|
|
# case we can just return its value. |
|
236
|
|
|
|
|
|
|
# |
|
237
|
|
|
|
|
|
|
# If we got this far we know we're going to want to call |
|
238
|
|
|
|
|
|
|
# $make_private_glob_and_alias_name->(). It'll also be used by |
|
239
|
|
|
|
|
|
|
# the "else" branch below if we end up having to define this |
|
240
|
|
|
|
|
|
|
# constant. |
|
241
|
209
|
|
|
|
|
226
|
$make_private_glob_and_alias_name->(); |
|
242
|
|
|
|
|
|
|
|
|
243
|
209
|
|
|
|
|
643
|
$pkg_stash->can($private_name); |
|
244
|
|
|
|
|
|
|
}) { |
|
245
|
|
|
|
|
|
|
# This is for constants that *we've* previously defined, we'll |
|
246
|
|
|
|
|
|
|
# always use our own $private_name. |
|
247
|
6
|
|
|
|
|
15
|
$value = $pkg_stash->can($private_name)->(); |
|
248
|
|
|
|
|
|
|
} else { |
|
249
|
203
|
|
|
|
|
193
|
my $override = $constants->{$gimme}->{options}->{override}; |
|
250
|
203
|
|
|
|
|
168
|
my $stash = $constants->{$gimme}->{options}->{stash}; |
|
251
|
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
# Only pass the stash around if we actually have it. Note that |
|
253
|
|
|
|
|
|
|
# "delete local $ctx->{stash}" is a feature new in 5.12.0, so |
|
254
|
|
|
|
|
|
|
# we can't use it. See |
|
255
|
|
|
|
|
|
|
# http://perldoc.perl.org/5.12.0/perldelta.html#delete-local |
|
256
|
203
|
|
|
|
|
196
|
local $ctx->{stash} = $stash; |
|
257
|
203
|
100
|
|
|
|
311
|
delete $ctx->{stash} unless ref $stash; |
|
258
|
|
|
|
|
|
|
|
|
259
|
203
|
|
|
|
|
119
|
my @overriden_value; |
|
260
|
|
|
|
|
|
|
my $source; |
|
261
|
203
|
100
|
66
|
|
|
364
|
if ($override and |
|
|
|
|
100
|
|
|
|
|
|
262
|
|
|
|
|
|
|
not (exists $_GETTING_VALUE_FOR_OVERRIDE->{$pkg_importer} and |
|
263
|
|
|
|
|
|
|
exists $_GETTING_VALUE_FOR_OVERRIDE->{$pkg_importer}->{$gimme})) { |
|
264
|
27
|
|
|
|
|
30
|
local $_GETTING_VALUE_FOR_OVERRIDE->{$pkg_importer}->{$gimme} = undef; |
|
265
|
27
|
|
|
|
|
38
|
@overriden_value = $override->($ctx, $gimme); |
|
266
|
|
|
|
|
|
|
} |
|
267
|
203
|
100
|
|
|
|
353
|
if (@overriden_value) { |
|
268
|
7
|
100
|
|
|
|
21
|
die "PANIC: We should only get one value returned from the override callback" if @overriden_value > 1; |
|
269
|
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
# This whole single value as an array business is so we |
|
271
|
|
|
|
|
|
|
# can distinguish between "return;" meaning "I don't want |
|
272
|
|
|
|
|
|
|
# to override this" and "return undef;" meaning "I want to |
|
273
|
|
|
|
|
|
|
# override this, to undef". |
|
274
|
6
|
|
|
|
|
650
|
$source = 'override'; |
|
275
|
6
|
|
|
|
|
8
|
$value = $overriden_value[0]; |
|
276
|
|
|
|
|
|
|
} else { |
|
277
|
196
|
|
|
|
|
146
|
$source = 'callback'; |
|
278
|
196
|
|
|
|
|
483
|
$value = $constants->{$gimme}->{call}->($ctx); |
|
279
|
|
|
|
|
|
|
} |
|
280
|
|
|
|
|
|
|
|
|
281
|
102
|
100
|
66
|
|
|
405
|
unless (exists $_GETTING_VALUE_FOR_OVERRIDE->{$pkg_importer} and |
|
282
|
|
|
|
|
|
|
exists $_GETTING_VALUE_FOR_OVERRIDE->{$pkg_importer}->{$gimme}) { |
|
283
|
|
|
|
|
|
|
# Instead of doing `sub () { $value }` we could also |
|
284
|
|
|
|
|
|
|
# use the following trick that constant.pm uses if |
|
285
|
|
|
|
|
|
|
# it's true that `$] > 5.009002`: |
|
286
|
|
|
|
|
|
|
# |
|
287
|
|
|
|
|
|
|
# Internals::SvREADONLY($value, 1); |
|
288
|
|
|
|
|
|
|
# my $stash = \%{"$pkg_stash::"}; |
|
289
|
|
|
|
|
|
|
# $stash->{$gimme} = \$value; |
|
290
|
|
|
|
|
|
|
# |
|
291
|
|
|
|
|
|
|
# This would save some space for perl when producing |
|
292
|
|
|
|
|
|
|
# these inline constants. The reason I'm not doing |
|
293
|
|
|
|
|
|
|
# this is basically because it looks like evil |
|
294
|
|
|
|
|
|
|
# sorcery, and I don't want to go through the hassle |
|
295
|
|
|
|
|
|
|
# of efficiently and portibly invalidating the MRO |
|
296
|
|
|
|
|
|
|
# cache (see $flush_mro in constant.pm). |
|
297
|
|
|
|
|
|
|
# |
|
298
|
|
|
|
|
|
|
# Relevant commits in perl.git: |
|
299
|
|
|
|
|
|
|
# |
|
300
|
|
|
|
|
|
|
# * perl-5.005_02-225-g779c5bc - first core support |
|
301
|
|
|
|
|
|
|
# for these kinds of constants in the optree. |
|
302
|
|
|
|
|
|
|
# |
|
303
|
|
|
|
|
|
|
# * perl-5.9.2-1966-ge040ff7 - first use in constant.pm. |
|
304
|
|
|
|
|
|
|
# |
|
305
|
|
|
|
|
|
|
# * perl-5.9.2-1981-ge1234d8 - first attempts to |
|
306
|
|
|
|
|
|
|
# invalidate the method cache with |
|
307
|
|
|
|
|
|
|
# Internals::inc_sub_generation() |
|
308
|
|
|
|
|
|
|
# |
|
309
|
|
|
|
|
|
|
# * perl-5.9.4-1684-ge1a479c - |
|
310
|
|
|
|
|
|
|
# Internals::inc_sub_generation() in constant.pm |
|
311
|
|
|
|
|
|
|
# replaced with mro::method_changed_in($pkg) |
|
312
|
|
|
|
|
|
|
# |
|
313
|
|
|
|
|
|
|
# * perl-5.9.4-1714-g41892db - Now unused |
|
314
|
|
|
|
|
|
|
# Internals::inc_sub_generation() removed from the |
|
315
|
|
|
|
|
|
|
# core. |
|
316
|
|
|
|
|
|
|
# |
|
317
|
|
|
|
|
|
|
# * v5.10.0-3508-gf7fd265 (and v5.10.0-3523-g81a8de7) |
|
318
|
|
|
|
|
|
|
# - MRO cache is changed to be flushed after all |
|
319
|
|
|
|
|
|
|
# constants are defined. |
|
320
|
|
|
|
|
|
|
# |
|
321
|
|
|
|
|
|
|
# * v5.19.2-130-g94d5c17, v5.19.2-132-g6f1b3ab, |
|
322
|
|
|
|
|
|
|
# v5.19.2-133-g15635cb, v5.19.2-134-gf815dc1 - |
|
323
|
|
|
|
|
|
|
# Father Chrysostomos making various list constant |
|
324
|
|
|
|
|
|
|
# changes, backed out in v5.19.2-204-gf99a5f0 due to |
|
325
|
|
|
|
|
|
|
# perl #119045: |
|
326
|
|
|
|
|
|
|
# https://rt.perl.org/rt3/Public/Bug/Display.html?id=119045 |
|
327
|
|
|
|
|
|
|
# |
|
328
|
|
|
|
|
|
|
# So basically it looks like a huge can of worms that |
|
329
|
|
|
|
|
|
|
# I don't want to touch now. So just create constants |
|
330
|
|
|
|
|
|
|
# in the more portable and idiot-proof way instead so |
|
331
|
|
|
|
|
|
|
# I don't have to duplicate all the logic in |
|
332
|
|
|
|
|
|
|
# constant.pm |
|
333
|
|
|
|
|
|
|
{ |
|
334
|
|
|
|
|
|
|
# Make the disabling of strict have as small as scope |
|
335
|
|
|
|
|
|
|
# as possible. |
|
336
|
7
|
|
|
7
|
|
30
|
no strict 'refs'; |
|
|
7
|
|
|
|
|
12
|
|
|
|
7
|
|
|
|
|
895
|
|
|
|
97
|
|
|
|
|
66
|
|
|
337
|
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
# Future-proof against changes in perl that might not |
|
339
|
|
|
|
|
|
|
# optimize the constant sub if $value is used |
|
340
|
|
|
|
|
|
|
# elsewhere, we're passing it to the $after function |
|
341
|
|
|
|
|
|
|
# just below. See the "Is it time to separate pad |
|
342
|
|
|
|
|
|
|
# names from SVs?" thread on perl5-porters. |
|
343
|
97
|
|
|
|
|
77
|
my $value_copy = $value; |
|
344
|
97
|
|
|
0
|
|
493
|
*$glob_name = sub () { $value_copy }; |
|
|
0
|
|
|
|
|
0
|
|
|
345
|
|
|
|
|
|
|
} |
|
346
|
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
# Maybe we have a callback that wants to know when we define |
|
348
|
|
|
|
|
|
|
# our constants, e.g. for printing something out, keeping taps |
|
349
|
|
|
|
|
|
|
# of what constants we have etc. |
|
350
|
97
|
100
|
|
|
|
217
|
if (my $after = $constants->{$gimme}->{options}->{after}) { |
|
351
|
|
|
|
|
|
|
# Future-proof so we can do something clever with the |
|
352
|
|
|
|
|
|
|
# return value in the future if we want. |
|
353
|
26
|
|
|
|
|
32
|
my @ret = $after->($ctx, $gimme, $value, $source); |
|
354
|
26
|
100
|
|
|
|
127
|
die "PANIC: Don't return anything from 'after' routines" if @ret; |
|
355
|
|
|
|
|
|
|
} |
|
356
|
|
|
|
|
|
|
} |
|
357
|
|
|
|
|
|
|
} |
|
358
|
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
# So? What's this entire evil magic about? |
|
360
|
|
|
|
|
|
|
# |
|
361
|
|
|
|
|
|
|
# Early on in the history of this module I decided that everything |
|
362
|
|
|
|
|
|
|
# that needed to call or define a constant would just go through |
|
363
|
|
|
|
|
|
|
# $ctx->call($gimme), including things called via the import(). |
|
364
|
|
|
|
|
|
|
# |
|
365
|
|
|
|
|
|
|
# This makes some parts of this module much simpler, since we |
|
366
|
|
|
|
|
|
|
# don't have e.g. a $ctx->call_and_intern($gimme) to define |
|
367
|
|
|
|
|
|
|
# constants for the first time, v.s. a |
|
368
|
|
|
|
|
|
|
# $ctx->get_interned_value($gimme). We just have one |
|
369
|
|
|
|
|
|
|
# $ctx->call($gimme) that DWYM. You just request a value, it does |
|
370
|
|
|
|
|
|
|
# the right thing, and you don't have to worry about it. |
|
371
|
|
|
|
|
|
|
# |
|
372
|
|
|
|
|
|
|
# However, we have to worry about the following cases: |
|
373
|
|
|
|
|
|
|
# |
|
374
|
|
|
|
|
|
|
# * Someone in "user" imports YourExporter::CONSTANT, we define |
|
375
|
|
|
|
|
|
|
# YourExporter::CONSTANT and alias user::CONSTANT to it. Easy, |
|
376
|
|
|
|
|
|
|
# this is the common case. |
|
377
|
|
|
|
|
|
|
# |
|
378
|
|
|
|
|
|
|
# * Ditto, but YourExporter::CONSTANT needs to get the value of |
|
379
|
|
|
|
|
|
|
# YourExporter::CONSTANT_NESTED to define its own value, we want |
|
380
|
|
|
|
|
|
|
# to export YourExporter::CONSTANT to user::CONSTANT but *NOT* |
|
381
|
|
|
|
|
|
|
# YourExporter::CONSTANT_NESTED. We don't want to leak dependent |
|
382
|
|
|
|
|
|
|
# constants like that. |
|
383
|
|
|
|
|
|
|
# |
|
384
|
|
|
|
|
|
|
# * The "user" imports YourExporter::CONSTANT, this in turns needs |
|
385
|
|
|
|
|
|
|
# to call Some::Module::function() and Some::Module::function() |
|
386
|
|
|
|
|
|
|
# needs YourExporter::UNRELATED_CONSTANT |
|
387
|
|
|
|
|
|
|
# |
|
388
|
|
|
|
|
|
|
# * When we're in the "override" callback for |
|
389
|
|
|
|
|
|
|
# YourExporter::CONSTANT we don't want to intern |
|
390
|
|
|
|
|
|
|
# YourExporter::CONSTANT, but if we call some unrelated |
|
391
|
|
|
|
|
|
|
# YourExporter::ANOTHER_CONSTANT while in the override we want |
|
392
|
|
|
|
|
|
|
# to intern (but not export!) that value. |
|
393
|
|
|
|
|
|
|
# |
|
394
|
|
|
|
|
|
|
# So to do all this we're tracking on a per importer/constant pair |
|
395
|
|
|
|
|
|
|
# basis who requested what during import()-time, and whether we're |
|
396
|
|
|
|
|
|
|
# currently in the scope of an "override" for a given constant. |
|
397
|
121
|
100
|
66
|
|
|
489
|
if (not (exists $_GETTING_VALUE_FOR_OVERRIDE->{$pkg_importer} and |
|
|
|
|
66
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
398
|
|
|
|
|
|
|
exists $_GETTING_VALUE_FOR_OVERRIDE->{$pkg_importer}->{$gimme}) and |
|
399
|
|
|
|
|
|
|
exists $_CALL_SHOULD_ALIAS_FROM_TO->{$pkg_importer} and |
|
400
|
|
|
|
|
|
|
exists $_CALL_SHOULD_ALIAS_FROM_TO->{$pkg_importer}->{$gimme}) { |
|
401
|
7
|
|
|
7
|
|
27
|
no strict 'refs'; |
|
|
7
|
|
|
|
|
7
|
|
|
|
7
|
|
|
|
|
955
|
|
|
402
|
|
|
|
|
|
|
# Alias e.g. user::CONSTANT to YourExporter::CONSTANT (well, |
|
403
|
|
|
|
|
|
|
# actually YourExporter::$private_name) |
|
404
|
95
|
|
|
|
|
312
|
*$alias_as = \&$glob_name; |
|
405
|
|
|
|
|
|
|
} |
|
406
|
|
|
|
|
|
|
|
|
407
|
121
|
|
|
|
|
384
|
return $value; |
|
408
|
|
|
|
|
|
|
} |
|
409
|
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
sub Constant::Export::Lazy::Ctx::stash { |
|
411
|
9
|
|
|
9
|
|
25
|
my ($ctx) = @_; |
|
412
|
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
# We used to die here when no $ctx->{stash} existed, but that |
|
414
|
|
|
|
|
|
|
# makes e.g. having a global "after" callback tedious. Just return |
|
415
|
|
|
|
|
|
|
# undef instead so we can do things like: |
|
416
|
|
|
|
|
|
|
# |
|
417
|
|
|
|
|
|
|
# if (defined(my $stash = $ctx->stash)) { ... } |
|
418
|
|
|
|
|
|
|
# |
|
419
|
9
|
|
|
|
|
15
|
return $ctx->{stash}; |
|
420
|
|
|
|
|
|
|
} |
|
421
|
|
|
|
|
|
|
|
|
422
|
|
|
|
|
|
|
1; |
|
423
|
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
__END__ |