Hi,

The following test script works fine, and simply outputs '3 5'.

-----------------------------------------
use warnings;
use Inline C => <<'EOC';

void call_me_stupid(int a, int b) {
     Inline_Stack_Vars;
     Inline_Stack_Reset;
     Inline_Stack_Push(sv_2mortal(newSViv(a)));
     Inline_Stack_Push(sv_2mortal(newSViv(b)));
     Inline_Stack_Done;
     perl_call_pv("main::me_stupid", G_DISCARD);
     Inline_Stack_Void;
}

EOC

#for(1..4) {
#print "$_: ";
call_me_stupid(3, 5);
#}

sub me_stupid {
    print "$_[0] $_[1]\n";
    }

__END__

But if I alter the above perl code by removing the 3 '#'s, then I get the following output:
1: 1 4
2:


3:

4:

That's on Win2000, perl 5.6.1. On perl 5.8.4 the blank lines of output are replaced with a warning about "uninitialised value".
What on Earth is happening ? Note that an error occurs with the very first iteration.


The C code that Inline generates can be found below my sig.

Cheers,
Rob


#line 1 "stupid_pl_6bb4.xs" #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "INLINE.h"

void call_me_stupid(int a, int b) {

     Inline_Stack_Vars;
     Inline_Stack_Reset;
     Inline_Stack_Push(sv_2mortal(newSViv(a)));
     Inline_Stack_Push(sv_2mortal(newSViv(b)));
     Inline_Stack_Done;
     perl_call_pv("main::me_stupid", G_DISCARD);
     Inline_Stack_Void;
}


#ifndef PERL_UNUSED_VAR # define PERL_UNUSED_VAR(var) if (0) var = var #endif

#line 32 "stupid_pl_6bb4.c"
XS(XS_main_call_me_stupid); /* prototype to pass -Wmissing-prototypes */
XS(XS_main_call_me_stupid)
{
    dXSARGS;
    if (items != 2)
        Perl_croak(aTHX_ "Usage: main::call_me_stupid(a, b)");
    PERL_UNUSED_VAR(cv); /* -W */
    PERL_UNUSED_VAR(ax); /* -Wall */
    SP -= items;
    {
        int     a = (int)SvIV(ST(0));
        int     b = (int)SvIV(ST(1));
#line 28 "stupid_pl_6bb4.xs"
        I32* temp;
#line 47 "stupid_pl_6bb4.c"
#line 30 "stupid_pl_6bb4.xs"
        temp = PL_markstack_ptr++;
        call_me_stupid(a, b);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */
#line 58 "stupid_pl_6bb4.c"
        PUTBACK;
        return;
    }
}

#ifdef __cplusplus
extern "C"
#endif
XS(boot_stupid_pl_6bb4); /* prototype to pass -Wmissing-prototypes */
XS(boot_stupid_pl_6bb4)
{
    dXSARGS;
    char* file = __FILE__;

    PERL_UNUSED_VAR(cv); /* -W */
    PERL_UNUSED_VAR(items); /* -W */
    XS_VERSION_BOOTCHECK ;

        newXS("main::call_me_stupid", XS_main_call_me_stupid, file);
    XSRETURN_YES;
}



Reply via email to