2 # Tests that all ops can be trapped by a Safe compartment
10 # this won't work outside of the core, so exit
11 print "1..0\n"; exit 0;
16 if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
17 print "1..0\n"; exit 0;
22 use Test::More tests => 354;
25 # Read the op names and descriptions directly from opcode.pl
28 open my $fh, '<', '../opcode.pl' or die "Can't open opcode.pl: $!";
35 my ($op, $opname) = split /\t+/;
37 push @opname, $opname;
42 my ($op, $opname, $code) = @_;
43 pass("$op : skipped") and return if $code =~ /^SKIP/;
44 pass("$op : skipped") and return if $code =~ m://: && $] < 5.009; # no dor
48 like($@, qr/'\Q$opname\E' trapped by operation mask/, $op);
53 testop $op[$i], $opname[$i], $_;
57 # lists op examples, in the same order than opcode.pl
58 # things that begin with SKIP are skipped, for various reasons (notably
59 # optree modified by the optimizer -- Safe checks are done before the
60 # optimizer modifies the optree)
69 SKIP (set by optimizer) $x # gvsv
75 SKIP (not implemented) # padany
76 SKIP split /foo/ # pushre
82 prototype 'foo' # prototype
90 SKIP (set by optimizer) $x .= <F> # rcatline
91 SKIP (internal) # regcmaybe
92 SKIP (internal) # regcreset
93 SKIP (internal) # regcomp
97 SKIP (set by optimizer) # substcont
110 SKIP (set by optimizer) # i_preinc
112 SKIP (set by optimizer) # i_predec
114 SKIP (set by optimizer) # i_postinc
116 SKIP (set by optimizer) # i_postdec
119 SKIP (set by optimizer) # i_multiply
121 SKIP (set by optimizer) # i_divide
123 SKIP (set by optimizer) # i_modulo
126 SKIP (set by optimizer) # i_add
128 SKIP (set by optimizer) # i_subtract
132 $x >> 1 # right_shift
134 SKIP (set by optimizer) # i_lt
136 SKIP (set by optimizer) # i_gt
138 SKIP (set by optimizer) # i_le
140 SKIP (set by optimizer) # i_ge
142 SKIP (set by optimizer) # i_eq
144 SKIP (set by optimizer) # i_ne
146 SKIP (set by optimizer) # i_ncmp
158 SKIP (set by optimizer) # i_negate
174 substr $x, 1 # substr
178 sprintf '%s', 'foo' # sprintf
182 crypt 'foo','bar' # crypt
187 quotemeta # quotemeta
189 SKIP (set by optimizer) # aelemfast
195 delete $h{Key} # delete
196 exists $h{Key} # exists
205 SKIP @x[1,2] # lslice
207 { a => 1 } # anonhash
208 splice @x, 1, 2, 3 # splice
215 grep { $_ eq 'foo' } @x # grepstart
216 SKIP grep { $_ eq 'foo' } @x # grepwhile
217 map $_ + 1, @foo # mapstart
218 SKIP (set by optimizer) # mapwhile
225 $x ? 1 : 0 # cond_expr
226 $x &&= $y # andassign
230 sub f{} f() # leavesub
231 sub f:lvalue{return $x} f() # leavesublv
238 SKIP (needs debugger) # dbstate
256 pipe FOO,BAR # pipe_op
258 umask 0755, 'foo' # umask
259 binmode FOO # binmode
265 SKIP (set by optimizer) # sselect
281 seek FH, $pos, $whence # seek
282 truncate FOO, 42 # truncate
287 socketpair # sockpair
293 getsockopt # gsockopt
294 setsockopt # ssockopt
295 getsockname # getsockname
296 getpeername # getpeername
329 unlink 'foo' # unlink
330 chmod 511, 'foo' # chmod
332 rename 'foo', 'bar' # rename
333 link 'foo', 'bar' # link
334 symlink 'foo', 'bar' # symlink
335 readlink 'foo' # readlink
338 opendir DIR # open_dir
339 readdir DIR # readdir
340 telldir DIR # telldir
341 seekdir DIR, $pos # seekdir
342 rewinddir DIR # rewinddir
343 closedir DIR # closedir
353 getpriority # getpriority
354 setpriority # setpriority
357 localtime # localtime
374 eval "1+1" # entereval
375 eval "1+1" # leaveeval
376 SKIP eval { 1+1 } # entertry
377 SKIP eval { 1+1 } # leavetry
378 gethostbyname 'foo' # ghbyname
379 gethostbyaddr 'foo' # ghbyaddr
380 gethostent # ghostent
381 getnetbyname 'foo' # gnbyname
382 getnetbyaddr 'foo' # gnbyaddr
384 getprotobyname 'foo' # gpbyname
385 getprotobynumber 42 # gpbynumber
386 getprotoent # gprotoent
387 getservbyname 'name', 'proto' # gsbyname
388 getservbyport 'a', 'b' # gsbyport
389 getservent # gservent
390 sethostent # shostent
392 setprotoent # sprotoent
393 setservent # sservent
394 endhostent # ehostent
396 endprotoent # eprotoent
397 endservent # eservent
413 $x->y() # method_named
415 $x //= $y # dorassign
416 SKIP (no way) # custom