line |
stmt |
bran |
cond |
sub |
time |
code |
1
|
|
|
|
|
|
/* pp_hot.c |
2
|
|
|
|
|
|
* |
3
|
|
|
|
|
|
* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, |
4
|
|
|
|
|
|
* 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others |
5
|
|
|
|
|
|
* |
6
|
|
|
|
|
|
* You may distribute under the terms of either the GNU General Public |
7
|
|
|
|
|
|
* License or the Artistic License, as specified in the README file. |
8
|
|
|
|
|
|
* |
9
|
|
|
|
|
|
*/ |
10
|
|
|
|
|
|
|
11
|
|
|
|
|
|
/* |
12
|
|
|
|
|
|
* Then he heard Merry change the note, and up went the Horn-cry of Buckland, |
13
|
|
|
|
|
|
* shaking the air. |
14
|
|
|
|
|
|
* |
15
|
|
|
|
|
|
* Awake! Awake! Fear, Fire, Foes! Awake! |
16
|
|
|
|
|
|
* Fire, Foes! Awake! |
17
|
|
|
|
|
|
* |
18
|
|
|
|
|
|
* [p.1007 of _The Lord of the Rings_, VI/viii: "The Scouring of the Shire"] |
19
|
|
|
|
|
|
*/ |
20
|
|
|
|
|
|
|
21
|
|
|
|
|
|
/* This file contains 'hot' pp ("push/pop") functions that |
22
|
|
|
|
|
|
* execute the opcodes that make up a perl program. A typical pp function |
23
|
|
|
|
|
|
* expects to find its arguments on the stack, and usually pushes its |
24
|
|
|
|
|
|
* results onto the stack, hence the 'pp' terminology. Each OP structure |
25
|
|
|
|
|
|
* contains a pointer to the relevant pp_foo() function. |
26
|
|
|
|
|
|
* |
27
|
|
|
|
|
|
* By 'hot', we mean common ops whose execution speed is critical. |
28
|
|
|
|
|
|
* By gathering them together into a single file, we encourage |
29
|
|
|
|
|
|
* CPU cache hits on hot code. Also it could be taken as a warning not to |
30
|
|
|
|
|
|
* change any code in this file unless you're sure it won't affect |
31
|
|
|
|
|
|
* performance. |
32
|
|
|
|
|
|
*/ |
33
|
|
|
|
|
|
|
34
|
|
|
|
|
|
#include "EXTERN.h" |
35
|
|
|
|
|
|
#define PERL_IN_PP_HOT_C |
36
|
|
|
|
|
|
#include "perl.h" |
37
|
|
|
|
|
|
|
38
|
|
|
|
|
|
/* Hot code. */ |
39
|
|
|
|
|
|
|
40
|
1625713949
|
|
|
|
|
PP(pp_const) |
41
|
|
|
|
|
|
{ |
42
|
|
|
|
|
|
dVAR; |
43
|
1625713949
|
|
|
|
|
dSP; |
44
|
1625713949
|
100
|
|
|
|
XPUSHs(cSVOP_sv); |
45
|
1625713949
|
|
|
|
|
RETURN; |
46
|
|
|
|
|
|
} |
47
|
|
|
|
|
|
|
48
|
2570688099
|
|
|
|
|
PP(pp_nextstate) |
49
|
|
|
|
|
|
{ |
50
|
|
|
|
|
|
dVAR; |
51
|
2570688099
|
|
|
|
|
PL_curcop = (COP*)PL_op; |
52
|
2570688099
|
|
|
|
|
TAINT_NOT; /* Each statement is presumed innocent */ |
53
|
2570688099
|
|
|
|
|
PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp; |
54
|
2570688099
|
100
|
|
|
|
FREETMPS; |
55
|
2570688099
|
100
|
|
|
|
PERL_ASYNC_CHECK(); |
56
|
2570688097
|
|
|
|
|
return NORMAL; |
57
|
|
|
|
|
|
} |
58
|
|
|
|
|
|
|
59
|
503336076
|
|
|
|
|
PP(pp_gvsv) |
60
|
503336076
|
100
|
|
|
|
{ |
61
|
|
|
|
|
|
dVAR; |
62
|
503336076
|
|
|
|
|
dSP; |
63
|
250801581
|
|
|
|
|
EXTEND(SP,1); |
64
|
503336076
|
100
|
|
|
|
if (PL_op->op_private & OPpLVAL_INTRO) |
65
|
49878290
|
|
|
|
|
PUSHs(save_scalar(cGVOP_gv)); |
66
|
|
|
|
|
|
else |
67
|
453457786
|
100
|
|
|
|
PUSHs(GvSVn(cGVOP_gv)); |
68
|
503336076
|
|
|
|
|
RETURN; |
69
|
|
|
|
|
|
} |
70
|
|
|
|
|
|
|
71
|
15735473
|
|
|
|
|
PP(pp_null) |
72
|
|
|
|
|
|
{ |
73
|
|
|
|
|
|
dVAR; |
74
|
15735473
|
|
|
|
|
return NORMAL; |
75
|
|
|
|
|
|
} |
76
|
|
|
|
|
|
|
77
|
|
|
|
|
|
/* This is sometimes called directly by pp_coreargs and pp_grepstart. */ |
78
|
756423342
|
|
|
|
|
PP(pp_pushmark) |
79
|
|
|
|
|
|
{ |
80
|
|
|
|
|
|
dVAR; |
81
|
756423342
|
100
|
|
|
|
PUSHMARK(PL_stack_sp); |
82
|
756423342
|
|
|
|
|
return NORMAL; |
83
|
|
|
|
|
|
} |
84
|
|
|
|
|
|
|
85
|
6317481
|
|
|
|
|
PP(pp_stringify) |
86
|
|
|
|
|
|
{ |
87
|
6317481
|
|
|
|
|
dVAR; dSP; dTARGET; |
88
|
6317481
|
|
|
|
|
SV * const sv = TOPs; |
89
|
6317481
|
|
|
|
|
SETs(TARG); |
90
|
6317481
|
|
|
|
|
sv_copypv(TARG, sv); |
91
|
6317479
|
100
|
|
|
|
SvSETMAGIC(TARG); |
92
|
|
|
|
|
|
/* no PUTBACK, SETs doesn't inc/dec SP */ |
93
|
6317479
|
|
|
|
|
return NORMAL; |
94
|
|
|
|
|
|
} |
95
|
|
|
|
|
|
|
96
|
435904583
|
|
|
|
|
PP(pp_gv) |
97
|
|
|
|
|
|
{ |
98
|
435904583
|
|
|
|
|
dVAR; dSP; |
99
|
435904583
|
100
|
|
|
|
XPUSHs(MUTABLE_SV(cGVOP_gv)); |
100
|
435904583
|
|
|
|
|
RETURN; |
101
|
|
|
|
|
|
} |
102
|
|
|
|
|
|
|
103
|
1091416353
|
|
|
|
|
PP(pp_and) |
104
|
|
|
|
|
|
{ |
105
|
|
|
|
|
|
dVAR; |
106
|
1091416353
|
100
|
|
|
|
PERL_ASYNC_CHECK(); |
107
|
|
|
|
|
|
{ |
108
|
|
|
|
|
|
/* SP is not used to remove a variable that is saved across the |
109
|
|
|
|
|
|
sv_2bool_flags call in SvTRUE_NN, if a RISC/CISC or low/high machine |
110
|
|
|
|
|
|
register or load/store vs direct mem ops macro is introduced, this |
111
|
|
|
|
|
|
should be a define block between direct PL_stack_sp and dSP operations, |
112
|
|
|
|
|
|
presently, using PL_stack_sp is bias towards CISC cpus */ |
113
|
1091416351
|
|
|
|
|
SV * const sv = *PL_stack_sp; |
114
|
1091416351
|
100
|
|
|
|
if (!SvTRUE_NN(sv)) |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
115
|
581963434
|
|
|
|
|
return NORMAL; |
116
|
|
|
|
|
|
else { |
117
|
509452917
|
100
|
|
|
|
if (PL_op->op_type == OP_AND) |
118
|
509442201
|
|
|
|
|
--PL_stack_sp; |
119
|
800911827
|
|
|
|
|
return cLOGOP->op_other; |
120
|
|
|
|
|
|
} |
121
|
|
|
|
|
|
} |
122
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
124
|
958241640
|
|
|
|
|
PP(pp_sassign) |
125
|
|
|
|
|
|
{ |
126
|
958241640
|
|
|
|
|
dVAR; dSP; |
127
|
|
|
|
|
|
/* sassign keeps its args in the optree traditionally backwards. |
128
|
|
|
|
|
|
So we pop them differently. |
129
|
|
|
|
|
|
*/ |
130
|
958241640
|
|
|
|
|
SV *left = POPs; SV *right = TOPs; |
131
|
|
|
|
|
|
|
132
|
958241640
|
100
|
|
|
|
if (PL_op->op_private & OPpASSIGN_BACKWARDS) { |
133
|
|
|
|
|
|
SV * const temp = left; |
134
|
|
|
|
|
|
left = right; right = temp; |
135
|
|
|
|
|
|
} |
136
|
958241640
|
100
|
|
|
|
if (TAINTING_get && TAINT_get && !SvTAINTED(right)) |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
137
|
0
|
|
|
|
|
TAINT_NOT; |
138
|
958241640
|
100
|
|
|
|
if (PL_op->op_private & OPpASSIGN_CV_TO_GV) { |
139
|
2120544
|
|
|
|
|
SV * const cv = SvRV(right); |
140
|
2120544
|
|
|
|
|
const U32 cv_type = SvTYPE(cv); |
141
|
2120544
|
100
|
|
|
|
const bool is_gv = isGV_with_GP(left); |
|
|
50
|
|
|
|
|
142
|
2120544
|
|
|
|
|
const bool got_coderef = cv_type == SVt_PVCV || cv_type == SVt_PVFM; |
143
|
|
|
|
|
|
|
144
|
|
|
|
|
|
if (!got_coderef) { |
145
|
|
|
|
|
|
assert(SvROK(cv)); |
146
|
|
|
|
|
|
} |
147
|
|
|
|
|
|
|
148
|
|
|
|
|
|
/* Can do the optimisation if left (LVALUE) is not a typeglob, |
149
|
|
|
|
|
|
right (RVALUE) is a reference to something, and we're in void |
150
|
|
|
|
|
|
context. */ |
151
|
2120544
|
100
|
|
|
|
if (!got_coderef && !is_gv && GIMME_V == G_VOID) { |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
152
|
|
|
|
|
|
/* Is the target symbol table currently empty? */ |
153
|
683754
|
|
|
|
|
GV * const gv = gv_fetchsv_nomg(left, GV_NOINIT, SVt_PVGV); |
154
|
1016264
|
100
|
|
|
|
if (SvTYPE(gv) != SVt_PVGV && !SvOK(gv)) { |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
155
|
|
|
|
|
|
/* Good. Create a new proxy constant subroutine in the target. |
156
|
|
|
|
|
|
The gv becomes a(nother) reference to the constant. */ |
157
|
666456
|
|
|
|
|
SV *const value = SvRV(cv); |
158
|
|
|
|
|
|
|
159
|
998966
|
|
|
|
|
SvUPGRADE(MUTABLE_SV(gv), SVt_IV); |
160
|
666456
|
|
|
|
|
SvPCS_IMPORTED_on(gv); |
161
|
666456
|
|
|
|
|
SvRV_set(gv, value); |
162
|
666456
|
50
|
|
|
|
SvREFCNT_inc_simple_void(value); |
163
|
666456
|
|
|
|
|
SETs(left); |
164
|
666456
|
|
|
|
|
RETURN; |
165
|
|
|
|
|
|
} |
166
|
|
|
|
|
|
} |
167
|
|
|
|
|
|
|
168
|
|
|
|
|
|
/* Need to fix things up. */ |
169
|
1454088
|
100
|
|
|
|
if (!is_gv) { |
170
|
|
|
|
|
|
/* Need to fix GV. */ |
171
|
1000356
|
|
|
|
|
left = MUTABLE_SV(gv_fetchsv_nomg(left,GV_ADD, SVt_PVGV)); |
172
|
|
|
|
|
|
} |
173
|
|
|
|
|
|
|
174
|
1454088
|
100
|
|
|
|
if (!got_coderef) { |
175
|
|
|
|
|
|
/* We've been returned a constant rather than a full subroutine, |
176
|
|
|
|
|
|
but they expect a subroutine reference to apply. */ |
177
|
17302
|
100
|
|
|
|
if (SvROK(cv)) { |
178
|
17298
|
|
|
|
|
ENTER_with_name("sassign_coderef"); |
179
|
17298
|
|
|
|
|
SvREFCNT_inc_void(SvRV(cv)); |
180
|
|
|
|
|
|
/* newCONSTSUB takes a reference count on the passed in SV |
181
|
|
|
|
|
|
from us. We set the name to NULL, otherwise we get into |
182
|
|
|
|
|
|
all sorts of fun as the reference to our new sub is |
183
|
|
|
|
|
|
donated to the GV that we're about to assign to. |
184
|
|
|
|
|
|
*/ |
185
|
17298
|
|
|
|
|
SvRV_set(right, MUTABLE_SV(newCONSTSUB(GvSTASH(left), NULL, |
186
|
|
|
|
|
|
SvRV(cv)))); |
187
|
17298
|
|
|
|
|
SvREFCNT_dec_NN(cv); |
188
|
17298
|
|
|
|
|
LEAVE_with_name("sassign_coderef"); |
189
|
|
|
|
|
|
} else { |
190
|
|
|
|
|
|
/* What can happen for the corner case *{"BONK"} = \&{"BONK"}; |
191
|
|
|
|
|
|
is that |
192
|
|
|
|
|
|
First: ops for \&{"BONK"}; return us the constant in the |
193
|
|
|
|
|
|
symbol table |
194
|
|
|
|
|
|
Second: ops for *{"BONK"} cause that symbol table entry |
195
|
|
|
|
|
|
(and our reference to it) to be upgraded from RV |
196
|
|
|
|
|
|
to typeblob) |
197
|
|
|
|
|
|
Thirdly: We get here. cv is actually PVGV now, and its |
198
|
|
|
|
|
|
GvCV() is actually the subroutine we're looking for |
199
|
|
|
|
|
|
|
200
|
|
|
|
|
|
So change the reference so that it points to the subroutine |
201
|
|
|
|
|
|
of that typeglob, as that's what they were after all along. |
202
|
|
|
|
|
|
*/ |
203
|
|
|
|
|
|
GV *const upgraded = MUTABLE_GV(cv); |
204
|
4
|
|
|
|
|
CV *const source = GvCV(upgraded); |
205
|
|
|
|
|
|
|
206
|
|
|
|
|
|
assert(source); |
207
|
|
|
|
|
|
assert(CvFLAGS(source) & CVf_CONST); |
208
|
|
|
|
|
|
|
209
|
|
|
|
|
|
SvREFCNT_inc_void(source); |
210
|
4
|
|
|
|
|
SvREFCNT_dec_NN(upgraded); |
211
|
4
|
|
|
|
|
SvRV_set(right, MUTABLE_SV(source)); |
212
|
|
|
|
|
|
} |
213
|
|
|
|
|
|
} |
214
|
|
|
|
|
|
|
215
|
|
|
|
|
|
} |
216
|
957575184
|
100
|
|
|
|
if ( |
217
|
477721779
|
100
|
|
|
|
SvTEMP(left) && !SvSMAGICAL(left) && SvREFCNT(left) == 1 && |
218
|
59
|
50
|
|
|
|
(!isGV_with_GP(left) || SvFAKE(left)) && ckWARN(WARN_MISC) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
219
|
|
|
|
|
|
) |
220
|
2
|
|
|
|
|
Perl_warner(aTHX_ |
221
|
|
|
|
|
|
packWARN(WARN_MISC), "Useless assignment to a temporary" |
222
|
|
|
|
|
|
); |
223
|
957575184
|
100
|
|
|
|
SvSetMagicSV(left, right); |
|
|
100
|
|
|
|
|
224
|
957575064
|
|
|
|
|
SETs(left); |
225
|
957909010
|
|
|
|
|
RETURN; |
226
|
|
|
|
|
|
} |
227
|
|
|
|
|
|
|
228
|
293227728
|
|
|
|
|
PP(pp_cond_expr) |
229
|
|
|
|
|
|
{ |
230
|
293227728
|
|
|
|
|
dVAR; dSP; |
231
|
293227728
|
100
|
|
|
|
PERL_ASYNC_CHECK(); |
232
|
293227728
|
50
|
|
|
|
if (SvTRUEx(POPs)) |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
233
|
77831555
|
|
|
|
|
RETURNOP(cLOGOP->op_other); |
234
|
|
|
|
|
|
else |
235
|
254603673
|
|
|
|
|
RETURNOP(cLOGOP->op_next); |
236
|
|
|
|
|
|
} |
237
|
|
|
|
|
|
|
238
|
959569420
|
|
|
|
|
PP(pp_unstack) |
239
|
|
|
|
|
|
{ |
240
|
|
|
|
|
|
dVAR; |
241
|
959569420
|
100
|
|
|
|
PERL_ASYNC_CHECK(); |
242
|
959569414
|
|
|
|
|
TAINT_NOT; /* Each statement is presumed innocent */ |
243
|
959569414
|
|
|
|
|
PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp; |
244
|
959569414
|
100
|
|
|
|
FREETMPS; |
245
|
959569414
|
100
|
|
|
|
if (!(PL_op->op_flags & OPf_SPECIAL)) { |
246
|
948273104
|
|
|
|
|
I32 oldsave = PL_scopestack[PL_scopestack_ix - 1]; |
247
|
948273104
|
100
|
|
|
|
LEAVE_SCOPE(oldsave); |
248
|
|
|
|
|
|
} |
249
|
959569414
|
|
|
|
|
return NORMAL; |
250
|
|
|
|
|
|
} |
251
|
|
|
|
|
|
|
252
|
204951605
|
|
|
|
|
PP(pp_concat) |
253
|
|
|
|
|
|
{ |
254
|
204951605
|
100
|
|
|
|
dVAR; dSP; dATARGET; tryAMAGICbin_MG(concat_amg, AMGf_assign); |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
255
|
|
|
|
|
|
{ |
256
|
204951567
|
|
|
|
|
dPOPTOPssrl; |
257
|
|
|
|
|
|
bool lbyte; |
258
|
|
|
|
|
|
STRLEN rlen; |
259
|
|
|
|
|
|
const char *rpv = NULL; |
260
|
|
|
|
|
|
bool rbyte = FALSE; |
261
|
|
|
|
|
|
bool rcopied = FALSE; |
262
|
|
|
|
|
|
|
263
|
204951567
|
100
|
|
|
|
if (TARG == right && right != left) { /* $r = $l.$r */ |
264
|
1983482
|
100
|
|
|
|
rpv = SvPV_nomg_const(right, rlen); |
265
|
1983482
|
100
|
|
|
|
rbyte = !DO_UTF8(right); |
|
|
50
|
|
|
|
|
266
|
1983482
|
|
|
|
|
right = newSVpvn_flags(rpv, rlen, SVs_TEMP); |
267
|
1983482
|
50
|
|
|
|
rpv = SvPV_const(right, rlen); /* no point setting UTF-8 here */ |
268
|
|
|
|
|
|
rcopied = TRUE; |
269
|
|
|
|
|
|
} |
270
|
|
|
|
|
|
|
271
|
204951567
|
100
|
|
|
|
if (TARG != left) { /* not $l .= $r */ |
272
|
|
|
|
|
|
STRLEN llen; |
273
|
94119236
|
100
|
|
|
|
const char* const lpv = SvPV_nomg_const(left, llen); |
274
|
94119236
|
100
|
|
|
|
lbyte = !DO_UTF8(left); |
|
|
100
|
|
|
|
|
275
|
94119236
|
|
|
|
|
sv_setpvn(TARG, lpv, llen); |
276
|
94119236
|
100
|
|
|
|
if (!lbyte) |
277
|
140014
|
|
|
|
|
SvUTF8_on(TARG); |
278
|
|
|
|
|
|
else |
279
|
93979222
|
|
|
|
|
SvUTF8_off(TARG); |
280
|
|
|
|
|
|
} |
281
|
|
|
|
|
|
else { /* $l .= $r */ |
282
|
110832331
|
100
|
|
|
|
if (!SvOK(TARG)) { |
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
283
|
509160
|
100
|
|
|
|
if (left == right && ckWARN(WARN_UNINITIALIZED)) /* $l .= $l */ |
|
|
50
|
|
|
|
|
284
|
2
|
|
|
|
|
report_uninit(right); |
285
|
509160
|
|
|
|
|
sv_setpvs(left, ""); |
286
|
|
|
|
|
|
} |
287
|
110832331
|
100
|
|
|
|
SvPV_force_nomg_nolen(left); |
288
|
110832329
|
100
|
|
|
|
lbyte = !DO_UTF8(left); |
|
|
100
|
|
|
|
|
289
|
110832329
|
100
|
|
|
|
if (IN_BYTES) |
290
|
1388074
|
|
|
|
|
SvUTF8_off(TARG); |
291
|
|
|
|
|
|
} |
292
|
|
|
|
|
|
|
293
|
204951565
|
100
|
|
|
|
if (!rcopied) { |
294
|
202968650
|
100
|
|
|
|
if (left == right) |
|
|
50
|
|
|
|
|
295
|
|
|
|
|
|
/* $r.$r: do magic twice: tied might return different 2nd time */ |
296
|
567
|
|
|
|
|
SvGETMAGIC(right); |
297
|
202968083
|
100
|
|
|
|
rpv = SvPV_nomg_const(right, rlen); |
298
|
202968083
|
100
|
|
|
|
rbyte = !DO_UTF8(right); |
|
|
100
|
|
|
|
|
299
|
|
|
|
|
|
} |
300
|
204951565
|
100
|
|
|
|
if (lbyte != rbyte) { |
301
|
|
|
|
|
|
/* sv_utf8_upgrade_nomg() may reallocate the stack */ |
302
|
2159786
|
|
|
|
|
PUTBACK; |
303
|
2159786
|
100
|
|
|
|
if (lbyte) |
304
|
946608
|
|
|
|
|
sv_utf8_upgrade_nomg(TARG); |
305
|
|
|
|
|
|
else { |
306
|
1213178
|
100
|
|
|
|
if (!rcopied) |
307
|
1213148
|
|
|
|
|
right = newSVpvn_flags(rpv, rlen, SVs_TEMP); |
308
|
1213178
|
|
|
|
|
sv_utf8_upgrade_nomg(right); |
309
|
1213178
|
50
|
|
|
|
rpv = SvPV_nomg_const(right, rlen); |
310
|
|
|
|
|
|
} |
311
|
2159782
|
|
|
|
|
SPAGAIN; |
312
|
|
|
|
|
|
} |
313
|
204951561
|
|
|
|
|
sv_catpvn_nomg(TARG, rpv, rlen); |
314
|
|
|
|
|
|
|
315
|
204951561
|
100
|
|
|
|
SETTARG; |
316
|
204951577
|
|
|
|
|
RETURN; |
317
|
|
|
|
|
|
} |
318
|
|
|
|
|
|
} |
319
|
|
|
|
|
|
|
320
|
|
|
|
|
|
/* push the elements of av onto the stack. |
321
|
|
|
|
|
|
* XXX Note that padav has similar code but without the mg_get(). |
322
|
|
|
|
|
|
* I suspect that the mg_get is no longer needed, but while padav |
323
|
|
|
|
|
|
* differs, it can't share this function */ |
324
|
|
|
|
|
|
|
325
|
|
|
|
|
|
STATIC void |
326
|
176339546
|
|
|
|
|
S_pushav(pTHX_ AV* const av) |
327
|
176339546
|
100
|
|
|
|
{ |
328
|
176339546
|
|
|
|
|
dSP; |
329
|
176339546
|
100
|
|
|
|
const SSize_t maxarg = AvFILL(av) + 1; |
330
|
88103832
|
|
|
|
|
EXTEND(SP, maxarg); |
331
|
176339546
|
100
|
|
|
|
if (SvRMAGICAL(av)) { |
332
|
|
|
|
|
|
PADOFFSET i; |
333
|
202609
|
100
|
|
|
|
for (i=0; i < (PADOFFSET)maxarg; i++) { |
334
|
186488
|
|
|
|
|
SV ** const svp = av_fetch(av, i, FALSE); |
335
|
|
|
|
|
|
/* See note in pp_helem, and bug id #27839 */ |
336
|
372976
|
|
|
|
|
SP[i+1] = svp |
337
|
184538
|
100
|
|
|
|
? SvGMAGICAL(*svp) ? (mg_get(*svp), *svp) : *svp |
338
|
186488
|
100
|
|
|
|
: &PL_sv_undef; |
339
|
|
|
|
|
|
} |
340
|
|
|
|
|
|
} |
341
|
|
|
|
|
|
else { |
342
|
|
|
|
|
|
PADOFFSET i; |
343
|
438362517
|
100
|
|
|
|
for (i=0; i < (PADOFFSET)maxarg; i++) { |
344
|
350132650
|
|
|
|
|
SV * const sv = AvARRAY(av)[i]; |
345
|
350132650
|
100
|
|
|
|
SP[i+1] = sv ? sv : &PL_sv_undef; |
346
|
|
|
|
|
|
} |
347
|
|
|
|
|
|
} |
348
|
176339546
|
|
|
|
|
SP += maxarg; |
349
|
176339546
|
|
|
|
|
PUTBACK; |
350
|
176339546
|
|
|
|
|
} |
351
|
|
|
|
|
|
|
352
|
|
|
|
|
|
|
353
|
|
|
|
|
|
/* ($lex1,@lex2,...) or my ($lex1,@lex2,...) */ |
354
|
|
|
|
|
|
|
355
|
894270059
|
|
|
|
|
PP(pp_padrange) |
356
|
|
|
|
|
|
{ |
357
|
894270059
|
|
|
|
|
dVAR; dSP; |
358
|
894270059
|
|
|
|
|
PADOFFSET base = PL_op->op_targ; |
359
|
894270059
|
|
|
|
|
int count = (int)(PL_op->op_private) & OPpPADRANGE_COUNTMASK; |
360
|
|
|
|
|
|
int i; |
361
|
894270059
|
100
|
|
|
|
if (PL_op->op_flags & OPf_SPECIAL) { |
362
|
|
|
|
|
|
/* fake the RHS of my ($x,$y,..) = @_ */ |
363
|
147347374
|
50
|
|
|
|
PUSHMARK(SP); |
364
|
147347374
|
50
|
|
|
|
S_pushav(aTHX_ GvAVn(PL_defgv)); |
365
|
147347374
|
|
|
|
|
SPAGAIN; |
366
|
|
|
|
|
|
} |
367
|
|
|
|
|
|
|
368
|
|
|
|
|
|
/* note, this is only skipped for compile-time-known void cxt */ |
369
|
1336696301
|
100
|
|
|
|
if ((PL_op->op_flags & OPf_WANT) != OPf_WANT_VOID) { |
|
|
50
|
|
|
|
|
370
|
442426242
|
|
|
|
|
EXTEND(SP, count); |
371
|
885361353
|
100
|
|
|
|
PUSHMARK(SP); |
372
|
1934878276
|
100
|
|
|
|
for (i = 0; i
|
373
|
1049516923
|
|
|
|
|
*++SP = PAD_SV(base+i); |
374
|
|
|
|
|
|
} |
375
|
894270059
|
100
|
|
|
|
if (PL_op->op_private & OPpLVAL_INTRO) { |
376
|
186319484
|
|
|
|
|
SV **svp = &(PAD_SVl(base)); |
377
|
186319484
|
|
|
|
|
const UV payload = (UV)( |
378
|
186319484
|
|
|
|
|
(base << (OPpPADRANGE_COUNTSHIFT + SAVE_TIGHT_SHIFT)) |
379
|
186319484
|
|
|
|
|
| (count << SAVE_TIGHT_SHIFT) |
380
|
|
|
|
|
|
| SAVEt_CLEARPADRANGE); |
381
|
|
|
|
|
|
assert(OPpPADRANGE_COUNTMASK + 1 == (1 <
|
382
|
|
|
|
|
|
assert((payload >> (OPpPADRANGE_COUNTSHIFT+SAVE_TIGHT_SHIFT)) == base); |
383
|
|
|
|
|
|
{ |
384
|
186319484
|
|
|
|
|
dSS_ADD; |
385
|
186319484
|
|
|
|
|
SS_ADD_UV(payload); |
386
|
186319484
|
50
|
|
|
|
SS_ADD_END(1); |
387
|
|
|
|
|
|
} |
388
|
|
|
|
|
|
|
389
|
443336880
|
100
|
|
|
|
for (i = 0; i
|
390
|
350099100
|
|
|
|
|
SvPADSTALE_off(*svp++); /* mark lexical as active */ |
391
|
|
|
|
|
|
} |
392
|
894270059
|
|
|
|
|
RETURN; |
393
|
|
|
|
|
|
} |
394
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
396
|
3118059641
|
|
|
|
|
PP(pp_padsv) |
397
|
3118059641
|
50
|
|
|
|
{ |
398
|
3118059641
|
|
|
|
|
dVAR; dSP; |
399
|
1555711975
|
|
|
|
|
EXTEND(SP, 1); |
400
|
|
|
|
|
|
{ |
401
|
3118059641
|
|
|
|
|
OP * const op = PL_op; |
402
|
|
|
|
|
|
/* access PL_curpad once */ |
403
|
3118059641
|
|
|
|
|
SV ** const padentry = &(PAD_SVl(op->op_targ)); |
404
|
|
|
|
|
|
{ |
405
|
|
|
|
|
|
dTARG; |
406
|
3118059641
|
|
|
|
|
TARG = *padentry; |
407
|
3118059641
|
|
|
|
|
PUSHs(TARG); |
408
|
3118059641
|
|
|
|
|
PUTBACK; /* no pop/push after this, TOPs ok */ |
409
|
|
|
|
|
|
} |
410
|
3118059641
|
100
|
|
|
|
if (op->op_flags & OPf_MOD) { |
411
|
1436456790
|
100
|
|
|
|
if (op->op_private & OPpLVAL_INTRO) |
412
|
644101295
|
100
|
|
|
|
if (!(op->op_private & OPpPAD_STATE)) |
413
|
644101153
|
|
|
|
|
save_clearsv(padentry); |
414
|
1436456790
|
100
|
|
|
|
if (op->op_private & OPpDEREF) { |
415
|
|
|
|
|
|
/* TOPs is equivalent to TARG here. Using TOPs (SP) rather |
416
|
|
|
|
|
|
than TARG reduces the scope of TARG, so it does not |
417
|
|
|
|
|
|
span the call to save_clearsv, resulting in smaller |
418
|
|
|
|
|
|
machine code. */ |
419
|
297912783
|
|
|
|
|
TOPs = vivify_ref(TOPs, op->op_private & OPpDEREF); |
420
|
|
|
|
|
|
} |
421
|
|
|
|
|
|
} |
422
|
3118059641
|
|
|
|
|
return op->op_next; |
423
|
|
|
|
|
|
} |
424
|
|
|
|
|
|
} |
425
|
|
|
|
|
|
|
426
|
9326719
|
|
|
|
|
PP(pp_readline) |
427
|
|
|
|
|
|
{ |
428
|
|
|
|
|
|
dVAR; |
429
|
9326719
|
|
|
|
|
dSP; |
430
|
13809337
|
100
|
|
|
|
if (TOPs) { |
|
|
100
|
|
|
|
|
431
|
4482620
|
|
|
|
|
SvGETMAGIC(TOPs); |
432
|
9326717
|
100
|
|
|
|
tryAMAGICunTARGETlist(iter_amg, 0); |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
433
|
9326715
|
|
|
|
|
PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--); |
434
|
|
|
|
|
|
} |
435
|
2
|
|
|
|
|
else PL_last_in_gv = PL_argvgv, PL_stack_sp--; |
436
|
9326717
|
100
|
|
|
|
if (!isGV_with_GP(PL_last_in_gv)) { |
|
|
50
|
|
|
|
|
437
|
6999272
|
100
|
|
|
|
if (SvROK(PL_last_in_gv) && isGV_with_GP(SvRV(PL_last_in_gv))) |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
438
|
6803408
|
|
|
|
|
PL_last_in_gv = MUTABLE_GV(SvRV(PL_last_in_gv)); |
439
|
|
|
|
|
|
else { |
440
|
195864
|
|
|
|
|
dSP; |
441
|
195864
|
50
|
|
|
|
XPUSHs(MUTABLE_SV(PL_last_in_gv)); |
442
|
195864
|
|
|
|
|
PUTBACK; |
443
|
195864
|
|
|
|
|
Perl_pp_rv2gv(aTHX); |
444
|
195862
|
|
|
|
|
PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--); |
445
|
|
|
|
|
|
} |
446
|
|
|
|
|
|
} |
447
|
9326716
|
|
|
|
|
return do_readline(); |
448
|
|
|
|
|
|
} |
449
|
|
|
|
|
|
|
450
|
70855286
|
|
|
|
|
PP(pp_eq) |
451
|
|
|
|
|
|
{ |
452
|
70855286
|
|
|
|
|
dVAR; dSP; |
453
|
|
|
|
|
|
SV *left, *right; |
454
|
|
|
|
|
|
|
455
|
70855286
|
100
|
|
|
|
tryAMAGICbin_MG(eq_amg, AMGf_set|AMGf_numeric); |
|
|
100
|
|
|
|
|
456
|
70599348
|
|
|
|
|
right = POPs; |
457
|
70599348
|
|
|
|
|
left = TOPs; |
458
|
70599348
|
100
|
|
|
|
SETs(boolSV( |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
459
|
|
|
|
|
|
(SvIOK_notUV(left) && SvIOK_notUV(right)) |
460
|
|
|
|
|
|
? (SvIVX(left) == SvIVX(right)) |
461
|
|
|
|
|
|
: ( do_ncmp(left, right) == 0) |
462
|
|
|
|
|
|
)); |
463
|
70727315
|
|
|
|
|
RETURN; |
464
|
|
|
|
|
|
} |
465
|
|
|
|
|
|
|
466
|
63258352
|
|
|
|
|
PP(pp_preinc) |
467
|
|
|
|
|
|
{ |
468
|
63258352
|
|
|
|
|
dVAR; dSP; |
469
|
63258352
|
|
|
|
|
const bool inc = |
470
|
63258352
|
|
|
|
|
PL_op->op_type == OP_PREINC || PL_op->op_type == OP_I_PREINC; |
471
|
63258352
|
50
|
|
|
|
if (SvTYPE(TOPs) >= SVt_PVAV || (isGV_with_GP(TOPs) && !SvFAKE(TOPs))) |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
472
|
0
|
|
|
|
|
Perl_croak_no_modify(); |
473
|
63258352
|
100
|
|
|
|
if (!SvREADONLY(TOPs) && !SvGMAGICAL(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) |
474
|
59479058
|
100
|
|
|
|
&& SvIVX(TOPs) != (inc ? IV_MAX : IV_MIN)) |
|
|
100
|
|
|
|
|
475
|
|
|
|
|
|
{ |
476
|
59477982
|
100
|
|
|
|
SvIV_set(TOPs, SvIVX(TOPs) + (inc ? 1 : -1)); |
477
|
59477982
|
|
|
|
|
SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK); |
478
|
|
|
|
|
|
} |
479
|
|
|
|
|
|
else /* Do all the PERL_PRESERVE_IVUV conditionals in sv_inc */ |
480
|
3780370
|
100
|
|
|
|
if (inc) sv_inc(TOPs); |
481
|
25072
|
|
|
|
|
else sv_dec(TOPs); |
482
|
63258308
|
100
|
|
|
|
SvSETMAGIC(TOPs); |
483
|
63258308
|
|
|
|
|
return NORMAL; |
484
|
|
|
|
|
|
} |
485
|
|
|
|
|
|
|
486
|
337732866
|
|
|
|
|
PP(pp_or) |
487
|
|
|
|
|
|
{ |
488
|
337732866
|
|
|
|
|
dVAR; dSP; |
489
|
337732866
|
100
|
|
|
|
PERL_ASYNC_CHECK(); |
490
|
337732866
|
50
|
|
|
|
if (SvTRUE(TOPs)) |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
491
|
195022523
|
|
|
|
|
RETURN; |
492
|
|
|
|
|
|
else { |
493
|
142710343
|
100
|
|
|
|
if (PL_op->op_type == OP_OR) |
494
|
135720956
|
|
|
|
|
--SP; |
495
|
240485025
|
|
|
|
|
RETURNOP(cLOGOP->op_other); |
496
|
|
|
|
|
|
} |
497
|
|
|
|
|
|
} |
498
|
|
|
|
|
|
|
499
|
114687858
|
|
|
|
|
PP(pp_defined) |
500
|
|
|
|
|
|
{ |
501
|
114687858
|
|
|
|
|
dVAR; dSP; |
502
|
|
|
|
|
|
SV* sv; |
503
|
|
|
|
|
|
bool defined; |
504
|
114687858
|
|
|
|
|
const int op_type = PL_op->op_type; |
505
|
114687858
|
|
|
|
|
const bool is_dor = (op_type == OP_DOR || op_type == OP_DORASSIGN); |
506
|
|
|
|
|
|
|
507
|
114687858
|
100
|
|
|
|
if (is_dor) { |
508
|
398650
|
50
|
|
|
|
PERL_ASYNC_CHECK(); |
509
|
398650
|
|
|
|
|
sv = TOPs; |
510
|
398650
|
50
|
|
|
|
if (!sv || !SvANY(sv)) { |
|
|
100
|
|
|
|
|
511
|
3018
|
100
|
|
|
|
if (op_type == OP_DOR) |
512
|
2704
|
|
|
|
|
--SP; |
513
|
3018
|
|
|
|
|
RETURNOP(cLOGOP->op_other); |
514
|
|
|
|
|
|
} |
515
|
|
|
|
|
|
} |
516
|
|
|
|
|
|
else { |
517
|
|
|
|
|
|
/* OP_DEFINED */ |
518
|
114289208
|
|
|
|
|
sv = POPs; |
519
|
114289208
|
50
|
|
|
|
if (!sv || !SvANY(sv)) |
|
|
100
|
|
|
|
|
520
|
20439359
|
|
|
|
|
RETPUSHNO; |
521
|
|
|
|
|
|
} |
522
|
|
|
|
|
|
|
523
|
|
|
|
|
|
defined = FALSE; |
524
|
140604759
|
100
|
|
|
|
switch (SvTYPE(sv)) { |
525
|
|
|
|
|
|
case SVt_PVAV: |
526
|
14
|
100
|
|
|
|
if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied))) |
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
527
|
|
|
|
|
|
defined = TRUE; |
528
|
|
|
|
|
|
break; |
529
|
|
|
|
|
|
case SVt_PVHV: |
530
|
50
|
100
|
|
|
|
if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied))) |
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
531
|
|
|
|
|
|
defined = TRUE; |
532
|
|
|
|
|
|
break; |
533
|
|
|
|
|
|
case SVt_PVCV: |
534
|
757706
|
100
|
|
|
|
if (CvROOT(sv) || CvXSUB(sv)) |
|
|
50
|
|
|
|
|
535
|
|
|
|
|
|
defined = TRUE; |
536
|
|
|
|
|
|
break; |
537
|
|
|
|
|
|
default: |
538
|
47757190
|
|
|
|
|
SvGETMAGIC(sv); |
539
|
93487711
|
100
|
|
|
|
if (SvOK(sv)) |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
540
|
|
|
|
|
|
defined = TRUE; |
541
|
|
|
|
|
|
break; |
542
|
|
|
|
|
|
} |
543
|
|
|
|
|
|
|
544
|
94245481
|
100
|
|
|
|
if (is_dor) { |
545
|
395632
|
100
|
|
|
|
if(defined) |
546
|
156622
|
|
|
|
|
RETURN; |
547
|
239010
|
100
|
|
|
|
if(op_type == OP_DOR) |
548
|
237850
|
|
|
|
|
--SP; |
549
|
239010
|
|
|
|
|
RETURNOP(cLOGOP->op_other); |
550
|
|
|
|
|
|
} |
551
|
|
|
|
|
|
/* assuming OP_DEFINED */ |
552
|
93849849
|
100
|
|
|
|
if(defined) |
553
|
85121163
|
|
|
|
|
RETPUSHYES; |
554
|
62107607
|
|
|
|
|
RETPUSHNO; |
555
|
|
|
|
|
|
} |
556
|
|
|
|
|
|
|
557
|
44462032
|
|
|
|
|
PP(pp_add) |
558
|
|
|
|
|
|
{ |
559
|
44462032
|
100
|
|
|
|
dVAR; dSP; dATARGET; bool useleft; SV *svl, *svr; |
560
|
44462032
|
100
|
|
|
|
tryAMAGICbin_MG(add_amg, AMGf_assign|AMGf_numeric); |
|
|
100
|
|
|
|
|
561
|
44457410
|
|
|
|
|
svr = TOPs; |
562
|
44457410
|
|
|
|
|
svl = TOPm1s; |
563
|
|
|
|
|
|
|
564
|
44457410
|
100
|
|
|
|
useleft = USE_LEFT(svl); |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
565
|
|
|
|
|
|
#ifdef PERL_PRESERVE_IVUV |
566
|
|
|
|
|
|
/* We must see if we can perform the addition with integers if possible, |
567
|
|
|
|
|
|
as the integer code detects overflow while the NV code doesn't. |
568
|
|
|
|
|
|
If either argument hasn't had a numeric conversion yet attempt to get |
569
|
|
|
|
|
|
the IV. It's important to do this now, rather than just assuming that |
570
|
|
|
|
|
|
it's not IOK as a PV of "9223372036854775806" may not take well to NV |
571
|
|
|
|
|
|
addition, and an SV which is NOK, NV=6.0 ought to be coerced to |
572
|
|
|
|
|
|
integer in case the second argument is IV=9223372036854775806 |
573
|
|
|
|
|
|
We can (now) rely on sv_2iv to do the right thing, only setting the |
574
|
|
|
|
|
|
public IOK flag if the value in the NV (or PV) slot is truly integer. |
575
|
|
|
|
|
|
|
576
|
|
|
|
|
|
A side effect is that this also aggressively prefers integer maths over |
577
|
|
|
|
|
|
fp maths for integer values. |
578
|
|
|
|
|
|
|
579
|
|
|
|
|
|
How to detect overflow? |
580
|
|
|
|
|
|
|
581
|
|
|
|
|
|
C 99 section 6.2.6.1 says |
582
|
|
|
|
|
|
|
583
|
|
|
|
|
|
The range of nonnegative values of a signed integer type is a subrange |
584
|
|
|
|
|
|
of the corresponding unsigned integer type, and the representation of |
585
|
|
|
|
|
|
the same value in each type is the same. A computation involving |
586
|
|
|
|
|
|
unsigned operands can never overflow, because a result that cannot be |
587
|
|
|
|
|
|
represented by the resulting unsigned integer type is reduced modulo |
588
|
|
|
|
|
|
the number that is one greater than the largest value that can be |
589
|
|
|
|
|
|
represented by the resulting type. |
590
|
|
|
|
|
|
|
591
|
|
|
|
|
|
(the 9th paragraph) |
592
|
|
|
|
|
|
|
593
|
|
|
|
|
|
which I read as "unsigned ints wrap." |
594
|
|
|
|
|
|
|
595
|
|
|
|
|
|
signed integer overflow seems to be classed as "exception condition" |
596
|
|
|
|
|
|
|
597
|
|
|
|
|
|
If an exceptional condition occurs during the evaluation of an |
598
|
|
|
|
|
|
expression (that is, if the result is not mathematically defined or not |
599
|
|
|
|
|
|
in the range of representable values for its type), the behavior is |
600
|
|
|
|
|
|
undefined. |
601
|
|
|
|
|
|
|
602
|
|
|
|
|
|
(6.5, the 5th paragraph) |
603
|
|
|
|
|
|
|
604
|
|
|
|
|
|
I had assumed that on 2s complement machines signed arithmetic would |
605
|
|
|
|
|
|
wrap, hence coded pp_add and pp_subtract on the assumption that |
606
|
|
|
|
|
|
everything perl builds on would be happy. After much wailing and |
607
|
|
|
|
|
|
gnashing of teeth it would seem that irix64 knows its ANSI spec well, |
608
|
|
|
|
|
|
knows that it doesn't need to, and doesn't. Bah. Anyway, the all- |
609
|
|
|
|
|
|
unsigned code below is actually shorter than the old code. :-) |
610
|
|
|
|
|
|
*/ |
611
|
|
|
|
|
|
|
612
|
44457410
|
100
|
|
|
|
if (SvIV_please_nomg(svr)) { |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
613
|
|
|
|
|
|
/* Unless the left argument is integer in range we are going to have to |
614
|
|
|
|
|
|
use NV maths. Hence only attempt to coerce the right argument if |
615
|
|
|
|
|
|
we know the left is integer. */ |
616
|
|
|
|
|
|
UV auv = 0; |
617
|
|
|
|
|
|
bool auvok = FALSE; |
618
|
|
|
|
|
|
bool a_valid = 0; |
619
|
|
|
|
|
|
|
620
|
44216674
|
100
|
|
|
|
if (!useleft) { |
621
|
|
|
|
|
|
auv = 0; |
622
|
|
|
|
|
|
a_valid = auvok = 1; |
623
|
|
|
|
|
|
/* left operand is undef, treat as zero. + 0 is identity, |
624
|
|
|
|
|
|
Could SETi or SETu right now, but space optimise by not adding |
625
|
|
|
|
|
|
lots of code to speed up what is probably a rarish case. */ |
626
|
|
|
|
|
|
} else { |
627
|
|
|
|
|
|
/* Left operand is defined, so is it IV? */ |
628
|
42661232
|
100
|
|
|
|
if (SvIV_please_nomg(svl)) { |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
629
|
42578090
|
100
|
|
|
|
if ((auvok = SvUOK(svl))) |
630
|
10394
|
|
|
|
|
auv = SvUVX(svl); |
631
|
|
|
|
|
|
else { |
632
|
42567696
|
|
|
|
|
const IV aiv = SvIVX(svl); |
633
|
42567696
|
100
|
|
|
|
if (aiv >= 0) { |
634
|
42361408
|
|
|
|
|
auv = aiv; |
635
|
|
|
|
|
|
auvok = 1; /* Now acting as a sign flag. */ |
636
|
|
|
|
|
|
} else { /* 2s complement assumption for IV_MIN */ |
637
|
206288
|
|
|
|
|
auv = (UV)-aiv; |
638
|
|
|
|
|
|
} |
639
|
|
|
|
|
|
} |
640
|
|
|
|
|
|
a_valid = 1; |
641
|
|
|
|
|
|
} |
642
|
|
|
|
|
|
} |
643
|
44216672
|
100
|
|
|
|
if (a_valid) { |
644
|
|
|
|
|
|
bool result_good = 0; |
645
|
|
|
|
|
|
UV result; |
646
|
|
|
|
|
|
UV buv; |
647
|
44133532
|
|
|
|
|
bool buvok = SvUOK(svr); |
648
|
|
|
|
|
|
|
649
|
44133532
|
100
|
|
|
|
if (buvok) |
650
|
186
|
|
|
|
|
buv = SvUVX(svr); |
651
|
|
|
|
|
|
else { |
652
|
44133346
|
|
|
|
|
const IV biv = SvIVX(svr); |
653
|
44133346
|
100
|
|
|
|
if (biv >= 0) { |
654
|
44077056
|
|
|
|
|
buv = biv; |
655
|
|
|
|
|
|
buvok = 1; |
656
|
|
|
|
|
|
} else |
657
|
56290
|
|
|
|
|
buv = (UV)-biv; |
658
|
|
|
|
|
|
} |
659
|
|
|
|
|
|
/* ?uvok if value is >= 0. basically, flagged as UV if it's +ve, |
660
|
|
|
|
|
|
else "IV" now, independent of how it came in. |
661
|
|
|
|
|
|
if a, b represents positive, A, B negative, a maps to -A etc |
662
|
|
|
|
|
|
a + b => (a + b) |
663
|
|
|
|
|
|
A + b => -(a - b) |
664
|
|
|
|
|
|
a + B => (a - b) |
665
|
|
|
|
|
|
A + B => -(a + b) |
666
|
|
|
|
|
|
all UV maths. negate result if A negative. |
667
|
|
|
|
|
|
add if signs same, subtract if signs differ. */ |
668
|
|
|
|
|
|
|
669
|
44133532
|
100
|
|
|
|
if (auvok ^ buvok) { |
670
|
|
|
|
|
|
/* Signs differ. */ |
671
|
258898
|
100
|
|
|
|
if (auv >= buv) { |
672
|
224354
|
|
|
|
|
result = auv - buv; |
673
|
|
|
|
|
|
/* Must get smaller */ |
674
|
224354
|
50
|
|
|
|
if (result <= auv) |
675
|
|
|
|
|
|
result_good = 1; |
676
|
|
|
|
|
|
} else { |
677
|
34544
|
|
|
|
|
result = buv - auv; |
678
|
34544
|
50
|
|
|
|
if (result <= buv) { |
679
|
|
|
|
|
|
/* result really should be -(auv-buv). as its negation |
680
|
|
|
|
|
|
of true value, need to swap our result flag */ |
681
|
34544
|
|
|
|
|
auvok = !auvok; |
682
|
|
|
|
|
|
result_good = 1; |
683
|
|
|
|
|
|
} |
684
|
|
|
|
|
|
} |
685
|
|
|
|
|
|
} else { |
686
|
|
|
|
|
|
/* Signs same */ |
687
|
43874634
|
|
|
|
|
result = auv + buv; |
688
|
43874634
|
100
|
|
|
|
if (result >= auv) |
689
|
|
|
|
|
|
result_good = 1; |
690
|
|
|
|
|
|
} |
691
|
44133532
|
100
|
|
|
|
if (result_good) { |
692
|
44133392
|
|
|
|
|
SP--; |
693
|
44133392
|
100
|
|
|
|
if (auvok) |
694
|
43913980
|
100
|
|
|
|
SETu( result ); |
695
|
|
|
|
|
|
else { |
696
|
|
|
|
|
|
/* Negate result */ |
697
|
219412
|
50
|
|
|
|
if (result <= (UV)IV_MIN) |
698
|
219412
|
100
|
|
|
|
SETi( -(IV)result ); |
699
|
|
|
|
|
|
else { |
700
|
|
|
|
|
|
/* result valid, but out of range for IV. */ |
701
|
0
|
0
|
|
|
|
SETn( -(NV)result ); |
702
|
|
|
|
|
|
} |
703
|
|
|
|
|
|
} |
704
|
44133392
|
|
|
|
|
RETURN; |
705
|
|
|
|
|
|
} /* Overflow, drop through to NVs. */ |
706
|
|
|
|
|
|
} |
707
|
|
|
|
|
|
} |
708
|
|
|
|
|
|
#endif |
709
|
|
|
|
|
|
{ |
710
|
324014
|
100
|
|
|
|
NV value = SvNV_nomg(svr); |
711
|
324014
|
|
|
|
|
(void)POPs; |
712
|
324014
|
100
|
|
|
|
if (!useleft) { |
713
|
|
|
|
|
|
/* left operand is undef, treat as zero. + 0.0 is identity. */ |
714
|
8
|
50
|
|
|
|
SETn(value); |
715
|
8
|
|
|
|
|
RETURN; |
716
|
|
|
|
|
|
} |
717
|
324006
|
100
|
|
|
|
SETn( value + SvNV_nomg(svl) ); |
|
|
50
|
|
|
|
|
718
|
22394430
|
|
|
|
|
RETURN; |
719
|
|
|
|
|
|
} |
720
|
|
|
|
|
|
} |
721
|
|
|
|
|
|
|
722
|
48824452
|
|
|
|
|
PP(pp_aelemfast) |
723
|
48824452
|
50
|
|
|
|
{ |
724
|
48824452
|
|
|
|
|
dVAR; dSP; |
725
|
48824452
|
|
|
|
|
AV * const av = PL_op->op_type == OP_AELEMFAST_LEX |
726
|
48824452
|
100
|
|
|
|
? MUTABLE_AV(PAD_SV(PL_op->op_targ)) : GvAVn(cGVOP_gv); |
|
|
100
|
|
|
|
|
727
|
48824452
|
|
|
|
|
const U32 lval = PL_op->op_flags & OPf_MOD; |
728
|
48824452
|
|
|
|
|
SV** const svp = av_fetch(av, PL_op->op_private, lval); |
729
|
48824452
|
100
|
|
|
|
SV *sv = (svp ? *svp : &PL_sv_undef); |
730
|
24380493
|
|
|
|
|
EXTEND(SP, 1); |
731
|
48824452
|
100
|
|
|
|
if (!lval && SvRMAGICAL(av) && SvGMAGICAL(sv)) /* see note in pp_helem() */ |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
732
|
66182
|
|
|
|
|
mg_get(sv); |
733
|
48824452
|
|
|
|
|
PUSHs(sv); |
734
|
48824452
|
|
|
|
|
RETURN; |
735
|
|
|
|
|
|
} |
736
|
|
|
|
|
|
|
737
|
7224727
|
|
|
|
|
PP(pp_join) |
738
|
|
|
|
|
|
{ |
739
|
7224727
|
|
|
|
|
dVAR; dSP; dMARK; dTARGET; |
740
|
7224727
|
|
|
|
|
MARK++; |
741
|
7224727
|
|
|
|
|
do_join(TARG, *MARK, MARK, SP); |
742
|
|
|
|
|
|
SP = MARK; |
743
|
7224727
|
|
|
|
|
SETs(TARG); |
744
|
7224727
|
|
|
|
|
RETURN; |
745
|
|
|
|
|
|
} |
746
|
|
|
|
|
|
|
747
|
4476850
|
|
|
|
|
PP(pp_pushre) |
748
|
|
|
|
|
|
{ |
749
|
4476850
|
|
|
|
|
dVAR; dSP; |
750
|
|
|
|
|
|
#ifdef DEBUGGING |
751
|
|
|
|
|
|
/* |
752
|
|
|
|
|
|
* We ass_u_me that LvTARGOFF() comes first, and that two STRLENs |
753
|
|
|
|
|
|
* will be enough to hold an OP*. |
754
|
|
|
|
|
|
*/ |
755
|
|
|
|
|
|
SV* const sv = sv_newmortal(); |
756
|
|
|
|
|
|
sv_upgrade(sv, SVt_PVLV); |
757
|
|
|
|
|
|
LvTYPE(sv) = '/'; |
758
|
|
|
|
|
|
Copy(&PL_op, &LvTARGOFF(sv), 1, OP*); |
759
|
|
|
|
|
|
XPUSHs(sv); |
760
|
|
|
|
|
|
#else |
761
|
4476850
|
50
|
|
|
|
XPUSHs(MUTABLE_SV(PL_op)); |
762
|
|
|
|
|
|
#endif |
763
|
4476850
|
|
|
|
|
RETURN; |
764
|
|
|
|
|
|
} |
765
|
|
|
|
|
|
|
766
|
|
|
|
|
|
/* Oversized hot code. */ |
767
|
|
|
|
|
|
|
768
|
3171717
|
|
|
|
|
PP(pp_print) |
769
|
|
|
|
|
|
{ |
770
|
3171717
|
|
|
|
|
dVAR; dSP; dMARK; dORIGMARK; |
771
|
|
|
|
|
|
PerlIO *fp; |
772
|
|
|
|
|
|
MAGIC *mg; |
773
|
|
|
|
|
|
GV * const gv |
774
|
3171717
|
100
|
|
|
|
= (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv; |
775
|
3171717
|
100
|
|
|
|
IO *io = GvIO(gv); |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
776
|
|
|
|
|
|
|
777
|
3171717
|
100
|
|
|
|
if (io |
778
|
3171689
|
100
|
|
|
|
&& (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) |
|
|
100
|
|
|
|
|
779
|
|
|
|
|
|
{ |
780
|
|
|
|
|
|
had_magic: |
781
|
192338
|
100
|
|
|
|
if (MARK == ORIGMARK) { |
782
|
|
|
|
|
|
/* If using default handle then we need to make space to |
783
|
|
|
|
|
|
* pass object as 1st arg, so move other args up ... |
784
|
|
|
|
|
|
*/ |
785
|
127326
|
50
|
|
|
|
MEXTEND(SP, 1); |
786
|
127326
|
|
|
|
|
++MARK; |
787
|
127326
|
50
|
|
|
|
Move(MARK, MARK + 1, (SP - MARK) + 1, SV*); |
788
|
127326
|
|
|
|
|
++SP; |
789
|
|
|
|
|
|
} |
790
|
288507
|
100
|
|
|
|
return Perl_tied_method(aTHX_ SV_CONST(PRINT), mark - 1, MUTABLE_SV(io), |
|
|
100
|
|
|
|
|
791
|
|
|
|
|
|
mg, |
792
|
|
|
|
|
|
(G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK |
793
|
192338
|
|
|
|
|
| (PL_op->op_type == OP_SAY |
794
|
192338
|
|
|
|
|
? TIED_METHOD_SAY : 0)), sp - mark); |
795
|
|
|
|
|
|
} |
796
|
2979379
|
100
|
|
|
|
if (!io) { |
797
|
28
|
100
|
|
|
|
if ( gv && GvEGVx(gv) && (io = GvIO(GvEGV(gv))) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
798
|
0
|
0
|
|
|
|
&& (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) |
|
|
0
|
|
|
|
|
799
|
|
|
|
|
|
goto had_magic; |
800
|
28
|
|
|
|
|
report_evil_fh(gv); |
801
|
28
|
|
|
|
|
SETERRNO(EBADF,RMS_IFI); |
802
|
28
|
|
|
|
|
goto just_say_no; |
803
|
|
|
|
|
|
} |
804
|
2979351
|
100
|
|
|
|
else if (!(fp = IoOFP(io))) { |
805
|
74
|
100
|
|
|
|
if (IoIFP(io)) |
806
|
22
|
|
|
|
|
report_wrongway_fh(gv, '<'); |
807
|
|
|
|
|
|
else |
808
|
52
|
|
|
|
|
report_evil_fh(gv); |
809
|
72
|
|
|
|
|
SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI); |
810
|
72
|
|
|
|
|
goto just_say_no; |
811
|
|
|
|
|
|
} |
812
|
|
|
|
|
|
else { |
813
|
2979277
|
|
|
|
|
SV * const ofs = GvSV(PL_ofsgv); /* $, */ |
814
|
2979277
|
|
|
|
|
MARK++; |
815
|
2979277
|
50
|
|
|
|
if (ofs && (SvGMAGICAL(ofs) || SvOK(ofs))) { |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
816
|
2523874
|
100
|
|
|
|
while (MARK <= SP) { |
817
|
1501118
|
50
|
|
|
|
if (!do_print(*MARK, fp)) |
818
|
|
|
|
|
|
break; |
819
|
1501118
|
|
|
|
|
MARK++; |
820
|
1501118
|
100
|
|
|
|
if (MARK <= SP) { |
821
|
|
|
|
|
|
/* don't use 'ofs' here - it may be invalidated by magic callbacks */ |
822
|
989876
|
50
|
|
|
|
if (!do_print(GvSV(PL_ofsgv), fp)) { |
823
|
|
|
|
|
|
MARK--; |
824
|
|
|
|
|
|
break; |
825
|
|
|
|
|
|
} |
826
|
|
|
|
|
|
} |
827
|
|
|
|
|
|
} |
828
|
|
|
|
|
|
} |
829
|
|
|
|
|
|
else { |
830
|
4981182
|
100
|
|
|
|
while (MARK <= SP) { |
831
|
3024673
|
100
|
|
|
|
if (!do_print(*MARK, fp)) |
832
|
|
|
|
|
|
break; |
833
|
3024661
|
|
|
|
|
MARK++; |
834
|
|
|
|
|
|
} |
835
|
|
|
|
|
|
} |
836
|
2979271
|
100
|
|
|
|
if (MARK <= SP) |
837
|
|
|
|
|
|
goto just_say_no; |
838
|
|
|
|
|
|
else { |
839
|
2979265
|
100
|
|
|
|
if (PL_op->op_type == OP_SAY) { |
840
|
68
|
50
|
|
|
|
if (PerlIO_write(fp, "\n", 1) == 0 || PerlIO_error(fp)) |
|
|
50
|
|
|
|
|
841
|
|
|
|
|
|
goto just_say_no; |
842
|
|
|
|
|
|
} |
843
|
2979197
|
100
|
|
|
|
else if (PL_ors_sv && SvOK(PL_ors_sv)) |
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
844
|
42852
|
50
|
|
|
|
if (!do_print(PL_ors_sv, fp)) /* $\ */ |
845
|
|
|
|
|
|
goto just_say_no; |
846
|
|
|
|
|
|
|
847
|
2979265
|
100
|
|
|
|
if (IoFLAGS(io) & IOf_FLUSH) |
848
|
696948
|
50
|
|
|
|
if (PerlIO_flush(fp) == EOF) |
849
|
|
|
|
|
|
goto just_say_no; |
850
|
|
|
|
|
|
} |
851
|
|
|
|
|
|
} |
852
|
2979265
|
|
|
|
|
SP = ORIGMARK; |
853
|
2979265
|
50
|
|
|
|
XPUSHs(&PL_sv_yes); |
854
|
2979265
|
|
|
|
|
RETURN; |
855
|
|
|
|
|
|
|
856
|
|
|
|
|
|
just_say_no: |
857
|
106
|
|
|
|
|
SP = ORIGMARK; |
858
|
106
|
50
|
|
|
|
XPUSHs(&PL_sv_undef); |
859
|
1586080
|
|
|
|
|
RETURN; |
860
|
|
|
|
|
|
} |
861
|
|
|
|
|
|
|
862
|
600757963
|
|
|
|
|
PP(pp_rv2av) |
863
|
600757963
|
100
|
|
|
|
{ |
864
|
600757963
|
|
|
|
|
dVAR; dSP; dTOPss; |
865
|
600757963
|
100
|
|
|
|
const I32 gimme = GIMME_V; |
866
|
|
|
|
|
|
static const char an_array[] = "an ARRAY"; |
867
|
|
|
|
|
|
static const char a_hash[] = "a HASH"; |
868
|
600757963
|
|
|
|
|
const bool is_pp_rv2av = PL_op->op_type == OP_RV2AV; |
869
|
600757963
|
100
|
|
|
|
const svtype type = is_pp_rv2av ? SVt_PVAV : SVt_PVHV; |
870
|
|
|
|
|
|
|
871
|
299281958
|
|
|
|
|
SvGETMAGIC(sv); |
872
|
600757963
|
100
|
|
|
|
if (SvROK(sv)) { |
873
|
413329709
|
50
|
|
|
|
if (SvAMAGIC(sv)) { |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
874
|
4525351
|
100
|
|
|
|
sv = amagic_deref_call(sv, is_pp_rv2av ? to_av_amg : to_hv_amg); |
875
|
|
|
|
|
|
} |
876
|
413329709
|
|
|
|
|
sv = SvRV(sv); |
877
|
413329709
|
100
|
|
|
|
if (SvTYPE(sv) != type) |
878
|
|
|
|
|
|
/* diag_listed_as: Not an ARRAY reference */ |
879
|
98
|
100
|
|
|
|
DIE(aTHX_ "Not %s reference", is_pp_rv2av ? an_array : a_hash); |
880
|
413329611
|
100
|
|
|
|
else if (PL_op->op_flags & OPf_MOD |
881
|
15778613
|
100
|
|
|
|
&& PL_op->op_private & OPpLVAL_INTRO) |
882
|
40
|
|
|
|
|
Perl_croak(aTHX_ "%s", PL_no_localize_ref); |
883
|
|
|
|
|
|
} |
884
|
187428254
|
100
|
|
|
|
else if (SvTYPE(sv) != type) { |
885
|
|
|
|
|
|
GV *gv; |
886
|
|
|
|
|
|
|
887
|
187246586
|
100
|
|
|
|
if (!isGV_with_GP(sv)) { |
|
|
50
|
|
|
|
|
888
|
3515435
|
100
|
|
|
|
gv = Perl_softref2xv(aTHX_ sv, is_pp_rv2av ? an_array : a_hash, |
889
|
|
|
|
|
|
type, &sp); |
890
|
3515415
|
100
|
|
|
|
if (!gv) |
891
|
70
|
|
|
|
|
RETURN; |
892
|
|
|
|
|
|
} |
893
|
|
|
|
|
|
else { |
894
|
|
|
|
|
|
gv = MUTABLE_GV(sv); |
895
|
|
|
|
|
|
} |
896
|
187246496
|
100
|
|
|
|
sv = is_pp_rv2av ? MUTABLE_SV(GvAVn(gv)) : MUTABLE_SV(GvHVn(gv)); |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
897
|
187246496
|
100
|
|
|
|
if (PL_op->op_private & OPpLVAL_INTRO) |
898
|
124364
|
100
|
|
|
|
sv = is_pp_rv2av ? MUTABLE_SV(save_ary(gv)) : MUTABLE_SV(save_hash(gv)); |
899
|
|
|
|
|
|
} |
900
|
600757735
|
100
|
|
|
|
if (PL_op->op_flags & OPf_REF) { |
901
|
554949794
|
|
|
|
|
SETs(sv); |
902
|
554949794
|
|
|
|
|
RETURN; |
903
|
|
|
|
|
|
} |
904
|
45807941
|
100
|
|
|
|
else if (PL_op->op_private & OPpMAYBE_LVSUB) { |
905
|
18
|
|
|
|
|
const I32 flags = is_lvalue_sub(); |
906
|
18
|
50
|
|
|
|
if (flags && !(flags & OPpENTERSUB_INARGS)) { |
|
|
100
|
|
|
|
|
907
|
8
|
50
|
|
|
|
if (gimme != G_ARRAY) |
908
|
|
|
|
|
|
goto croak_cant_return; |
909
|
8
|
|
|
|
|
SETs(sv); |
910
|
8
|
|
|
|
|
RETURN; |
911
|
|
|
|
|
|
} |
912
|
|
|
|
|
|
} |
913
|
|
|
|
|
|
|
914
|
45807933
|
100
|
|
|
|
if (is_pp_rv2av) { |
915
|
|
|
|
|
|
AV *const av = MUTABLE_AV(sv); |
916
|
|
|
|
|
|
/* The guts of pp_rv2av, with no intending change to preserve history |
917
|
|
|
|
|
|
(until such time as we get tools that can do blame annotation across |
918
|
|
|
|
|
|
whitespace changes. */ |
919
|
45077440
|
100
|
|
|
|
if (gimme == G_ARRAY) { |
920
|
28992172
|
|
|
|
|
SP--; |
921
|
28992172
|
|
|
|
|
PUTBACK; |
922
|
28992172
|
|
|
|
|
S_pushav(aTHX_ av); |
923
|
28992172
|
|
|
|
|
SPAGAIN; |
924
|
|
|
|
|
|
} |
925
|
16085268
|
100
|
|
|
|
else if (gimme == G_SCALAR) { |
926
|
15944489
|
|
|
|
|
dTARGET; |
927
|
15944489
|
100
|
|
|
|
const SSize_t maxarg = AvFILL(av) + 1; |
928
|
15944489
|
50
|
|
|
|
SETi(maxarg); |
929
|
|
|
|
|
|
} |
930
|
|
|
|
|
|
} else { |
931
|
|
|
|
|
|
/* The guts of pp_rv2hv */ |
932
|
730493
|
100
|
|
|
|
if (gimme == G_ARRAY) { /* array wanted */ |
933
|
376502
|
|
|
|
|
*PL_stack_sp = sv; |
934
|
376502
|
|
|
|
|
return Perl_do_kv(aTHX); |
935
|
|
|
|
|
|
} |
936
|
353991
|
100
|
|
|
|
else if ((PL_op->op_private & OPpTRUEBOOL |
937
|
190012
|
50
|
|
|
|
|| ( PL_op->op_private & OPpMAYBE_TRUEBOOL |
938
|
0
|
0
|
|
|
|
&& block_gimme() == G_VOID )) |
939
|
163979
|
50
|
|
|
|
&& (!SvRMAGICAL(sv) || !mg_find(sv, PERL_MAGIC_tied))) |
|
|
0
|
|
|
|
|
940
|
163979
|
50
|
|
|
|
SETs(HvUSEDKEYS(sv) ? &PL_sv_yes : sv_2mortal(newSViv(0))); |
|
|
100
|
|
|
|
|
941
|
190012
|
100
|
|
|
|
else if (gimme == G_SCALAR) { |
942
|
|
|
|
|
|
dTARGET; |
943
|
108595
|
|
|
|
|
TARG = Perl_hv_scalar(aTHX_ MUTABLE_HV(sv)); |
944
|
108595
|
|
|
|
|
SPAGAIN; |
945
|
108595
|
50
|
|
|
|
SETTARG; |
946
|
|
|
|
|
|
} |
947
|
|
|
|
|
|
} |
948
|
45431431
|
|
|
|
|
RETURN; |
949
|
|
|
|
|
|
|
950
|
|
|
|
|
|
croak_cant_return: |
951
|
301475944
|
0
|
|
|
|
Perl_croak(aTHX_ "Can't return %s to lvalue scalar context", |
952
|
|
|
|
|
|
is_pp_rv2av ? "array" : "hash"); |
953
|
|
|
|
|
|
RETURN; |
954
|
|
|
|
|
|
} |
955
|
|
|
|
|
|
|
956
|
|
|
|
|
|
STATIC void |
957
|
|
|
|
|
|
S_do_oddball(pTHX_ SV **oddkey, SV **firstkey) |
958
|
|
|
|
|
|
{ |
959
|
|
|
|
|
|
dVAR; |
960
|
|
|
|
|
|
|
961
|
|
|
|
|
|
PERL_ARGS_ASSERT_DO_ODDBALL; |
962
|
|
|
|
|
|
|
963
|
82
|
50
|
|
|
|
if (*oddkey) { |
964
|
82
|
100
|
|
|
|
if (ckWARN(WARN_MISC)) { |
965
|
|
|
|
|
|
const char *err; |
966
|
46
|
100
|
|
|
|
if (oddkey == firstkey && |
|
|
100
|
|
|
|
|
967
|
38
|
100
|
|
|
|
SvROK(*oddkey) && |
968
|
18
|
|
|
|
|
(SvTYPE(SvRV(*oddkey)) == SVt_PVAV || |
969
|
|
|
|
|
|
SvTYPE(SvRV(*oddkey)) == SVt_PVHV)) |
970
|
|
|
|
|
|
{ |
971
|
|
|
|
|
|
err = "Reference found where even-sized list expected"; |
972
|
|
|
|
|
|
} |
973
|
|
|
|
|
|
else |
974
|
|
|
|
|
|
err = "Odd number of elements in hash assignment"; |
975
|
34
|
|
|
|
|
Perl_warner(aTHX_ packWARN(WARN_MISC), "%s", err); |
976
|
|
|
|
|
|
} |
977
|
|
|
|
|
|
|
978
|
|
|
|
|
|
} |
979
|
|
|
|
|
|
} |
980
|
|
|
|
|
|
|
981
|
201988272
|
|
|
|
|
PP(pp_aassign) |
982
|
|
|
|
|
|
{ |
983
|
|
|
|
|
|
dVAR; dSP; |
984
|
201988272
|
|
|
|
|
SV **lastlelem = PL_stack_sp; |
985
|
201988272
|
|
|
|
|
SV **lastrelem = PL_stack_base + POPMARK; |
986
|
201988272
|
|
|
|
|
SV **firstrelem = PL_stack_base + POPMARK + 1; |
987
|
201988272
|
|
|
|
|
SV **firstlelem = lastrelem + 1; |
988
|
|
|
|
|
|
|
989
|
|
|
|
|
|
SV **relem; |
990
|
|
|
|
|
|
SV **lelem; |
991
|
|
|
|
|
|
|
992
|
|
|
|
|
|
SV *sv; |
993
|
|
|
|
|
|
AV *ary; |
994
|
|
|
|
|
|
|
995
|
|
|
|
|
|
I32 gimme; |
996
|
|
|
|
|
|
HV *hash; |
997
|
|
|
|
|
|
SSize_t i; |
998
|
|
|
|
|
|
int magic; |
999
|
|
|
|
|
|
U32 lval = 0; |
1000
|
|
|
|
|
|
|
1001
|
201988272
|
|
|
|
|
PL_delaymagic = DM_DELAY; /* catch simultaneous items */ |
1002
|
201988272
|
100
|
|
|
|
gimme = GIMME_V; |
1003
|
201988272
|
100
|
|
|
|
if (gimme == G_ARRAY) |
1004
|
95046
|
100
|
|
|
|
lval = PL_op->op_flags & OPf_MOD || LVRET; |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
1005
|
|
|
|
|
|
|
1006
|
|
|
|
|
|
/* If there's a common identifier on both sides we have to take |
1007
|
|
|
|
|
|
* special care that assigning the identifier on the left doesn't |
1008
|
|
|
|
|
|
* clobber a value on the right that's used later in the list. |
1009
|
|
|
|
|
|
* Don't bother if LHS is just an empty hash or array. |
1010
|
|
|
|
|
|
*/ |
1011
|
|
|
|
|
|
|
1012
|
206845909
|
100
|
|
|
|
if ( (PL_op->op_private & OPpASSIGN_COMMON) |
|
|
50
|
|
|
|
|
1013
|
23157622
|
100
|
|
|
|
&& ( |
1014
|
|
|
|
|
|
firstlelem != lastlelem |
1015
|
8377761
|
50
|
|
|
|
|| ! ((sv = *firstlelem)) |
1016
|
8377761
|
100
|
|
|
|
|| SvMAGICAL(sv) |
1017
|
8347047
|
100
|
|
|
|
|| ! (SvTYPE(sv) == SVt_PVAV || SvTYPE(sv) == SVt_PVHV) |
1018
|
10587827
|
100
|
|
|
|
|| (SvTYPE(sv) == SVt_PVAV && AvFILL((AV*)sv) != -1) |
|
|
0
|
|
|
|
|
|
|
100
|
|
|
|
|
1019
|
7685271
|
100
|
|
|
|
|| (SvTYPE(sv) == SVt_PVHV && HvUSEDKEYS((HV*)sv) != 0) |
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
1020
|
|
|
|
|
|
) |
1021
|
|
|
|
|
|
) { |
1022
|
15506071
|
100
|
|
|
|
EXTEND_MORTAL(lastrelem - firstrelem + 1); |
1023
|
59674143
|
100
|
|
|
|
for (relem = firstrelem; relem <= lastrelem; relem++) { |
1024
|
44168076
|
50
|
|
|
|
if ((sv = *relem)) { |
1025
|
44168076
|
|
|
|
|
TAINT_NOT; /* Each item is independent */ |
1026
|
|
|
|
|
|
|
1027
|
|
|
|
|
|
/* Dear TODO test in t/op/sort.t, I love you. |
1028
|
|
|
|
|
|
(It's relying on a panic, not a "semi-panic" from newSVsv() |
1029
|
|
|
|
|
|
and then an assertion failure below.) */ |
1030
|
44168076
|
50
|
|
|
|
if (SvIS_FREED(sv)) { |
1031
|
0
|
|
|
|
|
Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p", |
1032
|
|
|
|
|
|
(void*)sv); |
1033
|
|
|
|
|
|
} |
1034
|
|
|
|
|
|
/* Not newSVsv(), as it does not allow copy-on-write, |
1035
|
|
|
|
|
|
resulting in wasteful copies. We need a second copy of |
1036
|
|
|
|
|
|
a temp here, hence the SV_NOSTEAL. */ |
1037
|
44168076
|
|
|
|
|
*relem = sv_mortalcopy_flags(sv,SV_GMAGIC|SV_DO_COW_SVSETSV |
1038
|
|
|
|
|
|
|SV_NOSTEAL); |
1039
|
|
|
|
|
|
} |
1040
|
|
|
|
|
|
} |
1041
|
|
|
|
|
|
} |
1042
|
|
|
|
|
|
|
1043
|
|
|
|
|
|
relem = firstrelem; |
1044
|
|
|
|
|
|
lelem = firstlelem; |
1045
|
|
|
|
|
|
ary = NULL; |
1046
|
|
|
|
|
|
hash = NULL; |
1047
|
|
|
|
|
|
|
1048
|
686088296
|
100
|
|
|
|
while (lelem <= lastlelem) { |
1049
|
383286927
|
|
|
|
|
TAINT_NOT; /* Each item stands on its own, taintwise. */ |
1050
|
383286927
|
|
|
|
|
sv = *lelem++; |
1051
|
383286927
|
|
|
|
|
switch (SvTYPE(sv)) { |
1052
|
|
|
|
|
|
case SVt_PVAV: |
1053
|
|
|
|
|
|
ary = MUTABLE_AV(sv); |
1054
|
18824826
|
|
|
|
|
magic = SvMAGICAL(ary) != 0; |
1055
|
18824826
|
|
|
|
|
ENTER; |
1056
|
18824826
|
|
|
|
|
SAVEFREESV(SvREFCNT_inc_simple_NN(sv)); |
1057
|
18824826
|
|
|
|
|
av_clear(ary); |
1058
|
18824824
|
|
|
|
|
av_extend(ary, lastrelem - relem); |
1059
|
|
|
|
|
|
i = 0; |
1060
|
140844550
|
100
|
|
|
|
while (relem <= lastrelem) { /* gobble up all the rest */ |
1061
|
|
|
|
|
|
SV **didstore; |
1062
|
168852963
|
50
|
|
|
|
if (*relem) |
|
|
100
|
|
|
|
|
1063
|
56261668
|
|
|
|
|
SvGETMAGIC(*relem); /* before newSV, in case it dies */ |
1064
|
112649909
|
|
|
|
|
sv = newSV(0); |
1065
|
112649909
|
|
|
|
|
sv_setsv_nomg(sv, *relem); |
1066
|
112649907
|
|
|
|
|
*(relem++) = sv; |
1067
|
112649907
|
|
|
|
|
didstore = av_store(ary,i++,sv); |
1068
|
112649907
|
100
|
|
|
|
if (magic) { |
1069
|
502608
|
100
|
|
|
|
if (!didstore) |
1070
|
1132
|
|
|
|
|
sv_2mortal(sv); |
1071
|
502608
|
100
|
|
|
|
if (SvSMAGICAL(sv)) |
1072
|
371800
|
|
|
|
|
mg_set(sv); |
1073
|
|
|
|
|
|
} |
1074
|
112649903
|
|
|
|
|
TAINT_NOT; |
1075
|
|
|
|
|
|
} |
1076
|
18824814
|
100
|
|
|
|
if (PL_delaymagic & DM_ARRAY_ISA) |
1077
|
348450
|
50
|
|
|
|
SvSETMAGIC(MUTABLE_SV(ary)); |
1078
|
18824742
|
|
|
|
|
LEAVE; |
1079
|
18824742
|
|
|
|
|
break; |
1080
|
|
|
|
|
|
case SVt_PVHV: { /* normal hash */ |
1081
|
|
|
|
|
|
SV *tmpstr; |
1082
|
|
|
|
|
|
int odd; |
1083
|
|
|
|
|
|
int duplicates = 0; |
1084
|
|
|
|
|
|
SV** topelem = relem; |
1085
|
|
|
|
|
|
SV **firsthashrelem = relem; |
1086
|
|
|
|
|
|
|
1087
|
|
|
|
|
|
hash = MUTABLE_HV(sv); |
1088
|
5878683
|
|
|
|
|
magic = SvMAGICAL(hash) != 0; |
1089
|
|
|
|
|
|
|
1090
|
5878683
|
100
|
|
|
|
odd = ((lastrelem - firsthashrelem)&1)? 0 : 1; |
1091
|
5878683
|
100
|
|
|
|
if ( odd ) { |
1092
|
|
|
|
|
|
do_oddball(lastrelem, firsthashrelem); |
1093
|
|
|
|
|
|
/* we have firstlelem to reuse, it's not needed anymore |
1094
|
|
|
|
|
|
*/ |
1095
|
82
|
|
|
|
|
*(lastrelem+1) = &PL_sv_undef; |
1096
|
|
|
|
|
|
} |
1097
|
|
|
|
|
|
|
1098
|
5878683
|
|
|
|
|
ENTER; |
1099
|
5878683
|
|
|
|
|
SAVEFREESV(SvREFCNT_inc_simple_NN(sv)); |
1100
|
5878683
|
|
|
|
|
hv_clear(hash); |
1101
|
49560755
|
100
|
|
|
|
while (relem < lastrelem+odd) { /* gobble up all the rest */ |
|
|
100
|
|
|
|
|
1102
|
|
|
|
|
|
HE *didstore; |
1103
|
|
|
|
|
|
assert(*relem); |
1104
|
|
|
|
|
|
/* Copy the key if aassign is called in lvalue context, |
1105
|
|
|
|
|
|
to avoid having the next op modify our rhs. Copy |
1106
|
|
|
|
|
|
it also if it is gmagical, lest it make the |
1107
|
|
|
|
|
|
hv_store_ent call below croak, leaking the value. */ |
1108
|
20374756
|
100
|
|
|
|
sv = lval || SvGMAGICAL(*relem) |
1109
|
58
|
|
|
|
|
? sv_mortalcopy(*relem) |
1110
|
30724567
|
100
|
|
|
|
: *relem; |
1111
|
|
|
|
|
|
relem++; |
1112
|
|
|
|
|
|
assert(*relem); |
1113
|
11445415
|
|
|
|
|
SvGETMAGIC(*relem); |
1114
|
20374786
|
|
|
|
|
tmpstr = newSV(0); |
1115
|
20374786
|
|
|
|
|
sv_setsv_nomg(tmpstr,*relem++); /* value */ |
1116
|
20374786
|
100
|
|
|
|
if (gimme == G_ARRAY) { |
1117
|
184
|
100
|
|
|
|
if (hv_exists_ent(hash, sv, 0)) |
1118
|
|
|
|
|
|
/* key overwrites an existing entry */ |
1119
|
58
|
|
|
|
|
duplicates += 2; |
1120
|
|
|
|
|
|
else { |
1121
|
|
|
|
|
|
/* copy element back: possibly to an earlier |
1122
|
|
|
|
|
|
* stack location if we encountered dups earlier, |
1123
|
|
|
|
|
|
* possibly to a later stack location if odd */ |
1124
|
126
|
|
|
|
|
*topelem++ = sv; |
1125
|
126
|
|
|
|
|
*topelem++ = tmpstr; |
1126
|
|
|
|
|
|
} |
1127
|
|
|
|
|
|
} |
1128
|
20374786
|
|
|
|
|
didstore = hv_store_ent(hash,sv,tmpstr,0); |
1129
|
20374786
|
100
|
|
|
|
if (magic) { |
1130
|
338728
|
100
|
|
|
|
if (!didstore) sv_2mortal(tmpstr); |
1131
|
338728
|
100
|
|
|
|
SvSETMAGIC(tmpstr); |
1132
|
|
|
|
|
|
} |
1133
|
20374786
|
|
|
|
|
TAINT_NOT; |
1134
|
|
|
|
|
|
} |
1135
|
5878663
|
|
|
|
|
LEAVE; |
1136
|
5878663
|
100
|
|
|
|
if (duplicates && gimme == G_ARRAY) { |
1137
|
|
|
|
|
|
/* at this point we have removed the duplicate key/value |
1138
|
|
|
|
|
|
* pairs from the stack, but the remaining values may be |
1139
|
|
|
|
|
|
* wrong; i.e. with (a 1 a 2 b 3) on the stack we've removed |
1140
|
|
|
|
|
|
* the (a 2), but the stack now probably contains |
1141
|
|
|
|
|
|
* (a b 3), because { hv_save(a,1); hv_save(a,2) } |
1142
|
|
|
|
|
|
* obliterates the earlier key. So refresh all values. */ |
1143
|
32
|
|
|
|
|
lastrelem -= duplicates; |
1144
|
|
|
|
|
|
relem = firsthashrelem; |
1145
|
92
|
100
|
|
|
|
while (relem < lastrelem+odd) { |
1146
|
|
|
|
|
|
HE *he; |
1147
|
44
|
|
|
|
|
he = hv_fetch_ent(hash, *relem++, 0, 0); |
1148
|
44
|
50
|
|
|
|
*relem++ = (he ? HeVAL(he) : &PL_sv_undef); |
1149
|
|
|
|
|
|
} |
1150
|
|
|
|
|
|
} |
1151
|
5878663
|
100
|
|
|
|
if (odd && gimme == G_ARRAY) lastrelem++; |
1152
|
|
|
|
|
|
} |
1153
|
|
|
|
|
|
break; |
1154
|
|
|
|
|
|
default: |
1155
|
358583418
|
100
|
|
|
|
if (SvIMMORTAL(sv)) { |
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
1156
|
651948
|
100
|
|
|
|
if (relem <= lastrelem) |
1157
|
643818
|
|
|
|
|
relem++; |
1158
|
|
|
|
|
|
break; |
1159
|
|
|
|
|
|
} |
1160
|
357931470
|
100
|
|
|
|
if (relem <= lastrelem) { |
1161
|
340789163
|
100
|
|
|
|
if ( |
1162
|
170120671
|
100
|
|
|
|
SvTEMP(sv) && !SvSMAGICAL(sv) && SvREFCNT(sv) == 1 && |
1163
|
8
|
50
|
|
|
|
(!isGV_with_GP(sv) || SvFAKE(sv)) && ckWARN(WARN_MISC) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
1164
|
|
|
|
|
|
) |
1165
|
2
|
|
|
|
|
Perl_warner(aTHX_ |
1166
|
|
|
|
|
|
packWARN(WARN_MISC), |
1167
|
|
|
|
|
|
"Useless assignment to a temporary" |
1168
|
|
|
|
|
|
); |
1169
|
340789163
|
|
|
|
|
sv_setsv(sv, *relem); |
1170
|
340789163
|
|
|
|
|
*(relem++) = sv; |
1171
|
|
|
|
|
|
} |
1172
|
|
|
|
|
|
else |
1173
|
17142307
|
|
|
|
|
sv_setsv(sv, &PL_sv_undef); |
1174
|
370663074
|
100
|
|
|
|
SvSETMAGIC(sv); |
1175
|
|
|
|
|
|
break; |
1176
|
|
|
|
|
|
} |
1177
|
|
|
|
|
|
} |
1178
|
201988164
|
100
|
|
|
|
if (PL_delaymagic & ~DM_DELAY) { |
1179
|
|
|
|
|
|
/* Will be used to set PL_tainting below */ |
1180
|
348374
|
|
|
|
|
Uid_t tmp_uid = PerlProc_getuid(); |
1181
|
348374
|
|
|
|
|
Uid_t tmp_euid = PerlProc_geteuid(); |
1182
|
348374
|
|
|
|
|
Gid_t tmp_gid = PerlProc_getgid(); |
1183
|
348374
|
|
|
|
|
Gid_t tmp_egid = PerlProc_getegid(); |
1184
|
|
|
|
|
|
|
1185
|
348374
|
50
|
|
|
|
if (PL_delaymagic & DM_UID) { |
1186
|
|
|
|
|
|
#ifdef HAS_SETRESUID |
1187
|
0
|
0
|
|
|
|
(void)setresuid((PL_delaymagic & DM_RUID) ? PL_delaymagic_uid : (Uid_t)-1, |
|
|
0
|
|
|
|
|
1188
|
0
|
|
|
|
|
(PL_delaymagic & DM_EUID) ? PL_delaymagic_euid : (Uid_t)-1, |
1189
|
|
|
|
|
|
(Uid_t)-1); |
1190
|
|
|
|
|
|
#else |
1191
|
|
|
|
|
|
# ifdef HAS_SETREUID |
1192
|
|
|
|
|
|
(void)setreuid((PL_delaymagic & DM_RUID) ? PL_delaymagic_uid : (Uid_t)-1, |
1193
|
|
|
|
|
|
(PL_delaymagic & DM_EUID) ? PL_delaymagic_euid : (Uid_t)-1); |
1194
|
|
|
|
|
|
# else |
1195
|
|
|
|
|
|
# ifdef HAS_SETRUID |
1196
|
|
|
|
|
|
if ((PL_delaymagic & DM_UID) == DM_RUID) { |
1197
|
|
|
|
|
|
(void)setruid(PL_delaymagic_uid); |
1198
|
|
|
|
|
|
PL_delaymagic &= ~DM_RUID; |
1199
|
|
|
|
|
|
} |
1200
|
|
|
|
|
|
# endif /* HAS_SETRUID */ |
1201
|
|
|
|
|
|
# ifdef HAS_SETEUID |
1202
|
|
|
|
|
|
if ((PL_delaymagic & DM_UID) == DM_EUID) { |
1203
|
|
|
|
|
|
(void)seteuid(PL_delaymagic_euid); |
1204
|
|
|
|
|
|
PL_delaymagic &= ~DM_EUID; |
1205
|
|
|
|
|
|
} |
1206
|
|
|
|
|
|
# endif /* HAS_SETEUID */ |
1207
|
|
|
|
|
|
if (PL_delaymagic & DM_UID) { |
1208
|
|
|
|
|
|
if (PL_delaymagic_uid != PL_delaymagic_euid) |
1209
|
|
|
|
|
|
DIE(aTHX_ "No setreuid available"); |
1210
|
|
|
|
|
|
(void)PerlProc_setuid(PL_delaymagic_uid); |
1211
|
|
|
|
|
|
} |
1212
|
|
|
|
|
|
# endif /* HAS_SETREUID */ |
1213
|
|
|
|
|
|
#endif /* HAS_SETRESUID */ |
1214
|
0
|
|
|
|
|
tmp_uid = PerlProc_getuid(); |
1215
|
0
|
|
|
|
|
tmp_euid = PerlProc_geteuid(); |
1216
|
|
|
|
|
|
} |
1217
|
348374
|
50
|
|
|
|
if (PL_delaymagic & DM_GID) { |
1218
|
|
|
|
|
|
#ifdef HAS_SETRESGID |
1219
|
0
|
0
|
|
|
|
(void)setresgid((PL_delaymagic & DM_RGID) ? PL_delaymagic_gid : (Gid_t)-1, |
|
|
0
|
|
|
|
|
1220
|
0
|
|
|
|
|
(PL_delaymagic & DM_EGID) ? PL_delaymagic_egid : (Gid_t)-1, |
1221
|
|
|
|
|
|
(Gid_t)-1); |
1222
|
|
|
|
|
|
#else |
1223
|
|
|
|
|
|
# ifdef HAS_SETREGID |
1224
|
|
|
|
|
|
(void)setregid((PL_delaymagic & DM_RGID) ? PL_delaymagic_gid : (Gid_t)-1, |
1225
|
|
|
|
|
|
(PL_delaymagic & DM_EGID) ? PL_delaymagic_egid : (Gid_t)-1); |
1226
|
|
|
|
|
|
# else |
1227
|
|
|
|
|
|
# ifdef HAS_SETRGID |
1228
|
|
|
|
|
|
if ((PL_delaymagic & DM_GID) == DM_RGID) { |
1229
|
|
|
|
|
|
(void)setrgid(PL_delaymagic_gid); |
1230
|
|
|
|
|
|
PL_delaymagic &= ~DM_RGID; |
1231
|
|
|
|
|
|
} |
1232
|
|
|
|
|
|
# endif /* HAS_SETRGID */ |
1233
|
|
|
|
|
|
# ifdef HAS_SETEGID |
1234
|
|
|
|
|
|
if ((PL_delaymagic & DM_GID) == DM_EGID) { |
1235
|
|
|
|
|
|
(void)setegid(PL_delaymagic_egid); |
1236
|
|
|
|
|
|
PL_delaymagic &= ~DM_EGID; |
1237
|
|
|
|
|
|
} |
1238
|
|
|
|
|
|
# endif /* HAS_SETEGID */ |
1239
|
|
|
|
|
|
if (PL_delaymagic & DM_GID) { |
1240
|
|
|
|
|
|
if (PL_delaymagic_gid != PL_delaymagic_egid) |
1241
|
|
|
|
|
|
DIE(aTHX_ "No setregid available"); |
1242
|
|
|
|
|
|
(void)PerlProc_setgid(PL_delaymagic_gid); |
1243
|
|
|
|
|
|
} |
1244
|
|
|
|
|
|
# endif /* HAS_SETREGID */ |
1245
|
|
|
|
|
|
#endif /* HAS_SETRESGID */ |
1246
|
0
|
|
|
|
|
tmp_gid = PerlProc_getgid(); |
1247
|
0
|
|
|
|
|
tmp_egid = PerlProc_getegid(); |
1248
|
|
|
|
|
|
} |
1249
|
348374
|
50
|
|
|
|
TAINTING_set( TAINTING_get | (tmp_uid && (tmp_euid != tmp_uid || tmp_egid != tmp_gid)) ); |
|
|
50
|
|
|
|
|
1250
|
|
|
|
|
|
#ifdef NO_TAINT_SUPPORT |
1251
|
|
|
|
|
|
PERL_UNUSED_VAR(tmp_uid); |
1252
|
|
|
|
|
|
PERL_UNUSED_VAR(tmp_euid); |
1253
|
|
|
|
|
|
PERL_UNUSED_VAR(tmp_gid); |
1254
|
|
|
|
|
|
PERL_UNUSED_VAR(tmp_egid); |
1255
|
|
|
|
|
|
#endif |
1256
|
|
|
|
|
|
} |
1257
|
201988164
|
|
|
|
|
PL_delaymagic = 0; |
1258
|
|
|
|
|
|
|
1259
|
201988164
|
100
|
|
|
|
if (gimme == G_VOID) |
1260
|
198439226
|
|
|
|
|
SP = firstrelem - 1; |
1261
|
3548938
|
100
|
|
|
|
else if (gimme == G_SCALAR) { |
1262
|
3453892
|
|
|
|
|
dTARGET; |
1263
|
|
|
|
|
|
SP = firstrelem; |
1264
|
3453892
|
50
|
|
|
|
SETi(lastrelem - firstrelem + 1); |
1265
|
|
|
|
|
|
} |
1266
|
|
|
|
|
|
else { |
1267
|
95046
|
100
|
|
|
|
if (ary || hash) |
1268
|
|
|
|
|
|
/* note that in this case *firstlelem may have been overwritten |
1269
|
|
|
|
|
|
by sv_undef in the odd hash case */ |
1270
|
|
|
|
|
|
SP = lastrelem; |
1271
|
|
|
|
|
|
else { |
1272
|
91600
|
|
|
|
|
SP = firstrelem + (lastlelem - firstlelem); |
1273
|
91600
|
|
|
|
|
lelem = firstlelem + (relem - firstrelem); |
1274
|
137404
|
100
|
|
|
|
while (relem <= SP) |
1275
|
4
|
50
|
|
|
|
*relem++ = (lelem <= lastlelem) ? *lelem++ : &PL_sv_undef; |
1276
|
|
|
|
|
|
} |
1277
|
|
|
|
|
|
} |
1278
|
|
|
|
|
|
|
1279
|
201988164
|
|
|
|
|
RETURN; |
1280
|
|
|
|
|
|
} |
1281
|
|
|
|
|
|
|
1282
|
2087052
|
|
|
|
|
PP(pp_qr) |
1283
|
2087052
|
50
|
|
|
|
{ |
1284
|
2087052
|
|
|
|
|
dVAR; dSP; |
1285
|
2087052
|
|
|
|
|
PMOP * const pm = cPMOP; |
1286
|
2087052
|
|
|
|
|
REGEXP * rx = PM_GETRE(pm); |
1287
|
3121038
|
50
|
|
|
|
SV * const pkg = rx ? CALLREG_PACKAGE(rx) : NULL; |
1288
|
2087052
|
|
|
|
|
SV * const rv = sv_newmortal(); |
1289
|
|
|
|
|
|
CV **cvp; |
1290
|
|
|
|
|
|
CV *cv; |
1291
|
|
|
|
|
|
|
1292
|
3121038
|
|
|
|
|
SvUPGRADE(rv, SVt_IV); |
1293
|
|
|
|
|
|
/* For a subroutine describing itself as "This is a hacky workaround" I'm |
1294
|
|
|
|
|
|
loathe to use it here, but it seems to be the right fix. Or close. |
1295
|
|
|
|
|
|
The key part appears to be that it's essential for pp_qr to return a new |
1296
|
|
|
|
|
|
object (SV), which implies that there needs to be an effective way to |
1297
|
|
|
|
|
|
generate a new SV from the existing SV that is pre-compiled in the |
1298
|
|
|
|
|
|
optree. */ |
1299
|
2087052
|
|
|
|
|
SvRV_set(rv, MUTABLE_SV(reg_temp_copy(NULL, rx))); |
1300
|
2087052
|
|
|
|
|
SvROK_on(rv); |
1301
|
|
|
|
|
|
|
1302
|
2087052
|
|
|
|
|
cvp = &( ReANY((REGEXP *)SvRV(rv))->qr_anoncv); |
1303
|
2087052
|
100
|
|
|
|
if ((cv = *cvp) && CvCLONE(*cvp)) { |
|
|
100
|
|
|
|
|
1304
|
7648
|
|
|
|
|
*cvp = cv_clone(cv); |
1305
|
7648
|
|
|
|
|
SvREFCNT_dec_NN(cv); |
1306
|
|
|
|
|
|
} |
1307
|
|
|
|
|
|
|
1308
|
2087052
|
50
|
|
|
|
if (pkg) { |
1309
|
2087052
|
|
|
|
|
HV *const stash = gv_stashsv(pkg, GV_ADD); |
1310
|
2087052
|
|
|
|
|
SvREFCNT_dec_NN(pkg); |
1311
|
2087052
|
|
|
|
|
(void)sv_bless(rv, stash); |
1312
|
|
|
|
|
|
} |
1313
|
|
|
|
|
|
|
1314
|
2087052
|
100
|
|
|
|
if (RX_ISTAINTED(rx)) { |
1315
|
650
|
50
|
|
|
|
SvTAINTED_on(rv); |
1316
|
650
|
50
|
|
|
|
SvTAINTED_on(SvRV(rv)); |
1317
|
|
|
|
|
|
} |
1318
|
2087052
|
50
|
|
|
|
XPUSHs(rv); |
1319
|
2087052
|
|
|
|
|
RETURN; |
1320
|
|
|
|
|
|
} |
1321
|
|
|
|
|
|
|
1322
|
158822148
|
|
|
|
|
PP(pp_match) |
1323
|
|
|
|
|
|
{ |
1324
|
158822148
|
|
|
|
|
dVAR; dSP; dTARG; |
1325
|
158822148
|
|
|
|
|
PMOP *pm = cPMOP; |
1326
|
|
|
|
|
|
PMOP *dynpm = pm; |
1327
|
|
|
|
|
|
const char *s; |
1328
|
|
|
|
|
|
const char *strend; |
1329
|
|
|
|
|
|
SSize_t curpos = 0; /* initial pos() or current $+[0] */ |
1330
|
|
|
|
|
|
I32 global; |
1331
|
|
|
|
|
|
U8 r_flags = 0; |
1332
|
|
|
|
|
|
const char *truebase; /* Start of string */ |
1333
|
158822148
|
|
|
|
|
REGEXP *rx = PM_GETRE(pm); |
1334
|
|
|
|
|
|
bool rxtainted; |
1335
|
158822148
|
100
|
|
|
|
const I32 gimme = GIMME; |
|
|
100
|
|
|
|
|
1336
|
|
|
|
|
|
STRLEN len; |
1337
|
158822148
|
|
|
|
|
const I32 oldsave = PL_savestack_ix; |
1338
|
|
|
|
|
|
I32 had_zerolen = 0; |
1339
|
|
|
|
|
|
MAGIC *mg = NULL; |
1340
|
|
|
|
|
|
|
1341
|
158822148
|
100
|
|
|
|
if (PL_op->op_flags & OPf_STACKED) |
1342
|
128478340
|
|
|
|
|
TARG = POPs; |
1343
|
60687556
|
100
|
|
|
|
else if (PL_op->op_private & OPpTARGET_MY) |
|
|
50
|
|
|
|
|
1344
|
60
|
|
|
|
|
GETTARGET; |
1345
|
|
|
|
|
|
else { |
1346
|
30343748
|
100
|
|
|
|
TARG = DEFSV; |
1347
|
15149018
|
|
|
|
|
EXTEND(SP,1); |
1348
|
|
|
|
|
|
} |
1349
|
|
|
|
|
|
|
1350
|
158822148
|
|
|
|
|
PUTBACK; /* EVAL blocks need stack_sp. */ |
1351
|
|
|
|
|
|
/* Skip get-magic if this is a qr// clone, because regcomp has |
1352
|
|
|
|
|
|
already done it. */ |
1353
|
158822148
|
|
|
|
|
truebase = ReANY(rx)->mother_re |
1354
|
13132731
|
100
|
|
|
|
? SvPV_nomg_const(TARG, len) |
1355
|
231418929
|
100
|
|
|
|
: SvPV_const(TARG, len); |
|
|
100
|
|
|
|
|
1356
|
158822146
|
50
|
|
|
|
if (!truebase) |
1357
|
0
|
|
|
|
|
DIE(aTHX_ "panic: pp_match"); |
1358
|
158822146
|
|
|
|
|
strend = truebase + len; |
1359
|
158822146
|
100
|
|
|
|
rxtainted = (RX_ISTAINTED(rx) || |
|
|
100
|
|
|
|
|
1360
|
79883153
|
50
|
|
|
|
(TAINT_get && (pm->op_pmflags & PMf_RETAINT))); |
1361
|
158822146
|
|
|
|
|
TAINT_NOT; |
1362
|
|
|
|
|
|
|
1363
|
|
|
|
|
|
/* We need to know this in case we fail out early - pos() must be reset */ |
1364
|
158822146
|
|
|
|
|
global = dynpm->op_pmflags & PMf_GLOBAL; |
1365
|
|
|
|
|
|
|
1366
|
|
|
|
|
|
/* PMdf_USED is set after a ?? matches once */ |
1367
|
158822146
|
100
|
|
|
|
if ( |
1368
|
|
|
|
|
|
#ifdef USE_ITHREADS |
1369
|
|
|
|
|
|
SvREADONLY(PL_regex_pad[pm->op_pmoffset]) |
1370
|
|
|
|
|
|
#else |
1371
|
158822146
|
|
|
|
|
pm->op_pmflags & PMf_USED |
1372
|
|
|
|
|
|
#endif |
1373
|
|
|
|
|
|
) { |
1374
|
|
|
|
|
|
DEBUG_r(PerlIO_printf(Perl_debug_log, "?? already matched once")); |
1375
|
|
|
|
|
|
goto nope; |
1376
|
|
|
|
|
|
} |
1377
|
|
|
|
|
|
|
1378
|
|
|
|
|
|
/* empty pattern special-cased to use last successful pattern if |
1379
|
|
|
|
|
|
possible, except for qr// */ |
1380
|
231418875
|
100
|
|
|
|
if (!ReANY(rx)->mother_re && !RX_PRELEN(rx) |
|
|
100
|
|
|
|
|
1381
|
662
|
100
|
|
|
|
&& PL_curpm) { |
1382
|
612
|
|
|
|
|
pm = PL_curpm; |
1383
|
612
|
|
|
|
|
rx = PM_GETRE(pm); |
1384
|
|
|
|
|
|
} |
1385
|
|
|
|
|
|
|
1386
|
237796220
|
50
|
|
|
|
if (RX_MINLEN(rx) >= 0 && (STRLEN)RX_MINLEN(rx) > len) { |
|
|
100
|
|
|
|
|
1387
|
|
|
|
|
|
DEBUG_r(PerlIO_printf(Perl_debug_log, "String shorter than min possible regex match (%" |
1388
|
|
|
|
|
|
UVuf" < %"IVdf")\n", |
1389
|
|
|
|
|
|
(UV)len, (IV)RX_MINLEN(rx))); |
1390
|
|
|
|
|
|
goto nope; |
1391
|
|
|
|
|
|
} |
1392
|
|
|
|
|
|
|
1393
|
|
|
|
|
|
/* get pos() if //g */ |
1394
|
139581562
|
100
|
|
|
|
if (global) { |
1395
|
14231040
|
|
|
|
|
mg = mg_find_mglob(TARG); |
1396
|
14231040
|
100
|
|
|
|
if (mg && mg->mg_len >= 0) { |
|
|
100
|
|
|
|
|
1397
|
24945724
|
|
|
|
|
curpos = MgBYTEPOS(mg, TARG, truebase, len); |
1398
|
|
|
|
|
|
/* last time pos() was set, it was zero-length match */ |
1399
|
12472862
|
100
|
|
|
|
if (mg->mg_flags & MGf_MINMATCH) |
1400
|
|
|
|
|
|
had_zerolen = 1; |
1401
|
|
|
|
|
|
} |
1402
|
|
|
|
|
|
} |
1403
|
|
|
|
|
|
|
1404
|
|
|
|
|
|
#ifdef PERL_SAWAMPERSAND |
1405
|
|
|
|
|
|
if ( RX_NPARENS(rx) |
1406
|
|
|
|
|
|
|| PL_sawampersand |
1407
|
|
|
|
|
|
|| (RX_EXTFLAGS(rx) & (RXf_EVAL_SEEN|RXf_PMf_KEEPCOPY)) |
1408
|
|
|
|
|
|
|| (dynpm->op_pmflags & PMf_KEEPCOPY) |
1409
|
|
|
|
|
|
) |
1410
|
|
|
|
|
|
#endif |
1411
|
|
|
|
|
|
{ |
1412
|
|
|
|
|
|
r_flags |= (REXEC_COPY_STR|REXEC_COPY_SKIP_PRE); |
1413
|
|
|
|
|
|
/* in @a =~ /(.)/g, we iterate multiple times, but copy the buffer |
1414
|
|
|
|
|
|
* only on the first iteration. Therefore we need to copy $' as well |
1415
|
|
|
|
|
|
* as $&, to make the rest of the string available for captures in |
1416
|
|
|
|
|
|
* subsequent iterations */ |
1417
|
139581562
|
100
|
|
|
|
if (! (global && gimme == G_ARRAY)) |
1418
|
|
|
|
|
|
r_flags |= REXEC_COPY_SKIP_POST; |
1419
|
|
|
|
|
|
}; |
1420
|
|
|
|
|
|
#ifdef PERL_SAWAMPERSAND |
1421
|
|
|
|
|
|
if (dynpm->op_pmflags & PMf_KEEPCOPY) |
1422
|
|
|
|
|
|
/* handle KEEPCOPY in pmop but not rx, eg $r=qr/a/; /$r/p */ |
1423
|
|
|
|
|
|
r_flags &= ~(REXEC_COPY_SKIP_PRE|REXEC_COPY_SKIP_POST); |
1424
|
|
|
|
|
|
#endif |
1425
|
|
|
|
|
|
|
1426
|
|
|
|
|
|
s = truebase; |
1427
|
|
|
|
|
|
|
1428
|
|
|
|
|
|
play_it_again: |
1429
|
140837714
|
100
|
|
|
|
if (global) |
1430
|
15487192
|
|
|
|
|
s = truebase + curpos; |
1431
|
|
|
|
|
|
|
1432
|
140837714
|
100
|
|
|
|
if (!CALLREGEXEC(rx, (char*)s, (char *)strend, (char*)truebase, |
1433
|
|
|
|
|
|
had_zerolen, TARG, NULL, r_flags)) |
1434
|
|
|
|
|
|
goto nope; |
1435
|
|
|
|
|
|
|
1436
|
41666671
|
|
|
|
|
PL_curpm = pm; |
1437
|
41666671
|
100
|
|
|
|
if (dynpm->op_pmflags & PMf_ONCE) |
1438
|
|
|
|
|
|
#ifdef USE_ITHREADS |
1439
|
|
|
|
|
|
SvREADONLY_on(PL_regex_pad[dynpm->op_pmoffset]); |
1440
|
|
|
|
|
|
#else |
1441
|
34
|
|
|
|
|
dynpm->op_pmflags |= PMf_USED; |
1442
|
|
|
|
|
|
#endif |
1443
|
|
|
|
|
|
|
1444
|
41666671
|
100
|
|
|
|
if (rxtainted) |
1445
|
130
|
|
|
|
|
RX_MATCH_TAINTED_on(rx); |
1446
|
41666671
|
100
|
|
|
|
TAINT_IF(RX_MATCH_TAINTED(rx)); |
1447
|
|
|
|
|
|
|
1448
|
|
|
|
|
|
/* update pos */ |
1449
|
|
|
|
|
|
|
1450
|
41666671
|
100
|
|
|
|
if (global && (gimme != G_ARRAY || (dynpm->op_pmflags & PMf_CONTINUE))) { |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
1451
|
12385310
|
100
|
|
|
|
if (!mg) |
1452
|
1106310
|
|
|
|
|
mg = sv_magicext_mglob(TARG); |
1453
|
18577965
|
100
|
|
|
|
MgBYTEPOS_set(mg, TARG, truebase, RX_OFFS(rx)[0].end); |
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
1454
|
24770620
|
100
|
|
|
|
if (RX_ZERO_LEN(rx)) |
1455
|
41498
|
|
|
|
|
mg->mg_flags |= MGf_MINMATCH; |
1456
|
|
|
|
|
|
else |
1457
|
12343812
|
|
|
|
|
mg->mg_flags &= ~MGf_MINMATCH; |
1458
|
|
|
|
|
|
} |
1459
|
|
|
|
|
|
|
1460
|
41666671
|
100
|
|
|
|
if ((!RX_NPARENS(rx) && !global) || gimme != G_ARRAY) { |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
1461
|
39220408
|
100
|
|
|
|
LEAVE_SCOPE(oldsave); |
1462
|
39220408
|
|
|
|
|
RETPUSHYES; |
1463
|
|
|
|
|
|
} |
1464
|
|
|
|
|
|
|
1465
|
|
|
|
|
|
/* push captures on stack */ |
1466
|
|
|
|
|
|
|
1467
|
2446263
|
100
|
|
|
|
{ |
1468
|
2446263
|
|
|
|
|
const I32 nparens = RX_NPARENS(rx); |
1469
|
2446263
|
|
|
|
|
I32 i = (global && !nparens) ? 1 : 0; |
1470
|
|
|
|
|
|
|
1471
|
2446263
|
|
|
|
|
SPAGAIN; /* EVAL blocks could move the stack. */ |
1472
|
1206936
|
|
|
|
|
EXTEND(SP, nparens + i); |
1473
|
2446263
|
50
|
|
|
|
EXTEND_MORTAL(nparens + i); |
1474
|
6759321
|
100
|
|
|
|
for (i = !i; i <= nparens; i++) { |
1475
|
4313058
|
|
|
|
|
PUSHs(sv_newmortal()); |
1476
|
6401800
|
100
|
|
|
|
if ((RX_OFFS(rx)[i].start != -1) && RX_OFFS(rx)[i].end != -1 ) { |
|
|
50
|
|
|
|
|
1477
|
8478788
|
|
|
|
|
const I32 len = RX_OFFS(rx)[i].end - RX_OFFS(rx)[i].start; |
1478
|
4239394
|
|
|
|
|
const char * const s = RX_OFFS(rx)[i].start + truebase; |
1479
|
6328136
|
50
|
|
|
|
if (RX_OFFS(rx)[i].end < 0 || RX_OFFS(rx)[i].start < 0 || |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
1480
|
4239394
|
50
|
|
|
|
len < 0 || len > strend - s) |
1481
|
0
|
|
|
|
|
DIE(aTHX_ "panic: pp_match start/end pointers, i=%ld, " |
1482
|
|
|
|
|
|
"start=%ld, end=%ld, s=%p, strend=%p, len=%"UVuf, |
1483
|
0
|
|
|
|
|
(long) i, (long) RX_OFFS(rx)[i].start, |
1484
|
0
|
|
|
|
|
(long)RX_OFFS(rx)[i].end, s, strend, (UV) len); |
1485
|
4239394
|
|
|
|
|
sv_setpvn(*SP, s, len); |
1486
|
4239394
|
100
|
|
|
|
if (DO_UTF8(TARG) && is_utf8_string((U8*)s, len)) |
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
1487
|
12880
|
|
|
|
|
SvUTF8_on(*SP); |
1488
|
|
|
|
|
|
} |
1489
|
|
|
|
|
|
} |
1490
|
2446263
|
100
|
|
|
|
if (global) { |
1491
|
1256152
|
|
|
|
|
curpos = (UV)RX_OFFS(rx)[0].end; |
1492
|
3768456
|
|
|
|
|
had_zerolen = RX_ZERO_LEN(rx); |
1493
|
1256152
|
|
|
|
|
PUTBACK; /* EVAL blocks may use stack */ |
1494
|
1256152
|
|
|
|
|
r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST; |
1495
|
1256152
|
|
|
|
|
goto play_it_again; |
1496
|
|
|
|
|
|
} |
1497
|
1190111
|
100
|
|
|
|
LEAVE_SCOPE(oldsave); |
1498
|
1190111
|
|
|
|
|
RETURN; |
1499
|
|
|
|
|
|
} |
1500
|
|
|
|
|
|
/* NOTREACHED */ |
1501
|
|
|
|
|
|
|
1502
|
|
|
|
|
|
nope: |
1503
|
118386475
|
100
|
|
|
|
if (global && !(dynpm->op_pmflags & PMf_CONTINUE)) { |
|
|
100
|
|
|
|
|
1504
|
1764926
|
100
|
|
|
|
if (!mg) |
1505
|
645110
|
|
|
|
|
mg = mg_find_mglob(TARG); |
1506
|
1764926
|
100
|
|
|
|
if (mg) |
1507
|
1126148
|
|
|
|
|
mg->mg_len = -1; |
1508
|
|
|
|
|
|
} |
1509
|
118386475
|
100
|
|
|
|
LEAVE_SCOPE(oldsave); |
1510
|
118386475
|
100
|
|
|
|
if (gimme == G_ARRAY) |
1511
|
825076
|
|
|
|
|
RETURN; |
1512
|
138388100
|
|
|
|
|
RETPUSHNO; |
1513
|
|
|
|
|
|
} |
1514
|
|
|
|
|
|
|
1515
|
|
|
|
|
|
OP * |
1516
|
9330653
|
|
|
|
|
Perl_do_readline(pTHX) |
1517
|
|
|
|
|
|
{ |
1518
|
9330653
|
100
|
|
|
|
dVAR; dSP; dTARGETSTACKED; |
1519
|
|
|
|
|
|
SV *sv; |
1520
|
|
|
|
|
|
STRLEN tmplen = 0; |
1521
|
|
|
|
|
|
STRLEN offset; |
1522
|
|
|
|
|
|
PerlIO *fp; |
1523
|
9330653
|
50
|
|
|
|
IO * const io = GvIO(PL_last_in_gv); |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
1524
|
9330653
|
|
|
|
|
const I32 type = PL_op->op_type; |
1525
|
9330653
|
100
|
|
|
|
const I32 gimme = GIMME_V; |
1526
|
|
|
|
|
|
|
1527
|
9330653
|
100
|
|
|
|
if (io) { |
1528
|
9330645
|
100
|
|
|
|
const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar); |
1529
|
9330645
|
100
|
|
|
|
if (mg) { |
1530
|
8414
|
100
|
|
|
|
Perl_tied_method(aTHX_ SV_CONST(READLINE), SP, MUTABLE_SV(io), mg, gimme, 0); |
1531
|
8404
|
100
|
|
|
|
if (gimme == G_SCALAR) { |
1532
|
8338
|
|
|
|
|
SPAGAIN; |
1533
|
8338
|
50
|
|
|
|
SvSetSV_nosteal(TARG, TOPs); |
1534
|
8338
|
50
|
|
|
|
SETTARG; |
1535
|
|
|
|
|
|
} |
1536
|
8404
|
|
|
|
|
return NORMAL; |
1537
|
|
|
|
|
|
} |
1538
|
|
|
|
|
|
} |
1539
|
|
|
|
|
|
fp = NULL; |
1540
|
9322239
|
100
|
|
|
|
if (io) { |
1541
|
9322231
|
|
|
|
|
fp = IoIFP(io); |
1542
|
9322231
|
100
|
|
|
|
if (!fp) { |
1543
|
718
|
100
|
|
|
|
if (IoFLAGS(io) & IOf_ARGV) { |
1544
|
238
|
50
|
|
|
|
if (IoFLAGS(io) & IOf_START) { |
1545
|
238
|
|
|
|
|
IoLINES(io) = 0; |
1546
|
238
|
50
|
|
|
|
if (av_len(GvAVn(PL_last_in_gv)) < 0) { |
|
|
100
|
|
|
|
|
1547
|
154
|
|
|
|
|
IoFLAGS(io) &= ~IOf_START; |
1548
|
154
|
|
|
|
|
do_open(PL_last_in_gv,"-",1,FALSE,O_RDONLY,0,NULL); |
1549
|
154
|
50
|
|
|
|
SvTAINTED_off(GvSVn(PL_last_in_gv)); /* previous tainting irrelevant */ |
|
|
0
|
|
|
|
|
1550
|
154
|
50
|
|
|
|
sv_setpvs(GvSVn(PL_last_in_gv), "-"); |
1551
|
154
|
50
|
|
|
|
SvSETMAGIC(GvSV(PL_last_in_gv)); |
1552
|
154
|
|
|
|
|
fp = IoIFP(io); |
1553
|
154
|
|
|
|
|
goto have_fp; |
1554
|
|
|
|
|
|
} |
1555
|
|
|
|
|
|
} |
1556
|
84
|
|
|
|
|
fp = nextargv(PL_last_in_gv); |
1557
|
84
|
100
|
|
|
|
if (!fp) { /* Note: fp != IoIFP(io) */ |
1558
|
6
|
|
|
|
|
(void)do_close(PL_last_in_gv, FALSE); /* now it does*/ |
1559
|
|
|
|
|
|
} |
1560
|
|
|
|
|
|
} |
1561
|
480
|
100
|
|
|
|
else if (type == OP_GLOB) |
1562
|
438
|
|
|
|
|
fp = Perl_start_glob(aTHX_ POPs, io); |
1563
|
|
|
|
|
|
} |
1564
|
9321513
|
50
|
|
|
|
else if (type == OP_GLOB) |
1565
|
0
|
|
|
|
|
SP--; |
1566
|
9321513
|
100
|
|
|
|
else if (IoTYPE(io) == IoTYPE_WRONLY) { |
1567
|
12
|
|
|
|
|
report_wrongway_fh(PL_last_in_gv, '>'); |
1568
|
|
|
|
|
|
} |
1569
|
|
|
|
|
|
} |
1570
|
9322085
|
100
|
|
|
|
if (!fp) { |
1571
|
56
|
100
|
|
|
|
if ((!io || !(IoFLAGS(io) & IOf_START)) |
|
|
100
|
|
|
|
|
1572
|
50
|
100
|
|
|
|
&& ckWARN2(WARN_GLOB, WARN_CLOSED)) |
1573
|
|
|
|
|
|
{ |
1574
|
20
|
50
|
|
|
|
if (type == OP_GLOB) |
1575
|
0
|
|
|
|
|
Perl_ck_warner_d(aTHX_ packWARN(WARN_GLOB), |
1576
|
|
|
|
|
|
"glob failed (can't start child: %s)", |
1577
|
0
|
|
|
|
|
Strerror(errno)); |
1578
|
|
|
|
|
|
else |
1579
|
20
|
|
|
|
|
report_evil_fh(PL_last_in_gv); |
1580
|
|
|
|
|
|
} |
1581
|
56
|
100
|
|
|
|
if (gimme == G_SCALAR) { |
1582
|
|
|
|
|
|
/* undef TARG, and push that undefined value */ |
1583
|
46
|
100
|
|
|
|
if (type != OP_RCATLINE) { |
1584
|
40
|
100
|
|
|
|
SV_CHECK_THINKFIRST_COW_DROP(TARG); |
1585
|
36
|
50
|
|
|
|
SvOK_off(TARG); |
1586
|
|
|
|
|
|
} |
1587
|
42
|
100
|
|
|
|
PUSHTARG; |
1588
|
|
|
|
|
|
} |
1589
|
52
|
|
|
|
|
RETURN; |
1590
|
|
|
|
|
|
} |
1591
|
|
|
|
|
|
have_fp: |
1592
|
18640102
|
100
|
|
|
|
if (gimme == G_SCALAR) { |
|
|
100
|
|
|
|
|
1593
|
|
|
|
|
|
sv = TARG; |
1594
|
9317919
|
100
|
|
|
|
if (type == OP_RCATLINE && SvGMAGICAL(sv)) |
|
|
100
|
|
|
|
|
1595
|
4
|
|
|
|
|
mg_get(sv); |
1596
|
9317919
|
100
|
|
|
|
if (SvROK(sv)) { |
1597
|
14
|
100
|
|
|
|
if (type == OP_RCATLINE) |
1598
|
4
|
50
|
|
|
|
SvPV_force_nomg_nolen(sv); |
1599
|
|
|
|
|
|
else |
1600
|
10
|
|
|
|
|
sv_unref(sv); |
1601
|
|
|
|
|
|
} |
1602
|
9317905
|
100
|
|
|
|
else if (isGV_with_GP(sv)) { |
|
|
50
|
|
|
|
|
1603
|
4
|
50
|
|
|
|
SvPV_force_nomg_nolen(sv); |
1604
|
|
|
|
|
|
} |
1605
|
4494845
|
|
|
|
|
SvUPGRADE(sv, SVt_PV); |
1606
|
9317919
|
|
|
|
|
tmplen = SvLEN(sv); /* remember if already alloced */ |
1607
|
9317919
|
100
|
|
|
|
if (!tmplen && !SvREADONLY(sv) && !SvIsCOW(sv)) { |
|
|
100
|
|
|
|
|
1608
|
|
|
|
|
|
/* try short-buffering it. Please update t/op/readline.t |
1609
|
|
|
|
|
|
* if you change the growth length. |
1610
|
|
|
|
|
|
*/ |
1611
|
568467
|
|
|
|
|
Sv_Grow(sv, 80); |
1612
|
|
|
|
|
|
} |
1613
|
|
|
|
|
|
offset = 0; |
1614
|
9317919
|
100
|
|
|
|
if (type == OP_RCATLINE && SvOK(sv)) { |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
1615
|
3346
|
100
|
|
|
|
if (!SvPOK(sv)) { |
1616
|
4
|
50
|
|
|
|
SvPV_force_nomg_nolen(sv); |
1617
|
|
|
|
|
|
} |
1618
|
4843505
|
|
|
|
|
offset = SvCUR(sv); |
1619
|
|
|
|
|
|
} |
1620
|
|
|
|
|
|
} |
1621
|
|
|
|
|
|
else { |
1622
|
87232
|
|
|
|
|
sv = sv_2mortal(newSV(80)); |
1623
|
|
|
|
|
|
offset = 0; |
1624
|
|
|
|
|
|
} |
1625
|
|
|
|
|
|
|
1626
|
|
|
|
|
|
/* This should not be marked tainted if the fp is marked clean */ |
1627
|
|
|
|
|
|
#define MAYBE_TAINT_LINE(io, sv) \ |
1628
|
|
|
|
|
|
if (!(IoFLAGS(io) & IOf_UNTAINT)) { \ |
1629
|
|
|
|
|
|
TAINT; \ |
1630
|
|
|
|
|
|
SvTAINTED_on(sv); \ |
1631
|
|
|
|
|
|
} |
1632
|
|
|
|
|
|
|
1633
|
|
|
|
|
|
/* delay EOF state for a snarfed empty file */ |
1634
|
|
|
|
|
|
#define SNARF_EOF(gimme,rs,io,sv) \ |
1635
|
|
|
|
|
|
(gimme != G_SCALAR || SvCUR(sv) \ |
1636
|
|
|
|
|
|
|| (IoFLAGS(io) & IOf_NOLINE) || !RsSNARF(rs)) |
1637
|
|
|
|
|
|
|
1638
|
|
|
|
|
|
for (;;) { |
1639
|
9488119
|
|
|
|
|
PUTBACK; |
1640
|
9488119
|
100
|
|
|
|
if (!sv_gets(sv, fp, offset) |
1641
|
24495
|
100
|
|
|
|
&& (type == OP_GLOB |
1642
|
24063
|
100
|
|
|
|
|| SNARF_EOF(gimme, PL_rs, io, sv) |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
1643
|
428
|
100
|
|
|
|
|| PerlIO_error(fp))) |
1644
|
|
|
|
|
|
{ |
1645
|
24071
|
|
|
|
|
PerlIO_clearerr(fp); |
1646
|
24071
|
100
|
|
|
|
if (IoFLAGS(io) & IOf_ARGV) { |
1647
|
580
|
|
|
|
|
fp = nextargv(PL_last_in_gv); |
1648
|
580
|
100
|
|
|
|
if (fp) |
1649
|
384
|
|
|
|
|
continue; |
1650
|
196
|
|
|
|
|
(void)do_close(PL_last_in_gv, FALSE); |
1651
|
|
|
|
|
|
} |
1652
|
23491
|
100
|
|
|
|
else if (type == OP_GLOB) { |
1653
|
432
|
50
|
|
|
|
if (!do_close(PL_last_in_gv, FALSE)) { |
1654
|
0
|
0
|
|
|
|
Perl_ck_warner(aTHX_ packWARN(WARN_GLOB), |
1655
|
|
|
|
|
|
"glob failed (child exited with status %d%s)", |
1656
|
|
|
|
|
|
(int)(STATUS_CURRENT >> 8), |
1657
|
0
|
|
|
|
|
(STATUS_CURRENT & 0x80) ? ", core dumped" : ""); |
1658
|
|
|
|
|
|
} |
1659
|
|
|
|
|
|
} |
1660
|
23687
|
100
|
|
|
|
if (gimme == G_SCALAR) { |
1661
|
19529
|
100
|
|
|
|
if (type != OP_RCATLINE) { |
1662
|
19525
|
50
|
|
|
|
SV_CHECK_THINKFIRST_COW_DROP(TARG); |
1663
|
19525
|
100
|
|
|
|
SvOK_off(TARG); |
1664
|
|
|
|
|
|
} |
1665
|
19529
|
|
|
|
|
SPAGAIN; |
1666
|
19529
|
100
|
|
|
|
PUSHTARG; |
1667
|
|
|
|
|
|
} |
1668
|
23687
|
100
|
|
|
|
MAYBE_TAINT_LINE(io, sv); |
|
|
50
|
|
|
|
|
1669
|
23687
|
|
|
|
|
RETURN; |
1670
|
|
|
|
|
|
} |
1671
|
9464042
|
100
|
|
|
|
MAYBE_TAINT_LINE(io, sv); |
|
|
100
|
|
|
|
|
1672
|
9464042
|
|
|
|
|
IoLINES(io)++; |
1673
|
9464042
|
|
|
|
|
IoFLAGS(io) |= IOf_NOLINE; |
1674
|
9464042
|
100
|
|
|
|
SvSETMAGIC(sv); |
1675
|
9464042
|
|
|
|
|
SPAGAIN; |
1676
|
9464042
|
100
|
|
|
|
XPUSHs(sv); |
1677
|
9464042
|
100
|
|
|
|
if (type == OP_GLOB) { |
1678
|
|
|
|
|
|
const char *t1; |
1679
|
|
|
|
|
|
|
1680
|
442
|
50
|
|
|
|
if (SvCUR(sv) > 0 && SvCUR(PL_rs) > 0) { |
|
|
50
|
|
|
|
|
1681
|
442
|
|
|
|
|
char * const tmps = SvEND(sv) - 1; |
1682
|
442
|
50
|
|
|
|
if (*tmps == *SvPVX_const(PL_rs)) { |
1683
|
442
|
|
|
|
|
*tmps = '\0'; |
1684
|
442
|
|
|
|
|
SvCUR_set(sv, SvCUR(sv) - 1); |
1685
|
|
|
|
|
|
} |
1686
|
|
|
|
|
|
} |
1687
|
3692
|
100
|
|
|
|
for (t1 = SvPVX_const(sv); *t1; t1++) |
1688
|
3997
|
100
|
|
|
|
if (!isALPHANUMERIC(*t1) && |
|
|
100
|
|
|
|
|
1689
|
662
|
|
|
|
|
strchr("$&*(){}[]'\";\\|?<>~`", *t1)) |
1690
|
|
|
|
|
|
break; |
1691
|
858
|
|
|
|
|
if (*t1 && PerlLIO_lstat(SvPVX_const(sv), &PL_statbuf) < 0) { |
1692
|
|
|
|
|
|
(void)POPs; /* Unmatched wildcard? Chuck it... */ |
1693
|
416
|
|
|
|
|
continue; |
1694
|
|
|
|
|
|
} |
1695
|
9463600
|
100
|
|
|
|
} else if (SvUTF8(sv)) { /* OP_READLINE, OP_RCATLINE */ |
1696
|
21798
|
100
|
|
|
|
if (ckWARN(WARN_UTF8)) { |
1697
|
2176
|
|
|
|
|
const U8 * const s = (const U8*)SvPVX_const(sv) + offset; |
1698
|
2176
|
|
|
|
|
const STRLEN len = SvCUR(sv) - offset; |
1699
|
|
|
|
|
|
const U8 *f; |
1700
|
|
|
|
|
|
|
1701
|
2176
|
100
|
|
|
|
if (!is_utf8_string_loc(s, len, &f)) |
1702
|
|
|
|
|
|
/* Emulate :encoding(utf8) warning in the same case. */ |
1703
|
9
|
50
|
|
|
|
Perl_warner(aTHX_ packWARN(WARN_UTF8), |
1704
|
|
|
|
|
|
"utf8 \"\\x%02X\" does not map to Unicode", |
1705
|
12
|
|
|
|
|
f < (U8*)SvEND(sv) ? *f : 0); |
1706
|
|
|
|
|
|
} |
1707
|
|
|
|
|
|
} |
1708
|
9463626
|
100
|
|
|
|
if (gimme == G_ARRAY) { |
1709
|
165136
|
100
|
|
|
|
if (SvLEN(sv) - SvCUR(sv) > 20) { |
1710
|
145416
|
|
|
|
|
SvPV_shrink_to_cur(sv); |
1711
|
|
|
|
|
|
} |
1712
|
165136
|
|
|
|
|
sv = sv_2mortal(newSV(80)); |
1713
|
165136
|
|
|
|
|
continue; |
1714
|
|
|
|
|
|
} |
1715
|
9298490
|
100
|
|
|
|
else if (gimme == G_SCALAR && !tmplen && SvLEN(sv) - SvCUR(sv) > 80) { |
|
|
100
|
|
|
|
|
1716
|
|
|
|
|
|
/* try to reclaim a bit of scalar space (only on 1st alloc) */ |
1717
|
|
|
|
|
|
const STRLEN new_len |
1718
|
93033
|
100
|
|
|
|
= SvCUR(sv) < 60 ? 80 : SvCUR(sv)+40; /* allow some slop */ |
1719
|
93033
|
|
|
|
|
SvPV_renew(sv, new_len); |
1720
|
|
|
|
|
|
} |
1721
|
9314741
|
|
|
|
|
RETURN; |
1722
|
|
|
|
|
|
} |
1723
|
|
|
|
|
|
} |
1724
|
|
|
|
|
|
|
1725
|
483465120
|
|
|
|
|
PP(pp_helem) |
1726
|
|
|
|
|
|
{ |
1727
|
483465120
|
|
|
|
|
dVAR; dSP; |
1728
|
|
|
|
|
|
HE* he; |
1729
|
|
|
|
|
|
SV **svp; |
1730
|
483465120
|
|
|
|
|
SV * const keysv = POPs; |
1731
|
483465120
|
|
|
|
|
HV * const hv = MUTABLE_HV(POPs); |
1732
|
483465120
|
100
|
|
|
|
const U32 lval = PL_op->op_flags & OPf_MOD || LVRET; |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
1733
|
483465120
|
|
|
|
|
const U32 defer = PL_op->op_private & OPpLVAL_DEFER; |
1734
|
|
|
|
|
|
SV *sv; |
1735
|
483465120
|
|
|
|
|
const bool localizing = PL_op->op_private & OPpLVAL_INTRO; |
1736
|
|
|
|
|
|
bool preeminent = TRUE; |
1737
|
|
|
|
|
|
|
1738
|
483465120
|
50
|
|
|
|
if (SvTYPE(hv) != SVt_PVHV) |
1739
|
0
|
|
|
|
|
RETPUSHUNDEF; |
1740
|
|
|
|
|
|
|
1741
|
483465120
|
100
|
|
|
|
if (localizing) { |
1742
|
|
|
|
|
|
MAGIC *mg; |
1743
|
|
|
|
|
|
HV *stash; |
1744
|
|
|
|
|
|
|
1745
|
|
|
|
|
|
/* If we can determine whether the element exist, |
1746
|
|
|
|
|
|
* Try to preserve the existenceness of a tied hash |
1747
|
|
|
|
|
|
* element by using EXISTS and DELETE if possible. |
1748
|
|
|
|
|
|
* Fallback to FETCH and STORE otherwise. */ |
1749
|
3715408
|
100
|
|
|
|
if (SvCANEXISTDELETE(hv)) |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
1750
|
3715408
|
|
|
|
|
preeminent = hv_exists_ent(hv, keysv, 0); |
1751
|
|
|
|
|
|
} |
1752
|
|
|
|
|
|
|
1753
|
483465120
|
100
|
|
|
|
he = hv_fetch_ent(hv, keysv, lval && !defer, 0); |
1754
|
483464878
|
100
|
|
|
|
svp = he ? &HeVAL(he) : NULL; |
1755
|
483464878
|
100
|
|
|
|
if (lval) { |
1756
|
256220726
|
100
|
|
|
|
if (!svp || !*svp || *svp == &PL_sv_undef) { |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
1757
|
|
|
|
|
|
SV* lv; |
1758
|
|
|
|
|
|
SV* key2; |
1759
|
78722
|
50
|
|
|
|
if (!defer) { |
1760
|
0
|
|
|
|
|
DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv)); |
1761
|
|
|
|
|
|
} |
1762
|
78722
|
|
|
|
|
lv = sv_newmortal(); |
1763
|
78722
|
|
|
|
|
sv_upgrade(lv, SVt_PVLV); |
1764
|
78722
|
|
|
|
|
LvTYPE(lv) = 'y'; |
1765
|
78722
|
|
|
|
|
sv_magic(lv, key2 = newSVsv(keysv), PERL_MAGIC_defelem, NULL, 0); |
1766
|
78722
|
|
|
|
|
SvREFCNT_dec_NN(key2); /* sv_magic() increments refcount */ |
1767
|
157444
|
|
|
|
|
LvTARG(lv) = SvREFCNT_inc_simple(hv); |
1768
|
78722
|
|
|
|
|
LvTARGLEN(lv) = 1; |
1769
|
78722
|
|
|
|
|
PUSHs(lv); |
1770
|
78722
|
|
|
|
|
RETURN; |
1771
|
|
|
|
|
|
} |
1772
|
256142004
|
100
|
|
|
|
if (localizing) { |
1773
|
3715408
|
100
|
|
|
|
if (HvNAME_get(hv) && isGV(*svp)) |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
1774
|
10
|
|
|
|
|
save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL)); |
1775
|
3715398
|
100
|
|
|
|
else if (preeminent) |
1776
|
605294
|
|
|
|
|
save_helem_flags(hv, keysv, svp, |
1777
|
|
|
|
|
|
(PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC); |
1778
|
|
|
|
|
|
else |
1779
|
3110104
|
|
|
|
|
SAVEHDELETE(hv, keysv); |
1780
|
|
|
|
|
|
} |
1781
|
252426596
|
100
|
|
|
|
else if (PL_op->op_private & OPpDEREF) { |
1782
|
96629523
|
|
|
|
|
PUSHs(vivify_ref(*svp, PL_op->op_private & OPpDEREF)); |
1783
|
96629523
|
|
|
|
|
RETURN; |
1784
|
|
|
|
|
|
} |
1785
|
|
|
|
|
|
} |
1786
|
386756633
|
100
|
|
|
|
sv = (svp && *svp ? *svp : &PL_sv_undef); |
|
|
50
|
|
|
|
|
1787
|
|
|
|
|
|
/* Originally this did a conditional C; this |
1788
|
|
|
|
|
|
* was to make C possible. |
1789
|
|
|
|
|
|
* However, it seems no longer to be needed for that purpose, and |
1790
|
|
|
|
|
|
* introduced a new bug: stuff like C |
1791
|
|
|
|
|
|
* would loop endlessly since the pos magic is getting set on the |
1792
|
|
|
|
|
|
* mortal copy and lost. However, the copy has the effect of |
1793
|
|
|
|
|
|
* triggering the get magic, and losing it altogether made things like |
1794
|
|
|
|
|
|
* c<$tied{foo};> in void context no longer do get magic, which some |
1795
|
|
|
|
|
|
* code relied on. Also, delayed triggering of magic on @+ and friends |
1796
|
|
|
|
|
|
* meant the original regex may be out of scope by now. So as a |
1797
|
|
|
|
|
|
* compromise, do the get magic here. (The MGf_GSKIP flag will stop it |
1798
|
|
|
|
|
|
* being called too many times). */ |
1799
|
386756633
|
100
|
|
|
|
if (!lval && SvRMAGICAL(hv) && SvGMAGICAL(sv)) |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
1800
|
424245
|
|
|
|
|
mg_get(sv); |
1801
|
386756625
|
|
|
|
|
PUSHs(sv); |
1802
|
435558114
|
|
|
|
|
RETURN; |
1803
|
|
|
|
|
|
} |
1804
|
|
|
|
|
|
|
1805
|
151771607
|
|
|
|
|
PP(pp_iter) |
1806
|
151771607
|
50
|
|
|
|
{ |
1807
|
151771607
|
|
|
|
|
dVAR; dSP; |
1808
|
|
|
|
|
|
PERL_CONTEXT *cx; |
1809
|
|
|
|
|
|
SV *oldsv; |
1810
|
|
|
|
|
|
SV **itersvp; |
1811
|
|
|
|
|
|
|
1812
|
75659283
|
|
|
|
|
EXTEND(SP, 1); |
1813
|
151771607
|
|
|
|
|
cx = &cxstack[cxstack_ix]; |
1814
|
151771607
|
50
|
|
|
|
itersvp = CxITERVAR(cx); |
|
|
100
|
|
|
|
|
1815
|
|
|
|
|
|
|
1816
|
151771607
|
|
|
|
|
switch (CxTYPE(cx)) { |
1817
|
|
|
|
|
|
|
1818
|
|
|
|
|
|
case CXt_LOOP_LAZYSV: /* string increment */ |
1819
|
|
|
|
|
|
{ |
1820
|
836
|
|
|
|
|
SV* cur = cx->blk_loop.state_u.lazysv.cur; |
1821
|
836
|
|
|
|
|
SV *end = cx->blk_loop.state_u.lazysv.end; |
1822
|
|
|
|
|
|
/* If the maximum is !SvOK(), pp_enteriter substitutes PL_sv_no. |
1823
|
|
|
|
|
|
It has SvPVX of "" and SvCUR of 0, which is what we want. */ |
1824
|
836
|
|
|
|
|
STRLEN maxlen = 0; |
1825
|
836
|
100
|
|
|
|
const char *max = SvPV_const(end, maxlen); |
1826
|
836
|
100
|
|
|
|
if (SvNIOK(cur) || SvCUR(cur) > maxlen) |
|
|
100
|
|
|
|
|
1827
|
56
|
|
|
|
|
RETPUSHNO; |
1828
|
|
|
|
|
|
|
1829
|
780
|
|
|
|
|
oldsv = *itersvp; |
1830
|
780
|
100
|
|
|
|
if (SvREFCNT(oldsv) == 1 && !SvMAGICAL(oldsv)) { |
1831
|
|
|
|
|
|
/* safe to reuse old SV */ |
1832
|
774
|
|
|
|
|
sv_setsv(oldsv, cur); |
1833
|
|
|
|
|
|
} |
1834
|
|
|
|
|
|
else |
1835
|
|
|
|
|
|
{ |
1836
|
|
|
|
|
|
/* we need a fresh SV every time so that loop body sees a |
1837
|
|
|
|
|
|
* completely new SV for closures/references to work as |
1838
|
|
|
|
|
|
* they used to */ |
1839
|
6
|
|
|
|
|
*itersvp = newSVsv(cur); |
1840
|
6
|
|
|
|
|
SvREFCNT_dec_NN(oldsv); |
1841
|
|
|
|
|
|
} |
1842
|
780
|
100
|
|
|
|
if (strEQ(SvPVX_const(cur), max)) |
1843
|
38
|
|
|
|
|
sv_setiv(cur, 0); /* terminate next time */ |
1844
|
|
|
|
|
|
else |
1845
|
742
|
|
|
|
|
sv_inc(cur); |
1846
|
|
|
|
|
|
break; |
1847
|
|
|
|
|
|
} |
1848
|
|
|
|
|
|
|
1849
|
|
|
|
|
|
case CXt_LOOP_LAZYIV: /* integer increment */ |
1850
|
|
|
|
|
|
{ |
1851
|
21824758
|
|
|
|
|
IV cur = cx->blk_loop.state_u.lazyiv.cur; |
1852
|
21824758
|
100
|
|
|
|
if (cur > cx->blk_loop.state_u.lazyiv.end) |
1853
|
604040
|
|
|
|
|
RETPUSHNO; |
1854
|
|
|
|
|
|
|
1855
|
21220718
|
|
|
|
|
oldsv = *itersvp; |
1856
|
|
|
|
|
|
/* don't risk potential race */ |
1857
|
21220718
|
100
|
|
|
|
if (SvREFCNT(oldsv) == 1 && !SvMAGICAL(oldsv)) { |
1858
|
|
|
|
|
|
/* safe to reuse old SV */ |
1859
|
20884076
|
|
|
|
|
sv_setiv(oldsv, cur); |
1860
|
|
|
|
|
|
} |
1861
|
|
|
|
|
|
else |
1862
|
|
|
|
|
|
{ |
1863
|
|
|
|
|
|
/* we need a fresh SV every time so that loop body sees a |
1864
|
|
|
|
|
|
* completely new SV for closures/references to work as they |
1865
|
|
|
|
|
|
* used to */ |
1866
|
336642
|
|
|
|
|
*itersvp = newSViv(cur); |
1867
|
336642
|
|
|
|
|
SvREFCNT_dec_NN(oldsv); |
1868
|
|
|
|
|
|
} |
1869
|
|
|
|
|
|
|
1870
|
21220718
|
100
|
|
|
|
if (cur == IV_MAX) { |
1871
|
|
|
|
|
|
/* Handle end of range at IV_MAX */ |
1872
|
10
|
|
|
|
|
cx->blk_loop.state_u.lazyiv.end = IV_MIN; |
1873
|
|
|
|
|
|
} else |
1874
|
21220708
|
|
|
|
|
++cx->blk_loop.state_u.lazyiv.cur; |
1875
|
|
|
|
|
|
break; |
1876
|
|
|
|
|
|
} |
1877
|
|
|
|
|
|
|
1878
|
|
|
|
|
|
case CXt_LOOP_FOR: /* iterate array */ |
1879
|
|
|
|
|
|
{ |
1880
|
|
|
|
|
|
|
1881
|
129946013
|
|
|
|
|
AV *av = cx->blk_loop.state_u.ary.ary; |
1882
|
|
|
|
|
|
SV *sv; |
1883
|
|
|
|
|
|
bool av_is_stack = FALSE; |
1884
|
|
|
|
|
|
IV ix; |
1885
|
|
|
|
|
|
|
1886
|
129946013
|
100
|
|
|
|
if (!av) { |
1887
|
|
|
|
|
|
av_is_stack = TRUE; |
1888
|
91359381
|
|
|
|
|
av = PL_curstack; |
1889
|
|
|
|
|
|
} |
1890
|
129946013
|
100
|
|
|
|
if (PL_op->op_private & OPpITER_REVERSED) { |
1891
|
68304
|
|
|
|
|
ix = --cx->blk_loop.state_u.ary.ix; |
1892
|
68304
|
100
|
|
|
|
if (ix <= (av_is_stack ? cx->blk_loop.resetsp : -1)) |
|
|
100
|
|
|
|
|
1893
|
14784
|
|
|
|
|
RETPUSHNO; |
1894
|
|
|
|
|
|
} |
1895
|
|
|
|
|
|
else { |
1896
|
129877709
|
|
|
|
|
ix = ++cx->blk_loop.state_u.ary.ix; |
1897
|
129877709
|
100
|
|
|
|
if (ix > (av_is_stack ? cx->blk_oldsp : AvFILL(av))) |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
1898
|
29053349
|
|
|
|
|
RETPUSHNO; |
1899
|
|
|
|
|
|
} |
1900
|
|
|
|
|
|
|
1901
|
105553790
|
100
|
|
|
|
if (SvMAGICAL(av) || AvREIFY(av)) { |
|
|
100
|
|
|
|
|
1902
|
4675910
|
|
|
|
|
SV * const * const svp = av_fetch(av, ix, FALSE); |
1903
|
4675910
|
100
|
|
|
|
sv = svp ? *svp : NULL; |
1904
|
|
|
|
|
|
} |
1905
|
|
|
|
|
|
else { |
1906
|
96201970
|
|
|
|
|
sv = AvARRAY(av)[ix]; |
1907
|
|
|
|
|
|
} |
1908
|
|
|
|
|
|
|
1909
|
100877880
|
100
|
|
|
|
if (sv) { |
1910
|
100851260
|
100
|
|
|
|
if (SvIS_FREED(sv)) { |
1911
|
2
|
|
|
|
|
*itersvp = NULL; |
1912
|
2
|
|
|
|
|
Perl_croak(aTHX_ "Use of freed value in iteration"); |
1913
|
|
|
|
|
|
} |
1914
|
100851258
|
100
|
|
|
|
if (SvPADTMP(sv) && !IS_PADGV(sv)) |
1915
|
66148
|
|
|
|
|
sv = newSVsv(sv); |
1916
|
|
|
|
|
|
else { |
1917
|
100785110
|
|
|
|
|
SvTEMP_off(sv); |
1918
|
100785110
|
|
|
|
|
SvREFCNT_inc_simple_void_NN(sv); |
1919
|
|
|
|
|
|
} |
1920
|
|
|
|
|
|
} |
1921
|
26620
|
50
|
|
|
|
else if (!av_is_stack) { |
1922
|
26620
|
|
|
|
|
SV *lv = newSV_type(SVt_PVLV); |
1923
|
26620
|
|
|
|
|
LvTYPE(lv) = 'y'; |
1924
|
26620
|
|
|
|
|
sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0); |
1925
|
53240
|
|
|
|
|
LvTARG(lv) = SvREFCNT_inc_simple(av); |
1926
|
26620
|
|
|
|
|
LvTARGOFF(lv) = ix; |
1927
|
26620
|
|
|
|
|
LvTARGLEN(lv) = (STRLEN)UV_MAX; |
1928
|
|
|
|
|
|
sv = lv; |
1929
|
|
|
|
|
|
} |
1930
|
|
|
|
|
|
else |
1931
|
|
|
|
|
|
sv = &PL_sv_undef; |
1932
|
|
|
|
|
|
|
1933
|
100877878
|
|
|
|
|
oldsv = *itersvp; |
1934
|
100877878
|
|
|
|
|
*itersvp = sv; |
1935
|
100877878
|
|
|
|
|
SvREFCNT_dec(oldsv); |
1936
|
100877878
|
|
|
|
|
break; |
1937
|
|
|
|
|
|
} |
1938
|
|
|
|
|
|
|
1939
|
|
|
|
|
|
default: |
1940
|
0
|
|
|
|
|
DIE(aTHX_ "panic: pp_iter, type=%u", CxTYPE(cx)); |
1941
|
|
|
|
|
|
} |
1942
|
136989483
|
|
|
|
|
RETPUSHYES; |
1943
|
|
|
|
|
|
} |
1944
|
|
|
|
|
|
|
1945
|
|
|
|
|
|
/* |
1946
|
|
|
|
|
|
A description of how taint works in pattern matching and substitution. |
1947
|
|
|
|
|
|
|
1948
|
|
|
|
|
|
This is all conditional on NO_TAINT_SUPPORT not being defined. Under |
1949
|
|
|
|
|
|
NO_TAINT_SUPPORT, taint-related operations should become no-ops. |
1950
|
|
|
|
|
|
|
1951
|
|
|
|
|
|
While the pattern is being assembled/concatenated and then compiled, |
1952
|
|
|
|
|
|
PL_tainted will get set (via TAINT_set) if any component of the pattern |
1953
|
|
|
|
|
|
is tainted, e.g. /.*$tainted/. At the end of pattern compilation, |
1954
|
|
|
|
|
|
the RXf_TAINTED flag is set on the pattern if PL_tainted is set (via |
1955
|
|
|
|
|
|
TAINT_get). |
1956
|
|
|
|
|
|
|
1957
|
|
|
|
|
|
When the pattern is copied, e.g. $r = qr/..../, the SV holding the ref to |
1958
|
|
|
|
|
|
the pattern is marked as tainted. This means that subsequent usage, such |
1959
|
|
|
|
|
|
as /x$r/, will set PL_tainted using TAINT_set, and thus RXf_TAINTED, |
1960
|
|
|
|
|
|
on the new pattern too. |
1961
|
|
|
|
|
|
|
1962
|
|
|
|
|
|
At the start of execution of a pattern, the RXf_TAINTED_SEEN flag on the |
1963
|
|
|
|
|
|
regex is cleared; during execution, locale-variant ops such as POSIXL may |
1964
|
|
|
|
|
|
set RXf_TAINTED_SEEN. |
1965
|
|
|
|
|
|
|
1966
|
|
|
|
|
|
RXf_TAINTED_SEEN is used post-execution by the get magic code |
1967
|
|
|
|
|
|
of $1 et al to indicate whether the returned value should be tainted. |
1968
|
|
|
|
|
|
It is the responsibility of the caller of the pattern (i.e. pp_match, |
1969
|
|
|
|
|
|
pp_subst etc) to set this flag for any other circumstances where $1 needs |
1970
|
|
|
|
|
|
to be tainted. |
1971
|
|
|
|
|
|
|
1972
|
|
|
|
|
|
The taint behaviour of pp_subst (and pp_substcont) is quite complex. |
1973
|
|
|
|
|
|
|
1974
|
|
|
|
|
|
There are three possible sources of taint |
1975
|
|
|
|
|
|
* the source string |
1976
|
|
|
|
|
|
* the pattern (both compile- and run-time, RXf_TAINTED / RXf_TAINTED_SEEN) |
1977
|
|
|
|
|
|
* the replacement string (or expression under /e) |
1978
|
|
|
|
|
|
|
1979
|
|
|
|
|
|
There are four destinations of taint and they are affected by the sources |
1980
|
|
|
|
|
|
according to the rules below: |
1981
|
|
|
|
|
|
|
1982
|
|
|
|
|
|
* the return value (not including /r): |
1983
|
|
|
|
|
|
tainted by the source string and pattern, but only for the |
1984
|
|
|
|
|
|
number-of-iterations case; boolean returns aren't tainted; |
1985
|
|
|
|
|
|
* the modified string (or modified copy under /r): |
1986
|
|
|
|
|
|
tainted by the source string, pattern, and replacement strings; |
1987
|
|
|
|
|
|
* $1 et al: |
1988
|
|
|
|
|
|
tainted by the pattern, and under 'use re "taint"', by the source |
1989
|
|
|
|
|
|
string too; |
1990
|
|
|
|
|
|
* PL_taint - i.e. whether subsequent code (e.g. in a /e block) is tainted: |
1991
|
|
|
|
|
|
should always be unset before executing subsequent code. |
1992
|
|
|
|
|
|
|
1993
|
|
|
|
|
|
The overall action of pp_subst is: |
1994
|
|
|
|
|
|
|
1995
|
|
|
|
|
|
* at the start, set bits in rxtainted indicating the taint status of |
1996
|
|
|
|
|
|
the various sources. |
1997
|
|
|
|
|
|
|
1998
|
|
|
|
|
|
* After each pattern execution, update the SUBST_TAINT_PAT bit in |
1999
|
|
|
|
|
|
rxtainted if RXf_TAINTED_SEEN has been set, to indicate that the |
2000
|
|
|
|
|
|
pattern has subsequently become tainted via locale ops. |
2001
|
|
|
|
|
|
|
2002
|
|
|
|
|
|
* If control is being passed to pp_substcont to execute a /e block, |
2003
|
|
|
|
|
|
save rxtainted in the CXt_SUBST block, for future use by |
2004
|
|
|
|
|
|
pp_substcont. |
2005
|
|
|
|
|
|
|
2006
|
|
|
|
|
|
* Whenever control is being returned to perl code (either by falling |
2007
|
|
|
|
|
|
off the "end" of pp_subst/pp_substcont, or by entering a /e block), |
2008
|
|
|
|
|
|
use the flag bits in rxtainted to make all the appropriate types of |
2009
|
|
|
|
|
|
destination taint visible; e.g. set RXf_TAINTED_SEEN so that $1 |
2010
|
|
|
|
|
|
et al will appear tainted. |
2011
|
|
|
|
|
|
|
2012
|
|
|
|
|
|
pp_match is just a simpler version of the above. |
2013
|
|
|
|
|
|
|
2014
|
|
|
|
|
|
*/ |
2015
|
|
|
|
|
|
|
2016
|
104453038
|
|
|
|
|
PP(pp_subst) |
2017
|
104453038
|
100
|
|
|
|
{ |
2018
|
104453038
|
|
|
|
|
dVAR; dSP; dTARG; |
2019
|
104453038
|
|
|
|
|
PMOP *pm = cPMOP; |
2020
|
|
|
|
|
|
PMOP *rpm = pm; |
2021
|
|
|
|
|
|
char *s; |
2022
|
|
|
|
|
|
char *strend; |
2023
|
|
|
|
|
|
const char *c; |
2024
|
|
|
|
|
|
STRLEN clen; |
2025
|
|
|
|
|
|
I32 iters = 0; |
2026
|
|
|
|
|
|
I32 maxiters; |
2027
|
|
|
|
|
|
bool once; |
2028
|
|
|
|
|
|
U8 rxtainted = 0; /* holds various SUBST_TAINT_* flag bits. |
2029
|
|
|
|
|
|
See "how taint works" above */ |
2030
|
|
|
|
|
|
char *orig; |
2031
|
|
|
|
|
|
U8 r_flags; |
2032
|
104453038
|
|
|
|
|
REGEXP *rx = PM_GETRE(pm); |
2033
|
|
|
|
|
|
STRLEN len; |
2034
|
|
|
|
|
|
int force_on_match = 0; |
2035
|
104453038
|
|
|
|
|
const I32 oldsave = PL_savestack_ix; |
2036
|
|
|
|
|
|
STRLEN slen; |
2037
|
|
|
|
|
|
bool doutf8 = FALSE; /* whether replacement is in utf8 */ |
2038
|
|
|
|
|
|
#ifdef PERL_ANY_COW |
2039
|
|
|
|
|
|
bool is_cow; |
2040
|
|
|
|
|
|
#endif |
2041
|
|
|
|
|
|
SV *nsv = NULL; |
2042
|
|
|
|
|
|
/* known replacement string? */ |
2043
|
104453038
|
100
|
|
|
|
SV *dstr = (pm->op_pmflags & PMf_CONST) ? POPs : NULL; |
2044
|
|
|
|
|
|
|
2045
|
104453038
|
50
|
|
|
|
PERL_ASYNC_CHECK(); |
2046
|
|
|
|
|
|
|
2047
|
104453038
|
100
|
|
|
|
if (PL_op->op_flags & OPf_STACKED) |
2048
|
90733934
|
|
|
|
|
TARG = POPs; |
2049
|
27438192
|
100
|
|
|
|
else if (PL_op->op_private & OPpTARGET_MY) |
|
|
50
|
|
|
|
|
2050
|
16
|
|
|
|
|
GETTARGET; |
2051
|
|
|
|
|
|
else { |
2052
|
13719088
|
100
|
|
|
|
TARG = DEFSV; |
2053
|
6823798
|
|
|
|
|
EXTEND(SP,1); |
2054
|
|
|
|
|
|
} |
2055
|
|
|
|
|
|
|
2056
|
52187689
|
|
|
|
|
SvGETMAGIC(TARG); /* must come before cow check */ |
2057
|
|
|
|
|
|
#ifdef PERL_ANY_COW |
2058
|
|
|
|
|
|
/* Awooga. Awooga. "bool" types that are actually char are dangerous, |
2059
|
|
|
|
|
|
because they make integers such as 256 "false". */ |
2060
|
104453038
|
|
|
|
|
is_cow = SvIsCOW(TARG) ? TRUE : FALSE; |
2061
|
|
|
|
|
|
#else |
2062
|
|
|
|
|
|
if (SvIsCOW(TARG)) |
2063
|
|
|
|
|
|
sv_force_normal_flags(TARG,0); |
2064
|
|
|
|
|
|
#endif |
2065
|
104453038
|
100
|
|
|
|
if (!(rpm->op_pmflags & PMf_NONDESTRUCT) |
2066
|
103539248
|
100
|
|
|
|
&& (SvREADONLY(TARG) |
2067
|
103539242
|
100
|
|
|
|
|| ( ((SvTYPE(TARG) == SVt_PVGV && isGV_with_GP(TARG)) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
2068
|
103539208
|
50
|
|
|
|
|| SvTYPE(TARG) > SVt_PVLV) |
2069
|
34
|
50
|
|
|
|
&& !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))) |
2070
|
6
|
|
|
|
|
Perl_croak_no_modify(); |
2071
|
104453032
|
|
|
|
|
PUTBACK; |
2072
|
|
|
|
|
|
|
2073
|
104453032
|
100
|
|
|
|
orig = SvPV_nomg(TARG, len); |
2074
|
|
|
|
|
|
/* note we don't (yet) force the var into being a string; if we fail |
2075
|
|
|
|
|
|
* to match, we leave as-is; on successful match howeverm, we *will* |
2076
|
|
|
|
|
|
* coerce into a string, then repeat the match */ |
2077
|
104453032
|
100
|
|
|
|
if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV || SvVOK(TARG)) |
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
2078
|
|
|
|
|
|
force_on_match = 1; |
2079
|
|
|
|
|
|
|
2080
|
|
|
|
|
|
/* only replace once? */ |
2081
|
104453032
|
|
|
|
|
once = !(rpm->op_pmflags & PMf_GLOBAL); |
2082
|
|
|
|
|
|
|
2083
|
|
|
|
|
|
/* See "how taint works" above */ |
2084
|
104453032
|
100
|
|
|
|
if (TAINTING_get) { |
2085
|
1188350
|
100
|
|
|
|
rxtainted = ( |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
2086
|
198194
|
50
|
|
|
|
(SvTAINTED(TARG) ? SUBST_TAINT_STR : 0) |
2087
|
396092
|
|
|
|
|
| (RX_ISTAINTED(rx) ? SUBST_TAINT_PAT : 0) |
2088
|
396092
|
|
|
|
|
| ((pm->op_pmflags & PMf_RETAINT) ? SUBST_TAINT_RETAINT : 0) |
2089
|
394810
|
50
|
|
|
|
| ((once && !(rpm->op_pmflags & PMf_NONDESTRUCT)) |
2090
|
|
|
|
|
|
? SUBST_TAINT_BOOLRET : 0)); |
2091
|
52468992
|
|
|
|
|
TAINT_NOT; |
2092
|
|
|
|
|
|
} |
2093
|
|
|
|
|
|
|
2094
|
|
|
|
|
|
force_it: |
2095
|
104454216
|
50
|
|
|
|
if (!pm || !orig) |
2096
|
0
|
|
|
|
|
DIE(aTHX_ "panic: pp_subst, pm=%p, orig=%p", pm, orig); |
2097
|
|
|
|
|
|
|
2098
|
104454216
|
|
|
|
|
strend = orig + len; |
2099
|
104454216
|
100
|
|
|
|
slen = DO_UTF8(TARG) ? utf8_length((U8*)orig, (U8*)strend) : len; |
|
|
100
|
|
|
|
|
2100
|
104454216
|
|
|
|
|
maxiters = 2 * slen + 10; /* We can match twice at each |
2101
|
|
|
|
|
|
position, once with zero-length, |
2102
|
|
|
|
|
|
second time with non-zero. */ |
2103
|
|
|
|
|
|
|
2104
|
156637486
|
100
|
|
|
|
if (!RX_PRELEN(rx) && PL_curpm |
|
|
100
|
|
|
|
|
2105
|
60
|
100
|
|
|
|
&& !ReANY(rx)->mother_re) { |
2106
|
58
|
|
|
|
|
pm = PL_curpm; |
2107
|
58
|
|
|
|
|
rx = PM_GETRE(pm); |
2108
|
|
|
|
|
|
} |
2109
|
|
|
|
|
|
|
2110
|
|
|
|
|
|
#ifdef PERL_SAWAMPERSAND |
2111
|
|
|
|
|
|
r_flags = ( RX_NPARENS(rx) |
2112
|
|
|
|
|
|
|| PL_sawampersand |
2113
|
|
|
|
|
|
|| (RX_EXTFLAGS(rx) & (RXf_EVAL_SEEN|RXf_PMf_KEEPCOPY)) |
2114
|
|
|
|
|
|
|| (rpm->op_pmflags & PMf_KEEPCOPY) |
2115
|
|
|
|
|
|
) |
2116
|
|
|
|
|
|
? REXEC_COPY_STR |
2117
|
|
|
|
|
|
: 0; |
2118
|
|
|
|
|
|
#else |
2119
|
|
|
|
|
|
r_flags = REXEC_COPY_STR; |
2120
|
|
|
|
|
|
#endif |
2121
|
|
|
|
|
|
|
2122
|
104454216
|
100
|
|
|
|
if (!CALLREGEXEC(rx, orig, strend, orig, 0, TARG, NULL, r_flags)) |
2123
|
|
|
|
|
|
{ |
2124
|
48970316
|
|
|
|
|
SPAGAIN; |
2125
|
48970316
|
100
|
|
|
|
PUSHs(rpm->op_pmflags & PMf_NONDESTRUCT ? TARG : &PL_sv_no); |
2126
|
48970316
|
100
|
|
|
|
LEAVE_SCOPE(oldsave); |
2127
|
48970316
|
|
|
|
|
RETURN; |
2128
|
|
|
|
|
|
} |
2129
|
55483896
|
|
|
|
|
PL_curpm = pm; |
2130
|
|
|
|
|
|
|
2131
|
|
|
|
|
|
/* known replacement string? */ |
2132
|
55483896
|
100
|
|
|
|
if (dstr) { |
2133
|
|
|
|
|
|
/* replacement needing upgrading? */ |
2134
|
54170329
|
100
|
|
|
|
if (DO_UTF8(TARG) && !doutf8) { |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
2135
|
88288
|
|
|
|
|
nsv = sv_newmortal(); |
2136
|
88288
|
50
|
|
|
|
SvSetSV(nsv, dstr); |
2137
|
88288
|
100
|
|
|
|
if (PL_encoding) |
2138
|
2358
|
|
|
|
|
sv_recode_to_utf8(nsv, PL_encoding); |
2139
|
|
|
|
|
|
else |
2140
|
85930
|
|
|
|
|
sv_utf8_upgrade(nsv); |
2141
|
88288
|
50
|
|
|
|
c = SvPV_const(nsv, clen); |
2142
|
88288
|
|
|
|
|
doutf8 = TRUE; |
2143
|
|
|
|
|
|
} |
2144
|
|
|
|
|
|
else { |
2145
|
54082041
|
100
|
|
|
|
c = SvPV_const(dstr, clen); |
2146
|
54082041
|
100
|
|
|
|
doutf8 = DO_UTF8(dstr); |
|
|
50
|
|
|
|
|
2147
|
|
|
|
|
|
} |
2148
|
|
|
|
|
|
|
2149
|
54170329
|
100
|
|
|
|
if (SvTAINTED(dstr)) |
|
|
50
|
|
|
|
|
2150
|
0
|
|
|
|
|
rxtainted |= SUBST_TAINT_REPL; |
2151
|
|
|
|
|
|
} |
2152
|
|
|
|
|
|
else { |
2153
|
|
|
|
|
|
c = NULL; |
2154
|
|
|
|
|
|
doutf8 = FALSE; |
2155
|
|
|
|
|
|
} |
2156
|
|
|
|
|
|
|
2157
|
|
|
|
|
|
/* can do inplace substitution? */ |
2158
|
55483896
|
100
|
|
|
|
if (c |
2159
|
|
|
|
|
|
#ifdef PERL_ANY_COW |
2160
|
54170329
|
100
|
|
|
|
&& !is_cow |
2161
|
|
|
|
|
|
#endif |
2162
|
6000014
|
100
|
|
|
|
&& (I32)clen <= RX_MINLENRET(rx) |
2163
|
3761629
|
100
|
|
|
|
&& ( once |
2164
|
|
|
|
|
|
|| !(r_flags & REXEC_COPY_STR) |
2165
|
1475859
|
100
|
|
|
|
|| (!SvGMAGICAL(dstr) && !(RX_EXTFLAGS(rx) & RXf_EVAL_SEEN)) |
|
|
100
|
|
|
|
|
2166
|
|
|
|
|
|
) |
2167
|
3757321
|
100
|
|
|
|
&& !(RX_EXTFLAGS(rx) & RXf_NO_INPLACE_SUBST) |
2168
|
3693391
|
100
|
|
|
|
&& (!doutf8 || SvUTF8(TARG)) |
|
|
100
|
|
|
|
|
2169
|
3693355
|
100
|
|
|
|
&& !(rpm->op_pmflags & PMf_NONDESTRUCT)) |
2170
|
|
|
|
|
|
{ |
2171
|
|
|
|
|
|
|
2172
|
|
|
|
|
|
#ifdef PERL_ANY_COW |
2173
|
3493273
|
100
|
|
|
|
if (SvIsCOW(TARG)) { |
2174
|
3221741
|
50
|
|
|
|
if (!force_on_match) |
2175
|
|
|
|
|
|
goto have_a_cow; |
2176
|
|
|
|
|
|
assert(SvVOK(TARG)); |
2177
|
|
|
|
|
|
} |
2178
|
|
|
|
|
|
#endif |
2179
|
271532
|
100
|
|
|
|
if (force_on_match) { |
2180
|
|
|
|
|
|
/* redo the first match, this time with the orig var |
2181
|
|
|
|
|
|
* forced into being a string */ |
2182
|
|
|
|
|
|
force_on_match = 0; |
2183
|
946
|
50
|
|
|
|
orig = SvPV_force_nomg(TARG, len); |
2184
|
|
|
|
|
|
goto force_it; |
2185
|
|
|
|
|
|
} |
2186
|
|
|
|
|
|
|
2187
|
270586
|
100
|
|
|
|
if (once) { |
2188
|
|
|
|
|
|
char *d, *m; |
2189
|
255896
|
50
|
|
|
|
if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */ |
2190
|
0
|
|
|
|
|
rxtainted |= SUBST_TAINT_PAT; |
2191
|
255896
|
|
|
|
|
m = orig + RX_OFFS(rx)[0].start; |
2192
|
255896
|
|
|
|
|
d = orig + RX_OFFS(rx)[0].end; |
2193
|
|
|
|
|
|
s = orig; |
2194
|
255896
|
100
|
|
|
|
if (m - s > strend - d) { /* faster to shorten from end */ |
2195
|
|
|
|
|
|
I32 i; |
2196
|
24914
|
100
|
|
|
|
if (clen) { |
2197
|
28
|
|
|
|
|
Copy(c, m, clen, char); |
2198
|
28
|
|
|
|
|
m += clen; |
2199
|
|
|
|
|
|
} |
2200
|
24914
|
|
|
|
|
i = strend - d; |
2201
|
24914
|
100
|
|
|
|
if (i > 0) { |
2202
|
934
|
|
|
|
|
Move(d, m, i, char); |
2203
|
934
|
|
|
|
|
m += i; |
2204
|
|
|
|
|
|
} |
2205
|
24914
|
|
|
|
|
*m = '\0'; |
2206
|
24914
|
|
|
|
|
SvCUR_set(TARG, m - s); |
2207
|
|
|
|
|
|
} |
2208
|
|
|
|
|
|
else { /* faster from front */ |
2209
|
230982
|
|
|
|
|
I32 i = m - s; |
2210
|
230982
|
|
|
|
|
d -= clen; |
2211
|
230982
|
100
|
|
|
|
if (i > 0) |
2212
|
34
|
|
|
|
|
Move(s, d - i, i, char); |
2213
|
230982
|
|
|
|
|
sv_chop(TARG, d-i); |
2214
|
230982
|
100
|
|
|
|
if (clen) |
2215
|
148
|
|
|
|
|
Copy(c, d, clen, char); |
2216
|
|
|
|
|
|
} |
2217
|
255896
|
|
|
|
|
SPAGAIN; |
2218
|
255896
|
|
|
|
|
PUSHs(&PL_sv_yes); |
2219
|
|
|
|
|
|
} |
2220
|
|
|
|
|
|
else { |
2221
|
|
|
|
|
|
char *d, *m; |
2222
|
14690
|
|
|
|
|
d = s = RX_OFFS(rx)[0].start + orig; |
2223
|
|
|
|
|
|
do { |
2224
|
|
|
|
|
|
I32 i; |
2225
|
34680
|
50
|
|
|
|
if (iters++ > maxiters) |
2226
|
0
|
|
|
|
|
DIE(aTHX_ "Substitution loop"); |
2227
|
34680
|
50
|
|
|
|
if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */ |
2228
|
0
|
|
|
|
|
rxtainted |= SUBST_TAINT_PAT; |
2229
|
34680
|
|
|
|
|
m = RX_OFFS(rx)[0].start + orig; |
2230
|
34680
|
100
|
|
|
|
if ((i = m - s)) { |
2231
|
16690
|
100
|
|
|
|
if (s != d) |
2232
|
9808
|
|
|
|
|
Move(s, d, i, char); |
2233
|
16690
|
|
|
|
|
d += i; |
2234
|
|
|
|
|
|
} |
2235
|
34680
|
100
|
|
|
|
if (clen) { |
2236
|
20464
|
|
|
|
|
Copy(c, d, clen, char); |
2237
|
20464
|
|
|
|
|
d += clen; |
2238
|
|
|
|
|
|
} |
2239
|
34680
|
|
|
|
|
s = RX_OFFS(rx)[0].end + orig; |
2240
|
34680
|
100
|
|
|
|
} while (CALLREGEXEC(rx, s, strend, orig, |
2241
|
|
|
|
|
|
s == m, /* don't match same null twice */ |
2242
|
|
|
|
|
|
TARG, NULL, |
2243
|
|
|
|
|
|
REXEC_NOT_FIRST|REXEC_IGNOREPOS|REXEC_FAIL_ON_UNDERFLOW)); |
2244
|
14690
|
100
|
|
|
|
if (s != d) { |
2245
|
4216
|
|
|
|
|
I32 i = strend - s; |
2246
|
4216
|
|
|
|
|
SvCUR_set(TARG, d - SvPVX_const(TARG) + i); |
2247
|
4216
|
|
|
|
|
Move(s, d, i+1, char); /* include the NUL */ |
2248
|
|
|
|
|
|
} |
2249
|
14690
|
|
|
|
|
SPAGAIN; |
2250
|
14690
|
|
|
|
|
mPUSHi((I32)iters); |
2251
|
|
|
|
|
|
} |
2252
|
|
|
|
|
|
} |
2253
|
|
|
|
|
|
else { |
2254
|
|
|
|
|
|
bool first; |
2255
|
|
|
|
|
|
char *m; |
2256
|
|
|
|
|
|
SV *repl; |
2257
|
51990623
|
100
|
|
|
|
if (force_on_match) { |
2258
|
|
|
|
|
|
/* redo the first match, this time with the orig var |
2259
|
|
|
|
|
|
* forced into being a string */ |
2260
|
|
|
|
|
|
force_on_match = 0; |
2261
|
238
|
100
|
|
|
|
if (rpm->op_pmflags & PMf_NONDESTRUCT) { |
2262
|
|
|
|
|
|
/* I feel that it should be possible to avoid this mortal copy |
2263
|
|
|
|
|
|
given that the code below copies into a new destination. |
2264
|
|
|
|
|
|
However, I suspect it isn't worth the complexity of |
2265
|
|
|
|
|
|
unravelling the C for the small number of |
2266
|
|
|
|
|
|
cases where it would be viable to drop into the copy code. */ |
2267
|
16
|
|
|
|
|
TARG = sv_2mortal(newSVsv(TARG)); |
2268
|
|
|
|
|
|
} |
2269
|
238
|
50
|
|
|
|
orig = SvPV_force_nomg(TARG, len); |
2270
|
|
|
|
|
|
goto force_it; |
2271
|
|
|
|
|
|
} |
2272
|
|
|
|
|
|
#ifdef PERL_ANY_COW |
2273
|
|
|
|
|
|
have_a_cow: |
2274
|
|
|
|
|
|
#endif |
2275
|
55212126
|
100
|
|
|
|
if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */ |
2276
|
78
|
|
|
|
|
rxtainted |= SUBST_TAINT_PAT; |
2277
|
|
|
|
|
|
repl = dstr; |
2278
|
55212126
|
|
|
|
|
s = RX_OFFS(rx)[0].start + orig; |
2279
|
55212126
|
100
|
|
|
|
dstr = newSVpvn_flags(orig, s-orig, |
|
|
100
|
|
|
|
|
2280
|
|
|
|
|
|
SVs_TEMP | (DO_UTF8(TARG) ? SVf_UTF8 : 0)); |
2281
|
55212126
|
100
|
|
|
|
if (!c) { |
2282
|
|
|
|
|
|
PERL_CONTEXT *cx; |
2283
|
1313427
|
|
|
|
|
SPAGAIN; |
2284
|
|
|
|
|
|
m = orig; |
2285
|
|
|
|
|
|
/* note that a whole bunch of local vars are saved here for |
2286
|
|
|
|
|
|
* use by pp_substcont: here's a list of them in case you're |
2287
|
|
|
|
|
|
* searching for places in this sub that uses a particular var: |
2288
|
|
|
|
|
|
* iters maxiters r_flags oldsave rxtainted orig dstr targ |
2289
|
|
|
|
|
|
* s m strend rx once */ |
2290
|
1313427
|
100
|
|
|
|
PUSHSUBST(cx); |
|
|
100
|
|
|
|
|
2291
|
28268713
|
|
|
|
|
RETURNOP(cPMOP->op_pmreplrootu.op_pmreplroot); |
2292
|
|
|
|
|
|
} |
2293
|
|
|
|
|
|
first = TRUE; |
2294
|
|
|
|
|
|
do { |
2295
|
56491071
|
50
|
|
|
|
if (iters++ > maxiters) |
2296
|
0
|
|
|
|
|
DIE(aTHX_ "Substitution loop"); |
2297
|
56491071
|
100
|
|
|
|
if (RX_MATCH_TAINTED(rx)) |
2298
|
80
|
|
|
|
|
rxtainted |= SUBST_TAINT_PAT; |
2299
|
56500346
|
100
|
|
|
|
if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) { |
|
|
100
|
|
|
|
|
2300
|
|
|
|
|
|
char *old_s = s; |
2301
|
|
|
|
|
|
char *old_orig = orig; |
2302
|
|
|
|
|
|
assert(RX_SUBOFFSET(rx) == 0); |
2303
|
|
|
|
|
|
|
2304
|
7012
|
|
|
|
|
orig = RX_SUBBEG(rx); |
2305
|
7012
|
|
|
|
|
s = orig + (old_s - old_orig); |
2306
|
7012
|
|
|
|
|
strend = s + (strend - old_s); |
2307
|
|
|
|
|
|
} |
2308
|
56491071
|
|
|
|
|
m = RX_OFFS(rx)[0].start + orig; |
2309
|
56491071
|
100
|
|
|
|
sv_catpvn_nomg_maybeutf8(dstr, s, m - s, DO_UTF8(TARG)); |
|
|
100
|
|
|
|
|
2310
|
56491071
|
|
|
|
|
s = RX_OFFS(rx)[0].end + orig; |
2311
|
56491071
|
100
|
|
|
|
if (first) { |
2312
|
|
|
|
|
|
/* replacement already stringified */ |
2313
|
53898699
|
100
|
|
|
|
if (clen) |
2314
|
867914
|
100
|
|
|
|
sv_catpvn_nomg_maybeutf8(dstr, c, clen, doutf8); |
2315
|
|
|
|
|
|
first = FALSE; |
2316
|
|
|
|
|
|
} |
2317
|
|
|
|
|
|
else { |
2318
|
2592372
|
100
|
|
|
|
if (PL_encoding) { |
2319
|
3150
|
100
|
|
|
|
if (!nsv) nsv = sv_newmortal(); |
2320
|
3150
|
|
|
|
|
sv_copypv(nsv, repl); |
2321
|
3150
|
50
|
|
|
|
if (!DO_UTF8(nsv)) sv_recode_to_utf8(nsv, PL_encoding); |
|
|
0
|
|
|
|
|
2322
|
3150
|
|
|
|
|
sv_catsv(dstr, nsv); |
2323
|
|
|
|
|
|
} |
2324
|
2589222
|
|
|
|
|
else sv_catsv(dstr, repl); |
2325
|
2592372
|
100
|
|
|
|
if (SvTAINTED(repl)) |
|
|
50
|
|
|
|
|
2326
|
0
|
|
|
|
|
rxtainted |= SUBST_TAINT_REPL; |
2327
|
|
|
|
|
|
} |
2328
|
56491071
|
100
|
|
|
|
if (once) |
2329
|
|
|
|
|
|
break; |
2330
|
4295950
|
100
|
|
|
|
} while (CALLREGEXEC(rx, s, strend, orig, s == m, |
2331
|
|
|
|
|
|
TARG, NULL, |
2332
|
|
|
|
|
|
REXEC_NOT_FIRST|REXEC_IGNOREPOS|REXEC_FAIL_ON_UNDERFLOW)); |
2333
|
53898699
|
100
|
|
|
|
sv_catpvn_nomg_maybeutf8(dstr, s, strend - s, DO_UTF8(TARG)); |
|
|
100
|
|
|
|
|
2334
|
|
|
|
|
|
|
2335
|
53898699
|
100
|
|
|
|
if (rpm->op_pmflags & PMf_NONDESTRUCT) { |
2336
|
|
|
|
|
|
/* From here on down we're using the copy, and leaving the original |
2337
|
|
|
|
|
|
untouched. */ |
2338
|
|
|
|
|
|
TARG = dstr; |
2339
|
370500
|
|
|
|
|
SPAGAIN; |
2340
|
370500
|
|
|
|
|
PUSHs(dstr); |
2341
|
|
|
|
|
|
} else { |
2342
|
|
|
|
|
|
#ifdef PERL_ANY_COW |
2343
|
|
|
|
|
|
/* The match may make the string COW. If so, brilliant, because |
2344
|
|
|
|
|
|
that's just saved us one malloc, copy and free - the regexp has |
2345
|
|
|
|
|
|
donated the old buffer, and we malloc an entirely new one, rather |
2346
|
|
|
|
|
|
than the regexp malloc()ing a buffer and copying our original, |
2347
|
|
|
|
|
|
only for us to throw it away here during the substitution. */ |
2348
|
53528199
|
100
|
|
|
|
if (SvIsCOW(TARG)) { |
2349
|
53523743
|
|
|
|
|
sv_force_normal_flags(TARG, SV_COW_DROP_PV); |
2350
|
|
|
|
|
|
} else |
2351
|
|
|
|
|
|
#endif |
2352
|
|
|
|
|
|
{ |
2353
|
4456
|
50
|
|
|
|
SvPV_free(TARG); |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
2354
|
|
|
|
|
|
} |
2355
|
53528199
|
|
|
|
|
SvPV_set(TARG, SvPVX(dstr)); |
2356
|
53528199
|
|
|
|
|
SvCUR_set(TARG, SvCUR(dstr)); |
2357
|
53528199
|
|
|
|
|
SvLEN_set(TARG, SvLEN(dstr)); |
2358
|
53528199
|
|
|
|
|
SvFLAGS(TARG) |= SvUTF8(dstr); |
2359
|
53528199
|
|
|
|
|
SvPV_set(dstr, NULL); |
2360
|
|
|
|
|
|
|
2361
|
53528199
|
|
|
|
|
SPAGAIN; |
2362
|
53528199
|
|
|
|
|
mPUSHi((I32)iters); |
2363
|
|
|
|
|
|
} |
2364
|
|
|
|
|
|
} |
2365
|
|
|
|
|
|
|
2366
|
54169285
|
100
|
|
|
|
if (!(rpm->op_pmflags & PMf_NONDESTRUCT)) { |
2367
|
53798785
|
|
|
|
|
(void)SvPOK_only_UTF8(TARG); |
2368
|
|
|
|
|
|
} |
2369
|
|
|
|
|
|
|
2370
|
|
|
|
|
|
/* See "how taint works" above */ |
2371
|
54169285
|
100
|
|
|
|
if (TAINTING_get) { |
2372
|
5454
|
50
|
|
|
|
if ((rxtainted & SUBST_TAINT_PAT) || |
|
|
50
|
|
|
|
|
2373
|
3636
|
|
|
|
|
((rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_RETAINT)) == |
2374
|
|
|
|
|
|
(SUBST_TAINT_STR|SUBST_TAINT_RETAINT)) |
2375
|
|
|
|
|
|
) |
2376
|
0
|
|
|
|
|
(RX_MATCH_TAINTED_on(rx)); /* taint $1 et al */ |
2377
|
|
|
|
|
|
|
2378
|
3636
|
100
|
|
|
|
if (!(rxtainted & SUBST_TAINT_BOOLRET) |
2379
|
528
|
50
|
|
|
|
&& (rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_PAT)) |
2380
|
|
|
|
|
|
) |
2381
|
0
|
0
|
|
|
|
SvTAINTED_on(TOPs); /* taint return value */ |
2382
|
|
|
|
|
|
else |
2383
|
3636
|
50
|
|
|
|
SvTAINTED_off(TOPs); /* may have got tainted earlier */ |
2384
|
|
|
|
|
|
|
2385
|
|
|
|
|
|
/* needed for mg_set below */ |
2386
|
3636
|
|
|
|
|
TAINT_set( |
2387
|
|
|
|
|
|
cBOOL(rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_PAT|SUBST_TAINT_REPL)) |
2388
|
|
|
|
|
|
); |
2389
|
3636
|
50
|
|
|
|
SvTAINT(TARG); |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
2390
|
|
|
|
|
|
} |
2391
|
54169285
|
100
|
|
|
|
SvSETMAGIC(TARG); /* PL_tainted must be correctly set for this mg_set */ |
2392
|
54169285
|
|
|
|
|
TAINT_NOT; |
2393
|
54169285
|
100
|
|
|
|
LEAVE_SCOPE(oldsave); |
2394
|
79349058
|
|
|
|
|
RETURN; |
2395
|
|
|
|
|
|
} |
2396
|
|
|
|
|
|
|
2397
|
170727800
|
|
|
|
|
PP(pp_grepwhile) |
2398
|
|
|
|
|
|
{ |
2399
|
170727800
|
|
|
|
|
dVAR; dSP; |
2400
|
|
|
|
|
|
|
2401
|
170727800
|
50
|
|
|
|
if (SvTRUEx(POPs)) |
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
2402
|
7306120
|
|
|
|
|
PL_stack_base[PL_markstack_ptr[-1]++] = PL_stack_base[*PL_markstack_ptr]; |
2403
|
170727800
|
|
|
|
|
++*PL_markstack_ptr; |
2404
|
170727800
|
100
|
|
|
|
FREETMPS; |
2405
|
170727800
|
|
|
|
|
LEAVE_with_name("grep_item"); /* exit inner scope */ |
2406
|
|
|
|
|
|
|
2407
|
|
|
|
|
|
/* All done yet? */ |
2408
|
170727800
|
100
|
|
|
|
if (PL_stack_base + *PL_markstack_ptr > SP) { |
2409
|
|
|
|
|
|
I32 items; |
2410
|
13543256
|
100
|
|
|
|
const I32 gimme = GIMME_V; |
2411
|
|
|
|
|
|
|
2412
|
13543256
|
|
|
|
|
LEAVE_with_name("grep"); /* exit outer scope */ |
2413
|
13543256
|
|
|
|
|
(void)POPMARK; /* pop src */ |
2414
|
13543256
|
|
|
|
|
items = --*PL_markstack_ptr - PL_markstack_ptr[-1]; |
2415
|
13543256
|
|
|
|
|
(void)POPMARK; /* pop dst */ |
2416
|
13543256
|
|
|
|
|
SP = PL_stack_base + POPMARK; /* pop original mark */ |
2417
|
13543256
|
100
|
|
|
|
if (gimme == G_SCALAR) { |
2418
|
653963
|
100
|
|
|
|
if (PL_op->op_private & OPpGREP_LEX) { |
2419
|
2
|
|
|
|
|
SV* const sv = sv_newmortal(); |
2420
|
2
|
|
|
|
|
sv_setiv(sv, items); |
2421
|
2
|
|
|
|
|
PUSHs(sv); |
2422
|
|
|
|
|
|
} |
2423
|
|
|
|
|
|
else { |
2424
|
653961
|
|
|
|
|
dTARGET; |
2425
|
653961
|
50
|
|
|
|
XPUSHi(items); |
|
|
50
|
|
|
|
|
2426
|
|
|
|
|
|
} |
2427
|
|
|
|
|
|
} |
2428
|
12889293
|
100
|
|
|
|
else if (gimme == G_ARRAY) |
2429
|
12889265
|
|
|
|
|
SP += items; |
2430
|
13543256
|
|
|
|
|
RETURN; |
2431
|
|
|
|
|
|
} |
2432
|
|
|
|
|
|
else { |
2433
|
|
|
|
|
|
SV *src; |
2434
|
|
|
|
|
|
|
2435
|
157184544
|
|
|
|
|
ENTER_with_name("grep_item"); /* enter inner scope */ |
2436
|
157184544
|
|
|
|
|
SAVEVPTR(PL_curpm); |
2437
|
|
|
|
|
|
|
2438
|
157184544
|
|
|
|
|
src = PL_stack_base[*PL_markstack_ptr]; |
2439
|
157184544
|
100
|
|
|
|
if (SvPADTMP(src) && !IS_PADGV(src)) { |
2440
|
14
|
|
|
|
|
src = PL_stack_base[*PL_markstack_ptr] = sv_mortalcopy(src); |
2441
|
14
|
|
|
|
|
PL_tmps_floor++; |
2442
|
|
|
|
|
|
} |
2443
|
157184544
|
|
|
|
|
SvTEMP_off(src); |
2444
|
157184544
|
100
|
|
|
|
if (PL_op->op_private & OPpGREP_LEX) |
2445
|
6
|
|
|
|
|
PAD_SVl(PL_op->op_targ) = src; |
2446
|
|
|
|
|
|
else |
2447
|
314369076
|
|
|
|
|
DEFSV_set(src); |
2448
|
|
|
|
|
|
|
2449
|
163960100
|
|
|
|
|
RETURNOP(cLOGOP->op_other); |
2450
|
|
|
|
|
|
} |
2451
|
|
|
|
|
|
} |
2452
|
|
|
|
|
|
|
2453
|
134987005
|
|
|
|
|
PP(pp_leavesub) |
2454
|
|
|
|
|
|
{ |
2455
|
134987005
|
|
|
|
|
dVAR; dSP; |
2456
|
|
|
|
|
|
SV **mark; |
2457
|
|
|
|
|
|
SV **newsp; |
2458
|
|
|
|
|
|
PMOP *newpm; |
2459
|
|
|
|
|
|
I32 gimme; |
2460
|
|
|
|
|
|
PERL_CONTEXT *cx; |
2461
|
|
|
|
|
|
SV *sv; |
2462
|
|
|
|
|
|
|
2463
|
134987005
|
100
|
|
|
|
if (CxMULTICALL(&cxstack[cxstack_ix])) |
2464
|
|
|
|
|
|
return 0; |
2465
|
|
|
|
|
|
|
2466
|
134952113
|
|
|
|
|
POPBLOCK(cx,newpm); |
2467
|
134952113
|
|
|
|
|
cxstack_ix++; /* temporarily protect top context */ |
2468
|
|
|
|
|
|
|
2469
|
134952113
|
|
|
|
|
TAINT_NOT; |
2470
|
134952113
|
100
|
|
|
|
if (gimme == G_SCALAR) { |
2471
|
67440038
|
|
|
|
|
MARK = newsp + 1; |
2472
|
67440038
|
100
|
|
|
|
if (MARK <= SP) { |
2473
|
101041766
|
50
|
|
|
|
if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) { |
|
|
100
|
|
|
|
|
2474
|
24757053
|
100
|
|
|
|
if (SvTEMP(TOPs) && SvREFCNT(TOPs) == 1 |
2475
|
16504702
|
|
|
|
|
&& !SvMAGICAL(TOPs)) { |
2476
|
558116
|
|
|
|
|
*MARK = SvREFCNT_inc(TOPs); |
2477
|
279058
|
50
|
|
|
|
FREETMPS; |
2478
|
279058
|
|
|
|
|
sv_2mortal(*MARK); |
2479
|
|
|
|
|
|
} |
2480
|
|
|
|
|
|
else { |
2481
|
16225644
|
|
|
|
|
sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */ |
2482
|
16225644
|
100
|
|
|
|
FREETMPS; |
2483
|
16225644
|
|
|
|
|
*MARK = sv_mortalcopy(sv); |
2484
|
16225644
|
|
|
|
|
SvREFCNT_dec_NN(sv); |
2485
|
|
|
|
|
|
} |
2486
|
|
|
|
|
|
} |
2487
|
76284713
|
100
|
|
|
|
else if (SvTEMP(TOPs) && SvREFCNT(TOPs) == 1 |
2488
|
50867568
|
|
|
|
|
&& !SvMAGICAL(TOPs)) { |
2489
|
11620337
|
|
|
|
|
*MARK = TOPs; |
2490
|
|
|
|
|
|
} |
2491
|
|
|
|
|
|
else |
2492
|
39247231
|
|
|
|
|
*MARK = sv_mortalcopy(TOPs); |
2493
|
|
|
|
|
|
} |
2494
|
|
|
|
|
|
else { |
2495
|
67768
|
50
|
|
|
|
MEXTEND(MARK, 0); |
2496
|
33770542
|
|
|
|
|
*MARK = &PL_sv_undef; |
2497
|
|
|
|
|
|
} |
2498
|
|
|
|
|
|
SP = MARK; |
2499
|
|
|
|
|
|
} |
2500
|
67512075
|
100
|
|
|
|
else if (gimme == G_ARRAY) { |
2501
|
24340224
|
100
|
|
|
|
for (MARK = newsp + 1; MARK <= SP; MARK++) { |
2502
|
23565270
|
100
|
|
|
|
if (!SvTEMP(*MARK) || SvREFCNT(*MARK) != 1 |
2503
|
15711439
|
|
|
|
|
|| SvMAGICAL(*MARK)) { |
2504
|
13814557
|
|
|
|
|
*MARK = sv_mortalcopy(*MARK); |
2505
|
13814557
|
|
|
|
|
TAINT_NOT; /* Each item is independent */ |
2506
|
|
|
|
|
|
} |
2507
|
|
|
|
|
|
} |
2508
|
|
|
|
|
|
} |
2509
|
134952113
|
|
|
|
|
PUTBACK; |
2510
|
|
|
|
|
|
|
2511
|
134952113
|
|
|
|
|
LEAVE; |
2512
|
202259617
|
100
|
|
|
|
POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */ |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
2513
|
134952113
|
|
|
|
|
cxstack_ix--; |
2514
|
134952113
|
|
|
|
|
PL_curpm = newpm; /* ... and pop $1 et al */ |
2515
|
|
|
|
|
|
|
2516
|
134952113
|
|
|
|
|
LEAVESUB(sv); |
2517
|
134969559
|
|
|
|
|
return cx->blk_sub.retop; |
2518
|
|
|
|
|
|
} |
2519
|
|
|
|
|
|
|
2520
|
921144959
|
|
|
|
|
PP(pp_entersub) |
2521
|
|
|
|
|
|
{ |
2522
|
921144959
|
|
|
|
|
dVAR; dSP; dPOPss; |
2523
|
|
|
|
|
|
GV *gv; |
2524
|
|
|
|
|
|
CV *cv; |
2525
|
|
|
|
|
|
PERL_CONTEXT *cx; |
2526
|
|
|
|
|
|
I32 gimme; |
2527
|
921144959
|
|
|
|
|
const bool hasargs = (PL_op->op_flags & OPf_STACKED) != 0; |
2528
|
|
|
|
|
|
|
2529
|
921144959
|
50
|
|
|
|
if (!sv) |
2530
|
0
|
|
|
|
|
DIE(aTHX_ "Not a CODE reference"); |
2531
|
940276073
|
100
|
|
|
|
switch (SvTYPE(sv)) { |
2532
|
|
|
|
|
|
/* This is overwhelming the most common case: */ |
2533
|
|
|
|
|
|
case SVt_PVGV: |
2534
|
|
|
|
|
|
we_have_a_glob: |
2535
|
245135758
|
100
|
|
|
|
if (!(cv = GvCVu((const GV *)sv))) { |
|
|
100
|
|
|
|
|
2536
|
|
|
|
|
|
HV *stash; |
2537
|
1426
|
|
|
|
|
cv = sv_2cv(sv, &stash, &gv, 0); |
2538
|
|
|
|
|
|
} |
2539
|
245135758
|
100
|
|
|
|
if (!cv) { |
2540
|
1426
|
|
|
|
|
ENTER; |
2541
|
1426
|
|
|
|
|
SAVETMPS; |
2542
|
1426
|
|
|
|
|
goto try_autoload; |
2543
|
|
|
|
|
|
} |
2544
|
|
|
|
|
|
break; |
2545
|
|
|
|
|
|
case SVt_PVLV: |
2546
|
74
|
100
|
|
|
|
if(isGV_with_GP(sv)) goto we_have_a_glob; |
|
|
50
|
|
|
|
|
2547
|
|
|
|
|
|
/*FALLTHROUGH*/ |
2548
|
|
|
|
|
|
default: |
2549
|
21631036
|
100
|
|
|
|
if (sv == &PL_sv_yes) { /* unfound import, ignore */ |
2550
|
2499922
|
50
|
|
|
|
if (hasargs) |
2551
|
2499922
|
|
|
|
|
SP = PL_stack_base + POPMARK; |
2552
|
|
|
|
|
|
else |
2553
|
0
|
|
|
|
|
(void)POPMARK; |
2554
|
2499922
|
|
|
|
|
RETURN; |
2555
|
|
|
|
|
|
} |
2556
|
9563771
|
|
|
|
|
SvGETMAGIC(sv); |
2557
|
19131114
|
100
|
|
|
|
if (SvROK(sv)) { |
2558
|
19042764
|
50
|
|
|
|
if (SvAMAGIC(sv)) { |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
2559
|
92
|
|
|
|
|
sv = amagic_deref_call(sv, to_cv_amg); |
2560
|
|
|
|
|
|
/* Don't SPAGAIN here. */ |
2561
|
|
|
|
|
|
} |
2562
|
|
|
|
|
|
} |
2563
|
|
|
|
|
|
else { |
2564
|
|
|
|
|
|
const char *sym; |
2565
|
|
|
|
|
|
STRLEN len; |
2566
|
88350
|
100
|
|
|
|
if (!SvOK(sv)) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
2567
|
10
|
|
|
|
|
DIE(aTHX_ PL_no_usym, "a subroutine"); |
2568
|
88340
|
100
|
|
|
|
sym = SvPV_nomg_const(sv, len); |
2569
|
88340
|
100
|
|
|
|
if (PL_op->op_private & HINT_STRICT_REFS) |
2570
|
6
|
50
|
|
|
|
DIE(aTHX_ "Can't use string (\"%" SVf32 "\"%s) as a subroutine ref while \"strict refs\" in use", sv, len>32 ? "..." : ""); |
2571
|
88334
|
|
|
|
|
cv = get_cvn_flags(sym, len, GV_ADD|SvUTF8(sv)); |
2572
|
88334
|
|
|
|
|
break; |
2573
|
|
|
|
|
|
} |
2574
|
19042764
|
|
|
|
|
cv = MUTABLE_CV(SvRV(sv)); |
2575
|
19042764
|
100
|
|
|
|
if (SvTYPE(cv) == SVt_PVCV) |
2576
|
|
|
|
|
|
break; |
2577
|
|
|
|
|
|
/* FALL THROUGH */ |
2578
|
|
|
|
|
|
case SVt_PVHV: |
2579
|
|
|
|
|
|
case SVt_PVAV: |
2580
|
6
|
|
|
|
|
DIE(aTHX_ "Not a CODE reference"); |
2581
|
|
|
|
|
|
/* This is the second most common case: */ |
2582
|
|
|
|
|
|
case SVt_PVCV: |
2583
|
654378165
|
|
|
|
|
cv = MUTABLE_CV(sv); |
2584
|
654378165
|
|
|
|
|
break; |
2585
|
|
|
|
|
|
} |
2586
|
|
|
|
|
|
|
2587
|
918643589
|
|
|
|
|
ENTER; |
2588
|
|
|
|
|
|
|
2589
|
|
|
|
|
|
retry: |
2590
|
919906321
|
50
|
|
|
|
if (CvCLONE(cv) && ! CvCLONED(cv)) |
|
|
0
|
|
|
|
|
2591
|
0
|
|
|
|
|
DIE(aTHX_ "Closure prototype called"); |
2592
|
919906321
|
100
|
|
|
|
if (!CvROOT(cv) && !CvXSUB(cv)) { |
|
|
50
|
|
|
|
|
2593
|
|
|
|
|
|
GV* autogv; |
2594
|
|
|
|
|
|
SV* sub_name; |
2595
|
|
|
|
|
|
|
2596
|
|
|
|
|
|
/* anonymous or undef'd function leaves us no recourse */ |
2597
|
2522794
|
100
|
|
|
|
if (CvANON(cv) || !(gv = CvGV(cv))) { |
|
|
100
|
|
|
|
|
2598
|
28
|
100
|
|
|
|
if (CvNAMED(cv)) |
2599
|
26
|
|
|
|
|
DIE(aTHX_ "Undefined subroutine &%"HEKf" called", |
2600
|
|
|
|
|
|
HEKfARG(CvNAME_HEK(cv))); |
2601
|
2
|
|
|
|
|
DIE(aTHX_ "Undefined subroutine called"); |
2602
|
|
|
|
|
|
} |
2603
|
|
|
|
|
|
|
2604
|
|
|
|
|
|
/* autoloaded stub? */ |
2605
|
1261370
|
100
|
|
|
|
if (cv != GvCV(gv)) { |
2606
|
1252604
|
|
|
|
|
cv = GvCV(gv); |
2607
|
|
|
|
|
|
} |
2608
|
|
|
|
|
|
/* should call AUTOLOAD now? */ |
2609
|
|
|
|
|
|
else { |
2610
|
|
|
|
|
|
try_autoload: |
2611
|
10192
|
100
|
|
|
|
if ((autogv = gv_autoload_pvn(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), |
|
|
100
|
|
|
|
|
2612
|
|
|
|
|
|
GvNAMEUTF8(gv) ? SVf_UTF8 : 0))) |
2613
|
|
|
|
|
|
{ |
2614
|
10132
|
|
|
|
|
cv = GvCV(autogv); |
2615
|
|
|
|
|
|
} |
2616
|
|
|
|
|
|
else { |
2617
|
|
|
|
|
|
sorry: |
2618
|
64
|
|
|
|
|
sub_name = sv_newmortal(); |
2619
|
64
|
|
|
|
|
gv_efullname3(sub_name, gv, NULL); |
2620
|
64
|
|
|
|
|
DIE(aTHX_ "Undefined subroutine &%"SVf" called", SVfARG(sub_name)); |
2621
|
|
|
|
|
|
} |
2622
|
|
|
|
|
|
} |
2623
|
1262736
|
100
|
|
|
|
if (!cv) |
2624
|
|
|
|
|
|
goto sorry; |
2625
|
|
|
|
|
|
goto retry; |
2626
|
|
|
|
|
|
} |
2627
|
|
|
|
|
|
|
2628
|
918644923
|
100
|
|
|
|
gimme = GIMME_V; |
2629
|
918644923
|
100
|
|
|
|
if ((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub) && !CvNODEBUG(cv)) { |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
2630
|
32832
|
|
|
|
|
Perl_get_db_sub(aTHX_ &sv, cv); |
2631
|
32832
|
100
|
|
|
|
if (CvISXSUB(cv)) |
2632
|
1712
|
|
|
|
|
PL_curcopdb = PL_curcop; |
2633
|
32832
|
100
|
|
|
|
if (CvLVALUE(cv)) { |
2634
|
|
|
|
|
|
/* check for lsub that handles lvalue subroutines */ |
2635
|
6
|
|
|
|
|
cv = GvCV(gv_HVadd(gv_fetchpvs("DB::lsub", GV_ADDMULTI, SVt_PVHV))); |
2636
|
|
|
|
|
|
/* if lsub not found then fall back to DB::sub */ |
2637
|
6
|
50
|
|
|
|
if (!cv) cv = GvCV(PL_DBsub); |
2638
|
|
|
|
|
|
} else { |
2639
|
32826
|
|
|
|
|
cv = GvCV(PL_DBsub); |
2640
|
|
|
|
|
|
} |
2641
|
|
|
|
|
|
|
2642
|
32832
|
50
|
|
|
|
if (!cv || (!CvXSUB(cv) && !CvSTART(cv))) |
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
2643
|
0
|
|
|
|
|
DIE(aTHX_ "No DB::sub routine defined"); |
2644
|
|
|
|
|
|
} |
2645
|
|
|
|
|
|
|
2646
|
918644923
|
100
|
|
|
|
if (!(CvISXSUB(cv))) { |
2647
|
|
|
|
|
|
/* This path taken at least 75% of the time */ |
2648
|
377837061
|
|
|
|
|
dMARK; |
2649
|
377837061
|
|
|
|
|
I32 items = SP - MARK; |
2650
|
377837061
|
|
|
|
|
PADLIST * const padlist = CvPADLIST(cv); |
2651
|
377837061
|
100
|
|
|
|
PUSHBLOCK(cx, CXt_SUB, MARK); |
2652
|
755306921
|
100
|
|
|
|
PUSHSUB(cx); |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
2653
|
377837061
|
|
|
|
|
cx->blk_sub.retop = PL_op->op_next; |
2654
|
377837061
|
|
|
|
|
CvDEPTH(cv)++; |
2655
|
377837061
|
100
|
|
|
|
if (CvDEPTH(cv) >= 2) { |
2656
|
|
|
|
|
|
PERL_STACK_OVERFLOW_CHECK(); |
2657
|
45108288
|
|
|
|
|
pad_push(padlist, CvDEPTH(cv)); |
2658
|
|
|
|
|
|
} |
2659
|
377837061
|
|
|
|
|
SAVECOMPPAD(); |
2660
|
755674122
|
|
|
|
|
PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv)); |
2661
|
377837061
|
100
|
|
|
|
if (hasargs) { |
2662
|
372831997
|
|
|
|
|
AV *const av = MUTABLE_AV(PAD_SVl(0)); |
2663
|
372831997
|
50
|
|
|
|
if (AvREAL(av)) { |
2664
|
|
|
|
|
|
/* @_ is normally not REAL--this should only ever |
2665
|
|
|
|
|
|
* happen when DB::sub() calls things that modify @_ */ |
2666
|
0
|
|
|
|
|
av_clear(av); |
2667
|
0
|
|
|
|
|
AvREAL_off(av); |
2668
|
0
|
|
|
|
|
AvREIFY_on(av); |
2669
|
|
|
|
|
|
} |
2670
|
372831997
|
|
|
|
|
cx->blk_sub.savearray = GvAV(PL_defgv); |
2671
|
745663994
|
|
|
|
|
GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av)); |
2672
|
372831997
|
|
|
|
|
CX_CURPAD_SAVE(cx->blk_sub); |
2673
|
372831997
|
|
|
|
|
cx->blk_sub.argarray = av; |
2674
|
372831997
|
|
|
|
|
++MARK; |
2675
|
|
|
|
|
|
|
2676
|
372831997
|
100
|
|
|
|
if (items - 1 > AvMAX(av)) { |
2677
|
3283772
|
|
|
|
|
SV **ary = AvALLOC(av); |
2678
|
3283772
|
|
|
|
|
AvMAX(av) = items - 1; |
2679
|
3283772
|
50
|
|
|
|
Renew(ary, items, SV*); |
2680
|
3283772
|
|
|
|
|
AvALLOC(av) = ary; |
2681
|
3283772
|
|
|
|
|
AvARRAY(av) = ary; |
2682
|
|
|
|
|
|
} |
2683
|
|
|
|
|
|
|
2684
|
372831997
|
50
|
|
|
|
Copy(MARK,AvARRAY(av),items,SV*); |
2685
|
372831997
|
|
|
|
|
AvFILLp(av) = items - 1; |
2686
|
|
|
|
|
|
|
2687
|
372831997
|
|
|
|
|
MARK = AvARRAY(av); |
2688
|
1150851868
|
100
|
|
|
|
while (items--) { |
2689
|
591787114
|
50
|
|
|
|
if (*MARK) |
2690
|
|
|
|
|
|
{ |
2691
|
591787114
|
100
|
|
|
|
if (SvPADTMP(*MARK) && !IS_PADGV(*MARK)) |
2692
|
28583851
|
|
|
|
|
*MARK = sv_mortalcopy(*MARK); |
2693
|
591787114
|
|
|
|
|
SvTEMP_off(*MARK); |
2694
|
|
|
|
|
|
} |
2695
|
591787114
|
|
|
|
|
MARK++; |
2696
|
|
|
|
|
|
} |
2697
|
|
|
|
|
|
} |
2698
|
377837061
|
|
|
|
|
SAVETMPS; |
2699
|
377837358
|
100
|
|
|
|
if ((cx->blk_u16 & OPpENTERSUB_LVAL_MASK) == OPpLVAL_INTRO && |
|
|
100
|
|
|
|
|
2700
|
594
|
|
|
|
|
!CvLVALUE(cv)) |
2701
|
10
|
|
|
|
|
DIE(aTHX_ "Can't modify non-lvalue subroutine call"); |
2702
|
|
|
|
|
|
/* warning must come *after* we fully set up the context |
2703
|
|
|
|
|
|
* stuff so that __WARN__ handlers can safely dounwind() |
2704
|
|
|
|
|
|
* if they want to |
2705
|
|
|
|
|
|
*/ |
2706
|
377837051
|
100
|
|
|
|
if (CvDEPTH(cv) == PERL_SUB_DEPTH_WARN && ckWARN(WARN_RECURSION) |
|
|
100
|
|
|
|
|
2707
|
10
|
100
|
|
|
|
&& !(PERLDB_SUB && cv == GvCV(PL_DBsub))) |
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
2708
|
10
|
|
|
|
|
sub_crush_depth(cv); |
2709
|
377837047
|
|
|
|
|
RETURNOP(CvSTART(cv)); |
2710
|
|
|
|
|
|
} |
2711
|
|
|
|
|
|
else { |
2712
|
540807862
|
|
|
|
|
I32 markix = TOPMARK; |
2713
|
|
|
|
|
|
|
2714
|
540807862
|
|
|
|
|
SAVETMPS; |
2715
|
540807862
|
|
|
|
|
PUTBACK; |
2716
|
|
|
|
|
|
|
2717
|
811180487
|
100
|
|
|
|
if (((PL_op->op_private |
2718
|
540807862
|
100
|
|
|
|
& PUSHSUB_GET_LVALUE_MASK(Perl_is_lvalue_sub) |
|
|
100
|
|
|
|
|
2719
|
270372637
|
100
|
|
|
|
) & OPpENTERSUB_LVAL_MASK) == OPpLVAL_INTRO && |
2720
|
12
|
|
|
|
|
!CvLVALUE(cv)) |
2721
|
2
|
|
|
|
|
DIE(aTHX_ "Can't modify non-lvalue subroutine call"); |
2722
|
|
|
|
|
|
|
2723
|
540807860
|
100
|
|
|
|
if (!hasargs) { |
2724
|
|
|
|
|
|
/* Need to copy @_ to stack. Alternative may be to |
2725
|
|
|
|
|
|
* switch stack to @_, and copy return values |
2726
|
|
|
|
|
|
* back. This would allow popping @_ in XSUB, e.g.. XXXX */ |
2727
|
82552
|
|
|
|
|
AV * const av = GvAV(PL_defgv); |
2728
|
82552
|
|
|
|
|
const I32 items = AvFILLp(av) + 1; /* @_ is not tieable */ |
2729
|
|
|
|
|
|
|
2730
|
120958
|
100
|
|
|
|
if (items) { |
|
|
50
|
|
|
|
|
2731
|
|
|
|
|
|
/* Mark is at the end of the stack. */ |
2732
|
38406
|
|
|
|
|
EXTEND(SP, items); |
2733
|
76812
|
50
|
|
|
|
Copy(AvARRAY(av), SP + 1, items, SV*); |
2734
|
76812
|
|
|
|
|
SP += items; |
2735
|
76812
|
|
|
|
|
PUTBACK ; |
2736
|
|
|
|
|
|
} |
2737
|
|
|
|
|
|
} |
2738
|
|
|
|
|
|
else { |
2739
|
540725308
|
|
|
|
|
SV **mark = PL_stack_base + markix; |
2740
|
540725308
|
|
|
|
|
I32 items = SP - mark; |
2741
|
1438805130
|
100
|
|
|
|
while (items--) { |
2742
|
627748474
|
|
|
|
|
mark++; |
2743
|
627748474
|
50
|
|
|
|
if (*mark && SvPADTMP(*mark) && !IS_PADGV(*mark)) |
|
|
100
|
|
|
|
|
2744
|
314017291
|
|
|
|
|
*mark = sv_mortalcopy(*mark); |
2745
|
|
|
|
|
|
} |
2746
|
|
|
|
|
|
} |
2747
|
|
|
|
|
|
/* We assume first XSUB in &DB::sub is the called one. */ |
2748
|
540807860
|
100
|
|
|
|
if (PL_curcopdb) { |
2749
|
1712
|
|
|
|
|
SAVEVPTR(PL_curcop); |
2750
|
1712
|
|
|
|
|
PL_curcop = PL_curcopdb; |
2751
|
1712
|
|
|
|
|
PL_curcopdb = NULL; |
2752
|
|
|
|
|
|
} |
2753
|
|
|
|
|
|
/* Do we need to open block here? XXXX */ |
2754
|
|
|
|
|
|
|
2755
|
|
|
|
|
|
/* CvXSUB(cv) must not be NULL because newXS() refuses NULL xsub address */ |
2756
|
|
|
|
|
|
assert(CvXSUB(cv)); |
2757
|
540807860
|
|
|
|
|
CvXSUB(cv)(aTHX_ cv); |
2758
|
|
|
|
|
|
|
2759
|
|
|
|
|
|
/* Enforce some sanity in scalar context. */ |
2760
|
540803408
|
100
|
|
|
|
if (gimme == G_SCALAR && ++markix != PL_stack_sp - PL_stack_base ) { |
|
|
100
|
|
|
|
|
2761
|
35062822
|
100
|
|
|
|
if (markix > PL_stack_sp - PL_stack_base) |
2762
|
46
|
|
|
|
|
*(PL_stack_base + markix) = &PL_sv_undef; |
2763
|
|
|
|
|
|
else |
2764
|
35062776
|
|
|
|
|
*(PL_stack_base + markix) = *PL_stack_sp; |
2765
|
35062822
|
|
|
|
|
PL_stack_sp = PL_stack_base + markix; |
2766
|
|
|
|
|
|
} |
2767
|
540803408
|
|
|
|
|
LEAVE; |
2768
|
731159812
|
|
|
|
|
return NORMAL; |
2769
|
|
|
|
|
|
} |
2770
|
|
|
|
|
|
} |
2771
|
|
|
|
|
|
|
2772
|
|
|
|
|
|
void |
2773
|
10
|
|
|
|
|
Perl_sub_crush_depth(pTHX_ CV *cv) |
2774
|
|
|
|
|
|
{ |
2775
|
|
|
|
|
|
PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH; |
2776
|
|
|
|
|
|
|
2777
|
10
|
100
|
|
|
|
if (CvANON(cv)) |
2778
|
2
|
|
|
|
|
Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on anonymous subroutine"); |
2779
|
|
|
|
|
|
else { |
2780
|
|
|
|
|
|
HEK *const hek = CvNAME_HEK(cv); |
2781
|
|
|
|
|
|
SV *tmpstr; |
2782
|
8
|
100
|
|
|
|
if (hek) { |
2783
|
2
|
|
|
|
|
tmpstr = sv_2mortal(newSVhek(hek)); |
2784
|
|
|
|
|
|
} |
2785
|
|
|
|
|
|
else { |
2786
|
6
|
|
|
|
|
tmpstr = sv_newmortal(); |
2787
|
6
|
|
|
|
|
gv_efullname3(tmpstr, CvGV(cv), NULL); |
2788
|
|
|
|
|
|
} |
2789
|
8
|
|
|
|
|
Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on subroutine \"%"SVf"\"", |
2790
|
|
|
|
|
|
SVfARG(tmpstr)); |
2791
|
|
|
|
|
|
} |
2792
|
6
|
|
|
|
|
} |
2793
|
|
|
|
|
|
|
2794
|
132713278
|
|
|
|
|
PP(pp_aelem) |
2795
|
|
|
|
|
|
{ |
2796
|
132713278
|
|
|
|
|
dVAR; dSP; |
2797
|
|
|
|
|
|
SV** svp; |
2798
|
132713278
|
|
|
|
|
SV* const elemsv = POPs; |
2799
|
132713278
|
100
|
|
|
|
IV elem = SvIV(elemsv); |
2800
|
132713278
|
|
|
|
|
AV *const av = MUTABLE_AV(POPs); |
2801
|
132713278
|
100
|
|
|
|
const U32 lval = PL_op->op_flags & OPf_MOD || LVRET; |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
2802
|
132713278
|
|
|
|
|
const U32 defer = PL_op->op_private & OPpLVAL_DEFER; |
2803
|
132713278
|
|
|
|
|
const bool localizing = PL_op->op_private & OPpLVAL_INTRO; |
2804
|
|
|
|
|
|
bool preeminent = TRUE; |
2805
|
|
|
|
|
|
SV *sv; |
2806
|
|
|
|
|
|
|
2807
|
132713278
|
100
|
|
|
|
if (SvROK(elemsv) && !SvGAMAGIC(elemsv) && ckWARN(WARN_MISC)) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
2808
|
4
|
|
|
|
|
Perl_warner(aTHX_ packWARN(WARN_MISC), |
2809
|
|
|
|
|
|
"Use of reference \"%"SVf"\" as array index", |
2810
|
|
|
|
|
|
SVfARG(elemsv)); |
2811
|
132713278
|
50
|
|
|
|
if (SvTYPE(av) != SVt_PVAV) |
2812
|
0
|
|
|
|
|
RETPUSHUNDEF; |
2813
|
|
|
|
|
|
|
2814
|
132713278
|
100
|
|
|
|
if (localizing) { |
2815
|
|
|
|
|
|
MAGIC *mg; |
2816
|
|
|
|
|
|
HV *stash; |
2817
|
|
|
|
|
|
|
2818
|
|
|
|
|
|
/* If we can determine whether the element exist, |
2819
|
|
|
|
|
|
* Try to preserve the existenceness of a tied array |
2820
|
|
|
|
|
|
* element by using EXISTS and DELETE if possible. |
2821
|
|
|
|
|
|
* Fallback to FETCH and STORE otherwise. */ |
2822
|
324
|
100
|
|
|
|
if (SvCANEXISTDELETE(av)) |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
2823
|
314
|
|
|
|
|
preeminent = av_exists(av, elem); |
2824
|
|
|
|
|
|
} |
2825
|
|
|
|
|
|
|
2826
|
132713278
|
|
|
|
|
svp = av_fetch(av, elem, lval && !defer); |
2827
|
132713274
|
100
|
|
|
|
if (lval) { |
2828
|
|
|
|
|
|
#ifdef PERL_MALLOC_WRAP |
2829
|
90100772
|
50
|
|
|
|
if (SvUOK(elemsv)) { |
2830
|
0
|
0
|
|
|
|
const UV uv = SvUV(elemsv); |
2831
|
0
|
0
|
|
|
|
elem = uv > IV_MAX ? IV_MAX : uv; |
2832
|
|
|
|
|
|
} |
2833
|
90100772
|
100
|
|
|
|
else if (SvNOK(elemsv)) |
2834
|
24172
|
50
|
|
|
|
elem = (IV)SvNV(elemsv); |
2835
|
107219329
|
100
|
|
|
|
if (elem > 0) { |
|
|
50
|
|
|
|
|
2836
|
|
|
|
|
|
static const char oom_array_extend[] = |
2837
|
|
|
|
|
|
"Out of memory during array extend"; /* Duplicated in av.c */ |
2838
|
17118557
|
|
|
|
|
MEM_WRAP_CHECK_1(elem,SV*,oom_array_extend); |
2839
|
|
|
|
|
|
} |
2840
|
|
|
|
|
|
#endif |
2841
|
90100772
|
100
|
|
|
|
if (!svp || !*svp) { |
|
|
50
|
|
|
|
|
2842
|
|
|
|
|
|
SV* lv; |
2843
|
|
|
|
|
|
IV len; |
2844
|
7630
|
100
|
|
|
|
if (!defer) |
2845
|
4
|
|
|
|
|
DIE(aTHX_ PL_no_aelem, elem); |
2846
|
7626
|
|
|
|
|
len = av_len(av); |
2847
|
7626
|
|
|
|
|
lv = sv_newmortal(); |
2848
|
7626
|
|
|
|
|
sv_upgrade(lv, SVt_PVLV); |
2849
|
7626
|
|
|
|
|
LvTYPE(lv) = 'y'; |
2850
|
7626
|
|
|
|
|
sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0); |
2851
|
15252
|
|
|
|
|
LvTARG(lv) = SvREFCNT_inc_simple(av); |
2852
|
|
|
|
|
|
/* Resolve a negative index now, unless it points before the |
2853
|
|
|
|
|
|
beginning of the array, in which case record it for error |
2854
|
|
|
|
|
|
reporting in magic_setdefelem. */ |
2855
|
15252
|
|
|
|
|
LvSTARGOFF(lv) = |
2856
|
7626
|
100
|
|
|
|
elem < 0 && len + elem >= 0 ? len + elem : elem; |
|
|
100
|
|
|
|
|
2857
|
7626
|
|
|
|
|
LvTARGLEN(lv) = 1; |
2858
|
7626
|
|
|
|
|
PUSHs(lv); |
2859
|
7626
|
|
|
|
|
RETURN; |
2860
|
|
|
|
|
|
} |
2861
|
90093142
|
100
|
|
|
|
if (localizing) { |
2862
|
324
|
100
|
|
|
|
if (preeminent) |
2863
|
312
|
|
|
|
|
save_aelem(av, elem, svp); |
2864
|
|
|
|
|
|
else |
2865
|
12
|
|
|
|
|
SAVEADELETE(av, elem); |
2866
|
|
|
|
|
|
} |
2867
|
90092818
|
100
|
|
|
|
else if (PL_op->op_private & OPpDEREF) { |
2868
|
9164288
|
|
|
|
|
PUSHs(vivify_ref(*svp, PL_op->op_private & OPpDEREF)); |
2869
|
9164288
|
|
|
|
|
RETURN; |
2870
|
|
|
|
|
|
} |
2871
|
|
|
|
|
|
} |
2872
|
123541356
|
100
|
|
|
|
sv = (svp ? *svp : &PL_sv_undef); |
2873
|
123541356
|
100
|
|
|
|
if (!lval && SvRMAGICAL(av) && SvGMAGICAL(sv)) /* see note in pp_helem() */ |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
2874
|
828
|
|
|
|
|
mg_get(sv); |
2875
|
123541356
|
|
|
|
|
PUSHs(sv); |
2876
|
128127313
|
|
|
|
|
RETURN; |
2877
|
|
|
|
|
|
} |
2878
|
|
|
|
|
|
|
2879
|
|
|
|
|
|
SV* |
2880
|
413373354
|
|
|
|
|
Perl_vivify_ref(pTHX_ SV *sv, U32 to_what) |
2881
|
413373354
|
100
|
|
|
|
{ |
2882
|
|
|
|
|
|
PERL_ARGS_ASSERT_VIVIFY_REF; |
2883
|
|
|
|
|
|
|
2884
|
206089952
|
|
|
|
|
SvGETMAGIC(sv); |
2885
|
416764668
|
100
|
|
|
|
if (!SvOK(sv)) { |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
2886
|
3391314
|
50
|
|
|
|
if (SvREADONLY(sv)) |
2887
|
0
|
|
|
|
|
Perl_croak_no_modify(); |
2888
|
3391314
|
100
|
|
|
|
prepare_SV_for_RV(sv); |
|
|
100
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
2889
|
3391314
|
|
|
|
|
switch (to_what) { |
2890
|
|
|
|
|
|
case OPpDEREF_SV: |
2891
|
16
|
|
|
|
|
SvRV_set(sv, newSV(0)); |
2892
|
16
|
|
|
|
|
break; |
2893
|
|
|
|
|
|
case OPpDEREF_AV: |
2894
|
1781147
|
|
|
|
|
SvRV_set(sv, MUTABLE_SV(newAV())); |
2895
|
1781147
|
|
|
|
|
break; |
2896
|
|
|
|
|
|
case OPpDEREF_HV: |
2897
|
1610151
|
|
|
|
|
SvRV_set(sv, MUTABLE_SV(newHV())); |
2898
|
1610151
|
|
|
|
|
break; |
2899
|
|
|
|
|
|
} |
2900
|
3391314
|
|
|
|
|
SvROK_on(sv); |
2901
|
3391314
|
100
|
|
|
|
SvSETMAGIC(sv); |
2902
|
1685729
|
|
|
|
|
SvGETMAGIC(sv); |
2903
|
|
|
|
|
|
} |
2904
|
413373354
|
100
|
|
|
|
if (SvGMAGICAL(sv)) { |
2905
|
|
|
|
|
|
/* copy the sv without magic to prevent magic from being |
2906
|
|
|
|
|
|
executed twice */ |
2907
|
754
|
|
|
|
|
SV* msv = sv_newmortal(); |
2908
|
754
|
|
|
|
|
sv_setsv_nomg(msv, sv); |
2909
|
207284547
|
|
|
|
|
return msv; |
2910
|
|
|
|
|
|
} |
2911
|
|
|
|
|
|
return sv; |
2912
|
|
|
|
|
|
} |
2913
|
|
|
|
|
|
|
2914
|
38280466
|
|
|
|
|
PP(pp_method) |
2915
|
|
|
|
|
|
{ |
2916
|
38280466
|
|
|
|
|
dVAR; dSP; |
2917
|
38280466
|
|
|
|
|
SV* const sv = TOPs; |
2918
|
|
|
|
|
|
|
2919
|
38280466
|
100
|
|
|
|
if (SvROK(sv)) { |
2920
|
38670
|
|
|
|
|
SV* const rsv = SvRV(sv); |
2921
|
38670
|
50
|
|
|
|
if (SvTYPE(rsv) == SVt_PVCV) { |
2922
|
38670
|
|
|
|
|
SETs(rsv); |
2923
|
38670
|
|
|
|
|
RETURN; |
2924
|
|
|
|
|
|
} |
2925
|
|
|
|
|
|
} |
2926
|
|
|
|
|
|
|
2927
|
38241796
|
|
|
|
|
SETs(method_common(sv, NULL)); |
2928
|
38261065
|
|
|
|
|
RETURN; |
2929
|
|
|
|
|
|
} |
2930
|
|
|
|
|
|
|
2931
|
610163116
|
|
|
|
|
PP(pp_method_named) |
2932
|
|
|
|
|
|
{ |
2933
|
610163116
|
|
|
|
|
dVAR; dSP; |
2934
|
610163116
|
|
|
|
|
SV* const sv = cSVOP_sv; |
2935
|
610163116
|
|
|
|
|
U32 hash = SvSHARED_HASH(sv); |
2936
|
|
|
|
|
|
|
2937
|
610163116
|
50
|
|
|
|
XPUSHs(method_common(sv, &hash)); |
2938
|
610011734
|
|
|
|
|
RETURN; |
2939
|
|
|
|
|
|
} |
2940
|
|
|
|
|
|
|
2941
|
|
|
|
|
|
STATIC SV * |
2942
|
648404912
|
|
|
|
|
S_method_common(pTHX_ SV* meth, U32* hashp) |
2943
|
648404906
|
100
|
|
|
|
{ |
2944
|
|
|
|
|
|
dVAR; |
2945
|
|
|
|
|
|
SV* ob; |
2946
|
|
|
|
|
|
GV* gv; |
2947
|
|
|
|
|
|
HV* stash; |
2948
|
|
|
|
|
|
SV *packsv = NULL; |
2949
|
648404912
|
|
|
|
|
SV * const sv = PL_stack_base + TOPMARK == PL_stack_sp |
2950
|
6
|
|
|
|
|
? (Perl_croak(aTHX_ "Can't call method \"%"SVf"\" without a " |
2951
|
|
|
|
|
|
"package or object reference", SVfARG(meth)), |
2952
|
|
|
|
|
|
(SV *)NULL) |
2953
|
972503650
|
100
|
|
|
|
: *(PL_stack_base + TOPMARK + 1); |
2954
|
|
|
|
|
|
|
2955
|
|
|
|
|
|
PERL_ARGS_ASSERT_METHOD_COMMON; |
2956
|
|
|
|
|
|
|
2957
|
648404906
|
50
|
|
|
|
if (!sv) |
2958
|
|
|
|
|
|
undefined: |
2959
|
412
|
|
|
|
|
Perl_croak(aTHX_ "Can't call method \"%"SVf"\" on an undefined value", |
2960
|
|
|
|
|
|
SVfARG(meth)); |
2961
|
|
|
|
|
|
|
2962
|
324098752
|
|
|
|
|
SvGETMAGIC(sv); |
2963
|
648404906
|
100
|
|
|
|
if (SvROK(sv)) |
2964
|
629209793
|
|
|
|
|
ob = MUTABLE_SV(SvRV(sv)); |
2965
|
19195113
|
100
|
|
|
|
else if (!SvOK(sv)) goto undefined; |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
2966
|
19194701
|
100
|
|
|
|
else if (isGV_with_GP(sv)) { |
|
|
50
|
|
|
|
|
2967
|
580
|
50
|
|
|
|
if (!GvIO(sv)) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
2968
|
2
|
|
|
|
|
Perl_croak(aTHX_ "Can't call method \"%"SVf"\" " |
2969
|
|
|
|
|
|
"without a package or object reference", |
2970
|
|
|
|
|
|
SVfARG(meth)); |
2971
|
|
|
|
|
|
ob = sv; |
2972
|
578
|
100
|
|
|
|
if (SvTYPE(ob) == SVt_PVLV && LvTYPE(ob) == 'y') { |
|
|
50
|
|
|
|
|
2973
|
|
|
|
|
|
assert(!LvTARGLEN(ob)); |
2974
|
2
|
|
|
|
|
ob = LvTARG(ob); |
2975
|
|
|
|
|
|
assert(ob); |
2976
|
|
|
|
|
|
} |
2977
|
578
|
|
|
|
|
*(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV(ob)); |
2978
|
|
|
|
|
|
} |
2979
|
|
|
|
|
|
else { |
2980
|
|
|
|
|
|
/* this isn't a reference */ |
2981
|
|
|
|
|
|
GV* iogv; |
2982
|
|
|
|
|
|
STRLEN packlen; |
2983
|
19194121
|
100
|
|
|
|
const char * const packname = SvPV_nomg_const(sv, packlen); |
2984
|
19194121
|
|
|
|
|
const bool packname_is_utf8 = !!SvUTF8(sv); |
2985
|
19194121
|
|
|
|
|
const HE* const he = |
2986
|
19194121
|
|
|
|
|
(const HE *)hv_common( |
2987
|
|
|
|
|
|
PL_stashcache, NULL, packname, packlen, |
2988
|
|
|
|
|
|
packname_is_utf8 ? HVhek_UTF8 : 0, 0, NULL, 0 |
2989
|
|
|
|
|
|
); |
2990
|
|
|
|
|
|
|
2991
|
19194121
|
100
|
|
|
|
if (he) { |
2992
|
12171732
|
50
|
|
|
|
stash = INT2PTR(HV*,SvIV(HeVAL(he))); |
2993
|
|
|
|
|
|
DEBUG_o(Perl_deb(aTHX_ "PL_stashcache hit %p for '%"SVf"'\n", |
2994
|
|
|
|
|
|
stash, sv)); |
2995
|
12171732
|
|
|
|
|
goto fetch; |
2996
|
|
|
|
|
|
} |
2997
|
|
|
|
|
|
|
2998
|
7022389
|
100
|
|
|
|
if (!(iogv = gv_fetchpvn_flags( |
2999
|
|
|
|
|
|
packname, packlen, SVf_UTF8 * packname_is_utf8, SVt_PVIO |
3000
|
11439
|
100
|
|
|
|
)) || |
3001
|
11439
|
50
|
|
|
|
!(ob=MUTABLE_SV(GvIO(iogv)))) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
3002
|
|
|
|
|
|
{ |
3003
|
|
|
|
|
|
/* this isn't the name of a filehandle either */ |
3004
|
7021925
|
100
|
|
|
|
if (!packlen) |
3005
|
|
|
|
|
|
{ |
3006
|
4
|
|
|
|
|
Perl_croak(aTHX_ "Can't call method \"%"SVf"\" " |
3007
|
|
|
|
|
|
"without a package or object reference", |
3008
|
|
|
|
|
|
SVfARG(meth)); |
3009
|
|
|
|
|
|
} |
3010
|
|
|
|
|
|
/* assume it's a package name */ |
3011
|
7021921
|
100
|
|
|
|
stash = gv_stashpvn(packname, packlen, packname_is_utf8 ? SVf_UTF8 : 0); |
3012
|
7021921
|
100
|
|
|
|
if (!stash) |
3013
|
|
|
|
|
|
packsv = sv; |
3014
|
|
|
|
|
|
else { |
3015
|
7021109
|
|
|
|
|
SV* const ref = newSViv(PTR2IV(stash)); |
3016
|
7021109
|
100
|
|
|
|
(void)hv_store(PL_stashcache, packname, |
3017
|
|
|
|
|
|
packname_is_utf8 ? -(I32)packlen : (I32)packlen, ref, 0); |
3018
|
|
|
|
|
|
DEBUG_o(Perl_deb(aTHX_ "PL_stashcache caching %p for '%"SVf"'\n", |
3019
|
|
|
|
|
|
stash, sv)); |
3020
|
|
|
|
|
|
} |
3021
|
|
|
|
|
|
goto fetch; |
3022
|
|
|
|
|
|
} |
3023
|
|
|
|
|
|
/* it _is_ a filehandle name -- replace with a reference */ |
3024
|
464
|
|
|
|
|
*(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV(MUTABLE_SV(iogv))); |
3025
|
|
|
|
|
|
} |
3026
|
|
|
|
|
|
|
3027
|
|
|
|
|
|
/* if we got here, ob should be an object or a glob */ |
3028
|
629303215
|
50
|
|
|
|
if (!ob || !(SvOBJECT(ob) |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
3029
|
126488
|
50
|
|
|
|
|| (isGV_with_GP(ob) |
3030
|
34108
|
50
|
|
|
|
&& (ob = MUTABLE_SV(GvIO((const GV *)ob))) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
100
|
|
|
|
|
3031
|
34086
|
50
|
|
|
|
&& SvOBJECT(ob)))) |
3032
|
|
|
|
|
|
{ |
3033
|
150678
|
100
|
|
|
|
Perl_croak(aTHX_ "Can't call method \"%"SVf"\" on unblessed reference", |
3034
|
75341
|
50
|
|
|
|
SVfARG((SvSCREAM(meth) && strEQ(SvPV_nolen_const(meth),"isa")) |
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
50
|
|
|
|
|
3035
|
|
|
|
|
|
? newSVpvs_flags("DOES", SVs_TEMP) |
3036
|
|
|
|
|
|
: meth)); |
3037
|
|
|
|
|
|
} |
3038
|
|
|
|
|
|
|
3039
|
629060161
|
|
|
|
|
stash = SvSTASH(ob); |
3040
|
|
|
|
|
|
|
3041
|
|
|
|
|
|
fetch: |
3042
|
|
|
|
|
|
/* NOTE: stash may be null, hope hv_fetch_ent and |
3043
|
|
|
|
|
|
gv_fetchmethod can cope (it seems they can) */ |
3044
|
|
|
|
|
|
|
3045
|
|
|
|
|
|
/* shortcut for simple names */ |
3046
|
648253814
|
100
|
|
|
|
if (hashp) { |
3047
|
610012022
|
|
|
|
|
const HE* const he = hv_fetch_ent(stash, meth, 0, *hashp); |
3048
|
610012022
|
100
|
|
|
|
if (he) { |
3049
|
609128682
|
|
|
|
|
gv = MUTABLE_GV(HeVAL(he)); |
3050
|
912376453
|
100
|
|
|
|
if (isGV(gv) && GvCV(gv) && |
|
|
100
|
|
|
|
|
|
|
100
|
|
|
|
|
3051
|
649995089
|
100
|
|
|
|
(!GvCVGEN(gv) || GvCVGEN(gv) |
3052
|
231168070
|
50
|
|
|
|
== (PL_sub_generation + HvMROMETA(stash)->cache_gen))) |
3053
|
601653319
|
|
|
|
|
return MUTABLE_SV(GvCV(gv)); |
3054
|
|
|
|
|
|
} |
3055
|
|
|
|
|
|
} |
3056
|
|
|
|
|
|
|
3057
|
46600495
|
100
|
|
|
|
gv = gv_fetchmethod_sv_flags(stash ? stash : MUTABLE_HV(packsv), |
3058
|
|
|
|
|
|
meth, GV_AUTOLOAD | GV_CROAK); |
3059
|
|
|
|
|
|
|
3060
|
|
|
|
|
|
assert(gv); |
3061
|
|
|
|
|
|
|
3062
|
347518258
|
100
|
|
|
|
return isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv); |
3063
|
4344859472
|
|
|
|
|
} |
3064
|
|
|
|
|
|
|
3065
|
|
|
|
|
|
/* |
3066
|
|
|
|
|
|
* Local variables: |
3067
|
|
|
|
|
|
* c-indentation-style: bsd |
3068
|
|
|
|
|
|
* c-basic-offset: 4 |
3069
|
|
|
|
|
|
* indent-tabs-mode: nil |
3070
|
|
|
|
|
|
* End: |
3071
|
|
|
|
|
|
* |
3072
|
|
|
|
|
|
* ex: set ts=8 sts=4 sw=4 et: |
3073
|
|
|
|
|
|
*/ |