source: trunk/essentials/dev-lang/perl/sv.h@ 3310

Last change on this file since 3310 was 3181, checked in by bird, 19 years ago

perl 5.8.8

File size: 47.2 KB
Line 
1/* sv.h
2 *
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006 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#ifdef sv_flags
12#undef sv_flags /* Convex has this in <signal.h> for sigvec() */
13#endif
14
15/*
16=head1 SV Flags
17
18=for apidoc AmU||svtype
19An enum of flags for Perl types. These are found in the file B<sv.h>
20in the C<svtype> enum. Test these flags with the C<SvTYPE> macro.
21
22=for apidoc AmU||SVt_PV
23Pointer type flag for scalars. See C<svtype>.
24
25=for apidoc AmU||SVt_IV
26Integer type flag for scalars. See C<svtype>.
27
28=for apidoc AmU||SVt_NV
29Double type flag for scalars. See C<svtype>.
30
31=for apidoc AmU||SVt_PVMG
32Type flag for blessed scalars. See C<svtype>.
33
34=for apidoc AmU||SVt_PVAV
35Type flag for arrays. See C<svtype>.
36
37=for apidoc AmU||SVt_PVHV
38Type flag for hashes. See C<svtype>.
39
40=for apidoc AmU||SVt_PVCV
41Type flag for code refs. See C<svtype>.
42
43=cut
44*/
45
46typedef enum {
47 SVt_NULL, /* 0 */
48 SVt_IV, /* 1 */
49 SVt_NV, /* 2 */
50 SVt_RV, /* 3 */
51 SVt_PV, /* 4 */
52 SVt_PVIV, /* 5 */
53 SVt_PVNV, /* 6 */
54 SVt_PVMG, /* 7 */
55 SVt_PVBM, /* 8 */
56 SVt_PVLV, /* 9 */
57 SVt_PVAV, /* 10 */
58 SVt_PVHV, /* 11 */
59 SVt_PVCV, /* 12 */
60 SVt_PVGV, /* 13 */
61 SVt_PVFM, /* 14 */
62 SVt_PVIO /* 15 */
63} svtype;
64
65/* Using C's structural equivalence to help emulate C++ inheritance here... */
66
67struct STRUCT_SV { /* struct sv { */
68 void* sv_any; /* pointer to something */
69 U32 sv_refcnt; /* how many references to us */
70 U32 sv_flags; /* what we are */
71};
72
73struct gv {
74 XPVGV* sv_any; /* pointer to something */
75 U32 sv_refcnt; /* how many references to us */
76 U32 sv_flags; /* what we are */
77};
78
79struct cv {
80 XPVCV* sv_any; /* pointer to something */
81 U32 sv_refcnt; /* how many references to us */
82 U32 sv_flags; /* what we are */
83};
84
85struct av {
86 XPVAV* sv_any; /* pointer to something */
87 U32 sv_refcnt; /* how many references to us */
88 U32 sv_flags; /* what we are */
89};
90
91struct hv {
92 XPVHV* sv_any; /* pointer to something */
93 U32 sv_refcnt; /* how many references to us */
94 U32 sv_flags; /* what we are */
95};
96
97struct io {
98 XPVIO* sv_any; /* pointer to something */
99 U32 sv_refcnt; /* how many references to us */
100 U32 sv_flags; /* what we are */
101};
102
103/*
104=head1 SV Manipulation Functions
105
106=for apidoc Am|U32|SvREFCNT|SV* sv
107Returns the value of the object's reference count.
108
109=for apidoc Am|SV*|SvREFCNT_inc|SV* sv
110Increments the reference count of the given SV.
111
112=for apidoc Am|void|SvREFCNT_dec|SV* sv
113Decrements the reference count of the given SV.
114
115=for apidoc Am|svtype|SvTYPE|SV* sv
116Returns the type of the SV. See C<svtype>.
117
118=for apidoc Am|void|SvUPGRADE|SV* sv|svtype type
119Used to upgrade an SV to a more complex form. Uses C<sv_upgrade> to
120perform the upgrade if necessary. See C<svtype>.
121
122=cut
123*/
124
125#define SvANY(sv) (sv)->sv_any
126#define SvFLAGS(sv) (sv)->sv_flags
127#define SvREFCNT(sv) (sv)->sv_refcnt
128
129#ifdef USE_5005THREADS
130
131# if defined(VMS)
132# define ATOMIC_INC(count) __ATOMIC_INCREMENT_LONG(&count)
133# define ATOMIC_DEC_AND_TEST(res,count) res=(1==__ATOMIC_DECREMENT_LONG(&count))
134 # else
135# ifdef EMULATE_ATOMIC_REFCOUNTS
136 # define ATOMIC_INC(count) STMT_START { \
137 MUTEX_LOCK(&PL_svref_mutex); \
138 ++count; \
139 MUTEX_UNLOCK(&PL_svref_mutex); \
140 } STMT_END
141# define ATOMIC_DEC_AND_TEST(res,count) STMT_START { \
142 MUTEX_LOCK(&PL_svref_mutex); \
143 res = (--count == 0); \
144 MUTEX_UNLOCK(&PL_svref_mutex); \
145 } STMT_END
146# else
147# define ATOMIC_INC(count) atomic_inc(&count)
148# define ATOMIC_DEC_AND_TEST(res,count) (res = atomic_dec_and_test(&count))
149# endif /* EMULATE_ATOMIC_REFCOUNTS */
150# endif /* VMS */
151#else
152# define ATOMIC_INC(count) (++count)
153# define ATOMIC_DEC_AND_TEST(res, count) (res = (--count == 0))
154#endif /* USE_5005THREADS */
155
156#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
157# define SvREFCNT_inc(sv) \
158 ({ \
159 SV * const _sv = (SV*)(sv); \
160 if (_sv) \
161 ATOMIC_INC(SvREFCNT(_sv)); \
162 _sv; \
163 })
164#else
165# ifdef USE_5005THREADS
166# if defined(VMS) && defined(__ALPHA)
167# define SvREFCNT_inc(sv) \
168 (PL_Sv=(SV*)(sv), (PL_Sv && __ATOMIC_INCREMENT_LONG(&(SvREFCNT(PL_Sv)))), (SV *)PL_Sv)
169# else
170# define SvREFCNT_inc(sv) sv_newref((SV*)sv)
171# endif
172# else
173# define SvREFCNT_inc(sv) \
174 ((PL_Sv=(SV*)(sv)), (PL_Sv && ATOMIC_INC(SvREFCNT(PL_Sv))), (SV*)PL_Sv)
175# endif
176#endif
177
178#define SvREFCNT_dec(sv) sv_free((SV*)(sv))
179
180#define SVTYPEMASK 0xff
181#define SvTYPE(sv) ((sv)->sv_flags & SVTYPEMASK)
182
183#define SvUPGRADE(sv, mt) (SvTYPE(sv) >= mt || sv_upgrade(sv, mt))
184
185#define SVs_PADBUSY 0x00000100 /* reserved for tmp or my already */
186#define SVs_PADTMP 0x00000200 /* in use as tmp */
187#define SVs_PADMY 0x00000400 /* in use a "my" variable */
188#define SVs_TEMP 0x00000800 /* string is stealable? */
189#define SVs_OBJECT 0x00001000 /* is "blessed" */
190#define SVs_GMG 0x00002000 /* has magical get method */
191#define SVs_SMG 0x00004000 /* has magical set method */
192#define SVs_RMG 0x00008000 /* has random magical methods */
193
194#define SVf_IOK 0x00010000 /* has valid public integer value */
195#define SVf_NOK 0x00020000 /* has valid public numeric value */
196#define SVf_POK 0x00040000 /* has valid public pointer value */
197#define SVf_ROK 0x00080000 /* has a valid reference pointer */
198
199#define SVf_FAKE 0x00100000 /* glob or lexical is just a copy */
200#define SVf_OOK 0x00200000 /* has valid offset value */
201#define SVf_BREAK 0x00400000 /* refcnt is artificially low - used
202 * by SV's in final arena cleanup */
203#define SVf_READONLY 0x00800000 /* may not be modified */
204
205
206#define SVp_IOK 0x01000000 /* has valid non-public integer value */
207#define SVp_NOK 0x02000000 /* has valid non-public numeric value */
208#define SVp_POK 0x04000000 /* has valid non-public pointer value */
209#define SVp_SCREAM 0x08000000 /* has been studied? */
210
211#define SVf_UTF8 0x20000000 /* SvPV is UTF-8 encoded */
212
213#define SVf_THINKFIRST (SVf_READONLY|SVf_ROK|SVf_FAKE)
214
215#define SVf_OK (SVf_IOK|SVf_NOK|SVf_POK|SVf_ROK| \
216 SVp_IOK|SVp_NOK|SVp_POK)
217
218#define SVf_AMAGIC 0x10000000 /* has magical overloaded methods */
219
220#define PRIVSHIFT 8 /* (SVp_?OK >> PRIVSHIFT) == SVf_?OK */
221
222/* Some private flags. */
223
224/* SVpad_OUR may be set on SVt_PV{NV,MG,GV} types */
225#define SVpad_OUR 0x80000000 /* pad name is "our" instead of "my" */
226#define SVpad_TYPED 0x40000000 /* Typed Lexical */
227
228#define SVf_IVisUV 0x80000000 /* use XPVUV instead of XPVIV */
229
230#define SVpfm_COMPILED 0x80000000 /* FORMLINE is compiled */
231
232#define SVpbm_VALID 0x80000000
233#define SVpbm_TAIL 0x40000000
234
235#define SVrepl_EVAL 0x40000000 /* Replacement part of s///e */
236
237#define SVphv_CLONEABLE 0x08000000 /* for stashes: clone its objects */
238#define SVphv_REHASH 0x10000000 /* HV is recalculating hash values */
239#define SVphv_SHAREKEYS 0x20000000 /* keys live on shared string table */
240#define SVphv_LAZYDEL 0x40000000 /* entry in xhv_eiter must be deleted */
241#define SVphv_HASKFLAGS 0x80000000 /* keys have flag byte after hash */
242
243#define SVprv_WEAKREF 0x80000000 /* Weak reference */
244
245struct xrv {
246 SV * xrv_rv; /* pointer to another SV */
247};
248
249struct xpv {
250 char * xpv_pv; /* pointer to malloced string */
251 STRLEN xpv_cur; /* length of xpv_pv as a C string */
252 STRLEN xpv_len; /* allocated size */
253};
254
255struct xpviv {
256 char * xpv_pv; /* pointer to malloced string */
257 STRLEN xpv_cur; /* length of xpv_pv as a C string */
258 STRLEN xpv_len; /* allocated size */
259 IV xiv_iv; /* integer value or pv offset */
260};
261
262struct xpvuv {
263 char * xpv_pv; /* pointer to malloced string */
264 STRLEN xpv_cur; /* length of xpv_pv as a C string */
265 STRLEN xpv_len; /* allocated size */
266 UV xuv_uv; /* unsigned value or pv offset */
267};
268
269struct xpvnv {
270 char * xpv_pv; /* pointer to malloced string */
271 STRLEN xpv_cur; /* length of xpv_pv as a C string */
272 STRLEN xpv_len; /* allocated size */
273 IV xiv_iv; /* integer value or pv offset */
274 NV xnv_nv; /* numeric value, if any */
275};
276
277/* These structure must match the beginning of struct xpvhv in hv.h. */
278struct xpvmg {
279 char * xpv_pv; /* pointer to malloced string */
280 STRLEN xpv_cur; /* length of xpv_pv as a C string */
281 STRLEN xpv_len; /* allocated size */
282 IV xiv_iv; /* integer value or pv offset */
283 NV xnv_nv; /* numeric value, if any */
284 MAGIC* xmg_magic; /* linked list of magicalness */
285 HV* xmg_stash; /* class package */
286};
287
288struct xpvlv {
289 char * xpv_pv; /* pointer to malloced string */
290 STRLEN xpv_cur; /* length of xpv_pv as a C string */
291 STRLEN xpv_len; /* allocated size */
292 IV xiv_iv; /* integer value or pv offset */
293 NV xnv_nv; /* numeric value, if any */
294 MAGIC* xmg_magic; /* linked list of magicalness */
295 HV* xmg_stash; /* class package */
296
297 STRLEN xlv_targoff;
298 STRLEN xlv_targlen;
299 SV* xlv_targ;
300 char xlv_type; /* k=keys .=pos x=substr v=vec /=join/re
301 * y=alem/helem/iter t=tie T=tied HE */
302};
303
304struct xpvgv {
305 char * xpv_pv; /* pointer to malloced string */
306 STRLEN xpv_cur; /* length of xpv_pv as a C string */
307 STRLEN xpv_len; /* allocated size */
308 IV xiv_iv; /* integer value or pv offset */
309 NV xnv_nv; /* numeric value, if any */
310 MAGIC* xmg_magic; /* linked list of magicalness */
311 HV* xmg_stash; /* class package */
312
313 GP* xgv_gp;
314 char* xgv_name;
315 STRLEN xgv_namelen;
316 HV* xgv_stash;
317 U8 xgv_flags;
318};
319
320struct xpvbm {
321 char * xpv_pv; /* pointer to malloced string */
322 STRLEN xpv_cur; /* length of xpv_pv as a C string */
323 STRLEN xpv_len; /* allocated size */
324 IV xiv_iv; /* integer value or pv offset */
325 NV xnv_nv; /* numeric value, if any */
326 MAGIC* xmg_magic; /* linked list of magicalness */
327 HV* xmg_stash; /* class package */
328
329 I32 xbm_useful; /* is this constant pattern being useful? */
330 U16 xbm_previous; /* how many characters in string before rare? */
331 U8 xbm_rare; /* rarest character in string */
332};
333
334/* This structure must match XPVCV in cv.h */
335
336typedef U16 cv_flags_t;
337
338struct xpvfm {
339 char * xpv_pv; /* pointer to malloced string */
340 STRLEN xpv_cur; /* length of xpv_pv as a C string */
341 STRLEN xpv_len; /* allocated size */
342 IV xiv_iv; /* integer value or pv offset */
343 NV xnv_nv; /* numeric value, if any */
344 MAGIC* xmg_magic; /* linked list of magicalness */
345 HV* xmg_stash; /* class package */
346
347 HV * xcv_stash;
348 OP * xcv_start;
349 OP * xcv_root;
350 void (*xcv_xsub)(pTHX_ CV*);
351 ANY xcv_xsubany;
352 GV * xcv_gv;
353 char * xcv_file;
354 long xcv_depth; /* >= 2 indicates recursive call */
355 AV * xcv_padlist;
356 CV * xcv_outside;
357#ifdef USE_5005THREADS
358 perl_mutex *xcv_mutexp; /* protects xcv_owner */
359 struct perl_thread *xcv_owner; /* current owner thread */
360#endif /* USE_5005THREADS */
361 cv_flags_t xcv_flags;
362 U32 xcv_outside_seq; /* the COP sequence (at the point of our
363 * compilation) in the lexically enclosing
364 * sub */
365 IV xfm_lines;
366};
367
368struct xpvio {
369 char * xpv_pv; /* pointer to malloced string */
370 STRLEN xpv_cur; /* length of xpv_pv as a C string */
371 STRLEN xpv_len; /* allocated size */
372 IV xiv_iv; /* integer value or pv offset */
373 NV xnv_nv; /* numeric value, if any */
374 MAGIC* xmg_magic; /* linked list of magicalness */
375 HV* xmg_stash; /* class package */
376
377 PerlIO * xio_ifp; /* ifp and ofp are normally the same */
378 PerlIO * xio_ofp; /* but sockets need separate streams */
379 /* Cray addresses everything by word boundaries (64 bits) and
380 * code and data pointers cannot be mixed (which is exactly what
381 * Perl_filter_add() tries to do with the dirp), hence the following
382 * union trick (as suggested by Gurusamy Sarathy).
383 * For further information see Geir Johansen's problem report titled
384 [ID 20000612.002] Perl problem on Cray system
385 * The any pointer (known as IoANY()) will also be a good place
386 * to hang any IO disciplines to.
387 */
388 union {
389 DIR * xiou_dirp; /* for opendir, readdir, etc */
390 void * xiou_any; /* for alignment */
391 } xio_dirpu;
392 IV xio_lines; /* $. */
393 IV xio_page; /* $% */
394 IV xio_page_len; /* $= */
395 IV xio_lines_left; /* $- */
396 char * xio_top_name; /* $^ */
397 GV * xio_top_gv; /* $^ */
398 char * xio_fmt_name; /* $~ */
399 GV * xio_fmt_gv; /* $~ */
400 char * xio_bottom_name;/* $^B */
401 GV * xio_bottom_gv; /* $^B */
402 short xio_subprocess; /* -| or |- */
403 char xio_type;
404 char xio_flags;
405};
406#define xio_dirp xio_dirpu.xiou_dirp
407#define xio_any xio_dirpu.xiou_any
408
409#define IOf_ARGV 1 /* this fp iterates over ARGV */
410#define IOf_START 2 /* check for null ARGV and substitute '-' */
411#define IOf_FLUSH 4 /* this fp wants a flush after write op */
412#define IOf_DIDTOP 8 /* just did top of form */
413#define IOf_UNTAINT 16 /* consider this fp (and its data) "safe" */
414#define IOf_NOLINE 32 /* slurped a pseudo-line from empty file */
415#define IOf_FAKE_DIRP 64 /* xio_dirp is fake (source filters kludge) */
416
417/* The following macros define implementation-independent predicates on SVs. */
418
419/*
420=for apidoc Am|bool|SvNIOK|SV* sv
421Returns a boolean indicating whether the SV contains a number, integer or
422double.
423
424=for apidoc Am|bool|SvNIOKp|SV* sv
425Returns a boolean indicating whether the SV contains a number, integer or
426double. Checks the B<private> setting. Use C<SvNIOK>.
427
428=for apidoc Am|void|SvNIOK_off|SV* sv
429Unsets the NV/IV status of an SV.
430
431=for apidoc Am|bool|SvOK|SV* sv
432Returns a boolean indicating whether the value is an SV. It also tells
433whether the value is defined or not.
434
435=for apidoc Am|bool|SvIOKp|SV* sv
436Returns a boolean indicating whether the SV contains an integer. Checks
437the B<private> setting. Use C<SvIOK>.
438
439=for apidoc Am|bool|SvNOKp|SV* sv
440Returns a boolean indicating whether the SV contains a double. Checks the
441B<private> setting. Use C<SvNOK>.
442
443=for apidoc Am|bool|SvPOKp|SV* sv
444Returns a boolean indicating whether the SV contains a character string.
445Checks the B<private> setting. Use C<SvPOK>.
446
447=for apidoc Am|bool|SvIOK|SV* sv
448Returns a boolean indicating whether the SV contains an integer.
449
450=for apidoc Am|void|SvIOK_on|SV* sv
451Tells an SV that it is an integer.
452
453=for apidoc Am|void|SvIOK_off|SV* sv
454Unsets the IV status of an SV.
455
456=for apidoc Am|void|SvIOK_only|SV* sv
457Tells an SV that it is an integer and disables all other OK bits.
458
459=for apidoc Am|void|SvIOK_only_UV|SV* sv
460Tells and SV that it is an unsigned integer and disables all other OK bits.
461
462=for apidoc Am|bool|SvIOK_UV|SV* sv
463Returns a boolean indicating whether the SV contains an unsigned integer.
464
465=for apidoc Am|void|SvUOK|SV* sv
466Returns a boolean indicating whether the SV contains an unsigned integer.
467
468=for apidoc Am|bool|SvIOK_notUV|SV* sv
469Returns a boolean indicating whether the SV contains a signed integer.
470
471=for apidoc Am|bool|SvNOK|SV* sv
472Returns a boolean indicating whether the SV contains a double.
473
474=for apidoc Am|void|SvNOK_on|SV* sv
475Tells an SV that it is a double.
476
477=for apidoc Am|void|SvNOK_off|SV* sv
478Unsets the NV status of an SV.
479
480=for apidoc Am|void|SvNOK_only|SV* sv
481Tells an SV that it is a double and disables all other OK bits.
482
483=for apidoc Am|bool|SvPOK|SV* sv
484Returns a boolean indicating whether the SV contains a character
485string.
486
487=for apidoc Am|void|SvPOK_on|SV* sv
488Tells an SV that it is a string.
489
490=for apidoc Am|void|SvPOK_off|SV* sv
491Unsets the PV status of an SV.
492
493=for apidoc Am|void|SvPOK_only|SV* sv
494Tells an SV that it is a string and disables all other OK bits.
495Will also turn off the UTF-8 status.
496
497=for apidoc Am|bool|SvOOK|SV* sv
498Returns a boolean indicating whether the SvIVX is a valid offset value for
499the SvPVX. This hack is used internally to speed up removal of characters
500from the beginning of a SvPV. When SvOOK is true, then the start of the
501allocated string buffer is really (SvPVX - SvIVX).
502
503=for apidoc Am|bool|SvROK|SV* sv
504Tests if the SV is an RV.
505
506=for apidoc Am|void|SvROK_on|SV* sv
507Tells an SV that it is an RV.
508
509=for apidoc Am|void|SvROK_off|SV* sv
510Unsets the RV status of an SV.
511
512=for apidoc Am|SV*|SvRV|SV* sv
513Dereferences an RV to return the SV.
514
515=for apidoc Am|IV|SvIVX|SV* sv
516Returns the raw value in the SV's IV slot, without checks or conversions.
517Only use when you are sure SvIOK is true. See also C<SvIV()>.
518
519=for apidoc Am|UV|SvUVX|SV* sv
520Returns the raw value in the SV's UV slot, without checks or conversions.
521Only use when you are sure SvIOK is true. See also C<SvUV()>.
522
523=for apidoc Am|NV|SvNVX|SV* sv
524Returns the raw value in the SV's NV slot, without checks or conversions.
525Only use when you are sure SvNOK is true. See also C<SvNV()>.
526
527=for apidoc Am|char*|SvPVX|SV* sv
528Returns a pointer to the physical string in the SV. The SV must contain a
529string.
530
531=for apidoc Am|STRLEN|SvCUR|SV* sv
532Returns the length of the string which is in the SV. See C<SvLEN>.
533
534=for apidoc Am|STRLEN|SvLEN|SV* sv
535Returns the size of the string buffer in the SV, not including any part
536attributable to C<SvOOK>. See C<SvCUR>.
537
538=for apidoc Am|char*|SvEND|SV* sv
539Returns a pointer to the last character in the string which is in the SV.
540See C<SvCUR>. Access the character as *(SvEND(sv)).
541
542=for apidoc Am|HV*|SvSTASH|SV* sv
543Returns the stash of the SV.
544
545=for apidoc Am|void|SvIV_set|SV* sv|IV val
546Set the value of the IV pointer in sv to val. It is possible to perform
547the same function of this macro with an lvalue assignment to C<SvIVX>.
548With future Perls, however, it will be more efficient to use
549C<SvIV_set> instead of the lvalue assignment to C<SvIVX>.
550
551=for apidoc Am|void|SvNV_set|SV* sv|NV val
552Set the value of the NV pointer in sv to val. See C<SvIV_set>.
553
554=for apidoc Am|void|SvPV_set|SV* sv|char* val
555Set the value of the PV pointer in sv to val. See C<SvIV_set>.
556
557=for apidoc Am|void|SvUV_set|SV* sv|UV val
558Set the value of the UV pointer in sv to val. See C<SvIV_set>.
559
560=for apidoc Am|void|SvRV_set|SV* sv|SV* val
561Set the value of the RV pointer in sv to val. See C<SvIV_set>.
562
563=for apidoc Am|void|SvMAGIC_set|SV* sv|MAGIC* val
564Set the value of the MAGIC pointer in sv to val. See C<SvIV_set>.
565
566=for apidoc Am|void|SvSTASH_set|SV* sv|STASH* val
567Set the value of the STASH pointer in sv to val. See C<SvIV_set>.
568
569=for apidoc Am|void|SvCUR_set|SV* sv|STRLEN len
570Set the current length of the string which is in the SV. See C<SvCUR>
571and C<SvIV_set>.
572
573=for apidoc Am|void|SvLEN_set|SV* sv|STRLEN len
574Set the actual length of the string which is in the SV. See C<SvIV_set>.
575
576=cut
577*/
578
579#define SvNIOK(sv) (SvFLAGS(sv) & (SVf_IOK|SVf_NOK))
580#define SvNIOKp(sv) (SvFLAGS(sv) & (SVp_IOK|SVp_NOK))
581#define SvNIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK| \
582 SVp_IOK|SVp_NOK|SVf_IVisUV))
583
584#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
585#define assert_not_ROK(sv) ({assert(!SvROK(sv) || !SvRV(sv));}),
586#else
587#define assert_not_ROK(sv)
588#endif
589
590#define SvOK(sv) (SvFLAGS(sv) & SVf_OK)
591#define SvOK_off(sv) (assert_not_ROK(sv) \
592 SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
593 SVf_IVisUV|SVf_UTF8), \
594 SvOOK_off(sv))
595#define SvOK_off_exc_UV(sv) (assert_not_ROK(sv) \
596 SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
597 SVf_UTF8), \
598 SvOOK_off(sv))
599
600#define SvOKp(sv) (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK))
601#define SvIOKp(sv) (SvFLAGS(sv) & SVp_IOK)
602#define SvIOKp_on(sv) ((void)SvOOK_off(sv), SvFLAGS(sv) |= SVp_IOK)
603#define SvNOKp(sv) (SvFLAGS(sv) & SVp_NOK)
604#define SvNOKp_on(sv) (SvFLAGS(sv) |= SVp_NOK)
605#define SvPOKp(sv) (SvFLAGS(sv) & SVp_POK)
606#define SvPOKp_on(sv) (assert_not_ROK(sv) \
607 SvFLAGS(sv) |= SVp_POK)
608
609#define SvIOK(sv) (SvFLAGS(sv) & SVf_IOK)
610#define SvIOK_on(sv) ((void)SvOOK_off(sv), \
611 SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
612#define SvIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK|SVf_IVisUV))
613#define SvIOK_only(sv) (SvOK_off(sv), \
614 SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
615#define SvIOK_only_UV(sv) (SvOK_off_exc_UV(sv), \
616 SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
617
618#define SvIOK_UV(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) \
619 == (SVf_IOK|SVf_IVisUV))
620#define SvUOK(sv) SvIOK_UV(sv)
621#define SvIOK_notUV(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) \
622 == SVf_IOK)
623
624#define SvVOK(sv) (SvMAGICAL(sv) && mg_find(sv,'V'))
625#define SvIsUV(sv) (SvFLAGS(sv) & SVf_IVisUV)
626#define SvIsUV_on(sv) (SvFLAGS(sv) |= SVf_IVisUV)
627#define SvIsUV_off(sv) (SvFLAGS(sv) &= ~SVf_IVisUV)
628
629#define SvNOK(sv) (SvFLAGS(sv) & SVf_NOK)
630#define SvNOK_on(sv) (SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
631#define SvNOK_off(sv) (SvFLAGS(sv) &= ~(SVf_NOK|SVp_NOK))
632#define SvNOK_only(sv) (SvOK_off(sv), \
633 SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
634
635/*
636=for apidoc Am|bool|SvUTF8|SV* sv
637Returns a boolean indicating whether the SV contains UTF-8 encoded data.
638
639=for apidoc Am|void|SvUTF8_on|SV *sv
640Turn on the UTF-8 status of an SV (the data is not changed, just the flag).
641Do not use frivolously.
642
643=for apidoc Am|void|SvUTF8_off|SV *sv
644Unsets the UTF-8 status of an SV.
645
646=for apidoc Am|void|SvPOK_only_UTF8|SV* sv
647Tells an SV that it is a string and disables all other OK bits,
648and leaves the UTF-8 status as it was.
649
650=cut
651 */
652
653#define SvUTF8(sv) (SvFLAGS(sv) & SVf_UTF8)
654#define SvUTF8_on(sv) (SvFLAGS(sv) |= (SVf_UTF8))
655#define SvUTF8_off(sv) (SvFLAGS(sv) &= ~(SVf_UTF8))
656
657#define SvPOK(sv) (SvFLAGS(sv) & SVf_POK)
658#define SvPOK_on(sv) (assert_not_ROK(sv) \
659 SvFLAGS(sv) |= (SVf_POK|SVp_POK))
660#define SvPOK_off(sv) (SvFLAGS(sv) &= ~(SVf_POK|SVp_POK))
661#define SvPOK_only(sv) (assert_not_ROK(sv) \
662 SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
663 SVf_IVisUV|SVf_UTF8), \
664 SvFLAGS(sv) |= (SVf_POK|SVp_POK))
665#define SvPOK_only_UTF8(sv) (assert_not_ROK(sv) \
666 SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
667 SVf_IVisUV), \
668 SvFLAGS(sv) |= (SVf_POK|SVp_POK))
669
670#define SvOOK(sv) (SvFLAGS(sv) & SVf_OOK)
671#define SvOOK_on(sv) ((void)SvIOK_off(sv), SvFLAGS(sv) |= SVf_OOK)
672#define SvOOK_off(sv) ((void)(SvOOK(sv) && sv_backoff(sv)))
673
674#define SvFAKE(sv) (SvFLAGS(sv) & SVf_FAKE)
675#define SvFAKE_on(sv) (SvFLAGS(sv) |= SVf_FAKE)
676#define SvFAKE_off(sv) (SvFLAGS(sv) &= ~SVf_FAKE)
677
678#define SvROK(sv) (SvFLAGS(sv) & SVf_ROK)
679#define SvROK_on(sv) (SvFLAGS(sv) |= SVf_ROK)
680#define SvROK_off(sv) (SvFLAGS(sv) &= ~(SVf_ROK|SVf_AMAGIC))
681
682#define SvMAGICAL(sv) (SvFLAGS(sv) & (SVs_GMG|SVs_SMG|SVs_RMG))
683#define SvMAGICAL_on(sv) (SvFLAGS(sv) |= (SVs_GMG|SVs_SMG|SVs_RMG))
684#define SvMAGICAL_off(sv) (SvFLAGS(sv) &= ~(SVs_GMG|SVs_SMG|SVs_RMG))
685
686#define SvGMAGICAL(sv) (SvFLAGS(sv) & SVs_GMG)
687#define SvGMAGICAL_on(sv) (SvFLAGS(sv) |= SVs_GMG)
688#define SvGMAGICAL_off(sv) (SvFLAGS(sv) &= ~SVs_GMG)
689