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