Ian Goodacre via RT
2013-04-20 06:53:08 UTC
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: nick_msu-***@public.gmane.org
Status: open
Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=11748 >
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;
}
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: nick_msu-***@public.gmane.org
Status: open
Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=11748 >
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, justhas 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).
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
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;
}