File Coverage

Float32.xs
Criterion Covered Total %
statement 269 313 85.9
branch 97 146 66.4
condition n/a
subroutine n/a
pod n/a
total 366 459 79.7


line stmt bran cond sub pod time code
1              
2             #ifdef __MINGW32__
3             #ifndef __USE_MINGW_ANSI_STDIO
4             #define __USE_MINGW_ANSI_STDIO 1
5             #endif
6             #endif
7              
8             #define PERL_NO_GET_CONTEXT 1
9              
10             #include "EXTERN.h"
11             #include "perl.h"
12             #include "XSUB.h"
13              
14             #define TYPE_PRECISION 24
15             #define TYPE_EMIN -148
16             #define TYPE_EMAX 128
17              
18              
19 27512           SV * _itsa(pTHX_ SV * a) {
20 27512 100         if(SvIOK(a)) {
21 399           return newSVuv(2); /* IV */
22             }
23 27113 100         if(SvPOK(a)) {
24 18048           return newSVuv(4); /* PV */
25             }
26 9065 100         if(SvNOK(a)) return newSVuv(3); /* NV */
27 8671 50         if(sv_isobject(a)) {
28 8671 50         const char* h = HvNAME(SvSTASH(SvRV(a)));
    50          
    50          
    0          
    50          
    50          
29 8671 50         if(strEQ(h, "Math::Float32")) return newSVuv(22);
30             }
31 0           croak("The Math::Float32::_itsa XSub has been given an invalid argument (probably undefined)");
32             }
33              
34 111           int is_flt_nan( float * obj) {
35 111 100         if(*obj == *obj) return 0;
36 47           return 1;
37             }
38              
39 16           int is_flt_inf( float * obj) {
40 16 50         if(*obj == 0) return 0;
41 16 100         if(*obj / *obj != *obj / *obj) {
42 11 100         if(*obj > 0) return 1;
43 5           return -1;
44             }
45 5           return 0;
46             }
47              
48 8594           SV * _fromFloat32(pTHX_ float * in) {
49              
50             float * f_obj;
51             SV * obj_ref, * obj;
52              
53 8594           Newx(f_obj, 1, float);
54 8594 50         if(f_obj == NULL) croak("Failed to allocate memory in _fromFloat32 function");
55 8594           obj_ref = newSV(0);
56 8594           obj = newSVrv(obj_ref, "Math::Float32");
57              
58 8594           *f_obj = *in;
59              
60 8594           sv_setiv(obj, INT2PTR(IV,f_obj));
61 8594           SvREADONLY_on(obj);
62 8594           return obj_ref;
63             }
64              
65 394           SV * _fromNV(pTHX_ SV * in) {
66              
67             float * f_obj;
68             SV * obj_ref, * obj;
69              
70 394           Newx(f_obj, 1, float);
71 394 50         if(f_obj == NULL) croak("Failed to allocate memory in _fromNV function");
72 394           obj_ref = newSV(0);
73 394           obj = newSVrv(obj_ref, "Math::Float32");
74              
75 394           *f_obj = (float)SvNV(in);
76              
77 394           sv_setiv(obj, INT2PTR(IV,f_obj));
78 394           SvREADONLY_on(obj);
79 394           return obj_ref;
80             }
81              
82 399           SV * _fromIV(pTHX_ SV * in) {
83              
84             float * f_obj;
85             SV * obj_ref, * obj;
86              
87 399           Newx(f_obj, 1, float);
88 399 50         if(f_obj == NULL) croak("Failed to allocate memory in _fromIV function");
89 399           obj_ref = newSV(0);
90 399           obj = newSVrv(obj_ref, "Math::Float32");
91              
92 399 100         if(SvUOK(in)) *f_obj = ( float)SvUV(in);
93 398           else *f_obj = ( float)SvIV(in);
94              
95 399           sv_setiv(obj, INT2PTR(IV,f_obj));
96 399           SvREADONLY_on(obj);
97 399           return obj_ref;
98             }
99              
100 9039           SV * _fromPV(pTHX_ SV * in) {
101              
102             float * f_obj;
103             SV * obj_ref, * obj;
104              
105 9039           Newx(f_obj, 1, float);
106 9039 50         if(f_obj == NULL) croak("Failed to allocate memory in _fromPV function");
107 9039           obj_ref = newSV(0);
108 9039           obj = newSVrv(obj_ref, "Math::Float32");
109              
110 9039           *f_obj = strtof(SvPV_nolen(in), NULL);
111              
112 9039           sv_setiv(obj, INT2PTR(IV,f_obj));
113 9039           SvREADONLY_on(obj);
114 9039           return obj_ref;
115             }
116              
117 278           SV * flt_to_NV(pTHX_ float * obj) {
118 278           return newSVnv(*obj);
119             }
120              
121 1           void _flt_set( float * a, float * b) {
122 1           *a = *b;
123 1           }
124              
125 0           void flt_set_nan( float * a) {
126 0           *a = strtof("NaN", NULL);
127 0           }
128              
129 1           void flt_set_inf( float * a, int is_pos) {
130 1 50         if(is_pos > 0) *a = strtof("Inf", NULL);
131 0           else *a = strtof("-Inf", NULL);
132 1           }
133              
134 0           void flt_set_zero( float * a, int is_pos) {
135 0 0         if(is_pos > 0) *a = strtof("0.0", NULL);
136 0           else *a = strtof("-0.0", NULL);
137 0           }
138              
139              
140 101           SV * _oload_add(pTHX_ float * a, float * b, SV * third) {
141              
142             float * f_obj;
143             SV * obj_ref, * obj;
144              
145 101           Newx(f_obj, 1, float);
146 101 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_add function");
147 101           obj_ref = newSV(0);
148 101           obj = newSVrv(obj_ref, "Math::Float32");
149              
150 101           *f_obj = *a + *b;
151              
152 101           sv_setiv(obj, INT2PTR(IV,f_obj));
153 101           SvREADONLY_on(obj);
154 101           return obj_ref;
155             }
156              
157 181           SV * _oload_sub(pTHX_ float * a, float * b, SV * third) {
158              
159             float * f_obj;
160             SV * obj_ref, * obj;
161              
162 181           Newx(f_obj, 1, float);
163 181 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_sub function");
164 181           obj_ref = newSV(0);
165 181           obj = newSVrv(obj_ref, "Math::Float32");
166              
167 181 100         if(SvTRUE_nomg_NN(third)) *f_obj = *b - *a;
168 72           else *f_obj = *a - *b;
169              
170 181           sv_setiv(obj, INT2PTR(IV,f_obj));
171 181           SvREADONLY_on(obj);
172 181           return obj_ref;
173             }
174              
175 141           SV * _oload_mul(pTHX_ float * a, float * b, SV * third) {
176              
177             float * f_obj;
178             SV * obj_ref, * obj;
179              
180 141           Newx(f_obj, 1, float);
181 141 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_mul function");
182 141           obj_ref = newSV(0);
183 141           obj = newSVrv(obj_ref, "Math::Float32");
184              
185 141           *f_obj = *a * *b;
186              
187 141           sv_setiv(obj, INT2PTR(IV,f_obj));
188 141           SvREADONLY_on(obj);
189 141           return obj_ref;
190             }
191              
192 107           SV * _oload_div(pTHX_ float * a, float * b, SV * third) {
193              
194             float * f_obj;
195             SV * obj_ref, * obj;
196              
197 107           Newx(f_obj, 1, float);
198 107 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_div function");
199 107           obj_ref = newSV(0);
200 107           obj = newSVrv(obj_ref, "Math::Float32");
201              
202 107 100         if(SvTRUE_nomg_NN(third)) *f_obj = *b / *a;
203 70           else *f_obj = *a / *b;
204              
205 107           sv_setiv(obj, INT2PTR(IV,f_obj));
206 107           SvREADONLY_on(obj);
207 107           return obj_ref;
208             }
209              
210 12           SV * _oload_fmod(pTHX_ float * a, float * b, SV * third) {
211              
212             float * f_obj;
213             SV * obj_ref, * obj;
214              
215 12           Newx(f_obj, 1, float);
216 12 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_fmod function");
217 12           obj_ref = newSV(0);
218 12           obj = newSVrv(obj_ref, "Math::Float32");
219              
220 12 100         if(SvTRUE_nomg_NN(third)) *f_obj = fmodf(*b, *a);
221 11           else *f_obj = fmodf(*a, *b);
222              
223 12           sv_setiv(obj, INT2PTR(IV,f_obj));
224 12           SvREADONLY_on(obj);
225 12           return obj_ref;
226             }
227              
228 28           SV * _oload_pow(pTHX_ float * a, float * b, SV * third) {
229              
230             float * f_obj;
231             SV * obj_ref, * obj;
232              
233 28           Newx(f_obj, 1, float);
234 28 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_pow function");
235 28           obj_ref = newSV(0);
236 28           obj = newSVrv(obj_ref, "Math::Float32");
237              
238 28 100         if(SvTRUE_nomg_NN(third)) *f_obj = powf(*b, *a); /* b ** a */
239 26           else *f_obj = powf(*a, *b); /* a ** b */
240              
241 28           sv_setiv(obj, INT2PTR(IV,f_obj));
242 28           SvREADONLY_on(obj);
243 28           return obj_ref;
244             }
245              
246 8662           int _oload_equiv( float * a, float * b, SV * third) {
247 8662 100         if(*a == *b) return 1;
248 12           return 0;
249             }
250              
251 14           int _oload_not_equiv( float * a, float * b, SV * third) {
252 14 50         if(*a != *b) return 1;
253 0           return 0;
254             }
255              
256 26           int _oload_gt(pTHX_ float * a, float * b, SV * third) {
257 26 100         if(SvTRUE_nomg_NN(third)) {
258 1 50         if(*b > *a) return 1;
259 0           return 0;
260             }
261 25 100         if(*a > *b) return 1;
262 10           return 0;
263             }
264              
265 66           int _oload_gte(pTHX_ float * a, float * b, SV * third) {
266 66 100         if(SvTRUE_nomg_NN(third)) {
267 2 50         if(*b >= *a) return 1;
268 0           return 0;
269             }
270 64 100         if(*a >= *b) return 1;
271 6           return 0;
272             }
273              
274 28           int _oload_lt(pTHX_ float * a, float * b, SV * third) {
275 28 100         if(SvTRUE_nomg_NN(third)) {
276 1 50         if(*b < *a) return 1;
277 0           return 0;
278             }
279 27 100         if(*a < *b) return 1;
280 11           return 0;
281             }
282              
283 66           int _oload_lte(pTHX_ float * a, float * b, SV * third) {
284 66 100         if(SvTRUE_nomg_NN(third)) {
285 2 50         if(*b <= *a) return 1;
286 0           return 0;
287             }
288 64 100         if(*a <= *b) return 1;
289 6           return 0;
290             }
291              
292 48           SV * _oload_spaceship(pTHX_ float * a, float * b, SV * third) {
293 48 100         if(*a == *b) return newSViv(0);
294 38 100         if(is_flt_nan(a) || is_flt_nan(b)) return &PL_sv_undef;
    50          
295 30 100         if(SvTRUE_nomg_NN(third)) {
296 1 50         if(*b > *a) return newSViv(1);
297 0           return newSViv(-1);
298             }
299 29 100         if(*a > *b) return newSViv(1);
300 15           return newSViv(-1);
301             }
302              
303 3           int _oload_not( float * a, SV * second, SV * third) {
304 3 100         if(is_flt_nan(a) || *a == 0) return 1;
    100          
305 1           return 0;
306             }
307              
308 3           int _oload_bool( float * a, SV * second, SV * third) {
309 3 100         if(is_flt_nan(a) || *a == 0) return 0;
    100          
310 1           return 1;
311             }
312              
313 1           SV * _oload_int(pTHX_ float * a, SV * second, SV * third) {
314             float * f_obj;
315             SV * obj_ref, * obj;
316              
317 1           Newx(f_obj, 1, float);
318 1 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_int function");
319 1           obj_ref = newSV(0);
320 1           obj = newSVrv(obj_ref, "Math::Float32");
321              
322 1 50         if(*a >= 0) *f_obj = floorf(*a);
323 0           else *f_obj = ceilf(*a);
324              
325 1           sv_setiv(obj, INT2PTR(IV,f_obj));
326 1           SvREADONLY_on(obj);
327 1           return obj_ref;
328             }
329              
330 1           SV * _oload_log(pTHX_ float * a, SV * second, SV * third) {
331             float * f_obj;
332             SV * obj_ref, * obj;
333              
334 1           Newx(f_obj, 1, float);
335 1 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_log function");
336 1           obj_ref = newSV(0);
337 1           obj = newSVrv(obj_ref, "Math::Float32");
338              
339 1           *f_obj = logf(*a);
340              
341 1           sv_setiv(obj, INT2PTR(IV,f_obj));
342 1           SvREADONLY_on(obj);
343 1           return obj_ref;
344             }
345              
346 1           SV * _oload_exp(pTHX_ float * a, SV * second, SV * third) {
347             float * f_obj;
348             SV * obj_ref, * obj;
349              
350 1           Newx(f_obj, 1, float);
351 1 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_exp function");
352 1           obj_ref = newSV(0);
353 1           obj = newSVrv(obj_ref, "Math::Float32");
354              
355 1           *f_obj = expf(*a);
356              
357 1           sv_setiv(obj, INT2PTR(IV,f_obj));
358 1           SvREADONLY_on(obj);
359 1           return obj_ref;
360             }
361              
362 4           SV * _oload_sqrt(pTHX_ float * a, SV * second, SV * third) {
363             float * f_obj;
364             SV * obj_ref, * obj;
365              
366              
367 4           Newx(f_obj, 1, float);
368 4 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_sqrt function");
369 4           obj_ref = newSV(0);
370 4           obj = newSVrv(obj_ref, "Math::Float32");
371              
372 4           *f_obj = sqrtf(*a);
373              
374 4           sv_setiv(obj, INT2PTR(IV,f_obj));
375 4           SvREADONLY_on(obj);
376 4           return obj_ref;
377             }
378              
379 8310           void _unpack_flt_hex(pTHX_ float * f) {
380 8310           dXSARGS;
381             int i;
382             char * buff;
383 8310           float bf16 = *f;
384 8310           void * p = &bf16;
385              
386 8310           Newx(buff, 8, char);
387 8310 50         if(buff == NULL) croak("Failed to allocate memory in unpack_flt_hex");
388              
389 8310           sp = mark;
390              
391             #ifdef WE_HAVE_BENDIAN /* Big Endian architecture */
392             for (i = 0; i < 4; i++) {
393             #else
394 41550 100         for (i = 3; i >= 0; i--) {
395             #endif
396 33240           sprintf(buff, "%02X", ((unsigned char*)p)[i]);
397 33240 50         XPUSHs(sv_2mortal(newSVpv(buff, 0)));
398             }
399 8310           PUTBACK;
400 8310           Safefree(buff);
401 8310           XSRETURN(4);
402             }
403              
404 0           void nextafter_flt(float * rop, float * op1, float * op2) {
405 0           *rop = nextafterf(*op1, *op2);
406 0           }
407              
408 4147           void flt_nextabove( float * a) {
409 4147           float f = strtof("Inf", NULL);
410 4147           *a = nextafterf(*a, f);
411 4147           }
412              
413 4146           void flt_nextbelow( float * a) {
414 4146           float f = strtof("-Inf", NULL);
415 4146           *a = nextafterf(*a, f);
416 4146           }
417              
418 19003           void DESTROY(SV * obj) {
419             /* printf("Destroying object\n"); *//* debugging check */
420 19003           Safefree(INT2PTR( float *, SvIVX(SvRV(obj))));
421 19003           }
422              
423              
424              
425              
426              
427             MODULE = Math::Float32 PACKAGE = Math::Float32
428              
429             PROTOTYPES: DISABLE
430              
431              
432             SV *
433             _itsa (a)
434             SV * a
435             CODE:
436 27512           RETVAL = _itsa (aTHX_ a);
437             OUTPUT: RETVAL
438              
439             int
440             is_flt_nan (obj)
441             float * obj
442              
443             int
444             is_flt_inf (obj)
445             float * obj
446              
447             SV *
448             _fromFloat32 (in)
449             float * in
450             CODE:
451 8594           RETVAL = _fromFloat32 (aTHX_ in);
452             OUTPUT: RETVAL
453              
454             SV *
455             _fromNV (in)
456             SV * in
457             CODE:
458 394           RETVAL = _fromNV (aTHX_ in);
459             OUTPUT: RETVAL
460              
461             SV *
462             _fromIV (in)
463             SV * in
464             CODE:
465 399           RETVAL = _fromIV (aTHX_ in);
466             OUTPUT: RETVAL
467              
468             SV *
469             _fromPV (in)
470             SV * in
471             CODE:
472 9039           RETVAL = _fromPV (aTHX_ in);
473             OUTPUT: RETVAL
474              
475             SV *
476             flt_to_NV (obj)
477             float * obj
478             CODE:
479 278           RETVAL = flt_to_NV (aTHX_ obj);
480             OUTPUT: RETVAL
481              
482             void
483             _flt_set (a, b)
484             float * a
485             float * b
486             PREINIT:
487             I32* temp;
488             PPCODE:
489 1           temp = PL_markstack_ptr++;
490 1           _flt_set(a, b);
491 1 50         if (PL_markstack_ptr != temp) {
492             /* truly void, because dXSARGS not invoked */
493 1           PL_markstack_ptr = temp;
494 1           XSRETURN_EMPTY; /* return empty stack */
495             }
496             /* must have used dXSARGS; list context implied */
497 0           return;
498              
499             void
500             flt_set_nan (a)
501             float * a
502             PREINIT:
503             I32* temp;
504             PPCODE:
505 0           temp = PL_markstack_ptr++;
506 0           flt_set_nan(a);
507 0 0         if (PL_markstack_ptr != temp) {
508             /* truly void, because dXSARGS not invoked */
509 0           PL_markstack_ptr = temp;
510 0           XSRETURN_EMPTY; /* return empty stack */
511             }
512             /* must have used dXSARGS; list context implied */
513 0           return;
514              
515             void
516             flt_set_inf (a, is_pos)
517             float * a
518             int is_pos
519             PREINIT:
520             I32* temp;
521             PPCODE:
522 1           temp = PL_markstack_ptr++;
523 1           flt_set_inf(a, is_pos);
524 1 50         if (PL_markstack_ptr != temp) {
525             /* truly void, because dXSARGS not invoked */
526 1           PL_markstack_ptr = temp;
527 1           XSRETURN_EMPTY; /* return empty stack */
528             }
529             /* must have used dXSARGS; list context implied */
530 0           return;
531              
532             void
533             flt_set_zero (a, is_pos)
534             float * a
535             int is_pos
536             PREINIT:
537             I32* temp;
538             PPCODE:
539 0           temp = PL_markstack_ptr++;
540 0           flt_set_zero(a, is_pos);
541 0 0         if (PL_markstack_ptr != temp) {
542             /* truly void, because dXSARGS not invoked */
543 0           PL_markstack_ptr = temp;
544 0           XSRETURN_EMPTY; /* return empty stack */
545             }
546             /* must have used dXSARGS; list context implied */
547 0           return;
548              
549             SV *
550             _oload_add (a, b, third)
551             float * a
552             float * b
553             SV * third
554             CODE:
555 101           RETVAL = _oload_add (aTHX_ a, b, third);
556             OUTPUT: RETVAL
557              
558             SV *
559             _oload_sub (a, b, third)
560             float * a
561             float * b
562             SV * third
563             CODE:
564 181           RETVAL = _oload_sub (aTHX_ a, b, third);
565             OUTPUT: RETVAL
566              
567             SV *
568             _oload_mul (a, b, third)
569             float * a
570             float * b
571             SV * third
572             CODE:
573 141           RETVAL = _oload_mul (aTHX_ a, b, third);
574             OUTPUT: RETVAL
575              
576             SV *
577             _oload_div (a, b, third)
578             float * a
579             float * b
580             SV * third
581             CODE:
582 107           RETVAL = _oload_div (aTHX_ a, b, third);
583             OUTPUT: RETVAL
584              
585             SV *
586             _oload_fmod (a, b, third)
587             float * a
588             float * b
589             SV * third
590             CODE:
591 12           RETVAL = _oload_fmod (aTHX_ a, b, third);
592             OUTPUT: RETVAL
593              
594             SV *
595             _oload_pow (a, b, third)
596             float * a
597             float * b
598             SV * third
599             CODE:
600 28           RETVAL = _oload_pow (aTHX_ a, b, third);
601             OUTPUT: RETVAL
602              
603             int
604             _oload_equiv (a, b, third)
605             float * a
606             float * b
607             SV * third
608              
609             int
610             _oload_not_equiv (a, b, third)
611             float * a
612             float * b
613             SV * third
614              
615             int
616             _oload_gt (a, b, third)
617             float * a
618             float * b
619             SV * third
620             CODE:
621 26           RETVAL = _oload_gt (aTHX_ a, b, third);
622             OUTPUT: RETVAL
623              
624             int
625             _oload_gte (a, b, third)
626             float * a
627             float * b
628             SV * third
629             CODE:
630 66           RETVAL = _oload_gte (aTHX_ a, b, third);
631             OUTPUT: RETVAL
632              
633             int
634             _oload_lt (a, b, third)
635             float * a
636             float * b
637             SV * third
638             CODE:
639 28           RETVAL = _oload_lt (aTHX_ a, b, third);
640             OUTPUT: RETVAL
641              
642             int
643             _oload_lte (a, b, third)
644             float * a
645             float * b
646             SV * third
647             CODE:
648 66           RETVAL = _oload_lte (aTHX_ a, b, third);
649             OUTPUT: RETVAL
650              
651             SV *
652             _oload_spaceship (a, b, third)
653             float * a
654             float * b
655             SV * third
656             CODE:
657 48           RETVAL = _oload_spaceship (aTHX_ a, b, third);
658             OUTPUT: RETVAL
659              
660             int
661             _oload_not (a, second, third)
662             float * a
663             SV * second
664             SV * third
665              
666             int
667             _oload_bool (a, second, third)
668             float * a
669             SV * second
670             SV * third
671              
672             SV *
673             _oload_int (a, second, third)
674             float * a
675             SV * second
676             SV * third
677             CODE:
678 1           RETVAL = _oload_int (aTHX_ a, second, third);
679             OUTPUT: RETVAL
680              
681             SV *
682             _oload_log (a, second, third)
683             float * a
684             SV * second
685             SV * third
686             CODE:
687 1           RETVAL = _oload_log (aTHX_ a, second, third);
688             OUTPUT: RETVAL
689              
690             SV *
691             _oload_exp (a, second, third)
692             float * a
693             SV * second
694             SV * third
695             CODE:
696 1           RETVAL = _oload_exp (aTHX_ a, second, third);
697             OUTPUT: RETVAL
698              
699             SV *
700             _oload_sqrt (a, second, third)
701             float * a
702             SV * second
703             SV * third
704             CODE:
705 4           RETVAL = _oload_sqrt (aTHX_ a, second, third);
706             OUTPUT: RETVAL
707              
708             void
709             _unpack_flt_hex (f)
710             float * f
711             PREINIT:
712             I32* temp;
713             PPCODE:
714 8310           temp = PL_markstack_ptr++;
715 8310           _unpack_flt_hex(aTHX_ f);
716 8310 50         if (PL_markstack_ptr != temp) {
717             /* truly void, because dXSARGS not invoked */
718 0           PL_markstack_ptr = temp;
719 0           XSRETURN_EMPTY; /* return empty stack */
720             }
721             /* must have used dXSARGS; list context implied */
722 8310           return;
723              
724             void
725             nextafter_flt (rop, op1, op2)
726             float * rop
727             float * op1
728             float * op2
729             PREINIT:
730             I32* temp;
731             PPCODE:
732 0           temp = PL_markstack_ptr++;
733 0           nextafter_flt(rop, op1, op2);
734 0 0         if (PL_markstack_ptr != temp) {
735             /* truly void, because dXSARGS not invoked */
736 0           PL_markstack_ptr = temp;
737 0           XSRETURN_EMPTY; /* return empty stack */
738             }
739             /* must have used dXSARGS; list context implied */
740 0           return;
741              
742             void
743             flt_nextabove (a)
744             float * a
745             PREINIT:
746             I32* temp;
747             PPCODE:
748 4147           temp = PL_markstack_ptr++;
749 4147           flt_nextabove(a);
750 4147 50         if (PL_markstack_ptr != temp) {
751             /* truly void, because dXSARGS not invoked */
752 4147           PL_markstack_ptr = temp;
753 4147           XSRETURN_EMPTY; /* return empty stack */
754             }
755             /* must have used dXSARGS; list context implied */
756 0           return;
757              
758             void
759             flt_nextbelow (a)
760             float * a
761             PREINIT:
762             I32* temp;
763             PPCODE:
764 4146           temp = PL_markstack_ptr++;
765 4146           flt_nextbelow(a);
766 4146 50         if (PL_markstack_ptr != temp) {
767             /* truly void, because dXSARGS not invoked */
768 4146           PL_markstack_ptr = temp;
769 4146           XSRETURN_EMPTY; /* return empty stack */
770             }
771             /* must have used dXSARGS; list context implied */
772 0           return;
773              
774             void
775             DESTROY (obj)
776             SV * obj
777             PREINIT:
778             I32* temp;
779             PPCODE:
780 19003           temp = PL_markstack_ptr++;
781 19003           DESTROY(obj);
782 19003 50         if (PL_markstack_ptr != temp) {
783             /* truly void, because dXSARGS not invoked */
784 19003           PL_markstack_ptr = temp;
785 19003           XSRETURN_EMPTY; /* return empty stack */
786             }
787             /* must have used dXSARGS; list context implied */
788 0           return;
789