annotate perl-5.22.2/util.h @ 8045:a16537d2fe07

<xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
author HackBot
date Sat, 14 May 2016 14:54:38 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8045
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
1 /* util.h
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
2 *
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
3 * Copyright (C) 1991, 1992, 1993, 1999, 2001, 2002, 2003, 2004, 2005,
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
4 * 2007, by Larry Wall and others
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
5 *
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
6 * You may distribute under the terms of either the GNU General Public
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
7 * License or the Artistic License, as specified in the README file.
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
8 *
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
9 */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
10
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
11 #ifdef VMS
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
12 # define PERL_FILE_IS_ABSOLUTE(f) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
13 (*(f) == '/' \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
14 || (strchr(f,':') \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
15 || ((*(f) == '[' || *(f) == '<') \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
16 && (isWORDCHAR((f)[1]) || strchr("$-_]>",(f)[1])))))
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
17
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
18 #else /* !VMS */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
19 # if defined(WIN32) || defined(__CYGWIN__)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
20 # define PERL_FILE_IS_ABSOLUTE(f) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
21 (*(f) == '/' || *(f) == '\\' /* UNC/rooted path */ \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
22 || ((f)[0] && (f)[1] == ':')) /* drive name */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
23 # else /* !WIN32 */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
24 # ifdef NETWARE
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
25 # define PERL_FILE_IS_ABSOLUTE(f) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
26 (((f)[0] && (f)[1] == ':') /* drive name */ \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
27 || ((f)[0] == '\\' && (f)[1] == '\\') /* UNC path */ \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
28 || ((f)[3] == ':')) /* volume name, currently only sys */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
29 # else /* !NETWARE */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
30 # if defined(DOSISH) || defined(__SYMBIAN32__)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
31 # define PERL_FILE_IS_ABSOLUTE(f) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
32 (*(f) == '/' \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
33 || ((f)[0] && (f)[1] == ':')) /* drive name */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
34 # else /* NEITHER DOSISH NOR SYMBIANISH */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
35 # define PERL_FILE_IS_ABSOLUTE(f) (*(f) == '/')
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
36 # endif /* DOSISH */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
37 # endif /* NETWARE */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
38 # endif /* WIN32 */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
39 #endif /* VMS */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
40
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
41 /*
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
42 =head1 Miscellaneous Functions
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
43
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
44 =for apidoc ibcmp
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
45
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
46 This is a synonym for (! foldEQ())
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
47
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
48 =for apidoc ibcmp_locale
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
49
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
50 This is a synonym for (! foldEQ_locale())
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
51
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
52 =cut
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
53 */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
54 #define ibcmp(s1, s2, len) cBOOL(! foldEQ(s1, s2, len))
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
55 #define ibcmp_locale(s1, s2, len) cBOOL(! foldEQ_locale(s1, s2, len))
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
56
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
57 /* outside the core, perl.h undefs HAS_QUAD if IV isn't 64-bit
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
58 We can't swap this to HAS_QUAD, because the logic here affects the type of
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
59 perl_drand48_t below, and that is visible outside of the core. */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
60 #if defined(U64TYPE) && !defined(USING_MSVC6)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
61 /* use a faster implementation when quads are available,
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
62 * but not with VC6 on Windows */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
63 # define PERL_DRAND48_QUAD
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
64 #endif
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
65
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
66 #ifdef PERL_DRAND48_QUAD
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
67
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
68 /* U64 is only defined under PERL_CORE, but this needs to be visible
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
69 * elsewhere so the definition of PerlInterpreter is complete.
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
70 */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
71 typedef U64TYPE perl_drand48_t;
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
72
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
73 #else
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
74
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
75 struct PERL_DRAND48_T {
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
76 U16 seed[3];
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
77 };
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
78
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
79 typedef struct PERL_DRAND48_T perl_drand48_t;
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
80
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
81 #endif
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
82
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
83 #define PL_RANDOM_STATE_TYPE perl_drand48_t
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
84
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
85 #define Perl_drand48_init(seed) (Perl_drand48_init_r(&PL_random_state, (seed)))
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
86 #define Perl_drand48() (Perl_drand48_r(&PL_random_state))
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
87
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
88 #ifdef USE_C_BACKTRACE
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
89
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
90 typedef struct {
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
91 /* The number of frames returned. */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
92 UV frame_count;
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
93 /* The total size of the Perl_c_backtrace, including this header,
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
94 * the frames, and the name strings. */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
95 UV total_bytes;
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
96 } Perl_c_backtrace_header;
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
97
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
98 typedef struct {
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
99 void* addr; /* the program counter at this frame */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
100
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
101 /* We could use Dl_info (as used by dladdr()) for many of these but
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
102 * that would be naughty towards non-dlfcn systems (hi there, Win32). */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
103
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
104 void* symbol_addr; /* symbol address (hint: try symbol_addr - addr) */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
105 void* object_base_addr; /* base address of the shared object */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
106
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
107 /* The offsets are from the beginning of the whole backtrace,
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
108 * which makes the backtrace relocatable. */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
109 STRLEN object_name_offset; /* pathname of the shared object */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
110 STRLEN object_name_size; /* length of the pathname */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
111 STRLEN symbol_name_offset; /* symbol name */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
112 STRLEN symbol_name_size; /* length of the symbol name */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
113 STRLEN source_name_offset; /* source code file name */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
114 STRLEN source_name_size; /* length of the source code file name */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
115 STRLEN source_line_number; /* source code line number */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
116
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
117 /* OS X notes: atos(1) (more recently, "xcrun atos"), but the C
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
118 * API atos() uses is unknown (private "Symbolicator" framework,
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
119 * might require Objective-C even if the API would be known).
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
120 * Currently we open read pipe to "xcrun atos" and parse the
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
121 * output - quite disgusting. And that won't work if the
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
122 * Developer Tools isn't installed. */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
123
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
124 /* FreeBSD notes: execinfo.h exists, but probably would need also
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
125 * the library -lexecinfo. BFD exists if the pkg devel/binutils
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
126 * has been installed, but there seems to be a known problem that
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
127 * the "bfd.h" getting installed refers to "ansidecl.h", which
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
128 * doesn't get installed. */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
129
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
130 /* Win32 notes: as moral equivalents of backtrace() + dladdr(),
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
131 * one could possibly first use GetCurrentProcess() +
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
132 * SymInitialize(), and then CaptureStackBackTrace() +
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
133 * SymFromAddr(). */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
134
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
135 /* Note that using the compiler optimizer easily leads into much
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
136 * of this information, like the symbol names (think inlining),
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
137 * and source code locations getting lost or confused. In many
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
138 * cases keeping the debug information (-g) is necessary.
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
139 *
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
140 * Note that for example with gcc you can do both -O and -g.
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
141 *
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
142 * Note, however, that on some platforms (e.g. OSX + clang (cc))
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
143 * backtrace() + dladdr() works fine without -g. */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
144
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
145 /* For example: the mere presence of <bfd.h> is no guarantee: e.g.
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
146 * OS X has that, but BFD does not seem to work on the OSX executables.
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
147 *
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
148 * Another niceness would be to able to see something about
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
149 * the function arguments, however gdb/lldb manage to do that. */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
150 } Perl_c_backtrace_frame;
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
151
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
152 typedef struct {
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
153 Perl_c_backtrace_header header;
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
154 Perl_c_backtrace_frame frame_info[1];
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
155 /* After the header come:
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
156 * (1) header.frame_count frames
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
157 * (2) frame_count times the \0-terminated strings (object_name
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
158 * and so forth). The frames contain the pointers to the starts
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
159 * of these strings, and the lengths of these strings. */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
160 } Perl_c_backtrace;
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
161
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
162 #define Perl_free_c_backtrace(bt) Safefree(bt)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
163
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
164 #endif /* USE_C_BACKTRACE */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
165
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
166 /* Use a packed 32 bit constant "key" to start the handshake. The key defines
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
167 ABI compatibility, and how to process the vararg list.
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
168
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
169 Note, some bits may be taken from INTRPSIZE (but then a simple x86 AX register
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
170 can't be used to read it) and 4 bits from API version len can also be taken,
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
171 since v00.00.00 is 9 bytes long. XS version length should not have any bits
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
172 taken since XS_VERSION lengths can get quite long since they are user
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
173 selectable. These spare bits allow for additional features for the varargs
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
174 stuff or ABI compat test flags in the future.
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
175 */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
176 #define HSm_APIVERLEN 0x0000001F /* perl version string won't be more than 31 chars */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
177 #define HS_APIVERLEN_MAX HSm_APIVERLEN
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
178 #define HSm_XSVERLEN 0x0000FF00 /* if 0, not present, dont check, die if over 255*/
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
179 #define HS_XSVERLEN_MAX 0xFF
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
180 /* uses var file to set default filename for newXS_deffile to use for CvFILE */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
181 #define HSf_SETXSUBFN 0x00000020
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
182 #define HSf_POPMARK 0x00000040 /* popmark mode or you must supply ax and items */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
183 #define HSf_IMP_CXT 0x00000080 /* ABI, threaded/PERL_IMPLICIT_CONTEXT, pTHX_ present */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
184 #define HSm_INTRPSIZE 0xFFFF0000 /* ABI, interp struct size */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
185 /* A mask of bits in the key which must always match between a XS mod and interp.
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
186 Also if all ABI bits in a key are true, skip all ABI checks, it is very
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
187 the unlikely interp size will all 1 bits */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
188 /* Maybe HSm_APIVERLEN one day if Perl_xs_apiversion_bootcheck is changed to a memcmp */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
189 #define HSm_KEY_MATCH (HSm_INTRPSIZE|HSf_IMP_CXT)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
190 #define HSf_NOCHK HSm_KEY_MATCH /* if all ABI bits are 1 in the key, dont chk */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
191
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
192
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
193 #define HS_GETINTERPSIZE(key) ((key) >> 16)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
194 /* if in the future "" and NULL must be separated, XSVERLEN would be 0
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
195 means arg not present, 1 is empty string/null byte */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
196 /* (((key) & 0x0000FF00) >> 8) is less efficient on Visual C */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
197 #define HS_GETXSVERLEN(key) ((key) >> 8 & 0xFF)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
198 #define HS_GETAPIVERLEN(key) ((key) & HSm_APIVERLEN)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
199
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
200 /* internal to util.h macro to create a packed handshake key, all args must be constants */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
201 /* U32 return = (U16 interpsize, bool cxt, bool setxsubfn, bool popmark,
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
202 U5 (FIVE!) apiverlen, U8 xsverlen) */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
203 #define HS_KEYp(interpsize, cxt, setxsubfn, popmark, apiverlen, xsverlen) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
204 (((interpsize) << 16) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
205 | ((xsverlen) > HS_XSVERLEN_MAX \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
206 ? (Perl_croak_nocontext("panic: handshake overflow"), HS_XSVERLEN_MAX) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
207 : (xsverlen) << 8) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
208 | (cBOOL(setxsubfn) ? HSf_SETXSUBFN : 0) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
209 | (cBOOL(cxt) ? HSf_IMP_CXT : 0) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
210 | (cBOOL(popmark) ? HSf_POPMARK : 0) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
211 | ((apiverlen) > HS_APIVERLEN_MAX \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
212 ? (Perl_croak_nocontext("panic: handshake overflow"), HS_APIVERLEN_MAX) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
213 : (apiverlen)))
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
214 /* overflows above will optimize away unless they will execute */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
215
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
216 /* public macro for core usage to create a packed handshake key but this is
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
217 not public API. This more friendly version already collected all ABI info */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
218 /* U32 return = (bool setxsubfn, bool popmark, "litteral_string_api_ver",
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
219 "litteral_string_xs_ver") */
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
220 #ifdef PERL_IMPLICIT_CONTEXT
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
221 # define HS_KEY(setxsubfn, popmark, apiver, xsver) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
222 HS_KEYp(sizeof(PerlInterpreter), TRUE, setxsubfn, popmark, \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
223 sizeof("" apiver "")-1, sizeof("" xsver "")-1)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
224 # define HS_CXT aTHX
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
225 #else
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
226 # define HS_KEY(setxsubfn, popmark, apiver, xsver) \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
227 HS_KEYp(sizeof(struct PerlHandShakeInterpreter), FALSE, setxsubfn, popmark, \
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
228 sizeof("" apiver "")-1, sizeof("" xsver "")-1)
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
229 # define HS_CXT cv
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
230 #endif
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
231
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
232 /*
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
233 * ex: set ts=8 sts=4 sw=4 et:
a16537d2fe07 <xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
HackBot
parents:
diff changeset
234 */