I'm writing an SQLite extension. I have it working fine in PIR, but the
bridge to Perl 6 is causing problems. Specifically, this Perl 6 code works:
SQLite::pmc_check(SQLite::open("test.db"));
# Returning 0x2d1efa0
# PMC 0xedf1a8 data pointer 0x2d1efa0
# PMC 0xedf1a8 data pointer 0x2d1efa0
But this code does not:
our $db; SQLite::pmc_check($db = SQLite::open("test.db"));
# Returning 0x2d1a850
# PMC 0x263f504 data pointer 0x2d1a850
# PMC 0x263f590 data pointer 0x0
SQLite::open is implemented in PIR, as follows:
.sub open
.local pmc x
x = open_wrapper("test.db")
pmc_check(x)
.return(x)
.end
pmc_check is a simple C function to tell me what's going on inside my
UnManagedStruct:
void pmc_check(PMC* pmc) {
printf("PMC %p data pointer %p\n", pmc, pmc->data);
}
The difference is, of course, that it goes through a Perl 6 variable
assignment.
>From this I can conclude that my PIR open() code correctly returns an
UnManagedStruct PMC; however, when Perl 6's assignment operator assigns
this to a variable, a new, empty UnManagedStruct PMC is created and no
longer contains the right data.
I have no idea how to fix this, but it looks like the assignment
operator is broken.
Simon