1 #define PERL_IN_XS_APITEST
9 #define MY_CXT_KEY "XS::APItest::_guts" XS_VERSION
18 /* indirect functions to test the [pa]MY_CXT macros */
20 my_cxt_getint_p(pMY_CXT)
25 my_cxt_setint_p(pMY_CXT_ int i)
30 my_cxt_setsv_p(SV* sv _pMY_CXT)
37 /* from exception.c */
40 /* A routine to test hv_delayfree_ent
41 (which itself is tested by testing on hv_free_ent */
43 typedef void (freeent_function)(pTHX_ HV *, register HE *);
46 test_freeent(freeent_function *f) {
49 HV *test_hash = newHV();
56 victim = (HE*)safemalloc(sizeof(HE));
58 /* Storing then deleting something should ensure that a hash entry is
60 hv_store(test_hash, "", 0, &PL_sv_yes, 0);
61 hv_delete(test_hash, "", 0, 0);
63 /* We need to "inline" new_he here as it's static, and the functions we
64 test expect to be able to call del_HE on the HE */
65 if (!PL_body_roots[HE_SVSLOT])
66 croak("PL_he_root is 0");
67 victim = PL_body_roots[HE_SVSLOT];
68 PL_body_roots[HE_SVSLOT] = HeNEXT(victim);
71 victim->hent_hek = Perl_share_hek(aTHX_ "", 0, 0);
73 test_scalar = newSV(0);
74 SvREFCNT_inc(test_scalar);
75 victim->hent_val = test_scalar;
77 /* Need this little game else we free the temps on the return stack. */
78 results[0] = SvREFCNT(test_scalar);
80 results[1] = SvREFCNT(test_scalar);
81 f(aTHX_ test_hash, victim);
82 results[2] = SvREFCNT(test_scalar);
84 results[3] = SvREFCNT(test_scalar);
89 } while (++i < sizeof(results)/sizeof(results[0]));
91 /* Goodbye to our extra reference. */
92 SvREFCNT_dec(test_scalar);
95 MODULE = XS::APItest:Hash PACKAGE = XS::APItest::Hash
97 #define UTF8KLEN(sv, len) (SvUTF8(sv) ? -(I32)len : (I32)len)
108 key = SvPV(key_sv, len);
109 RETVAL = hv_exists(hash, key, UTF8KLEN(key_sv, len));
122 key = SvPV(key_sv, len);
123 /* It's already mortal, so need to increase reference count. */
124 RETVAL = SvREFCNT_inc(hv_delete(hash, key, UTF8KLEN(key_sv, len), 0));
129 store_ent(hash, key, value)
139 result = hv_store_ent(hash, key, copy, 0);
140 SvSetMagicSV(copy, value);
145 /* It's about to become mortal, so need to increase reference count.
147 RETVAL = SvREFCNT_inc(HeVAL(result));
153 store(hash, key_sv, value)
164 key = SvPV(key_sv, len);
166 result = hv_store(hash, key, UTF8KLEN(key_sv, len), copy, 0);
167 SvSetMagicSV(copy, value);
172 /* It's about to become mortal, so need to increase reference count.
174 RETVAL = SvREFCNT_inc(*result);
189 key = SvPV(key_sv, len);
190 result = hv_fetch(hash, key, UTF8KLEN(key_sv, len), 0);
195 RETVAL = newSVsv(*result);
202 test_freeent(&Perl_hv_free_ent);
206 test_hv_delayfree_ent()
208 test_freeent(&Perl_hv_delayfree_ent);
213 sub TIEHASH { bless {}, $_[0] }
214 sub STORE { $_[0]->{$_[1]} = $_[2] }
215 sub FETCH { $_[0]->{$_[1]} }
216 sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} }
217 sub NEXTKEY { each %{$_[0]} }
218 sub EXISTS { exists $_[0]->{$_[1]} }
219 sub DELETE { delete $_[0]->{$_[1]} }
220 sub CLEAR { %{$_[0]} = () }
224 MODULE = XS::APItest PACKAGE = XS::APItest
232 MY_CXT.sv = newSVpv("initial",0);
239 MY_CXT.sv = newSVpv("initial_clone",0);
245 printf("%5.3f\n",val);
250 #ifdef HAS_LONG_DOUBLE
261 #ifdef HAS_LONG_DOUBLE
262 # if defined(PERL_PRIfldbl) && (LONG_DOUBLESIZE > DOUBLESIZE)
263 long double val = 7.0;
264 printf("%5.3" PERL_PRIfldbl "\n",val);
267 printf("%5.3f\n",val);
287 printf("%5.3f\n",val);
364 call_sv(sv, flags, ...)
370 for (i=0; i<items-2; i++)
371 ST(i) = ST(i+2); /* pop first two args */
375 i = call_sv(sv, flags);
378 PUSHs(sv_2mortal(newSViv(i)));
381 call_pv(subname, flags, ...)
387 for (i=0; i<items-2; i++)
388 ST(i) = ST(i+2); /* pop first two args */
392 i = call_pv(subname, flags);
395 PUSHs(sv_2mortal(newSViv(i)));
398 call_method(methname, flags, ...)
404 for (i=0; i<items-2; i++)
405 ST(i) = ST(i+2); /* pop first two args */
409 i = call_method(methname, flags);
412 PUSHs(sv_2mortal(newSViv(i)));
422 i = eval_sv(sv, flags);
425 PUSHs(sv_2mortal(newSViv(i)));
428 eval_pv(p, croak_on_error)
434 PUSHs(eval_pv(p, croak_on_error));
453 Perl_croak(aTHX_ "%s", pv);
458 RETVAL = newRV_inc((SV*)PL_strtab);
466 RETVAL = my_cxt_getint_p(aMY_CXT);
475 my_cxt_setint_p(aMY_CXT_ i);
490 SvREFCNT_dec(MY_CXT.sv);
491 my_cxt_setsv_p(sv _aMY_CXT);