#!/usr/bin/perl
-unlink "opcode.h";
+unlink "opcode.h", "opnames.h";
open(OC, ">opcode.h") || die "Can't create opcode.h: $!\n";
+open(ON, ">opnames.h") || die "Can't create opnames.h: $!\n";
select OC;
# Read data.
$i = 0;
print <<"END";
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
+
#define Perl_pp_i_preinc Perl_pp_preinc
#define Perl_pp_i_predec Perl_pp_predec
#define Perl_pp_i_postinc Perl_pp_postinc
#define Perl_pp_i_postdec Perl_pp_postdec
-typedef enum {
END
+
+print ON <<"END";
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
+
+typedef enum opcode {
+END
+
for (@ops) {
- print "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n";
+ print ON "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n";
}
-print "\t", &tab(3,"OP_max"), "\n";
-print "} opcode;\n";
-print "\n#define MAXO ", scalar @ops, "\n\n";
+print ON "\t", &tab(3,"OP_max"), "\n";
+print ON "} opcode;\n";
+print ON "\n#define MAXO ", scalar @ops, "\n\n";
# Emit op names and descriptions.
'1', 1, # unop
'2', 2, # binop
'|', 3, # logop
- '?', 4, # condop
- '@', 5, # listop
- '/', 6, # pmop
- '$', 7, # svop
- '*', 8, # gvop
- '"', 9, # pvop_or_svop
- '{', 10, # loop
- ';', 11, # cop
- '%', 12, # baseop_or_unop
- '-', 13, # filestatop
- '}', 14, # loopexop
+ '@', 4, # listop
+ '/', 5, # pmop
+ '$', 6, # svop
+ '*', 7, # gvop
+ '"', 8, # pvop_or_svop
+ '{', 9, # loop
+ ';', 10, # cop
+ '%', 11, # baseop_or_unop
+ '-', 12, # filestatop
+ '}', 13, # loopexop
);
for (@ops) {
END
close OC or die "Error closing opcode.h: $!";
+close ON or die "Error closing opnames.h: $!";
unlink "pp_proto.h";
unlink "pp.sym";
open PP, '>pp_proto.h' or die "Error creating pp_proto.h: $!";
open PPSYM, '>pp.sym' or die "Error creating pp.sym: $!";
+print PP <<"END";
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
+
+END
+
+print PPSYM <<"END";
+#
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by opcode.pl from its data. Any changes made here
+# will be lost!
+#
+
+END
+
+
for (sort keys %ckname) {
print PP "PERL_CKDEF(Perl_$_)\n";
print PPSYM "Perl_$_\n";
__END__
+# New ops always go at the very end
+
# Nothing.
null null operation ck_null 0
# Hashes.
-each each ck_fun t% H
+each each ck_fun % H
values values ck_fun t% H
keys keys ck_fun t% H
delete delete ck_delete % S
unpack unpack ck_fun @ S S
pack pack ck_fun mst@ S L
split split ck_split t@ S S S
-join join ck_fun msT@ S L
+join join ck_join msT@ S L
# List operators.
# Range stuff.
-range flipflop ck_null ? S S
+range flipflop ck_null | S S
flip range (or flip) ck_null 1 S S
flop range (or flop) ck_null 1
and logical and ck_null |
or logical or ck_null |
-xor logical xor ck_null fs| S S
-cond_expr conditional expression ck_null d?
+xor logical xor ck_null fs2 S S
+cond_expr conditional expression ck_null d|
andassign logical and assignment ck_null s|
orassign logical or assignment ck_null s|
-method method lookup ck_null d1
+method method lookup ck_method d1
entersub subroutine entry ck_subr dmt1 L
leavesub subroutine exit ck_null 1
+leavesublv lvalue subroutine exit ck_null 1
caller caller ck_fun t% S?
warn warn ck_fun imst@ L
die die ck_fun dimst@ L
dump dump ck_null ds}
goto goto ck_null ds}
exit exit ck_fun ds% S?
+# continued below
#nswitch numeric switch ck_null d
#cswitch character switch ck_null d
# I/O.
-open open ck_fun ist@ F S?
+open open ck_fun ist@ F S? S?
close close ck_fun is% F?
pipe_op pipe ck_fun is@ F F
# For multi-threading
lock lock ck_rfun s% S
threadsv per-thread variable ck_null ds0
+
+# Control (contd.)
+setstate set statement info ck_null s;
+method_named method with known name ck_null d$