* src/pmc/scalar.pmc:
[parrot.git] / t / pmc / managedstruct.t
blobbb26fd05b0e7195dde4651a3d0b4c8a109e4474d
1 #! perl
2 # Copyright (C) 2001-2005, The Perl Foundation.
3 # $Id$
5 use strict;
6 use warnings;
7 use lib qw( . lib ../lib ../../lib );
8 use Test::More;
9 use Parrot::Test tests => 6;
10 use Parrot::Config;
12 =head1 NAME
14 t/pmc/managedstruct.t - Managed C Structure
16 =head1 SYNOPSIS
18     % prove t/pmc/managedstruct.t
20 =head1 DESCRIPTION
22 Tests the ManagedStruct PMC. Checks element access and memory allocation.
24 =cut
26 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting ManagedStruct size" );
27     new P0,.ManagedStruct
28     set I0,P0
29     eq I0,0,OK_1
30     print "not "
31 OK_1:    print "ok 1\n"
32     set P0,1
33     set I0,P0
34     eq I0,1,OK_2
35     print "not "
36 OK_2:    print "ok 2\n"
37     set P0,2
38     set I0,P0
39     eq I0,2,OK_3
40     print "not "
41 OK_3:    print "ok 3\n"
42         end
43 CODE
44 ok 1
45 ok 2
46 ok 3
47 OUTPUT
49 pasm_output_is( <<'CODE', <<'OUTPUT', "element access - float, double" );
50     new P2, .ResizablePMCArray
51     .include "datatypes.pasm"
52     push P2, .DATATYPE_FLOAT
53     push P2, 2  # 2 elem array
54     push P2, 0
55     push P2, .DATATYPE_DOUBLE
56     push P2, 0
57     push P2, 0
58     new P0, .ManagedStruct, P2
59     # must have set size automatically
60     # this is hopefully 2*4+8 everywhere
61     set I0, P0
62     print I0
63     print "\n"
64     set P0[0;0], 14.1
65     set N0, P0[0;0]
66     set P0[0;1], 14.2
67     set P0[1], 14.3
68     set N0, P0[0;0]
69     print N0
70     print "\n"
71     set N0, P0[0;1]
72     print N0
73     print "\n"
74     set N0, P0[1]
75     print N0
76     print "\n"
77     end
78 CODE
80 14.100000
81 14.200000
82 14.300000
83 OUTPUT
85 pasm_output_like( <<'CODE', <<'OUTPUT', "element access - char, short" );
86     new P2, .ResizablePMCArray
87     .include "datatypes.pasm"
88     push P2, .DATATYPE_CHAR
89     push P2, 2  # 2 elem char array
90     push P2, 0
91     new P0, .ManagedStruct, P2
92     set I0, P0
93     ge I0, 2, ok1
94     print "not "
95 ok1:
96     print "ok "
97     set P0[0;0], 1
98     set P0[0;1], 258    # must be truncated to 2
99     set I0, P0[0;0]
100     print I0
101     set I0, P0[0;1]
102     print I0
103     print " "
104     # now acces that as a short
105     new P2, .ResizablePMCArray
106     push P2, .DATATYPE_SHORT
107     push P2, 1
108     push P2, 0
109     assign P0, P2
110     # should be 2*256+1 or 1*256+2
111     set I0, P0[0]
112     print I0
113     end
114 CODE
115 /^ok 12 (513|258)$/
116 OUTPUT
118 pir_output_is( <<'CODE', <<'OUTPUT', "named element access int16" );
120 .include "datatypes.pasm"
122 .sub _main
123     new $P1, .OrderedHash
124     set  $P1['x'], .DATATYPE_INT16
125     push $P1, 0
126     push $P1, 0
128     set $P1['y'], .DATATYPE_INT16
129     push $P1, 0
130     push $P1, 0
132     # need a ManagedStruct to allocate data memory
133     new $P2, .ManagedStruct, $P1
135     # calc allocation size
136     set $I0, 0
137     sizeof $I1, .DATATYPE_INT16
138     add $I0, $I1
139     add $I0, $I1
140     # set size
141     set $P2, $I0
143     # set struct values by name
144     set $I0, 2
145     set $P2["x"], $I0
147     set $I1, 16
148     set $S0, "y"
149     set $P2[$S0], $I1
151     # get struct values by struct item idx
152     set $I2, $P2[0]
153     set $I3, $P2[1]
155     print "x: "
156     print $I2
158     print "\ny: "
159     print $I3
161     # get struct values by name
162     set $I2, $P2["x"]
163     set $I3, $P2["y"]
165     print "\nx: "
166     print $I2
168     print "\ny: "
169     print $I3
170     print "\n"
171     end
172 .end
173 CODE
174 x: 2
175 y: 16
176 x: 2
177 y: 16
178 OUTPUT
180 pasm_output_is( <<'CODE', <<'OUTPUT', "nested struct offsets" );
181   # the nested structure
182   .include "datatypes.pasm"
183   new P3, .ResizablePMCArray
184   push P3, .DATATYPE_INT
185   push P3, 0
186   push P3, 0
187   push P3, .DATATYPE_INT
188   push P3, 0
189   push P3, 0
190   new P4, .UnManagedStruct, P3
191   # outer structure
192   new P2, .ResizablePMCArray
193   push P2, .DATATYPE_INT
194   push P2, 0
195   push P2, 0
196   push P2, .DATATYPE_STRUCT
197   # attach the unmanged struct as property
198   set P1, P2[-1]
199   setprop P1, "_struct", P4
200   push P2, 0
201   push P2, 0
202   push P2, .DATATYPE_INT
203   push P2, 0
204   push P2, 0
205   # attach struct initializer
206   new P5, .UnManagedStruct, P2
208   # now check offsets
209   set I0, P2[2]
210   print I0
211   print "\n"
212   set I0, P2[5]
213   print I0
214   print "\n"
215   set I0, P2[8]
216   print I0
217   print "\n"
218   # nested
219   set I0, P3[2]
220   print I0
221   print "\n"
222   set I0, P3[5]
223   print I0
224   print "\n"
226   # check struct size
227   set I0, P5
228   print I0
229   print "\n"
230   # nested
231   set I0, P4
232   print I0
233   print "\n"
234   end
235 CODE
243 OUTPUT
245 pir_output_is( << 'CODE', << 'OUTPUT', "check whether interface is done" );
247 .sub _main
248     .local pmc pmc1
249     pmc1 = new ManagedStruct
250     .local int bool1
251     does bool1, pmc1, "scalar"
252     print bool1
253     print "\n"
254     does bool1, pmc1, "no_interface"
255     print bool1
256     print "\n"
257     end
258 .end
259 CODE
262 OUTPUT
264 # Local Variables:
265 #   mode: cperl
266 #   cperl-indent-level: 4
267 #   fill-column: 100
268 # End:
269 # vim: expandtab shiftwidth=4: