On Tue, 2004-04-20 at 02:13, Leopold Toetsch wrote: > Can you provide some test code (s. t/pmc/nci.t and src/nci_test.c) for > signatures similar to the real:
> > extern DECLSPEC void SDLCALL SDL_UpdateRects > > (SDL_Surface *screen, int numrects, SDL_Rect *rects); No problem. Fair warning, though: nci_test doesn't build by default on Linux PPC. I had to build it manually then copy it into runtime/parrot/dynext/. After commenting out the skipall() which doesn't like my platform, tests 5 and 27-29 fail. More importantly, the other tests pass. After adding a signature for vpP to src/nci_call.txt and rebuilding, only test 5 fails. That might be due to differences in the size of shorts on this platform as compared to i386; just a guess. (The return value is 128, while the test expects -128). Anyhow, I've attached a new test which shows of more or less my idea for what this should do. It may be horribly wrong, but it's wrong in a way that has actual code, not just vague ideas. On the other hand, I'm really *not* a C programmer. -- c
Index: t/pmc/nci.t =================================================================== RCS file: /cvs/public/parrot/t/pmc/nci.t,v retrieving revision 1.35 diff -u -u -r1.35 nci.t --- t/pmc/nci.t 8 Mar 2004 00:20:09 -0000 1.35 +++ t/pmc/nci.t 28 Apr 2004 04:06:07 -0000 @@ -17,7 +17,7 @@ =cut -use Parrot::Test tests => 29; +use Parrot::Test tests => 30; use Parrot::Config; print STDERR $PConfig{jitcpuarch}, " JIT CPU\n"; output_is(<<'CODE', <<'OUTPUT', "nci_d_d"); @@ -1014,6 +1015,63 @@ user data: 42 external data: 77 done. +OUTPUT + +output_is(<<'CODE', <<'OUTPUT', 'array of structs'); + loadlib P1, "libnci" + dlfunc P0, P1, "nci_pip", "pip" +.include "datatypes.pasm" + new P3, .OrderedHash + set P3["x"], .DATATYPE_INT + push P3, 0 + push P3, 0 + set P3["y"], .DATATYPE_INT + push P3, 0 + push P3, 0 + set P3["w"], .DATATYPE_INT + push P3, 0 + push P3, 0 + set P3["h"], .DATATYPE_INT + push P3, 0 + push P3, 0 + + new P5, .ManagedStruct, P3 + set P5['x'], 100 + set P5['y'], 100 + set P5['w'], 100 + set P5['h'], 100 + + new P6, .ManagedStruct, P3 + set P6['x'], 200 + set P6['y'], 200 + set P6['w'], 200 + set P6['h'], 200 + + new P7, .ManagedStruct, P3 + set P7['x'], 300 + set P7['y'], 300 + set P7['w'], 300 + set P7['h'], 300 + + new P8, .ManagedStruct, P3 + set P8['x'], 400 + set P8['y'], 400 + set P8['w'], 400 + set P8['h'], 400 + + set I5, 4 + set I0, 1 + set I1, 1 + set I3, 4 + + invoke + +CODE +Count: 4 +X: 100 +Y: 200 +W: 300 +H: 400 OUTPUT } # SKIP Index: src/nci_test.c =================================================================== RCS file: /cvs/public/parrot/src/nci_test.c,v retrieving revision 1.22 diff -u -u -r1.22 nci_test.c --- src/nci_test.c 9 Feb 2004 15:54:47 -0000 1.22 +++ src/nci_test.c 28 Apr 2004 04:06:38 -0000 @@ -28,6 +28,14 @@ typedef void (*cb_D1_func)(void*, const char*); void nci_cb_D1(cb_D1_func, void*); +typedef struct +{ + int x, y; + int w, h; +} Rect_Like; + +void nci_pip (int count, Rect_Like *rects); + double nci_dd(double d) { return d * 2.0; } @@ -255,6 +263,12 @@ const char *result = "succeeded"; /* call the cb synchronously */ (cb)(user_data, result); +} + +void nci_pip (int count, Rect_Like *rects) +{ + printf( "Count: %d\nX: %d\nY: %d\nW: %d\nH: %d", + count, rects[0].x, rects[1].y, rects[2].w, rects[3].h ); } #ifdef TEST Index: src/call_list.txt =================================================================== RCS file: /cvs/public/parrot/src/call_list.txt,v retrieving revision 1.29 Index: src/call_list.txt =================================================================== RCS file: /cvs/public/parrot/src/call_list.txt,v retrieving revision 1.29 diff -u -u -r1.29 call_list.txt --- src/call_list.txt 30 Mar 2004 10:23:25 -0000 1.29 +++ src/call_list.txt 28 Apr 2004 04:08:21 -0000 @@ -209,3 +209,7 @@ # Used by library/sdl.imc p iiil i ppl + +# used by t/pmc/nci.t +v pP +p ip