# Verify that perl executes concurrently as it should under MULTI_PERL import perl if not perl.MULTI_PERL: print "1..0" raise SystemExit print "1..3" import perl import re perl.eval(""" #line 14 "safecall" #$^W = 1; require Opcode; sub compile { my($code) = @_; $code = "package main; sub do { " . $code . "}"; #print "[[$code]]\\n"; eval $code; die if $@; } sub foo { 42; } *Safe1::_compile = \&compile; """) mask = perl.call("Opcode::opset", "bless", "add") print perl.call_tuple("Opcode::opset_to_ops", mask) perl.safecall("Safe1", mask, ('_compile', 'my $n = shift; print "ok $n\\n";')) perl.safecall("Safe1", mask, ('do', 1)) # try a trapped opcode try: perl.safecall("Safe1", mask, ('_compile', 'return bless {}, "Foo"')) except perl.PerlError, v: #print v if not re.match('^bless trapped by operation mask', str(v)): print "not ", print "ok 2" # The following call reset the perl parser state enought to # avoid the 'nexttoke' bug. perl.eval(""" sub ffff {}""") perl.eval(""" sub foo { print "not "; Safe1::foo(@_); } sub Safe1::foo { my $n = shift; print "ok $n\\n"; } """) perl.safecall("Safe1", mask, ('_compile', 'foo(shift)')) perl.safecall("Safe1", mask, ('do', 3))