The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#define PERL_NO_GET_CONTEXT 1
#include "EXTERN.h"
#include "perl.h"
#include "getset0_callparser0.h"
#include "XSUB.h"

static OP *THX_parse_args_a(pTHX_ GV *namegv, SV *psobj, U32 *flags_p)
{
	PERL_UNUSED_ARG(namegv);
	PERL_UNUSED_ARG(psobj);
	PERL_UNUSED_ARG(flags_p);
	return newOP(OP_NULL, 0);
}

static OP *THX_parse_args_b(pTHX_ GV *namegv, SV *psobj, U32 *flags_p)
{
	PERL_UNUSED_ARG(namegv);
	PERL_UNUSED_ARG(flags_p);
	return newSVOP(OP_CONST, 0, SvREFCNT_inc(psobj));
}

MODULE = t::getset0 PACKAGE = t::getset0

PROTOTYPES: DISABLE

void
test_cv_getset_call_parser()
PROTOTYPE:
PREINIT:
	CV *t0_cv, *t1_cv;
	Perl_call_parser psfun;
	SV *psobj;
CODE:
#define croak_fail() croak("fail at " __FILE__ " line %d", __LINE__)
#define croak_fail_ne(h, w) \
	croak("fail %p!=%p at " __FILE__ " line %d", (h), (w), __LINE__)
#define check_cp(cv, xpsfun, xpsobj) \
	do { \
		cv_get_call_parser((cv), &psfun, &psobj); \
		if (psfun != (xpsfun)) \
			croak_fail_ne(FPTR2DPTR(void *, psfun), xpsfun); \
		if (psobj != (xpsobj)) \
			croak_fail_ne(FPTR2DPTR(void *, psobj), xpsobj); \
	} while(0)
	t0_cv = get_cv("t::getset0::t0", 0);
	t1_cv = get_cv("t::getset0::t1", 0);
	check_cp(t0_cv, (Perl_call_parser)NULL, (SV*)NULL);
	check_cp(t1_cv, (Perl_call_parser)NULL, (SV*)NULL);
	cv_set_call_parser(t1_cv, THX_parse_args_a, &PL_sv_yes);
	check_cp(t0_cv, (Perl_call_parser)NULL, (SV*)NULL);
	check_cp(t1_cv, THX_parse_args_a, &PL_sv_yes);
	cv_set_call_parser(t0_cv, THX_parse_args_b, &PL_sv_no);
	check_cp(t0_cv, THX_parse_args_b, &PL_sv_no);
	check_cp(t1_cv, THX_parse_args_a, &PL_sv_yes);
	cv_set_call_parser(t1_cv, (Perl_call_parser)NULL, (SV*)NULL);
	check_cp(t0_cv, THX_parse_args_b, &PL_sv_no);
	check_cp(t1_cv, (Perl_call_parser)NULL, (SV*)NULL);
	cv_set_call_parser(t0_cv, (Perl_call_parser)NULL, (SV*)NULL);
	check_cp(t0_cv, (Perl_call_parser)NULL, (SV*)NULL);
	check_cp(t1_cv, (Perl_call_parser)NULL, (SV*)NULL);
	if (SvMAGICAL((SV*)t0_cv) || SvMAGIC((SV*)t0_cv)) croak_fail();
	if (SvMAGICAL((SV*)t1_cv) || SvMAGIC((SV*)t1_cv)) croak_fail();
#undef check_cp
#undef croak_fail_ne
#undef croak_fail

void
t0()
PROTOTYPE:
CODE:
	;

void
t1()
PROTOTYPE:
CODE:
	;