File: cv_set_anysv_refcounted.c.inc

package info (click to toggle)
libfuture-xs-perl 0.13-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 212 kB
  • sloc: ansic: 1,464; perl: 181; makefile: 3
file content (40 lines) | stat: -rw-r--r-- 1,128 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/* vi: set ft=c : */

#if HAVE_PERL_VERSION(5, 26, 0)
#  define XSANY_sv                  XSANY.any_sv
#  define CvXSUBANY_sv(cv)          CvXSUBANY(cv).any_sv
#  define CvXSUBANY_sv_set(cv, sv)  (CvXSUBANY(cv).any_sv = (sv))
#else
   /* Older perls did not have a .any_sv; we'll just cast the .any_ptr pointer */
#  define XSANY_sv          ((SV *)XSANY.any_ptr)
#  define CvXSUBANY_sv(cv)  ((SV *)CvXSUBANY(cv).any_ptr)
#  define CvXSUBANY_sv_set(cv, sv)  (CvXSUBANY(cv).any_ptr = (sv))
#endif

#ifdef CvREFCOUNTED_ANYSV
#  define HAVE_CVREFCOUNTED_ANYSV
#endif

#ifndef HAVE_CVREFCOUNTED_ANYSV
static int free_anysv_refcounted(pTHX_ SV *sv, MAGIC *mg)
{
  SvREFCNT_dec(CvXSUBANY_sv((CV *)sv));
  return 0;
}

static MGVTBL vtbl_anysv_refcounted = {
  .svt_free = &free_anysv_refcounted,
};
#endif

#define cv_set_anysv_refcounted(cv, sv)  S_cv_set_anysv_refcounted(aTHX_ cv, sv)
static void S_cv_set_anysv_refcounted(pTHX_ CV *cv, SV *sv)
{
  CvXSUBANY_sv_set(cv, sv);

#ifdef HAVE_CVREFCOUNTED_ANYSV
  CvREFCOUNTED_ANYSV_on(cv);
#else
  sv_magicext((SV *)cv, NULL, PERL_MAGIC_ext, &vtbl_anysv_refcounted, NULL, 0);
#endif
}