This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [PATCH] Optimize split //
[perl5.git] / ext / Devel / PPPort / parts / inc / misc
CommitLineData
adfe19db
MHM
1################################################################################
2##
d2dacc4f 3## $Revision: 38 $
adfe19db 4## $Author: mhx $
d2dacc4f 5## $Date: 2007/01/02 12:32:34 +0100 $
adfe19db
MHM
6##
7################################################################################
8##
d2dacc4f 9## Version 3.x, Copyright (C) 2004-2007, Marcus Holland-Moritz.
adfe19db
MHM
10## Version 2.x, Copyright (C) 2001, Paul Marquess.
11## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
12##
13## This program is free software; you can redistribute it and/or
14## modify it under the same terms as Perl itself.
15##
16################################################################################
17
18=provides
19
20__UNDEFINED__
21PERL_UNUSED_DECL
f2ab5a41
MHM
22PERL_UNUSED_ARG
23PERL_UNUSED_VAR
24PERL_UNUSED_CONTEXT
a745474a 25PERL_GCC_BRACE_GROUPS_FORBIDDEN
c07deaaf 26PERL_USE_GCC_BRACE_GROUPS
adfe19db
MHM
27NVTYPE
28INT2PTR
29PTRV
30NUM2PTR
31PTR2IV
32PTR2UV
33PTR2NV
34PTR2ul
a745474a
MHM
35START_EXTERN_C
36END_EXTERN_C
37EXTERN_C
38STMT_START
39STMT_END
0d0f8426 40XSRETURN
adfe19db
MHM
41
42=implementation
43
62093c1c
NC
44#ifndef PERL_UNUSED_DECL
45# ifdef HASATTRIBUTE
46# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
47# define PERL_UNUSED_DECL
48# else
49# define PERL_UNUSED_DECL __attribute__((unused))
50# endif
adfe19db 51# else
62093c1c 52# define PERL_UNUSED_DECL
adfe19db 53# endif
adfe19db
MHM
54#endif
55
f2ab5a41
MHM
56#ifndef PERL_UNUSED_ARG
57# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
58# include <note.h>
59# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
60# else
61# define PERL_UNUSED_ARG(x) ((void)x)
62# endif
63#endif
64
65#ifndef PERL_UNUSED_VAR
66# define PERL_UNUSED_VAR(x) ((void)x)
67#endif
68
69#ifndef PERL_UNUSED_CONTEXT
70# ifdef USE_ITHREADS
71# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
72# else
73# define PERL_UNUSED_CONTEXT
74# endif
75#endif
76
77__UNDEFINED__ NOOP /*EMPTY*/(void)0
78__UNDEFINED__ dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
adfe19db
MHM
79
80#ifndef NVTYPE
81# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
82# define NVTYPE long double
83# else
84# define NVTYPE double
85# endif
86typedef NVTYPE NV;
87#endif
88
89#ifndef INT2PTR
90
91# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
92# define PTRV UV
93# define INT2PTR(any,d) (any)(d)
94# else
95# if PTRSIZE == LONGSIZE
96# define PTRV unsigned long
97# else
98# define PTRV unsigned
99# endif
100# define INT2PTR(any,d) (any)(PTRV)(d)
101# endif
102
103# define NUM2PTR(any,d) (any)(PTRV)(d)
104# define PTR2IV(p) INT2PTR(IV,p)
105# define PTR2UV(p) INT2PTR(UV,p)
106# define PTR2NV(p) NUM2PTR(NV,p)
107
108# if PTRSIZE == LONGSIZE
109# define PTR2ul(p) (unsigned long)(p)
110# else
4a582685 111# define PTR2ul(p) INT2PTR(unsigned long,p)
adfe19db
MHM
112# endif
113
114#endif /* !INT2PTR */
115
a745474a
MHM
116#undef START_EXTERN_C
117#undef END_EXTERN_C
118#undef EXTERN_C
119#ifdef __cplusplus
120# define START_EXTERN_C extern "C" {
121# define END_EXTERN_C }
122# define EXTERN_C extern "C"
123#else
124# define START_EXTERN_C
125# define END_EXTERN_C
126# define EXTERN_C extern
127#endif
128
c07deaaf
MHM
129#if defined(PERL_GCC_PEDANTIC)
130# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
a745474a
MHM
131# define PERL_GCC_BRACE_GROUPS_FORBIDDEN
132# endif
133#endif
134
c07deaaf
MHM
135#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
136# ifndef PERL_USE_GCC_BRACE_GROUPS
137# define PERL_USE_GCC_BRACE_GROUPS
138# endif
139#endif
140
a745474a
MHM
141#undef STMT_START
142#undef STMT_END
c07deaaf 143#ifdef PERL_USE_GCC_BRACE_GROUPS
a745474a
MHM
144# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
145# define STMT_END )
146#else
147# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
148# define STMT_START if (1)
149# define STMT_END else (void)0
150# else
151# define STMT_START do
152# define STMT_END while (0)
153# endif
154#endif
155
adfe19db
MHM
156__UNDEFINED__ boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
157
158/* DEFSV appears first in 5.004_56 */
159__UNDEFINED__ DEFSV GvSV(PL_defgv)
160__UNDEFINED__ SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
161
162/* Older perls (<=5.003) lack AvFILLp */
163__UNDEFINED__ AvFILLp AvFILL
164
165__UNDEFINED__ ERRSV get_sv("@",FALSE)
166
167__UNDEFINED__ newSVpvn(data,len) ((data) \
168 ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
169 : newSV(0))
170
171/* Hint: gv_stashpvn
172 * This function's backport doesn't support the length parameter, but
173 * rather ignores it. Portability can only be ensured if the length
174 * parameter is used for speed reasons, but the length can always be
175 * correctly computed from the string argument.
176 */
177
178__UNDEFINED__ gv_stashpvn(str,len,create) gv_stashpv(str,create)
179
180/* Replace: 1 */
181__UNDEFINED__ get_cv perl_get_cv
182__UNDEFINED__ get_sv perl_get_sv
183__UNDEFINED__ get_av perl_get_av
184__UNDEFINED__ get_hv perl_get_hv
185/* Replace: 0 */
186
adfe19db
MHM
187__UNDEFINED__ dUNDERBAR dNOOP
188__UNDEFINED__ UNDERBAR DEFSV
189
190__UNDEFINED__ dAX I32 ax = MARK - PL_stack_base + 1
191__UNDEFINED__ dITEMS I32 items = SP - MARK
192
9132e1a3
MHM
193__UNDEFINED__ dXSTARG SV * targ = sv_newmortal()
194
0d0f8426
MHM
195__UNDEFINED__ dAXMARK I32 ax = POPMARK; \
196 register SV ** const mark = PL_stack_base + ax++
197
198
199__UNDEFINED__ XSprePUSH (sp = PL_stack_base + ax - 1)
200
201#if { VERSION < 5.005 }
202# undef XSRETURN
203# define XSRETURN(off) \
204 STMT_START { \
205 PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
206 return; \
207 } STMT_END
208#endif
209
f2ab5a41
MHM
210__UNDEFINED__ PERL_ABS(x) ((x) < 0 ? -(x) : (x))
211
212__UNDEFINED__ dVAR dNOOP
213
214__UNDEFINED__ SVf "_"
215
9132e1a3
MHM
216=xsmisc
217
218XS(XS_Devel__PPPort_dXSTARG); /* prototype */
219XS(XS_Devel__PPPort_dXSTARG)
220{
221 dXSARGS;
222 dXSTARG;
2dd69576 223 IV iv;
9132e1a3 224 SP -= items;
2dd69576 225 iv = SvIV(ST(0)) + 1;
9132e1a3
MHM
226 PUSHi(iv);
227 XSRETURN(1);
228}
229
0d0f8426
MHM
230XS(XS_Devel__PPPort_dAXMARK); /* prototype */
231XS(XS_Devel__PPPort_dAXMARK)
232{
233 dSP;
234 dAXMARK;
235 dITEMS;
236 IV iv;
237 SP -= items;
238 iv = SvIV(ST(0)) - 1;
239 PUSHs(sv_2mortal(newSViv(iv)));
240 XSRETURN(1);
241}
242
9132e1a3
MHM
243=xsboot
244
245newXS("Devel::PPPort::dXSTARG", XS_Devel__PPPort_dXSTARG, file);
0d0f8426 246newXS("Devel::PPPort::dAXMARK", XS_Devel__PPPort_dAXMARK, file);
9132e1a3 247
adfe19db
MHM
248=xsubs
249
250int
251gv_stashpvn(name, create)
252 char *name
253 I32 create
254 CODE:
255 RETVAL = gv_stashpvn(name, strlen(name), create) != NULL;
256 OUTPUT:
257 RETVAL
258
259int
260get_sv(name, create)
261 char *name
262 I32 create
263 CODE:
264 RETVAL = get_sv(name, create) != NULL;
265 OUTPUT:
266 RETVAL
267
268int
269get_av(name, create)
270 char *name
271 I32 create
272 CODE:
273 RETVAL = get_av(name, create) != NULL;
274 OUTPUT:
275 RETVAL
276
277int
278get_hv(name, create)
279 char *name
280 I32 create
281 CODE:
282 RETVAL = get_hv(name, create) != NULL;
283 OUTPUT:
284 RETVAL
285
286int
287get_cv(name, create)
288 char *name
289 I32 create
290 CODE:
291 RETVAL = get_cv(name, create) != NULL;
292 OUTPUT:
293 RETVAL
294
295void
296newSVpvn()
297 PPCODE:
298 XPUSHs(newSVpvn("test", 4));
299 XPUSHs(newSVpvn("test", 2));
300 XPUSHs(newSVpvn("test", 0));
301 XPUSHs(newSVpvn(NULL, 2));
302 XPUSHs(newSVpvn(NULL, 0));
303 XSRETURN(5);
304
0d0f8426
MHM
305void
306xsreturn(two)
307 int two
308 PPCODE:
309 XPUSHs(newSVpvn("test1", 5));
310 if (two)
311 XPUSHs(newSVpvn("test2", 5));
312 if (two)
313 XSRETURN(2);
314 else
315 XSRETURN(1);
316
adfe19db
MHM
317SV*
318boolSV(value)
319 int value
320 CODE:
321 RETVAL = newSVsv(boolSV(value));
322 OUTPUT:
323 RETVAL
324
325SV*
326DEFSV()
327 CODE:
328 RETVAL = newSVsv(DEFSV);
329 OUTPUT:
330 RETVAL
331
332int
333ERRSV()
334 CODE:
335 RETVAL = SvTRUE(ERRSV);
336 OUTPUT:
337 RETVAL
338
339SV*
340UNDERBAR()
341 CODE:
342 {
343 dUNDERBAR;
344 RETVAL = newSVsv(UNDERBAR);
345 }
346 OUTPUT:
347 RETVAL
348
0d0f8426
MHM
349void
350prepush()
351 CODE:
352 {
353 dXSTARG;
354 XSprePUSH;
355 PUSHi(42);
356 XSRETURN(1);
357 }
358
f2ab5a41
MHM
359int
360PERL_ABS(a)
361 int a
362
363void
364SVf(x)
365 SV *x
366 PPCODE:
367#if { VERSION >= 5.004 }
368 x = newSVpvf("[%"SVf"]", x);
369#endif
370 XPUSHs(x);
371 XSRETURN(1);
372
cac25305 373=tests plan => 38
adfe19db
MHM
374
375use vars qw($my_sv @my_av %my_hv);
376
377my @s = &Devel::PPPort::newSVpvn();
378ok(@s == 5);
379ok($s[0], "test");
380ok($s[1], "te");
381ok($s[2], "");
382ok(!defined($s[3]));
383ok(!defined($s[4]));
384
adfe19db
MHM
385ok(&Devel::PPPort::boolSV(1));
386ok(!&Devel::PPPort::boolSV(0));
387
388$_ = "Fred";
389ok(&Devel::PPPort::DEFSV(), "Fred");
390ok(&Devel::PPPort::UNDERBAR(), "Fred");
391
0d0f8426
MHM
392if ($] >= 5.009002) {
393 eval q{
394 my $_ = "Tony";
395 ok(&Devel::PPPort::DEFSV(), "Fred");
396 ok(&Devel::PPPort::UNDERBAR(), "Tony");
397 };
398}
399else {
400 ok(1);
401 ok(1);
402}
403
adfe19db
MHM
404eval { 1 };
405ok(!&Devel::PPPort::ERRSV());
406eval { cannot_call_this_one() };
407ok(&Devel::PPPort::ERRSV());
408
409ok(&Devel::PPPort::gv_stashpvn('Devel::PPPort', 0));
410ok(!&Devel::PPPort::gv_stashpvn('does::not::exist', 0));
411ok(&Devel::PPPort::gv_stashpvn('does::not::exist', 1));
412
413$my_sv = 1;
414ok(&Devel::PPPort::get_sv('my_sv', 0));
415ok(!&Devel::PPPort::get_sv('not_my_sv', 0));
416ok(&Devel::PPPort::get_sv('not_my_sv', 1));
417
418@my_av = (1);
419ok(&Devel::PPPort::get_av('my_av', 0));
420ok(!&Devel::PPPort::get_av('not_my_av', 0));
421ok(&Devel::PPPort::get_av('not_my_av', 1));
422
423%my_hv = (a=>1);
424ok(&Devel::PPPort::get_hv('my_hv', 0));
425ok(!&Devel::PPPort::get_hv('not_my_hv', 0));
426ok(&Devel::PPPort::get_hv('not_my_hv', 1));
427
428sub my_cv { 1 };
429ok(&Devel::PPPort::get_cv('my_cv', 0));
430ok(!&Devel::PPPort::get_cv('not_my_cv', 0));
431ok(&Devel::PPPort::get_cv('not_my_cv', 1));
432
9132e1a3 433ok(Devel::PPPort::dXSTARG(42), 43);
0d0f8426
MHM
434ok(Devel::PPPort::dAXMARK(4711), 4710);
435
436ok(Devel::PPPort::prepush(), 42);
9132e1a3 437
0d0f8426
MHM
438ok(join(':', Devel::PPPort::xsreturn(0)), 'test1');
439ok(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
f2ab5a41
MHM
440
441ok(Devel::PPPort::PERL_ABS(42), 42);
442ok(Devel::PPPort::PERL_ABS(-13), 13);
443
444ok(Devel::PPPort::SVf(42), $] >= 5.004 ? '[42]' : '42');
445ok(Devel::PPPort::SVf('abc'), $] >= 5.004 ? '[abc]' : 'abc');
446