This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Stop substr($utf8) from calling get-magic twice
[perl5.git] / mg_vtable.h
CommitLineData
8b09643d
NC
1/* -*- buffer-read-only: t -*-
2 *
3 * mg_vtable.h
4 * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
5 * This file is built by regen/mg_vtable.pl.
6 * Any changes made here will be lost!
7 */
8
abf9aa7a
NC
9/* These constants should be used in preference to raw characters
10 * when using magic. Note that some perl guts still assume
11 * certain character properties of these constants, namely that
12 * isUPPER() and toLOWER() may do useful mappings.
13 */
14
15#define PERL_MAGIC_sv '\0' /* Special scalar variable */
23cfd2fc
NC
16#define PERL_MAGIC_arylen '#' /* Array length ($#ary) */
17#define PERL_MAGIC_rhash '%' /* extra data for restricted hashes */
18#define PERL_MAGIC_pos '.' /* pos() lvalue */
19#define PERL_MAGIC_symtab ':' /* extra data for symbol tables */
20#define PERL_MAGIC_backref '<' /* for weak ref data */
21#define PERL_MAGIC_arylen_p '@' /* to move arylen out of XPVAV */
abf9aa7a 22#define PERL_MAGIC_bm 'B' /* Boyer-Moore (fast string search) */
23cfd2fc 23#define PERL_MAGIC_overload_table 'c' /* Holds overload table (AMT) on stash */
abf9aa7a
NC
24#define PERL_MAGIC_regdata 'D' /* Regex match position data
25 (@+ and @- vars) */
26#define PERL_MAGIC_regdatum 'd' /* Regex match position data element */
27#define PERL_MAGIC_env 'E' /* %ENV hash */
28#define PERL_MAGIC_envelem 'e' /* %ENV hash element */
29#define PERL_MAGIC_fm 'f' /* Formline ('compiled' format) */
0177730e 30#define PERL_MAGIC_regex_global 'g' /* m//g target */
abf9aa7a
NC
31#define PERL_MAGIC_hints 'H' /* %^H hash */
32#define PERL_MAGIC_hintselem 'h' /* %^H hash element */
33#define PERL_MAGIC_isa 'I' /* @ISA array */
34#define PERL_MAGIC_isaelem 'i' /* @ISA array element */
35#define PERL_MAGIC_nkeys 'k' /* scalar(keys()) lvalue */
36#define PERL_MAGIC_dbfile 'L' /* Debugger %_<filename */
37#define PERL_MAGIC_dbline 'l' /* Debugger %_<filename element */
38#define PERL_MAGIC_shared 'N' /* Shared between threads */
39#define PERL_MAGIC_shared_scalar 'n' /* Shared between threads */
40#define PERL_MAGIC_collxfrm 'o' /* Locale transformation */
41#define PERL_MAGIC_tied 'P' /* Tied array or hash */
42#define PERL_MAGIC_tiedelem 'p' /* Tied array or hash element */
43#define PERL_MAGIC_tiedscalar 'q' /* Tied scalar or handle */
44#define PERL_MAGIC_qr 'r' /* precompiled qr// regex */
45#define PERL_MAGIC_sig 'S' /* %SIG hash */
46#define PERL_MAGIC_sigelem 's' /* %SIG hash element */
47#define PERL_MAGIC_taint 't' /* Taintedness */
48#define PERL_MAGIC_uvar 'U' /* Available for use by extensions */
49#define PERL_MAGIC_uvar_elem 'u' /* Reserved for use by extensions */
abf9aa7a 50#define PERL_MAGIC_vstring 'V' /* SV was vstring literal */
23cfd2fc 51#define PERL_MAGIC_vec 'v' /* vec() lvalue */
abf9aa7a
NC
52#define PERL_MAGIC_utf8 'w' /* Cached UTF-8 information */
53#define PERL_MAGIC_substr 'x' /* substr() lvalue */
54#define PERL_MAGIC_defelem 'y' /* Shadow "foreach" iterator variable /
55 smart parameter vivification */
abf9aa7a 56#define PERL_MAGIC_checkcall ']' /* inlining/mutation of call to this CV */
23cfd2fc 57#define PERL_MAGIC_ext '~' /* Available for use by extensions */
abf9aa7a 58
ca298f7d 59enum { /* pass one of these to get_vtbl */
23cfd2fc
NC
60 want_vtbl_arylen,
61 want_vtbl_arylen_p,
62 want_vtbl_backref,
09fb282d 63 want_vtbl_checkcall,
23cfd2fc
NC
64 want_vtbl_collxfrm,
65 want_vtbl_dbline,
66 want_vtbl_defelem,
ca298f7d
NC
67 want_vtbl_env,
68 want_vtbl_envelem,
23cfd2fc
NC
69 want_vtbl_hints,
70 want_vtbl_hintselem,
ca298f7d
NC
71 want_vtbl_isa,
72 want_vtbl_isaelem,
ca298f7d
NC
73 want_vtbl_mglob,
74 want_vtbl_nkeys,
23cfd2fc
NC
75 want_vtbl_ovrld,
76 want_vtbl_pack,
77 want_vtbl_packelem,
ca298f7d 78 want_vtbl_pos,
ca298f7d
NC
79 want_vtbl_regdata,
80 want_vtbl_regdatum,
23cfd2fc
NC
81 want_vtbl_regexp,
82 want_vtbl_sigelem,
83 want_vtbl_substr,
84 want_vtbl_sv,
85 want_vtbl_taint,
ca298f7d 86 want_vtbl_utf8,
23cfd2fc
NC
87 want_vtbl_uvar,
88 want_vtbl_vec,
c7fdacb9 89 magic_vtable_max
ca298f7d
NC
90};
91
2d1f1fe5
NC
92#ifdef DOINIT
93EXTCONST char *PL_magic_vtable_names[magic_vtable_max] = {
23cfd2fc
NC
94 "arylen",
95 "arylen_p",
96 "backref",
09fb282d 97 "checkcall",
23cfd2fc
NC
98 "collxfrm",
99 "dbline",
100 "defelem",
2d1f1fe5
NC
101 "env",
102 "envelem",
23cfd2fc
NC
103 "hints",
104 "hintselem",
2d1f1fe5
NC
105 "isa",
106 "isaelem",
2d1f1fe5
NC
107 "mglob",
108 "nkeys",
23cfd2fc
NC
109 "ovrld",
110 "pack",
111 "packelem",
2d1f1fe5 112 "pos",
2d1f1fe5
NC
113 "regdata",
114 "regdatum",
23cfd2fc
NC
115 "regexp",
116 "sigelem",
117 "substr",
118 "sv",
119 "taint",
2d1f1fe5 120 "utf8",
23cfd2fc 121 "uvar",
4499db73 122 "vec"
2d1f1fe5
NC
123};
124#else
125EXTCONST char *PL_magic_vtable_names[magic_vtable_max];
126#endif
127
8b09643d
NC
128/* These all need to be 0, not NULL, as NULL can be (void*)0, which is a
129 * pointer to data, whereas we're assigning pointers to functions, which are
130 * not the same beast. ANSI doesn't allow the assignment from one to the other.
131 * (although most, but not all, compilers are prepared to do it)
132 */
133
0ffb5b03 134/* order is:
8b09643d
NC
135 get
136 set
137 len
138 clear
139 free
140 copy
141 dup
142 local
143*/
144
0ffb5b03 145#ifdef DOINIT
c7fdacb9 146EXT_MGVTBL PL_magic_vtables[magic_vtable_max] = {
23cfd2fc 147 { (int (*)(pTHX_ SV *, MAGIC *))Perl_magic_getarylen, Perl_magic_setarylen, 0, 0, 0, 0, 0, 0 },
83f29afa 148 { 0, 0, 0, Perl_magic_cleararylen_p, Perl_magic_freearylen_p, 0, 0, 0 },
23cfd2fc 149 { 0, 0, 0, 0, Perl_magic_killbackrefs, 0, 0, 0 },
09fb282d 150 { 0, 0, 0, 0, 0, Perl_magic_copycallchecker, 0, 0 },
23cfd2fc
NC
151#ifdef USE_LOCALE_COLLATE
152 { 0, Perl_magic_setcollxfrm, 0, 0, 0, 0, 0, 0 },
b7b5e578
NC
153#else
154 { 0, 0, 0, 0, 0, 0, 0, 0 },
155#endif
b7b5e578 156 { 0, Perl_magic_setdbline, 0, 0, 0, 0, 0, 0 },
23cfd2fc
NC
157 { Perl_magic_getdefelem, Perl_magic_setdefelem, 0, 0, 0, 0, 0, 0 },
158 { 0, Perl_magic_set_all_env, 0, Perl_magic_clear_all_env, 0, 0, 0, 0 },
159 { 0, Perl_magic_setenv, 0, Perl_magic_clearenv, 0, 0, 0, 0 },
160 { 0, 0, 0, Perl_magic_clearhints, 0, 0, 0, 0 },
161 { 0, Perl_magic_sethint, 0, Perl_magic_clearhint, 0, 0, 0, 0 },
b7b5e578
NC
162 { 0, Perl_magic_setisa, 0, Perl_magic_clearisa, 0, 0, 0, 0 },
163 { 0, Perl_magic_setisa, 0, 0, 0, 0, 0, 0 },
b7b5e578
NC
164 { 0, Perl_magic_setmglob, 0, 0, 0, 0, 0, 0 },
165 { Perl_magic_getnkeys, Perl_magic_setnkeys, 0, 0, 0, 0, 0, 0 },
23cfd2fc
NC
166 { 0, 0, 0, 0, Perl_magic_freeovrld, 0, 0, 0 },
167 { 0, 0, Perl_magic_sizepack, Perl_magic_wipepack, 0, 0, 0, 0 },
168 { Perl_magic_getpack, Perl_magic_setpack, 0, Perl_magic_clearpack, 0, 0, 0, 0 },
b7b5e578 169 { Perl_magic_getpos, Perl_magic_setpos, 0, 0, 0, 0, 0, 0 },
b7b5e578
NC
170 { 0, 0, Perl_magic_regdata_cnt, 0, 0, 0, 0, 0 },
171 { Perl_magic_regdatum_get, Perl_magic_regdatum_set, 0, 0, 0, 0, 0, 0 },
23cfd2fc
NC
172 { 0, Perl_magic_setregexp, 0, 0, 0, 0, 0, 0 },
173#ifndef PERL_MICRO
174 { Perl_magic_getsig, Perl_magic_setsig, 0, Perl_magic_clearsig, 0, 0, 0, 0 },
0ffb5b03 175#else
b7b5e578 176 { 0, 0, 0, 0, 0, 0, 0, 0 },
0ffb5b03 177#endif
23cfd2fc
NC
178 { Perl_magic_getsubstr, Perl_magic_setsubstr, 0, 0, 0, 0, 0, 0 },
179 { Perl_magic_get, Perl_magic_set, Perl_magic_len, 0, 0, 0, 0, 0 },
180 { Perl_magic_gettaint, Perl_magic_settaint, 0, 0, 0, 0, 0, 0 },
181 { 0, Perl_magic_setutf8, 0, 0, 0, 0, 0, 0 },
182 { Perl_magic_getuvar, Perl_magic_setuvar, 0, 0, 0, 0, 0, 0 },
4499db73 183 { Perl_magic_getvec, Perl_magic_setvec, 0, 0, 0, 0, 0, 0 }
b7b5e578 184};
0ffb5b03 185#else
c7fdacb9 186EXT_MGVTBL PL_magic_vtables[magic_vtable_max];
b7b5e578
NC
187#endif
188
b2e9fc6f
NC
189#define want_vtbl_bm want_vtbl_regexp
190#define want_vtbl_fm want_vtbl_regexp
191
b7b5e578
NC
192#define PL_vtbl_arylen PL_magic_vtables[want_vtbl_arylen]
193#define PL_vtbl_arylen_p PL_magic_vtables[want_vtbl_arylen_p]
194#define PL_vtbl_backref PL_magic_vtables[want_vtbl_backref]
195#define PL_vtbl_bm PL_magic_vtables[want_vtbl_bm]
09fb282d 196#define PL_vtbl_checkcall PL_magic_vtables[want_vtbl_checkcall]
b7b5e578
NC
197#define PL_vtbl_collxfrm PL_magic_vtables[want_vtbl_collxfrm]
198#define PL_vtbl_dbline PL_magic_vtables[want_vtbl_dbline]
199#define PL_vtbl_defelem PL_magic_vtables[want_vtbl_defelem]
200#define PL_vtbl_env PL_magic_vtables[want_vtbl_env]
201#define PL_vtbl_envelem PL_magic_vtables[want_vtbl_envelem]
202#define PL_vtbl_fm PL_magic_vtables[want_vtbl_fm]
203#define PL_vtbl_hints PL_magic_vtables[want_vtbl_hints]
204#define PL_vtbl_hintselem PL_magic_vtables[want_vtbl_hintselem]
205#define PL_vtbl_isa PL_magic_vtables[want_vtbl_isa]
206#define PL_vtbl_isaelem PL_magic_vtables[want_vtbl_isaelem]
207#define PL_vtbl_mglob PL_magic_vtables[want_vtbl_mglob]
208#define PL_vtbl_nkeys PL_magic_vtables[want_vtbl_nkeys]
209#define PL_vtbl_ovrld PL_magic_vtables[want_vtbl_ovrld]
210#define PL_vtbl_pack PL_magic_vtables[want_vtbl_pack]
211#define PL_vtbl_packelem PL_magic_vtables[want_vtbl_packelem]
212#define PL_vtbl_pos PL_magic_vtables[want_vtbl_pos]
213#define PL_vtbl_regdata PL_magic_vtables[want_vtbl_regdata]
214#define PL_vtbl_regdatum PL_magic_vtables[want_vtbl_regdatum]
215#define PL_vtbl_regexp PL_magic_vtables[want_vtbl_regexp]
216#define PL_vtbl_sigelem PL_magic_vtables[want_vtbl_sigelem]
217#define PL_vtbl_substr PL_magic_vtables[want_vtbl_substr]
218#define PL_vtbl_sv PL_magic_vtables[want_vtbl_sv]
219#define PL_vtbl_taint PL_magic_vtables[want_vtbl_taint]
220#define PL_vtbl_utf8 PL_magic_vtables[want_vtbl_utf8]
221#define PL_vtbl_uvar PL_magic_vtables[want_vtbl_uvar]
222#define PL_vtbl_vec PL_magic_vtables[want_vtbl_vec]
8b09643d
NC
223
224/* ex: set ro: */