http://qs321.pair.com?node_id=123392


in reply to Re: XS routine returns an extra depth of array refs
in thread XS routine returns an extra depth of array refs

If you really want to output arrays from C, you need to push your items on the stack.

Right, that's the ticket. This seems to work the way I want:

#include <sys/types.h> #include <dirent.h> #include <stdio.h> void readdir_inode(dirname) char* dirname INIT: struct dirent *ent; DIR* dir; SV* record[2]; AV *entry, *ret_val; PPCODE: dir = opendir(dirname); if (dir) { while ((ent=readdir(dir))) { printf("%ld %x\n", ent->d_ino, ent->d_name); record[0] = newSVpv(ent->d_name, 0); record[1] = newSViv((IV)ent->d_ino); PUSHs(newRV_noinc(av_make(2, record))); } closedir(dir); }

At least, I hope that last "newRV_noinc" shouldn't be a "newRV_inc"!

Replies are listed 'Best First'.
Re:{3} XS routine returns an extra depth of array refs
by jeroenes (Priest) on Nov 05, 2001 at 23:48 UTC
    It should be newRV_inc. :-)

    Only with inline the refcounter of the SV gets auto-incremented. With XS you have to that yourself.

    Update: For clarity, only the refcounter of the SV that gets returned! Other SV*'s you have to inc manually!

      The whole reason I'm not using Inline is because I want to be able to compile this as a module and not have it try to compile stuff at run time!
        Modules using Inline are compiled only once and this can be done during installation or even before distribution (for win32 for ex.).

        You have to modify your Makefile.PL for that, it's in the docs.