Merge ftzero ftsock ftchr ftblk ftfile ftdir ftpipe into
[p5sagit/p5-mst-13.2.git] / opcode.pl
CommitLineData
79072805 1#!/usr/bin/perl
36bb303b 2BEGIN {
3 # Get function prototypes
9ad884cb 4 require 'regen_lib.pl';
36bb303b 5}
79072805 6
bb6f4497 7$opcode_new = 'opcode.h-new';
8$opname_new = 'opnames.h-new';
9open(OC, ">$opcode_new") || die "Can't create $opcode_new: $!\n";
dfb1454f 10binmode OC;
bb6f4497 11open(ON, ">$opname_new") || die "Can't create $opname_new: $!\n";
dfb1454f 12binmode ON;
79072805 13select OC;
14
15# Read data.
16
17while (<DATA>) {
18 chop;
19 next unless $_;
20 next if /^#/;
c07a80fd 21 ($key, $desc, $check, $flags, $args) = split(/\t+/, $_, 5);
22
23 warn qq[Description "$desc" duplicates $seen{$desc}\n] if $seen{$desc};
24 die qq[Opcode "$key" duplicates $seen{$key}\n] if $seen{$key};
25 $seen{$desc} = qq[description of opcode "$key"];
26 $seen{$key} = qq[opcode "$key"];
27
79072805 28 push(@ops, $key);
c07a80fd 29 $desc{$key} = $desc;
79072805 30 $check{$key} = $check;
31 $ckname{$check}++;
32 $flags{$key} = $flags;
33 $args{$key} = $args;
34}
35
1d5774de 36# Set up aliases
37
38my %alias;
39
40# Format is "this function" => "does these op names"
41my @raw_alias = (
6faeeb49 42 Perl_do_kv => [qw( keys values )],
65bca31a 43 Perl_unimplemented_op => [qw(padany threadsv mapstart)],
0b612f93 44 # All the ops with a body of { return NORMAL; }
45 Perl_pp_null => [qw(scalar regcmaybe lineseq scope)],
46
47 Perl_pp_goto => ['dump'],
48 Perl_pp_require => ['dofile'],
49 Perl_pp_untie => ['dbmclose'],
50 Perl_pp_sysread => [qw(read recv)],
51 Perl_pp_sysseek => ['seek'],
52 Perl_pp_ioctl => ['fcntl'],
53 Perl_pp_ssockopt => ['gsockopt'],
54 Perl_pp_getpeername => ['getsockname'],
55 Perl_pp_stat => ['lstat'],
f1cb2d48 56 Perl_pp_ftrowned => [qw(fteowned ftzero ftsock ftchr ftblk
57 ftfile ftdir ftpipe)],
0b612f93 58 Perl_pp_fttext => ['ftbinary'],
59 Perl_pp_gmtime => ['localtime'],
60 Perl_pp_semget => [qw(shmget msgget)],
61 Perl_pp_semctl => [qw(shmctl msgctl)],
62 Perl_pp_shmwrite => ['shmread'],
63 Perl_pp_ghostent => [qw(ghbyname ghbyaddr)],
64 Perl_pp_gnetent => [qw(gnbyname gnbyaddr)],
65 Perl_pp_gprotoent => [qw(gpbyname gpbynumber)],
66 Perl_pp_gservent => [qw(gsbyname gsbyport)],
67 Perl_pp_gpwent => [qw(gpwnam gpwuid)],
68 Perl_pp_ggrent => [qw(ggrnam ggrgid)],
957b0e1d 69
70 Perl_pp_ftis => [qw(ftsize ftmtime ftatime ftctime)],
0b612f93 71);
1d5774de 72
73while (my ($func, $names) = splice @raw_alias, 0, 2) {
6faeeb49 74 $alias{$_} = $func for @$names;
1d5774de 75}
76
79072805 77# Emit defines.
78
79$i = 0;
748a9306 80print <<"END";
37442d52 81/* -*- buffer-read-only: t -*-
82 *
d6376244 83 * opcode.h
84 *
4bb101f2 85 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
bdf1bb36 86 * 2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
d6376244 87 *
88 * You may distribute under the terms of either the GNU General Public
89 * License or the Artistic License, as specified in the README file.
90 *
91 * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
92 * This file is built by opcode.pl from its data. Any changes made here
93 * will be lost!
94 */
a27f85b3 95
27da23d5 96#ifndef PERL_GLOBAL_STRUCT_INIT
97
864dbfa3 98#define Perl_pp_i_preinc Perl_pp_preinc
99#define Perl_pp_i_predec Perl_pp_predec
100#define Perl_pp_i_postinc Perl_pp_postinc
101#define Perl_pp_i_postdec Perl_pp_postdec
748a9306 102
65bca31a 103PERL_PPDEF(Perl_unimplemented_op)
104
748a9306 105END
abdd5c84 106
107print ON <<"END";
37442d52 108/* -*- buffer-read-only: t -*-
109 *
d6376244 110 * opnames.h
111 *
b5f8cc5c 112 * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, by Larry Wall and others
d6376244 113 *
114 * You may distribute under the terms of either the GNU General Public
115 * License or the Artistic License, as specified in the README file.
116 *
117 *
118 * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
119 * This file is built by opcode.pl from its data. Any changes made here
120 * will be lost!
121 */
abdd5c84 122
123typedef enum opcode {
124END
125
79072805 126for (@ops) {
abdd5c84 127 print ON "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n";
79072805 128}
abdd5c84 129print ON "\t", &tab(3,"OP_max"), "\n";
130print ON "} opcode;\n";
4c80c0b2 131print ON "\n#define MAXO ", scalar @ops, "\n";
132print ON "#define OP_phoney_INPUT_ONLY -1\n";
133print ON "#define OP_phoney_OUTPUT_ONLY -2\n\n";
79072805 134
c07a80fd 135# Emit op names and descriptions.
79072805 136
137print <<END;
73c4f7a1 138START_EXTERN_C
139
4a36906c 140#define OP_NAME(o) ((o)->op_type == OP_CUSTOM ? custom_op_name(o) : \\
141 PL_op_name[(o)->op_type])
142#define OP_DESC(o) ((o)->op_type == OP_CUSTOM ? custom_op_desc(o) : \\
143 PL_op_desc[(o)->op_type])
53e06cf0 144
79072805 145#ifndef DOINIT
27da23d5 146EXTCONST char* const PL_op_name[];
79072805 147#else
27da23d5 148EXTCONST char* const PL_op_name[] = {
79072805 149END
150
151for (@ops) {
c07a80fd 152 print qq(\t"$_",\n);
153}
154
155print <<END;
156};
157#endif
158
159END
160
161print <<END;
162#ifndef DOINIT
27da23d5 163EXTCONST char* const PL_op_desc[];
c07a80fd 164#else
27da23d5 165EXTCONST char* const PL_op_desc[] = {
c07a80fd 166END
167
168for (@ops) {
42d38218 169 my($safe_desc) = $desc{$_};
170
a567e93b 171 # Have to escape double quotes and escape characters.
42d38218 172 $safe_desc =~ s/(^|[^\\])([\\"])/$1\\$2/g;
173
174 print qq(\t"$safe_desc",\n);
79072805 175}
176
177print <<END;
178};
179#endif
180
73c4f7a1 181END_EXTERN_C
182
27da23d5 183#endif /* !PERL_GLOBAL_STRUCT_INIT */
22c35a8c 184END
79072805 185
22c35a8c 186# Emit function declarations.
79072805 187
22c35a8c 188#for (sort keys %ckname) {
cea2e8a9 189# print "OP *\t", &tab(3,$_),"(pTHX_ OP* o);\n";
22c35a8c 190#}
191#
192#print "\n";
193#
194#for (@ops) {
cea2e8a9 195# print "OP *\t", &tab(3, "pp_$_"), "(pTHX);\n";
22c35a8c 196#}
79072805 197
198# Emit ppcode switch array.
199
200print <<END;
201
73c4f7a1 202START_EXTERN_C
203
27da23d5 204#ifdef PERL_GLOBAL_STRUCT_INIT
205static const Perl_ppaddr_t Gppaddr[]
79072805 206#else
27da23d5 207# ifndef PERL_GLOBAL_STRUCT
208EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
209# endif
210#endif /* PERL_GLOBAL_STRUCT */
211#if (defined(DOINIT) && !defined(PERL_GLOBAL_STRUCT)) || defined(PERL_GLOBAL_STRUCT_INIT)
212= {
79072805 213END
214
215for (@ops) {
6faeeb49 216 $_ eq "custom" and next;
217 if (my $name = $alias{$_}) {
218 print "\tMEMBER_TO_FPTR($name),\t/* Perl_pp_$_ */\n";
219 }
220 else {
221 print "\tMEMBER_TO_FPTR(Perl_pp_$_),\n";
222 }
79072805 223}
224
225print <<END;
27da23d5 226}
79072805 227#endif
27da23d5 228;
79072805 229
230END
231
232# Emit check routines.
233
234print <<END;
27da23d5 235#ifdef PERL_GLOBAL_STRUCT_INIT
236static const Perl_check_t Gcheck[]
79072805 237#else
27da23d5 238# ifndef PERL_GLOBAL_STRUCT
239EXT Perl_check_t PL_check[] /* or perlvars.h */
240# endif
241#endif
242#if (defined(DOINIT) && !defined(PERL_GLOBAL_STRUCT)) || defined(PERL_GLOBAL_STRUCT_INIT)
243= {
79072805 244END
245
246for (@ops) {
2b260de0 247 print "\t", &tab(3, "MEMBER_TO_FPTR(Perl_$check{$_}),"), "\t/* $_ */\n";
79072805 248}
249
250print <<END;
27da23d5 251}
79072805 252#endif
27da23d5 253;
79072805 254
255END
256
257# Emit allowed argument types.
258
259print <<END;
27da23d5 260#ifndef PERL_GLOBAL_STRUCT_INIT
261
79072805 262#ifndef DOINIT
27da23d5 263EXT const U32 PL_opargs[];
79072805 264#else
27da23d5 265EXT const U32 PL_opargs[] = {
79072805 266END
267
268%argnum = (
269 S, 1, # scalar
270 L, 2, # list
271 A, 3, # array value
272 H, 4, # hash value
273 C, 5, # code value
274 F, 6, # file value
275 R, 7, # scalar reference
276);
277
db173bac 278%opclass = (
279 '0', 0, # baseop
280 '1', 1, # unop
281 '2', 2, # binop
282 '|', 3, # logop
1a67a97c 283 '@', 4, # listop
284 '/', 5, # pmop
350de78d 285 '$', 6, # svop_or_padop
7934575e 286 '#', 7, # padop
1a67a97c 287 '"', 8, # pvop_or_svop
288 '{', 9, # loop
289 ';', 10, # cop
290 '%', 11, # baseop_or_unop
291 '-', 12, # filestatop
292 '}', 13, # loopexop
db173bac 293);
294
a85d93d9 295my %OP_IS_SOCKET;
296my %OP_IS_FILETEST;
297
79072805 298for (@ops) {
299 $argsum = 0;
300 $flags = $flags{$_};
301 $argsum |= 1 if $flags =~ /m/; # needs stack mark
302 $argsum |= 2 if $flags =~ /f/; # fold constants
303 $argsum |= 4 if $flags =~ /s/; # always produces scalar
304 $argsum |= 8 if $flags =~ /t/; # needs target scalar
b162f9ea 305 $argsum |= (8|256) if $flags =~ /T/; # ... which may be lexical
79072805 306 $argsum |= 16 if $flags =~ /i/; # always produces integer
307 $argsum |= 32 if $flags =~ /I/; # has corresponding int op
308 $argsum |= 64 if $flags =~ /d/; # danger, unknown side effects
a0d0e21e 309 $argsum |= 128 if $flags =~ /u/; # defaults to $_
8be7d673 310 $flags =~ /([\W\d_])/ or die qq[Opcode "$_" has no class indicator];
b162f9ea 311 $argsum |= $opclass{$1} << 9;
312 $mul = 0x2000; # 2 ^ OASHIFT
79072805 313 for $arg (split(' ',$args{$_})) {
a85d93d9 314 if ($arg =~ /^F/) {
315 $OP_IS_SOCKET{$_} = 1 if $arg =~ s/s//;
316 $OP_IS_FILETEST{$_} = 1 if $arg =~ s/-//;
317 }
79072805 318 $argnum = ($arg =~ s/\?//) ? 8 : 0;
a85d93d9 319 die "op = $_, arg = $arg\n" unless length($arg) == 1;
79072805 320 $argnum += $argnum{$arg};
b162f9ea 321 warn "# Conflicting bit 32 for '$_'.\n"
322 if $argnum & 8 and $mul == 0x10000000;
79072805 323 $argsum += $argnum * $mul;
324 $mul <<= 4;
325 }
326 $argsum = sprintf("0x%08x", $argsum);
db173bac 327 print "\t", &tab(3, "$argsum,"), "/* $_ */\n";
79072805 328}
329
330print <<END;
331};
332#endif
73c4f7a1 333
334END_EXTERN_C
27da23d5 335
336#endif /* !PERL_GLOBAL_STRUCT_INIT */
79072805 337END
338
a85d93d9 339if (keys %OP_IS_SOCKET) {
340 print ON "\n#define OP_IS_SOCKET(op) \\\n\t(";
341 print ON join(" || \\\n\t ",
342 map { "(op) == OP_" . uc() } sort keys %OP_IS_SOCKET);
343 print ON ")\n\n";
344}
345
346if (keys %OP_IS_FILETEST) {
347 print ON "\n#define OP_IS_FILETEST(op) \\\n\t(";
348 print ON join(" || \\\n\t ",
349 map { "(op) == OP_" . uc() } sort keys %OP_IS_FILETEST);
350 print ON ")\n\n";
351}
352
37442d52 353print OC "/* ex: set ro: */\n";
354print ON "/* ex: set ro: */\n";
355
735e0d5c 356close OC or die "Error closing opcode.h: $!";
abdd5c84 357close ON or die "Error closing opnames.h: $!";
735e0d5c 358
36bb303b 359foreach ('opcode.h', 'opnames.h') {
360 safer_rename_silent $_, "$_-old";
361}
362safer_rename $opcode_new, 'opcode.h';
363safer_rename $opname_new, 'opnames.h';
46f659cb 364
bb6f4497 365$pp_proto_new = 'pp_proto.h-new';
366$pp_sym_new = 'pp.sym-new';
367
368open PP, ">$pp_proto_new" or die "Error creating $pp_proto_new: $!";
dfb1454f 369binmode PP;
bb6f4497 370open PPSYM, ">$pp_sym_new" or die "Error creating $pp_sym_new: $!";
dfb1454f 371binmode PPSYM;
22c35a8c 372
a27f85b3 373print PP <<"END";
37442d52 374/* -*- buffer-read-only: t -*-
375 !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
a27f85b3 376 This file is built by opcode.pl from its data. Any changes made here
377 will be lost!
378*/
379
380END
381
382print PPSYM <<"END";
37442d52 383# -*- buffer-read-only: t -*-
a27f85b3 384#
a567e93b 385# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
a27f85b3 386# This file is built by opcode.pl from its data. Any changes made here
387# will be lost!
388#
389
390END
391
392
22c35a8c 393for (sort keys %ckname) {
864dbfa3 394 print PP "PERL_CKDEF(Perl_$_)\n";
395 print PPSYM "Perl_$_\n";
20ce7b12 396#OP *\t", &tab(3,$_),"(OP* o);\n";
22c35a8c 397}
398
399print PP "\n\n";
400
735e0d5c 401for (@ops) {
15e52e56 402 next if /^i_(pre|post)(inc|dec)$/;
53e06cf0 403 next if /^custom$/;
864dbfa3 404 print PP "PERL_PPDEF(Perl_pp_$_)\n";
405 print PPSYM "Perl_pp_$_\n";
735e0d5c 406}
37442d52 407print PP "\n/* ex: set ro: */\n";
408print PPSYM "\n# ex: set ro:\n";
735e0d5c 409
410close PP or die "Error closing pp_proto.h: $!";
22c35a8c 411close PPSYM or die "Error closing pp.sym: $!";
735e0d5c 412
36bb303b 413foreach ('pp_proto.h', 'pp.sym') {
414 safer_rename_silent $_, "$_-old";
415}
416safer_rename $pp_proto_new, 'pp_proto.h';
417safer_rename $pp_sym_new, 'pp.sym';
46f659cb 418
24600adc 419END {
420 foreach ('opcode.h', 'opnames.h', 'pp_proto.h', 'pp.sym') {
421 1 while unlink "$_-old";
422 }
423}
424
79072805 425###########################################################################
426sub tab {
427 local($l, $t) = @_;
428 $t .= "\t" x ($l - (length($t) + 1) / 8);
429 $t;
430}
431###########################################################################
b162f9ea 432
433# Some comments about 'T' opcode classifier:
434
435# Safe to set if the ppcode uses:
436# tryAMAGICbin, tryAMAGICun, SETn, SETi, SETu, PUSHn, PUSHTARG, SETTARG,
437# SETs(TARG), XPUSHn, XPUSHu,
438
439# Unsafe to set if the ppcode uses dTARG or [X]RETPUSH[YES|NO|UNDEF]
440
441# lt and friends do SETs (including ncmp, but not scmp)
442
21f5b33c 443# Additional mode of failure: the opcode can modify TARG before it "used"
444# all the arguments (or may call an external function which does the same).
445# If the target coincides with one of the arguments ==> kaboom.
446
b162f9ea 447# pp.c pos substr each not OK (RETPUSHUNDEF)
448# substr vec also not OK due to LV to target (are they???)
449# ref not OK (RETPUSHNO)
450# trans not OK (dTARG; TARG = sv_newmortal();)
451# ucfirst etc not OK: TMP arg processed inplace
69b47968 452# quotemeta not OK (unsafe when TARG == arg)
91e74348 453# each repeat not OK too due to list context
b162f9ea 454# pack split - unknown whether they are safe
dae78bb1 455# sprintf: is calling do_sprintf(TARG,...) which can act on TARG
456# before other args are processed.
b162f9ea 457
21f5b33c 458# Suspicious wrt "additional mode of failure" (and only it):
459# schop, chop, postinc/dec, bit_and etc, negate, complement.
460
461# Also suspicious: 4-arg substr, sprintf, uc/lc (POK_only), reverse, pack.
462
463# substr/vec: doing TAINT_off()???
464
b162f9ea 465# pp_hot.c
466# readline - unknown whether it is safe
467# match subst not OK (dTARG)
468# grepwhile not OK (not always setting)
69b47968 469# join not OK (unsafe when TARG == arg)
b162f9ea 470
21f5b33c 471# Suspicious wrt "additional mode of failure": concat (dealt with
472# in ck_sassign()), join (same).
473
b162f9ea 474# pp_ctl.c
475# mapwhile flip caller not OK (not always setting)
476
477# pp_sys.c
478# backtick glob warn die not OK (not always setting)
479# warn not OK (RETPUSHYES)
480# open fileno getc sysread syswrite ioctl accept shutdown
481# ftsize(etc) readlink telldir fork alarm getlogin not OK (RETPUSHUNDEF)
482# umask select not OK (XPUSHs(&PL_sv_undef);)
483# fileno getc sysread syswrite tell not OK (meth("FILENO" "GETC"))
484# sselect shm* sem* msg* syscall - unknown whether they are safe
485# gmtime not OK (list context)
486
21f5b33c 487# Suspicious wrt "additional mode of failure": warn, die, select.
488
79072805 489__END__
490
4289559a 491# New ops always go at the end, just before 'custom'
7399586d 492
64b99527 493# A recapitulation of the format of this file:
494# The file consists of five columns: the name of the op, an English
495# description, the name of the "check" routine used to optimize this
496# operation, some flags, and a description of the operands.
497
498# The flags consist of options followed by a mandatory op class signifier
499
500# The classes are:
501# baseop - 0 unop - 1 binop - 2
502# logop - | listop - @ pmop - /
503# padop/svop - $ padop - # (unused) loop - {
504# baseop/unop - % loopexop - } filestatop - -
3508218b 505# pvop/svop - " cop - ;
64b99527 506
507# Other options are:
508# needs stack mark - m
509# needs constant folding - f
510# produces a scalar - s
511# produces an integer - i
512# needs a target - t
513# target can be in a pad - T
514# has a corresponding integer version - I
515# has side effects - d
516# uses $_ if no argument given - u
517
518# Values for the operands are:
519# scalar - S list - L array - A
520# hash - H sub (CV) - C file - F
521# socket - Fs filetest - F- reference - R
522# "?" denotes an optional operand.
523
79072805 524# Nothing.
525
526null null operation ck_null 0
93a17b20 527stub stub ck_null 0
db173bac 528scalar scalar ck_fun s% S
79072805 529
530# Pushy stuff.
531
db173bac 532pushmark pushmark ck_null s0
533wantarray wantarray ck_null is0
79072805 534
db173bac 535const constant item ck_svconst s$
79072805 536
7934575e 537gvsv scalar variable ck_null ds$
538gv glob value ck_null ds$
db173bac 539gelem glob elem ck_null d2 S S
540padsv private variable ck_null ds0
541padav private array ck_null d0
542padhv private hash ck_null d0
f1612b5c 543padany private value ck_null d0
79072805 544
1167e5da 545pushre push regexp ck_null d/
79072805 546
547# References and stuff.
548
db173bac 549rv2gv ref-to-glob cast ck_rvconst ds1
b89fed5f 550rv2sv scalar dereference ck_rvconst ds1
db173bac 551av2arylen array length ck_null is1
b89fed5f 552rv2cv subroutine dereference ck_rvconst d1
db173bac 553anoncode anonymous subroutine ck_anoncode $
554prototype subroutine prototype ck_null s% S
5d11ae5e 555refgen reference constructor ck_spair m1 L
dfa0f641 556srefgen single ref constructor ck_null fs1 S
db173bac 557ref reference-type operator ck_fun stu% S?
558bless bless ck_fun s@ S S?
79072805 559
560# Pushy I/O.
561
16fe6d59 562backtick quoted execution (``, qx) ck_open t%
0a753a76 563# glob defaults its first arg to $_
649da076 564glob glob ck_glob t@ S?
b04ef359 565readline <HANDLE> ck_null t% F?
5fc9b9e4 566rcatline append I/O operator ck_null t$
79072805 567
568# Bindable operators.
569
f1612b5c 570regcmaybe regexp internal guard ck_fun s1 S
571regcreset regexp internal reset ck_fun s1 S
572regcomp regexp compilation ck_null s| S
573match pattern match (m//) ck_match d/
574qr pattern quote (qr//) ck_match s/
59f00321 575subst substitution (s///) ck_match dis/ S
f1612b5c 576substcont substitution iterator ck_null dis|
59f00321 577trans transliteration (tr///) ck_match is" S
79072805 578
579# Lvalue operators.
db173bac 580# sassign is special-cased for op class
581
b162f9ea 582sassign scalar assignment ck_sassign s0
db173bac 583aassign list assignment ck_null t2 L L
584
21f5b33c 585chop chop ck_spair mts% L
586schop scalar chop ck_null stu% S?
f1612b5c 587chomp chomp ck_spair mTs% L
588schomp scalar chomp ck_null sTu% S?
69794302 589defined defined operator ck_defined isu% S?
db173bac 590undef undef operator ck_lfun s% S?
591study study ck_fun su% S?
592pos match position ck_lfun stu% S?
593
42d38218 594preinc preincrement (++) ck_lfun dIs1 S
595i_preinc integer preincrement (++) ck_lfun dis1 S
596predec predecrement (--) ck_lfun dIs1 S
597i_predec integer predecrement (--) ck_lfun dis1 S
21f5b33c 598postinc postincrement (++) ck_lfun dIst1 S
42d38218 599i_postinc integer postincrement (++) ck_lfun disT1 S
21f5b33c 600postdec postdecrement (--) ck_lfun dIst1 S
42d38218 601i_postdec integer postdecrement (--) ck_lfun disT1 S
79072805 602
603# Ordinary operators.
604
42d38218 605pow exponentiation (**) ck_null fsT2 S S
606
f1612b5c 607multiply multiplication (*) ck_null IfsT2 S S
42d38218 608i_multiply integer multiplication (*) ck_null ifsT2 S S
609divide division (/) ck_null IfsT2 S S
610i_divide integer division (/) ck_null ifsT2 S S
611modulo modulus (%) ck_null IifsT2 S S
612i_modulo integer modulus (%) ck_null ifsT2 S S
613repeat repeat (x) ck_repeat mt2 L S
614
615add addition (+) ck_null IfsT2 S S
616i_add integer addition (+) ck_null ifsT2 S S
617subtract subtraction (-) ck_null IfsT2 S S
618i_subtract integer subtraction (-) ck_null ifsT2 S S
df91b2c5 619concat concatenation (.) or string ck_concat fsT2 S S
b162f9ea 620stringify string ck_fun fsT@ S
db173bac 621
42d38218 622left_shift left bitshift (<<) ck_bitop fsT2 S S
623right_shift right bitshift (>>) ck_bitop fsT2 S S
624
625lt numeric lt (<) ck_null Iifs2 S S
626i_lt integer lt (<) ck_null ifs2 S S
627gt numeric gt (>) ck_null Iifs2 S S
628i_gt integer gt (>) ck_null ifs2 S S
629le numeric le (<=) ck_null Iifs2 S S
630i_le integer le (<=) ck_null ifs2 S S
631ge numeric ge (>=) ck_null Iifs2 S S
632i_ge integer ge (>=) ck_null ifs2 S S
633eq numeric eq (==) ck_null Iifs2 S S
634i_eq integer eq (==) ck_null ifs2 S S
635ne numeric ne (!=) ck_null Iifs2 S S
636i_ne integer ne (!=) ck_null ifs2 S S
637ncmp numeric comparison (<=>) ck_null Iifst2 S S
638i_ncmp integer comparison (<=>) ck_null ifst2 S S
db173bac 639
2de3dbcc 640slt string lt ck_null ifs2 S S
641sgt string gt ck_null ifs2 S S
642sle string le ck_null ifs2 S S
643sge string ge ck_null ifs2 S S
db173bac 644seq string eq ck_null ifs2 S S
645sne string ne ck_null ifs2 S S
2de3dbcc 646scmp string comparison (cmp) ck_null ifst2 S S
db173bac 647
21f5b33c 648bit_and bitwise and (&) ck_bitop fst2 S S
649bit_xor bitwise xor (^) ck_bitop fst2 S S
650bit_or bitwise or (|) ck_bitop fst2 S S
db173bac 651
21f5b33c 652negate negation (-) ck_null Ifst1 S
f1612b5c 653i_negate integer negation (-) ck_null ifsT1 S
db173bac 654not not ck_null ifs1 S
21f5b33c 655complement 1's complement (~) ck_bitop fst1 S
79072805 656
657# High falutin' math.
658
f1612b5c 659atan2 atan2 ck_fun fsT@ S S
660sin sin ck_fun fsTu% S?
661cos cos ck_fun fsTu% S?
662rand rand ck_fun sT% S?
663srand srand ck_fun s% S?
664exp exp ck_fun fsTu% S?
665log log ck_fun fsTu% S?
666sqrt sqrt ck_fun fsTu% S?
79072805 667
cf26c822 668# Lowbrow math.
669
b162f9ea 670int int ck_fun fsTu% S?
671hex hex ck_fun fsTu% S?
672oct oct ck_fun fsTu% S?
673abs abs ck_fun fsTu% S?
79072805 674
675# String stuff.
676
b162f9ea 677length length ck_lengthconst isTu% S?
35fba0d9 678substr substr ck_substr st@ S S S? S?
db173bac 679vec vec ck_fun ist@ S S S
79072805 680
b162f9ea 681index index ck_index isT@ S S S?
682rindex rindex ck_index isT@ S S S?
79072805 683
2de3dbcc 684sprintf sprintf ck_fun mfst@ S L
db173bac 685formline formline ck_fun ms@ S L
b162f9ea 686ord ord ck_fun ifsTu% S?
687chr chr ck_fun fsTu% S?
688crypt crypt ck_fun fsT@ S S
2de3dbcc 689ucfirst ucfirst ck_fun fstu% S?
690lcfirst lcfirst ck_fun fstu% S?
691uc uc ck_fun fstu% S?
692lc lc ck_fun fstu% S?
69b47968 693quotemeta quotemeta ck_fun fstu% S?
79072805 694
695# Arrays.
696
f1612b5c 697rv2av array dereference ck_rvconst dt1
7934575e 698aelemfast constant array element ck_null s$ A S
db173bac 699aelem array element ck_null s2 A S
700aslice array slice ck_null m@ A L
79072805 701
aa689395 702# Hashes.
79072805 703
59af0135 704each each ck_fun % H
db173bac 705values values ck_fun t% H
706keys keys ck_fun t% H
707delete delete ck_delete % S
42d38218 708exists exists ck_exists is% S
f1612b5c 709rv2hv hash dereference ck_rvconst dt1
710helem hash element ck_null s2@ H S
db173bac 711hslice hash slice ck_null m@ H L
79072805 712
713# Explosives and implosives.
714
bab9c0ac 715unpack unpack ck_unpack @ S S?
db173bac 716pack pack ck_fun mst@ S L
717split split ck_split t@ S S S
297b36dc 718join join or string ck_join mst@ S L
79072805 719
720# List operators.
721
db173bac 722list list ck_null m@ L
723lslice list slice ck_null 2 H L L
42d38218 724anonlist anonymous list ([]) ck_fun ms@ L
725anonhash anonymous hash ({}) ck_fun ms@ L
79072805 726
db173bac 727splice splice ck_fun m@ A S? S? L
b162f9ea 728push push ck_fun imsT@ A L
26f600bc 729pop pop ck_shift s% A?
730shift shift ck_shift s% A?
b162f9ea 731unshift unshift ck_fun imsT@ A L
9850bf21 732sort sort ck_sort dm@ C? L
db173bac 733reverse reverse ck_fun mt@ L
79072805 734
f1612b5c 735grepstart grep ck_grep dm@ C L
736grepwhile grep iterator ck_null dt|
79072805 737
f1612b5c 738mapstart map ck_grep dm@ C L
739mapwhile map iterator ck_null dt|
a0d0e21e 740
79072805 741# Range stuff.
742
1a67a97c 743range flipflop ck_null | S S
db173bac 744flip range (or flip) ck_null 1 S S
745flop range (or flop) ck_null 1
79072805 746
747# Control.
748
42d38218 749and logical and (&&) ck_null |
f1612b5c 750or logical or (||) ck_null |
751xor logical xor ck_null fs2 S S
752cond_expr conditional expression ck_null d|
42d38218 753andassign logical and assignment (&&=) ck_null s|
754orassign logical or assignment (||=) ck_null s|
db173bac 755
f5d5a27c 756method method lookup ck_method d1
db173bac 757entersub subroutine entry ck_subr dmt1 L
758leavesub subroutine exit ck_null 1
78f9721b 759leavesublv lvalue subroutine return ck_null 1
db173bac 760caller caller ck_fun t% S?
761warn warn ck_fun imst@ L
96e176bf 762die die ck_die dimst@ L
f1612b5c 763reset symbol reset ck_fun is% S?
db173bac 764
765lineseq line sequence ck_null @
722969e2 766nextstate next statement ck_null s;
767dbstate debug next statement ck_null s;
e9c54c90 768unstack iteration finalizer ck_null s0
79072805 769enter block entry ck_null 0
db173bac 770leave block exit ck_null @
771scope block ck_null @
772enteriter foreach loop entry ck_null d{
79072805 773iter foreach loop iterator ck_null 0
db173bac 774enterloop loop entry ck_null d{
775leaveloop loop exit ck_null 2
78f9721b 776return return ck_return dm@ L
db173bac 777last last ck_null ds}
778next next ck_null ds}
779redo redo ck_null ds}
780dump dump ck_null ds}
781goto goto ck_null ds}
d98f61e7 782exit exit ck_exit ds% S?
7399586d 783# continued below
79072805 784
f1612b5c 785#nswitch numeric switch ck_null d
786#cswitch character switch ck_null d
79072805 787
788# I/O.
789
a567e93b 790open open ck_open ismt@ F S? L
db173bac 791close close ck_fun is% F?
792pipe_op pipe ck_fun is@ F F
79072805 793
db173bac 794fileno fileno ck_fun ist% F
a86a20aa 795umask umask ck_fun ist% S?
1c1fc3ea 796binmode binmode ck_fun s@ F S?
79072805 797
db173bac 798tie tie ck_fun idms@ R S L
799untie untie ck_fun is% R
800tied tied ck_fun s% R
801dbmopen dbmopen ck_fun is@ H S S
802dbmclose dbmclose ck_fun is% H
79072805 803
db173bac 804sselect select system call ck_select t@ S S S S
805select select ck_select st@ F?
79072805 806
db173bac 807getc getc ck_eof st% F?
d1a002d4 808read read ck_fun imst@ F R S S?
db173bac 809enterwrite write ck_fun dis% F?
810leavewrite write exit ck_null 1
79072805 811
db173bac 812prtf printf ck_listiob ims@ F? L
813print print ck_listiob ims@ F? L
79072805 814
db173bac 815sysopen sysopen ck_fun s@ F S S S?
816sysseek sysseek ck_fun s@ F S S
d1a002d4 817sysread sysread ck_fun imst@ F R S S?
145d37e2 818syswrite syswrite ck_fun imst@ F S S? S?
79072805 819
a85d93d9 820send send ck_fun imst@ Fs S S S?
821recv recv ck_fun imst@ Fs R S S
79072805 822
db173bac 823eof eof ck_eof is% F?
824tell tell ck_fun st% F?
825seek seek ck_fun s@ F S S
9b01e405 826# truncate really behaves as if it had both "S S" and "F S"
db173bac 827truncate truncate ck_trunc is@ S S
79072805 828
db173bac 829fcntl fcntl ck_fun st@ F S S
830ioctl ioctl ck_fun st@ F S S
b162f9ea 831flock flock ck_fun isT@ F S
79072805 832
833# Sockets.
834
a85d93d9 835socket socket ck_fun is@ Fs S S S
836sockpair socketpair ck_fun is@ Fs Fs S S S
79072805 837
a85d93d9 838bind bind ck_fun is@ Fs S
839connect connect ck_fun is@ Fs S
840listen listen ck_fun is@ Fs S
841accept accept ck_fun ist@ Fs Fs
842shutdown shutdown ck_fun ist@ Fs S
79072805 843
a85d93d9 844gsockopt getsockopt ck_fun is@ Fs S S
845ssockopt setsockopt ck_fun is@ Fs S S S
79072805 846
a85d93d9 847getsockname getsockname ck_fun is% Fs
848getpeername getpeername ck_fun is% Fs
79072805 849
850# Stat calls.
851
db173bac 852lstat lstat ck_ftst u- F
853stat stat ck_ftst u- F
a85d93d9 854ftrread -R ck_ftst isu- F-
855ftrwrite -W ck_ftst isu- F-
856ftrexec -X ck_ftst isu- F-
857fteread -r ck_ftst isu- F-
858ftewrite -w ck_ftst isu- F-
859fteexec -x ck_ftst isu- F-
860ftis -e ck_ftst isu- F-
945fa9b5 861fteowned -o ck_ftst isu- F-
862ftrowned -O ck_ftst isu- F-
a85d93d9 863ftzero -z ck_ftst isu- F-
864ftsize -s ck_ftst istu- F-
865ftmtime -M ck_ftst stu- F-
866ftatime -A ck_ftst stu- F-
867ftctime -C ck_ftst stu- F-
868ftsock -S ck_ftst isu- F-
869ftchr -c ck_ftst isu- F-
870ftblk -b ck_ftst isu- F-
871ftfile -f ck_ftst isu- F-
872ftdir -d ck_ftst isu- F-
873ftpipe -p ck_ftst isu- F-
874ftlink -l ck_ftst isu- F-
875ftsuid -u ck_ftst isu- F-
876ftsgid -g ck_ftst isu- F-
877ftsvtx -k ck_ftst isu- F-
878fttty -t ck_ftst is- F-
879fttext -T ck_ftst isu- F-
880ftbinary -B ck_ftst isu- F-
79072805 881
882# File calls.
883
b162f9ea 884chdir chdir ck_fun isT% S?
885chown chown ck_fun imsT@ L
886chroot chroot ck_fun isTu% S?
887unlink unlink ck_fun imsTu@ L
a86a20aa 888chmod chmod ck_fun imsT@ L
b162f9ea 889utime utime ck_fun imsT@ L
890rename rename ck_fun isT@ S S
891link link ck_fun isT@ S S
892symlink symlink ck_fun isT@ S S
db173bac 893readlink readlink ck_fun stu% S?
491873e5 894mkdir mkdir ck_fun isTu@ S? S?
b162f9ea 895rmdir rmdir ck_fun isTu% S?
79072805 896
897# Directory calls.
898
1e2c6ed7 899open_dir opendir ck_fun is@ F S
db173bac 900readdir readdir ck_fun % F
901telldir telldir ck_fun st% F
902seekdir seekdir ck_fun s@ F S
903rewinddir rewinddir ck_fun s% F
904closedir closedir ck_fun is% F
79072805 905
906# Process control.
907
db173bac 908fork fork ck_null ist0
b162f9ea 909wait wait ck_null isT0
910waitpid waitpid ck_fun isT@ S S
911system system ck_exec imsT@ S? L
912exec exec ck_exec dimsT@ S? L
913kill kill ck_fun dimsT@ L
914getppid getppid ck_null isT0
915getpgrp getpgrp ck_fun isT% S?
916setpgrp setpgrp ck_fun isT@ S? S?
917getpriority getpriority ck_fun isT@ S S
918setpriority setpriority ck_fun isT@ S S S
79072805 919
920# Time calls.
921
cd39f2b6 922# NOTE: MacOS patches the 'i' of time() away later when the interpreter
923# is created because in MacOS time() is already returning times > 2**31-1,
924# that is, non-integers.
925
b162f9ea 926time time ck_null isT0
79072805 927tms times ck_null 0
db173bac 928localtime localtime ck_fun t% S?
929gmtime gmtime ck_fun t% S?
930alarm alarm ck_fun istu% S?
b162f9ea 931sleep sleep ck_fun isT% S?
79072805 932
933# Shared memory.
934
db173bac 935shmget shmget ck_fun imst@ S S S
936shmctl shmctl ck_fun imst@ S S S
937shmread shmread ck_fun imst@ S S S S
938shmwrite shmwrite ck_fun imst@ S S S S
79072805 939
940# Message passing.
941
db173bac 942msgget msgget ck_fun imst@ S S
943msgctl msgctl ck_fun imst@ S S S
944msgsnd msgsnd ck_fun imst@ S S S
945msgrcv msgrcv ck_fun imst@ S S S S S
79072805 946
947# Semaphores.
948
db173bac 949semget semget ck_fun imst@ S S S
950semctl semctl ck_fun imst@ S S S S
951semop semop ck_fun imst@ S S
79072805 952
953# Eval.
954
db173bac 955require require ck_require du% S?
b3f4d674 956dofile do "file" ck_fun d1 S
957entereval eval "string" ck_eval d% S
958leaveeval eval "string" exit ck_null 1 S
db173bac 959#evalonce eval constant string ck_null d1 S
42d38218 960entertry eval {block} ck_null |
f1612b5c 961leavetry eval {block} exit ck_null @
79072805 962
963# Get system info.
964
db173bac 965ghbyname gethostbyname ck_fun % S
966ghbyaddr gethostbyaddr ck_fun @ S S
79072805 967ghostent gethostent ck_null 0
db173bac 968gnbyname getnetbyname ck_fun % S
969gnbyaddr getnetbyaddr ck_fun @ S S
79072805 970gnetent getnetent ck_null 0
db173bac 971gpbyname getprotobyname ck_fun % S
972gpbynumber getprotobynumber ck_fun @ S
79072805 973gprotoent getprotoent ck_null 0
db173bac 974gsbyname getservbyname ck_fun @ S S
975gsbyport getservbyport ck_fun @ S S
79072805 976gservent getservent ck_null 0
db173bac 977shostent sethostent ck_fun is% S
978snetent setnetent ck_fun is% S
979sprotoent setprotoent ck_fun is% S
980sservent setservent ck_fun is% S
981ehostent endhostent ck_null is0
982enetent endnetent ck_null is0
983eprotoent endprotoent ck_null is0
984eservent endservent ck_null is0
985gpwnam getpwnam ck_fun % S
986gpwuid getpwuid ck_fun % S
79072805 987gpwent getpwent ck_null 0
db173bac 988spwent setpwent ck_null is0
989epwent endpwent ck_null is0
990ggrnam getgrnam ck_fun % S
991ggrgid getgrgid ck_fun % S
79072805 992ggrent getgrent ck_null 0
db173bac 993sgrent setgrent ck_null is0
994egrent endgrent ck_null is0
995getlogin getlogin ck_null st0
79072805 996
997# Miscellaneous.
998
db173bac 999syscall syscall ck_fun imst@ S L
c0329465 1000
1001# For multi-threading
5a47f09b 1002lock lock ck_rfun s% R
f1612b5c 1003threadsv per-thread value ck_null ds0
7399586d 1004
1005# Control (contd.)
3f872cb9 1006setstate set statement info ck_null s;
f5d5a27c 1007method_named method with known name ck_null d$
53e06cf0 1008
c963b151 1009dor defined or (//) ck_null |
1010dorassign defined or assignment (//=) ck_null s|
1011
16bb0245 1012# Add new ops before this, the custom operator.
7e030f46 1013
53e06cf0 1014custom unknown custom operator ck_null 0