* t/op/lexicals-2.t (added), MANIFEST:
[parrot.git] / t / op / pushaction.t
blobfaf79f44da4d1b05a6e3e42ed77391baa24b11d1
1 #! perl
2 # Copyright (C) 2001-2006, The Perl Foundation.
3 # $Id$
5 use strict;
6 use warnings;
8 use lib qw( . lib ../lib ../../lib );
10 use Test::More;
11 use Parrot::Test tests => 7;
13 =head1 NAME
15 t/op/pushaction.t - Test the C<pushaction> Instruction
17 =head1 SYNOPSIS
19         % prove t/pmc/pushaction.t
21 =head1 DESCRIPTION
23 Tests the C<pushaction> instruction.  Note that there are also uses of
24 C<pushaction> in C<t/pmc/exception.t> and C<t/pmc/continuation.t>.  If
25 you want to add a test that requires a continuation or throws an
26 error, you probably want to put it in one of those files instead.
28 =cut
30 pasm_output_is( <<'CODE', <<'OUTPUT', "pushaction" );
31     pushmark 10
32     print "ok 1\n"
33     .const .Sub P10 = "action"
34     pushaction P10
35     print "ok 2\n"
36     popmark 10
37     print "ok 3\n"
38     end
39 .pcc_sub action:
40     get_params "0", I5
41     print "in action I5 = "
42     print I5
43     print "\n"
44     returncc
45 CODE
46 ok 1
47 ok 2
48 in action I5 = 0
49 ok 3
50 OUTPUT
52 pir_output_is( <<'CODE', <<'OUTPUT', "pushaction, sub exit" );
53 .sub main
54     print "main\n"
55     foo()
56     print "back\n"
57 .end
59 .sub foo
60    .const .Sub ac = "action"
61     pushaction ac
62     print "foo\n"
63 .end
65 .sub action
66     .param int i
67     print "in action I5 = "
68     print i
69     print "\n"
70 .end
71 CODE
72 main
73 foo
74 in action I5 = 0
75 back
76 OUTPUT
78 pir_output_is( <<'CODE', <<'OUTPUT', "pushaction, sub exit - capture CC" );
79 .sub main
80     print "main\n"
81     foo()
82     print "back\n"
83 .end
85 .sub foo
86    .const .Sub ac = "action"
87     pushaction ac
88     .include "interpinfo.pasm"
89     .local pmc cc
90     cc = interpinfo .INTERPINFO_CURRENT_CONT
91     print "foo\n"
92 .end
94 .sub action
95     print "unwind\n"
96 .end
97 CODE
98 main
99 foo
100 unwind
101 back
102 OUTPUT
104 pir_output_is( <<'CODE', <<'OUTPUT', "pushaction, sub exit - capture CC, ret" );
105 .sub main
106     print "main\n"
107     foo()
108     print "back\n"
109 .end
111 .sub foo
112    .const .Sub ac = "action"
113     pushaction ac
114     .include "interpinfo.pasm"
115     .local pmc cc
116     cc = interpinfo .INTERPINFO_CURRENT_CONT
117     print "foo\n"
118     invokecc cc
119 .end
121 .sub action
122     print "unwind\n"
123 .end
124 CODE
125 main
127 unwind
128 back
129 OUTPUT
131 pir_output_is( <<'CODE', <<'OUTPUT', "pushaction - return from main" );
132 .sub main :main
133     print "main\n"
134     .const .Sub at_exit = "exit_handler"
135     pushaction at_exit
136     .return()
137 .end
139 .sub exit_handler
140     .param int flag
141     print "at_exit, flag = "
142     say flag
143 .end
144 CODE
145 main
146 at_exit, flag = 0
147 OUTPUT
149 pir_output_is( <<'CODE', <<'OUTPUT', "pushaction - end in main" );
150 .sub main :main
151     print "main\n"
152     .const .Sub at_exit = "exit_handler"
153     pushaction at_exit
154     # IMCC inserts end here, because it is :main
155 .end
157 .sub exit_handler
158     .param int flag
159     print "at_exit, flag = "
160     say flag
161 .end
162 CODE
163 main
164 OUTPUT
166 pir_output_is( <<'CODE', <<'OUTPUT', "pushaction as closure" );
167 .sub main :main
168     .local pmc a
169     .lex 'a', a
170     a = new 'Integer'
171     a = 42
172     print "main\n"
173     .const .Sub at_exit = "exit_handler"
174     pushaction at_exit
175     .return()
176 .end
178 .sub exit_handler :outer(main)
179     .param int flag
180     print "at_exit, flag = "
181     say flag
182     .local pmc a
183     a = find_lex 'a'
184     print 'a = '
185     say a
186 .end
187 CODE
188 main
189 at_exit, flag = 0
190 a = 42
191 OUTPUT
193 # Local Variables:
194 #   mode: cperl
195 #   cperl-indent-level: 4
196 #   fill-column: 100
197 # End:
198 # vim: expandtab shiftwidth=4: