# New Ticket Created by  chromatic 
# Please include the string:  [perl #29333]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org:80/rt3/Ticket/Display.html?id=29333 >


>From Parrot, I'm trying to access a struct within a struct.  Given an
SDL_Surface named surface, the relevant C code is:

        int bpp = surface->format->BytesPerPixel;

Given surface, a working UnManagedStruct representing an SDL_Surface (to
which I can draw -- that part works), I'd expect the following PIR to be
equivalent:

        .local int bpp
        bpp = surface[ 'format'; 'BytesPerPixel' ]

However this complains about the unknown key 'BytesPerPixel'.

The attached test patch demonstrates what I think is a problem.  Running
gdb and looking through unmanagedstruct.pmc makes me wonder if the
PMC_val of the nested struct is ever actually assigned to the enclosing
struct.

Then again, I'm not a great C programmer and it is late here.  I could
be doing things *completely* wrongly, in which case I'll write a
documentation patch to make things more clear after someone explains it
to me.

-- c


Index: t/pmc/nci.t
===================================================================
RCS file: /cvs/public/parrot/t/pmc/nci.t,v
retrieving revision 1.37
diff -u -u -r1.37 nci.t
--- t/pmc/nci.t	30 Apr 2004 16:05:47 -0000	1.37
+++ t/pmc/nci.t	4 May 2004 05:54:32 -0000
@@ -17,7 +17,7 @@
 
 =cut
 
-use Parrot::Test tests => 31;
+use Parrot::Test tests => 32;
 use Parrot::Config;
 
 print STDERR $PConfig{jitcpuarch}, " JIT CPU\n";
@@ -1137,6 +1137,68 @@
 Double: 6
 Triple: 6
 Sum: 12
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', 'nested structs');
+
+.include "datatypes.pasm"
+  new  P8, .OrderedHash
+  set  P8[ 'y' ],      .DATATYPE_INT
+  push P8, 0
+  push P8, 0
+  new  P9, .ManagedStruct, P8
+
+  new  P6, .OrderedHash
+  set  P6[ 'x' ],      .DATATYPE_INT
+  push P6, 0
+  push P6, 0
+  set  P6[ 'nested' ], .DATATYPE_STRUCT_PTR
+
+  set  P7, P6[ -1 ]
+  setprop P7, '_struct', P9
+
+  push P6, 0
+  push P6, 0
+
+  new  P5, .ManagedStruct, P6
+  set  P9[ 'y' ], 200
+  set  P5[ 'x' ], 100
+
+  set I0, P5[ 'x' ]
+  set I1, P5[ 'nested'; 'y' ]
+  print "Old X: "
+  print I0
+  print "\nOld Y: "
+  print I1
+  print "\n"
+
+  set I5, 1
+  set I6, 2
+
+  set I0, 1
+  set I1, 2
+  set I2, 0
+  set I3, 1
+  set I4, 0
+
+  loadlib P1, "libnci"
+  dlfunc P0, P1, "nci_v_pii", "vpii"
+  invoke
+
+  set I0, P5[ 'x' ]
+  set I1, P5[ 'nested'; 'y' ]
+  print "X: "
+  print I0
+  print "\nY: "
+  print I1
+  print "\n"
+
+  end
+CODE
+Old X: 100
+Old Y: 200
+X: 1
+Y: 2
 OUTPUT
 
 } # SKIP
Index: src/call_list.txt
===================================================================
RCS file: /cvs/public/parrot/src/call_list.txt,v
retrieving revision 1.31
diff -u -u -r1.31 call_list.txt
--- src/call_list.txt	30 Apr 2004 16:05:43 -0000	1.31
+++ src/call_list.txt	4 May 2004 05:55:27 -0000
@@ -209,8 +209,10 @@
 # Used by SDL
 p	iiil
 i	ppl
+v	pip
 
 # used by t/pmc/nci.t
 v	pP
 p	ip
 i	33
+v	pii
Index: src/nci_test.c
===================================================================
RCS file: /cvs/public/parrot/src/nci_test.c,v
retrieving revision 1.25
diff -u -u -r1.25 nci_test.c
--- src/nci_test.c	3 May 2004 07:29:48 -0000	1.25
+++ src/nci_test.c	4 May 2004 05:59:51 -0000
@@ -30,12 +30,24 @@
 
 typedef struct
 {
+	int y;
+} Nested;
+
+typedef struct
+{
+	int x;
+	Nested *nested;
+} Outer;
+
+typedef struct
+{
 	int x, y;
 	int w, h;
 } 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);
 
 double nci_dd(double d) {
     return d * 2.0;
@@ -283,6 +295,12 @@
 	*triple_me *= 3;
 
 	return( *double_me + *triple_me );
+}
+
+void nci_v_pii (Outer *my_data, int my_x, int my_y)
+{
+	my_data->x         = my_x;
+	my_data->nested->y = my_y;
 }
 
 #ifdef TEST

Reply via email to