Sat Apr 20 02:53:07 2013: Request 11748 was acted upon.
Transaction: Correspondence added by iang
Queue: Inline
Subject: Inline::CPP config gets lost because of Inline::C bug
Broken in: (no value)
Severity: Important
Owner: Nobody
Requestors: [email protected]
Status: open
Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=11748 >
On Mon Jun 29 19:24:59 2009, SISYPHUS wrote:
> On Fri Mar 04 06:12:48 2005, guest wrote:
> > It had seemed that Inline::CPP ignores INC Config option, but the bug
> > has been discovered in Inline::C: $o->{ILSM}{MAKEFILE}{INC} gets
> > erased each time validate() sub is called (sometimes it occurs
> > several times per script execution).
>
> A simple script demonstrating the precise problem would be handy, just
> to make sure that we (I) understand correctly. I'm not sure that the
> suggested patch is really necessary ... though there's probably no
> compelling reason to reject it.
>
> Cheers,
> Rob
I think the fault is in Inline::CPP, not Inline::C. If Inline::CPP generates
typemap data (if $typemap has non-zero length in Inline::CPP::write_typemap)
then Inline::CPP::validate is called with the generated TYPEMAP data passed,
but this calls Inline::C::validate, which sets $o->{ILSM}{MAKEFILE}{INC},
unless $o->UNTAINT is set.
A simple script which elicits the problem is as follows. The extra include
directory is useless, but it is also lost. Sorry, but the real case I was
working on is a lengthy mess at the moment and I don't know a simple case where
the extra include is actually needed.
Part of the issue is that when validating TYPEMAP, all the other options are
not passed to Inlince::C::validate. The initialization there sets INC and the
previously passed value is not appended because it is not passed, only the
TYPEMAP is passed.
#!C:/strawberry/perl/bin/perl.exe
#
use strict;
use warnings;
use Inline ('CPP' => 'DATA',
'INC' => '-IC:/',
);
print "9 + 16 = ", add(9, 16), "\n";
__END__
__CPP__
// change 7
int add(int x, int y) {
return x + y;
}
// Adding the following class causes Inline:CPP to generate
// typemap data which is validated. The validation of the
// typemap data causes the configuration of INC to be lost
// In this case, Inline::C::validate, which is called from
// Inline::CPP::validate, sets $o->{ILSM}{MAKEFILE}{INC}
// unless $o->UNTAINT is set.
class CRectangle {
int x, y;
public:
void set_values(int, int);
int area() { return(x*y); }
};
void CRectangle::set_values(int a, int b) {
x = a;
y = b;
}