Hello. >> I enjoy Parrot and tried to write new two opcodes -- suspend and resume. >> suspend opcode is to halt interpreter and resume opcode is to restart >> interpreter from where it suspended. > Hmm. How does the C<resume> opcode execute, when the runloop was left? > No test case there. What would be the usage of suspend/resume?
suspend and resume opcode are related two interpreters - one is the parent, the other is the child. The usage is following: 1. The parent interpreter creates child a ParrotInterpreter object. 2. The parent interpreter runs the child interpreter with runinterp opcode. 3. The child interpreter suspends by itself with suspend opcode. 4. The parent interpreter resumes the child interpreter with resume opcode. suspend opcode has no operand. resume opcode needs one operand to resume ParrotInterpreter PMC. I write down test cases below. Please excuse the following long text. Thank you. --- suspend.t --- #! perl -w =head1 NAME suspend.t - Suspend test =head1 SYNOPSIS % perl -Ilib suspend.t =head1 DESCRIPTION Tests suspend opcode. =cut use Parrot::Test tests => 3; pir_output_is(<< 'CODE', << 'OUTPUT', "suspend main interpreter"); .sub main @MAIN loadlib P0, "phtest_ops" print "suspend\n" suspend print "not reached\n" .end CODE suspend OUTPUT pir_output_is(<< 'CODE', << 'OUTPUT', "suspend in sub"); .sub main @MAIN loadlib P0, "phtest_ops" .local pmc interp interp = new .ParrotInterpreter print "0\n" runinterp interp, LABEL1 print "1\n" resume interp print "2\n" end LABEL1: test() end .end .sub test print "3\n" suspend print "4\n" .end CODE 0 3 1 4 2 OUTPUT pir_output_is(<< 'CODE', << 'OUTPUT', "suspend in sub in sub"); .sub main @MAIN loadlib P0, "phtest_ops" .local pmc interp interp = new .ParrotInterpreter print "0\n" runinterp interp, LABEL1 print "1\n" resume interp print "2\n" end LABEL1: test() end .end .sub test print "3\n" test2() print "4\n" .end .sub test2 print "5\n" suspend print "6\n" .end CODE 0 3 5 1 6 4 2 OUTPUT 1;