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);";

Reply via email to