Eshu

 view release on metacpan or  search on metacpan

include/eshu_xs.h  view on Meta::CPAN

static int eshu_xs_is_module_line(const char *content, const char *eol) {
	const char *p = content;
	if (eol - p < 8) return 0;
	if (memcmp(p, "MODULE", 6) != 0) return 0;
	p += 6;
	while (p < eol && (*p == ' ' || *p == '\t')) p++;
	return (p < eol && *p == '=');
}

/* XS labels: CODE, INIT, OUTPUT, PREINIT, CLEANUP, POSTCALL,
 * PPCODE, BOOT, CASE, INTERFACE, INTERFACE_MACRO, PROTOTYPES,
 * VERSIONCHECK, INCLUDE, FALLBACK, OVERLOAD, ALIAS, ATTRS */
static int eshu_xs_is_label(const char *content, const char *eol,
                            int *is_boot) {
	const char *p = content;
	const char *start;
	int len;

	*is_boot = 0;

	/* must start with alpha */

include/eshu_xs.h  view on Meta::CPAN

	/* it also must not be a :: (package separator) */
	if (p + 1 < eol && *(p + 1) == ':') return 0;

	/* Known XS labels */
	if ((len == 4 && memcmp(start, "CODE", 4) == 0) ||
	    (len == 4 && memcmp(start, "INIT", 4) == 0) ||
	    (len == 6 && memcmp(start, "OUTPUT", 6) == 0) ||
	    (len == 7 && memcmp(start, "PREINIT", 7) == 0) ||
	    (len == 7 && memcmp(start, "CLEANUP", 7) == 0) ||
	    (len == 8 && memcmp(start, "POSTCALL", 8) == 0) ||
	    (len == 6 && memcmp(start, "PPCODE", 6) == 0) ||
	    (len == 4 && memcmp(start, "CASE", 4) == 0) ||
	    (len == 9 && memcmp(start, "INTERFACE", 9) == 0) ||
	    (len == 15 && memcmp(start, "INTERFACE_MACRO", 15) == 0) ||
	    (len == 10 && memcmp(start, "PROTOTYPES", 10) == 0) ||
	    (len == 12 && memcmp(start, "VERSIONCHECK", 12) == 0) ||
	    (len == 7 && memcmp(start, "INCLUDE", 7) == 0) ||
	    (len == 8 && memcmp(start, "FALLBACK", 8) == 0) ||
	    (len == 8 && memcmp(start, "OVERLOAD", 8) == 0) ||
	    (len == 5 && memcmp(start, "ALIAS", 5) == 0) ||
	    (len == 5 && memcmp(start, "ATTRS", 5) == 0)) {

t/22-xs-labels.t  view on Meta::CPAN

	OUTPUT:
		RETVAL
	CLEANUP:
		free(val);
END

	my $got = Eshu->indent_xs($input);
	is($got, $expected, 'CLEANUP label at depth 1');
}

# PPCODE label
{
	my $input = <<'END';
MODULE = Foo  PACKAGE = Foo

void
get_pair()
PPCODE:
XPUSHs(sv_2mortal(newSViv(1)));
XPUSHs(sv_2mortal(newSViv(2)));
XSRETURN(2);
END

	my $expected = <<'END';
MODULE = Foo  PACKAGE = Foo

void
get_pair()
	PPCODE:
		XPUSHs(sv_2mortal(newSViv(1)));
		XPUSHs(sv_2mortal(newSViv(2)));
		XSRETURN(2);
END

	my $got = Eshu->indent_xs($input);
	is($got, $expected, 'PPCODE label at depth 1');
}

# INIT label (inside XSUB, not the Perl INIT{} block)
{
	my $input = <<'END';
MODULE = Foo  PACKAGE = Foo

int
sum(a, b)
int a

t/26-xs-advanced.t  view on Meta::CPAN

		}
		RETVAL = count;
	OUTPUT:
		RETVAL
END

	my $got = Eshu->indent_xs($input);
	is($got, $expected, 'XSUB with nested C control flow in CODE');
}

# XSUB with PPCODE (list context)
{
	my $input = <<'END';
MODULE = Foo  PACKAGE = Foo

void
get_pair(self)
SV * self
PPCODE:
XPUSHs(sv_2mortal(newSVpvs("key")));
XPUSHs(sv_2mortal(newSViv(42)));
END

	my $expected = <<'END';
MODULE = Foo  PACKAGE = Foo

void
get_pair(self)
	SV * self
	PPCODE:
		XPUSHs(sv_2mortal(newSVpvs("key")));
		XPUSHs(sv_2mortal(newSViv(42)));
END

	my $got = Eshu->indent_xs($input);
	is($got, $expected, 'XSUB with PPCODE for list context');
}

done_testing();



( run in 1.724 second using v1.01-cache-2.11-cpan-5511b514fd6 )