# New Ticket Created by Itsuki Toyota
# Please include the string: [perl #129784]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=129784 >
See the following codes and results. ( Sorry, it's little bit long. )
* codes *
t/01-basic.t
-----------------------------------------
use v6;
use Test;
use NativeCall;
use lib <lib t>;
use CompileTestLib;
compile_test_lib('01-basic');
sub ary_assign_malloc(CArray[int32] is rw) is native("./01-basic") { * }
sub ptr_assign_malloc(Pointer[int32] is rw) is native("./01-basic") { * }
sub new_malloc() returns Pointer[int32] is native("./01-basic") { * }
subtest {
my CArray[int32] $a = nativecast(CArray[int32], new_malloc());
is $a[100], 100;
}, "correct way";
subtest {
my CArray[int32] $a;
ary_assign_malloc($a);
my $aa = nativecast(CArray[int32], $a);
is $aa[100], 100;
my CArray[int32] $b .= new;
ary_assign_malloc($b);
my $bb = nativecast(CArray[int32], $b);
is $bb[100], 100;
}, "ary_assign test";
subtest {
my Pointer[int32] $a;
ptr_assign_malloc($a);
my $aa = nativecast(CArray[int32], $a);
is $aa[100], 100;
my Pointer[int32] $b .= new;
ptr_assign_malloc($b);
my $bb = nativecast(CArray[int32], $b);
is $bb[100], 100;
}, "ptr_assign test";
done-testing;
-----------------------------------------
t/01-basic.c
-----------------------------------------
#else
#define DLLEXPORT extern
#endif
DLLEXPORT void ptr_assign_malloc(int* item)
{
int i = 0;
item = (int*)malloc(sizeof(int) * 1000);
for(; i < 1000; i++) {
item[i] = i;
}
}
DLLEXPORT void ary_assign_malloc(int* item)
{
int i = 0;
item = (int*)malloc(sizeof(int) * 1000);
for(; i < 1000; i++) {
item[i] = i;
}
}
DLLEXPORT int* new_malloc()
{
int i = 0;
int* item = (int*)malloc(sizeof(int) * 1000);
for(; i < 1000; i++) {
item[i] = i;
}
return item;
}
-----------------------------------------
t/01-basic.h
-----------------------------------------
#if ! defined(HEADER_BASIC_H)
#define HEADER_BASIC_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
} /* closing brace for extern "C" */
#endif
#endif /* HEADER_BASIC_H */
-----------------------------------------
t/CompileTestLib.pm
(short version of rakudo's one)
-----------------------------------------
unit module CompileTestLib;
my @cleanup; # files to be cleaned up afterwards
sub compile_test_lib($name) is export {
my ($c_line, $l_line);
my $VM := $*VM;
my $cfg := $VM.config;
my $libname = $VM.platform-library-name($name.IO);
if $VM.name eq 'moar' {
my $o = $cfg<obj>;
# MoarVM exposes exposes GNU make directives here, but we cannot pass
this to gcc directly.
my $ldshared = $cfg<ldshared>.subst(/'--out-implib,lib$(notdir $@).a'/,
"--out-implib,$libname.a");
$c_line = "$cfg<cc> -c $cfg<ccshared> $cfg<ccout>$name$o $cfg<cflags>
t/$name.c";
$l_line = "$cfg<ld> $ldshared $cfg<ldflags> $cfg<ldlibs>
$cfg<ldout>$libname $name$o";
@cleanup = << "$libname" "$name$o" >>;
}
elsif $VM.name eq 'jvm' {
$c_line = "$cfg<nativecall.cc> -c $cfg<nativecall.ccdlflags>
-o$name$cfg<nativecall.o> $cfg<nativecall.ccflags> t/04-nativecall/$name.c";
$l_line = "$cfg<nativecall.ld> $cfg<nativecall.perllibs>
$cfg<nativecall.lddlflags> $cfg<nativecall.ldflags>
$cfg<nativecall.ldout>$libname $name$cfg<nativecall.o>";
@cleanup = << $libname "$name$cfg<nativecall.o>" >>;
}
else {
die "Unknown VM; don't know how to compile test libraries";
}
shell($c_line);
shell($l_line);
}
END {
# say "cleaning up @cleanup[]";
unlink @cleanup;
}
-----------------------------------------
* codes end *
* results *
-----------------------------------------
$ mi6 test -v
==> Set PERL6LIB=/home/itoyota/Programs/p6-Foo/lib
==> prove -e /home/itoyota/.rakudobrew/bin/../moar-nom/install/bin/perl6 -r -v
./t/01-basic.t ..
ok 1 -
1..1
ok 1 - correct way
not ok 1 -
# Failed test at ./t/01-basic.t line 21
# expected: '100'
# got: (Any)
not ok 2 -
# Failed test at ./t/01-basic.t line 26
# expected: '100'
# got: '0'
1..2
# Looks like you failed 2 tests of 2
not ok 2 - ary_assign test
# Failed test 'ary_assign test'
# at ./t/01-basic.t line 17
not ok 1 -
# Failed test at ./t/01-basic.t line 33
# expected: '100'
# got: (Any)
not ok 2 -
# Failed test at ./t/01-basic.t line 38
1..2
# expected: '100'
# got: (Any)
# Looks like you failed 2 tests of 2
not ok 3 - ptr_assign test
# Failed test 'ptr_assign test'
# at ./t/01-basic.t line 29
1..3
# Looks like you failed 2 tests of 3
Dubious, test returned 2 (wstat 512, 0x200)
Failed 2/3 subtests
Test Summary Report
-------------------
./t/01-basic.t (Wstat: 512 Tests: 3 Failed: 2)
Failed tests: 2-3
Non-zero exit status: 2
Files=1, Tests=3, 1 wallclock secs ( 0.03 usr 0.00 sys + 0.65 cusr 0.06
csys = 0.74 CPU)
Result: FAIL
-----------------------------------------
* results end *
I think:
1) The 3rd subtest (i.e. "ptr_assign test" subtest) should work correctly same
as the 1st subtest (i.e. "correct way" subtest).
2) The 2nd subtest (i.e. "ary_assign test" subtest) should return the compile
error message, because malloc returns not CArray[int32] but Pointer[int32].
titsuki