Author: infinoid
Date: Thu Jul 24 08:30:16 2008
New Revision: 29723
Modified:
trunk/config/gen/call_list/misc.in
trunk/src/libnci_test.def
trunk/src/nci_test.c
trunk/t/pmc/nci.t
trunk/tools/build/nativecall.pl
Log:
[nci] Apply patch from donaldh++ in RT #56828, with whitespace fixes.
* Add "V" NCI signature, for opaque void** writeback pointers.
* Add a test for it.
Modified: trunk/config/gen/call_list/misc.in
==============================================================================
--- trunk/config/gen/call_list/misc.in (original)
+++ trunk/config/gen/call_list/misc.in Thu Jul 24 08:30:16 2008
@@ -353,3 +353,6 @@
i JOt
i Jt
i Ji
+
+v Vi
+v p
Modified: trunk/src/libnci_test.def
==============================================================================
--- trunk/src/libnci_test.def (original)
+++ trunk/src/libnci_test.def Thu Jul 24 08:30:16 2008
@@ -32,6 +32,8 @@
nci_vP
nci_vpii
nci_vv
+ nci_vVi
+ nci_vp
nci_cb_C1
nci_cb_C2
nci_cb_C3
Modified: trunk/src/nci_test.c
==============================================================================
--- trunk/src/nci_test.c (original)
+++ trunk/src/nci_test.c Thu Jul 24 08:30:16 2008
@@ -58,6 +58,10 @@
int w, h;
} Rect_Like;
+typedef struct Opaque {
+ int x;
+} Opaque;
+
/* Function declarations.
*** If you add a new test function here,
@@ -98,6 +102,8 @@
PARROT_API void nci_vP(void *);
PARROT_API void nci_vpii(Outer *, int, int);
PARROT_API void nci_vv(void);
+PARROT_API void nci_vVi(Opaque**, int);
+PARROT_API void nci_vp(Opaque*);
/* Declarations for callback tests */
@@ -1044,6 +1050,47 @@
nci_dlvar_int *= 3;
}
+/*
+
+=item C<PARROT_API void
+nci_vVi(Opaque**, int)>
+
+Test an NCI opaque struct out value.
+
+=cut
+
+*/
+
+PARROT_API void
+nci_vVi(Opaque **outOpaque, int x)
+{
+ static Opaque opaque;
+ opaque.x = x;
+ *outOpaque = &opaque;
+}
+
+/*
+
+=item C<PARROT_API int
+nci_vp(Opaque*)>
+
+Test that a previously generated opaque struct gets passed back
+to an NCI function correctly.
+
+=cut
+
+*/
+
+PARROT_API void
+nci_vp(Opaque *inOpaque)
+{
+ if (inOpaque)
+ printf("got %d\n", inOpaque->x);
+ else
+ printf("got null");
+}
+
+
#ifdef TEST
char l2 = 4;
Modified: trunk/t/pmc/nci.t
==============================================================================
--- trunk/t/pmc/nci.t (original)
+++ trunk/t/pmc/nci.t Thu Jul 24 08:30:16 2008
@@ -6,7 +6,7 @@
use warnings;
use lib qw( . lib ../lib ../../lib );
use Test::More;
-use Parrot::Test tests => 65;
+use Parrot::Test tests => 66;
use Parrot::Config qw(%PConfig);
=head1 NAME
@@ -2645,6 +2645,29 @@
3
OUTPUT
+pir_output_is( << 'CODE', << 'OUTPUT', "nci_vVi - void** out parameter" );
+.sub test :main
+ .local string library_name
+ library_name = 'libnci_test'
+ .local pmc libnci_test
+ libnci_test = loadlib library_name
+
+ .local pmc nci_vVi
+ nci_vVi = dlfunc libnci_test, "nci_vVi", "vVi"
+
+ .local pmc nci_vp
+ nci_vp = dlfunc libnci_test, "nci_vp", "vp"
+
+ .local pmc opaque
+ opaque = new 'Pointer'
+ $I0 = 10
+ nci_vVi(opaque, $I0)
+ nci_vp(opaque)
+.end
+CODE
+got 10
+OUTPUT
+
# Local Variables:
# mode: cperl
# cperl-indent-level: 4
Modified: trunk/tools/build/nativecall.pl
==============================================================================
--- trunk/tools/build/nativecall.pl (original)
+++ trunk/tools/build/nativecall.pl Thu Jul 24 08:30:16 2008
@@ -82,6 +82,7 @@
B => "void **",
L => "long *",
T => "char **",
+ V => "void **",
'@' => "PMC *", # slurpy array
);
@@ -186,6 +187,7 @@
N => "N",
B => "S",
v => "v",
+ V => "P",
J => "",
'@' => '@',
);
@@ -439,6 +441,11 @@
push @{$extra_preamble_ref}, "t_$temp_num = GET_NCI_P($reg_num);";
return "PMC_data(t_$temp_num)";
};
+ /V/ && do {
+ push @{$temps_ref}, "PMC *t_$temp_num;";
+ push @{$extra_preamble_ref}, "t_$temp_num = GET_NCI_P($reg_num);";
+ return "(void**)&PMC_data(t_$temp_num)";
+ };
/i/ && do {
push @{$temps_ref}, "int t_$temp_num;";
push @{$extra_preamble_ref}, "t_$temp_num = (int)GET_NCI_I($reg_num);";