cvsuser     04/09/16 05:22:35

  Modified:    src      nci_test.c
               t/pmc    nci.t
  Log:
  [perl #31590]
  
  this patch adds two tests to t/pmc/nci.t.
  One test retrieves a pointer to a static integer in libnci.so, modifies the
  referenced integer, and check wether the modification has taken place.
  
  Furthermore I tried to make the naming of the tests more consistent.
  
  Courtesy of Bernhard Schmalhofer <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.30      +47 -18    parrot/src/nci_test.c
  
  Index: nci_test.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/nci_test.c,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -w -r1.29 -r1.30
  --- nci_test.c        6 Sep 2004 12:13:21 -0000       1.29
  +++ nci_test.c        16 Sep 2004 12:22:34 -0000      1.30
  @@ -1,10 +1,10 @@
   /*
   Copyright: 2001-2004 The Perl Foundation.  All Rights Reserved.
  -$Id: nci_test.c,v 1.29 2004/09/06 12:13:21 leo Exp $
  +$Id: nci_test.c,v 1.30 2004/09/16 12:22:34 jrieks Exp $
   
   =head1 NAME
   
  -src/nci_test.c - tests of the NCI use this as an example shared library 
  +src/nci_test.c - shared library used for testing the Native Call Interface
   
   =head1 DESCRIPTION
   
  @@ -18,25 +18,20 @@
   
      parrot/runtime/parrot/dynext/libnci.so
   
  -At that location the shared library should be loadable with the opcode 'loadlib'. 
  -The functions should be loadable with the opcode 'dlfunc'.
  +At that location the shared library is loadable with the opcode 'loadlib'. 
  +The functions in the library are available with the opcode 'dlfunc'.
   
   =head1 Functions
   
   The name of a test function is usually 'nci_<signature>'. E.g. the function
   'nci_ip' takes a 'pointer' and returns a 'int'.
   
  -=head1 SEE ALSO:
  -
  -  F<docs/pdds/pdd16_native_call.pod>
  -  F<config/gen/makefiles/root.in>
  -  F<t/pmc/nci.t>
  - 
   =cut
   
   */
   
   #include <stdio.h>
  +#include <stdlib.h>
   
   /*
   
  @@ -85,9 +80,11 @@
   } Rect_Like;
   
   void nci_pip (int count, Rect_Like *rects);
  -int nci_i_33 (int *double_me, int *triple_me);
  -void nci_v_pii (Outer *my_data, int my_x, int my_y);
  -void * nci_p_iiii (int alpha, int beta, int gamma, int delta);
  +int nci_i33 (int *double_me, int *triple_me);
  +void nci_vpii (Outer *my_data, int my_x, int my_y);
  +void * nci_piiii (int alpha, int beta, int gamma, int delta);
  +void * nci_pii (int, int);
  +int nci_i( void );
   
   /*
   
  @@ -145,7 +142,8 @@
   }
   
   static char s[] = "xx worked\n";
  -char *nci_tt(void *p) {
  +char *
  +nci_tt(void *p) {
       s[0] = ((char*) p)[1];
       s[1] = ((char*) p)[0];
   
  @@ -328,6 +326,11 @@
                   };
                   return &_x;
               }
  +        case 9:
  +            {
  +                static int i = 55555;
  +                return &i;
  +            }
           default:
               fprintf(stderr, "unknown test number\n");
       }
  @@ -346,7 +349,7 @@
   
   /*
   
  -Functions used for pdd16 tests
  +=head1 Functions used for pdd16 tests
   
   */
   
  @@ -381,7 +384,7 @@
   }
   
   int 
  -nci_i_33 (int *double_me, int *triple_me) {
  +nci_i33 (int *double_me, int *triple_me) {
       *double_me *= 2;
       *triple_me *= 3;
   
  @@ -389,14 +392,14 @@
   }
   
   void 
  -nci_v_pii (Outer *my_data, int my_x, int my_y) {
  +nci_vpii (Outer *my_data, int my_x, int my_y) {
       my_data->x            = my_x;
       my_data->nested->y    = my_y;
   }
   
   static int my_array[4];
   void * 
  -nci_p_iiii (int alpha, int beta, int gamma, int delta) {
  +nci_piiii (int alpha, int beta, int gamma, int delta) {
       static struct array_container
       {
           int   x;
  @@ -414,6 +417,20 @@
       return &container;
   }
   
  +static int my_product;
  +void * 
  +nci_pii (int fac1, int fac2) {
  +   my_product = fac1 * fac2;
  +
  +   return &my_product;
  +}
  +
  +int 
  +nci_i( void ) {
  +
  +   return my_product;
  +}
  +
   #ifdef TEST
   
   char l2 = 4;
  @@ -433,6 +450,18 @@
   #endif
   
   /*
  +
  +=head1 SEE ALSO:
  +
  +  F<docs/pdds/pdd16_native_call.pod>
  +  F<config/gen/makefiles/root.in>
  +  F<t/pmc/nci.t>
  + 
  +=cut
  +
  +*/
  +
  +/*
    * Local variables:
    * c-indentation-style: bsd
    * c-basic-offset: 4
  
  
  
  1.49      +142 -45   parrot/t/pmc/nci.t
  
  Index: nci.t
  ===================================================================
  RCS file: /cvs/public/parrot/t/pmc/nci.t,v
  retrieving revision 1.48
  retrieving revision 1.49
  diff -u -w -r1.48 -r1.49
  --- nci.t     2 Sep 2004 00:52:46 -0000       1.48
  +++ nci.t     16 Sep 2004 12:22:35 -0000      1.49
  @@ -1,6 +1,6 @@
   #! perl -w
   # Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -# $Id: nci.t,v 1.48 2004/09/02 00:52:46 dan Exp $
  +# $Id: nci.t,v 1.49 2004/09/16 12:22:35 jrieks Exp $
   
   =head1 NAME
   
  @@ -13,11 +13,17 @@
   =head1 DESCRIPTION
   
   This tests the Native Call Interface, that is the ParrotLibrary PMC. 
  -The tests are all skipped unless the F<libnci.so> library is found.
  +Most tests are skipped when the F<libnci.so> library is not found.
  +
  +=head1 SEE ALSO
  +
  +  F<docs/pdds/pdd16_native_call.pod>
  +  F<config/gen/makefiles/root.in>
  +  F<src/nci_test.c>
   
   =cut
   
  -use Parrot::Test tests => 37;
  +use Parrot::Test tests => 39;
   use Parrot::Config;
   
   SKIP: {
  @@ -26,7 +32,7 @@
             Test::Builder->expected_tests() );
   }
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_d_d");
  +output_is(<<'CODE', <<'OUTPUT', "nci_dd - PASM");
     loadlib P1, "libnci"
     print "loaded\n"
     dlfunc P0, P1, "nci_dd", "dd"
  @@ -56,7 +62,7 @@
   ok 2
   OUTPUT
   
  -output_is( << 'CODE', << 'OUTPUT', "nci_dd in PIR" );
  +output_is( << 'CODE', << 'OUTPUT', "nci_dd - PIR" );
   ##PIR##
   .sub _test @MAIN
       .local string library_name
  @@ -104,7 +110,7 @@
   libnci$PConfig{so} was successfully loaded
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_f_ff");
  +output_is(<<'CODE', <<'OUTPUT', "nci_fff");
     loadlib P1, "libnci"
     print "loaded\n"
     dlfunc P0, P1, "nci_fff", "fff"
  @@ -135,7 +141,7 @@
   ok 2
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_i_sc");
  +output_is(<<'CODE', <<'OUTPUT', "nci_isc");
     loadlib P1, "libnci"
     print "loaded\n"
     dlfunc P0, P1, "nci_isc", "isc"
  @@ -167,7 +173,7 @@
   OUTPUT
   
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_s_sc");
  +output_is(<<'CODE', <<'OUTPUT', "nci_ssc");
     loadlib P1, "libnci"
     print "loaded\n"
     dlfunc P0, P1, "nci_ssc", "ssc"
  @@ -198,7 +204,7 @@
   ok 2
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_c_sc");
  +output_is(<<'CODE', <<'OUTPUT', "nci_csc");
     loadlib P1, "libnci"
     print "loaded\n"
     dlfunc P0, P1, "nci_csc", "csc"
  @@ -240,7 +246,7 @@
   OUTPUT
   
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_i_t");
  +output_is(<<'CODE', <<'OUTPUT', "nci_it");
     loadlib P1, "libnci"
     printerr "loaded\n"
     dlfunc P0, P1, "nci_it", "it"
  @@ -269,7 +275,7 @@
   ok 2
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_t_t");
  +output_is(<<'CODE', <<'OUTPUT', "nci_tt");
     loadlib P1, "libnci"
     print "loaded\n"
     dlfunc P0, P1, "nci_tt", "tt"
  @@ -298,7 +304,7 @@
   ok 2
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_d_d - stress test");
  +output_is(<<'CODE', <<'OUTPUT', "nci_dd - stress test");
     loadlib P1, "libnci"
     print "loaded\n"
     set I10, 100000
  @@ -332,7 +338,7 @@
   ok 2
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_d_d - clone");
  +output_is(<<'CODE', <<'OUTPUT', "nci_dd - clone");
     loadlib P1, "libnci"
     print "loaded\n"
     dlfunc P0, P1, "nci_dd", "dd"
  @@ -373,7 +379,7 @@
   ok 4
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_i_iii");
  +output_is(<<'CODE', <<'OUTPUT', "nci_iiii");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_iiii", "iiii"
     set I0, 1  # prototype used - unchecked
  @@ -389,7 +395,7 @@
   2
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_i_4i");
  +output_is(<<'CODE', <<'OUTPUT', "nci_i4i");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_i4i", "i4i"
     new P5, .PerlInt
  @@ -403,7 +409,7 @@
   42
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_i_i3");
  +output_is(<<'CODE', <<'OUTPUT', "nci_ii3");
   .include "datatypes.pasm"
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_ii3", "ii3"
  @@ -427,7 +433,7 @@
   4711
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_t_b");
  +output_is(<<'CODE', <<'OUTPUT', "nci_tb");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_tb", "tb"
     set S5, "ko\n"
  @@ -438,7 +444,7 @@
   ok worked
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_t_B");
  +output_is(<<'CODE', <<'OUTPUT', "nci_tB");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_tB", "tB"
     set S5, "ko\n"
  @@ -449,7 +455,7 @@
   ok done
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_p_i");
  +output_is(<<'CODE', <<'OUTPUT', "nci_pi - struct with ints");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     # this test function returns a struct { int[2]; char }
  @@ -480,7 +486,7 @@
   66
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_p_i");
  +output_is(<<'CODE', <<'OUTPUT', "nci_pi - struct with floats");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     # this test function returns a struct { float[2]; double }
  @@ -511,7 +517,7 @@
   47.110000
   OUTPUT
   
  -output_like(<<'CODE', <<'OUTPUT', "nci_p_i - align");
  +output_like(<<'CODE', <<'OUTPUT', "nci_pi - align");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     # this test function returns a struct { char; int }
  @@ -544,7 +550,7 @@
   /
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_p_i - char*");
  +output_is(<<'CODE', <<'OUTPUT', "nci_pi - char*");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     # this test function returns a struct { char*; int }
  @@ -571,7 +577,7 @@
   20
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_p_i - nested struct *");
  +output_is(<<'CODE', <<'OUTPUT', "nci_pi - nested struct *");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     # this test function returns a struct { char; x->{int, double} }
  @@ -625,7 +631,7 @@
   200.000000
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_p_i - nested struct * w named access");
  +output_is(<<'CODE', <<'OUTPUT', "nci_pi - nested struct * w named access");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     set I5, 8  # test fun number
  @@ -694,8 +700,7 @@
   77
   OUTPUT
   
  -
  -output_is(<<'CODE', <<'OUTPUT', "nci_p_i - func_ptr* with signature");
  +output_is(<<'CODE', <<'OUTPUT', "nci_pi - func_ptr* with signature");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     # this test function returns a struct { int (*f)(char *) }
  @@ -724,7 +729,7 @@
   4711
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_p_i - nested struct aligned");
  +output_is(<<'CODE', <<'OUTPUT', "nci_pi - nested struct aligned");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     # this test function returns a struct { int; {int; int} int }
  @@ -778,7 +783,7 @@
   33
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_p_i - nested struct unaligned");
  +output_is(<<'CODE', <<'OUTPUT', "nci_pi - nested struct unaligned");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     # this test function returns a struct { char; {char; int} char }
  @@ -832,7 +837,7 @@
   33
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_p_i - nested, unaligned, named");
  +output_is(<<'CODE', <<'OUTPUT', "nci_pi - nested, unaligned, named");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_pi", "pi"
     # this test function returns a struct { char; {char; int} char }
  @@ -885,7 +890,46 @@
   12345
   33
   OUTPUT
  -output_is(<<'CODE', <<'OUTPUT', "nci_i_p");
  +
  +output_is( << 'CODE', << "OUTPUT", "nci_pi - int");
  +##PIR##
  +.include "datatypes.pasm"
  +
  +.sub _test @MAIN
  + 
  +  # load library
  +  .local pmc libnci
  +  libnci = loadlib "libnci"
  +  unless libnci goto NOT_LOADED
  +  print "libnci was successfully loaded\n"
  +
  +  # calling a function in libnci
  +  .local pmc nci_pi
  +  dlfunc nci_pi, libnci, "nci_pi", "pi"
  +  .local pmc nci_pi_out
  +  ( nci_pi_out ) = nci_pi( 9 )
  +
  +  # the contained structure pointer
  +  .local pmc nci_pi_out_decl
  +  nci_pi_out_decl = new PerlArray
  +  push nci_pi_out_decl, .DATATYPE_INT
  +  push nci_pi_out_decl, 0
  +  push nci_pi_out_decl, 0
  +
  +  # attach struct initializer
  +  assign nci_pi_out, nci_pi_out_decl
  +  set I0, nci_pi_out[0]
  +  print I0
  +NOT_LOADED:
  +  print "\n"
  +  end
  +.end
  +CODE
  +libnci was successfully loaded
  +55555
  +OUTPUT
  +
  +output_is(<<'CODE', <<'OUTPUT', "nci_ip");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_ip", "ip"
     # this test function wants a struct
  @@ -930,7 +974,8 @@
   31
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_v_P");
  +
  +output_is(<<'CODE', <<'OUTPUT', "nci_vP");
     loadlib P1, "libnci"
     dlfunc P0, P1, "nci_vP", "vP"
     new P5, .PerlString
  @@ -944,7 +989,7 @@
   got null
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_cb_C1");
  +output_is(<<'CODE', <<'OUTPUT', "nci_cb_C1 - PASM");
   
     # we need a flag if the call_back is already done
     new P10, .PerlInt
  @@ -1002,7 +1047,7 @@
   done.
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', "nci_cb_C1 in PIR");
  +output_is(<<'CODE', <<'OUTPUT', "nci_cb_C1 - PIR");
   ##PIR##
   .sub _test @MAIN
   
  @@ -1012,16 +1057,15 @@
       cb_done = 0
       store_global "cb_done", cb_done
   
  -    # this callback function will eventually by called by the library
  -    .local pmc cb
  -    cb = newsub _call_back 
  -
       # prepare user data
       .local pmc user_data
       user_data = new Integer
       user_data = 42
   
       # A Sub that can be given to the library
  +    # this callback function will eventually by called by the library
  +    .local pmc cb
  +    cb = newsub _call_back 
       .local pmc cb_wrapped
       cb_wrapped = new_callback cb, user_data, "tU"    # Z in pdd16
       print "created a callback sub\n"
  @@ -1192,7 +1236,7 @@
   done.
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', 'array of structs');
  +output_is(<<'CODE', <<'OUTPUT', 'nci_pip - array of structs');
   
   .include "datatypes.pasm"
     new P3, .OrderedHash
  @@ -1269,7 +1313,7 @@
   H: 430
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', 'out parameters and return values');
  +output_is(<<'CODE', <<'OUTPUT', 'nci_i33 - out parameters and return values');
   
   .include "datatypes.pasm"
     new P2, .PerlInt
  @@ -1285,7 +1329,7 @@
     set I3, 2
     set I4, 0
     loadlib P1, "libnci"
  -  dlfunc P0, P1, "nci_i_33", "i33"
  +  dlfunc P0, P1, "nci_i33", "i33"
     invoke
   
     print "Double: "
  @@ -1303,7 +1347,7 @@
   Sum: 12
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', 'nested structs');
  +output_is(<<'CODE', <<'OUTPUT', 'nci_vpii - nested structs');
   
   .include "datatypes.pasm"
     new  P8, .OrderedHash
  @@ -1346,7 +1390,7 @@
     set I4, 0
   
     loadlib P1, "libnci"
  -  dlfunc P0, P1, "nci_v_pii", "vpii"
  +  dlfunc P0, P1, "nci_vpii", "vpii"
     invoke
   
     set I0, P5[ 'x' ]
  @@ -1371,7 +1415,7 @@
   2
   OUTPUT
   
  -output_is(<<'CODE', <<'OUTPUT', 'nested array in a struct');
  +output_is(<<'CODE', <<'OUTPUT', 'nci_piiii - nested array in a struct');
   .include "datatypes.pasm"
     set I0, 1
     set I1, 4
  @@ -1384,7 +1428,7 @@
     set I8, 800
   
     loadlib P1, "libnci"
  -  dlfunc P0, P1, "nci_p_iiii", "piiii"
  +  dlfunc P0, P1, "nci_piiii", "piiii"
     invoke
   
     new  P6, .OrderedHash
  @@ -1439,9 +1483,62 @@
   3: 800
   OUTPUT
   
  +output_is( << 'CODE', << "OUTPUT", "nci_pii - writing back to libnci.so" );
  +##PIR##
  +.include "datatypes.pasm"
  +
  +.sub _test @MAIN
  + 
  +  # load library
  +  .local pmc libnci
  +  libnci = loadlib "libnci"
  +  unless libnci goto NOT_LOADED
  +  print "libnci was successfully loaded\n"
  +
  +  # calling a function in libnci
  +  .local pmc multiply
  +  multiply = dlfunc libnci, "nci_pii", "pii"
  +  .local pmc product_pointer
  +  ( product_pointer ) = multiply( -5, 11111 )
  +
  +  # the contained structure pointer
  +  .local pmc product_pointer_decl
  +  product_pointer_decl = new PerlArray
  +  push product_pointer_decl, .DATATYPE_INT
  +  push product_pointer_decl, 0
  +  push product_pointer_decl, 0
  +  assign product_pointer, product_pointer_decl
  +
  +  # check result of multiplication
  +  .local int product
  +  product = product_pointer[0]
  +  print product
  +  print "\n"
  +
  +  # Write back into libnci and check it
  +  product_pointer[0] = 333
  +  product = 4444
  +  print product
  +  print "\n"
  +  .local pmc get_product
  +  dlfunc get_product, libnci, "nci_i", "i"
  +  ( product ) = get_product() 
  +  print product
  +  print "\n"
  +
  +NOT_LOADED:
  +  end
  +.end
  +CODE
  +libnci was successfully loaded
  +-55555
  +4444
  +333
  +OUTPUT
  +
   } # SKIP
   
  -output_is(<< 'CODE', << 'OUTPUT', "check wether interface is done");
  +output_is(<< 'CODE', << 'OUTPUT', "opcode 'does'");
   ##PIR##
   .sub _test @MAIN
       .local pmc pmc1
  
  
  

Reply via email to