#!/usr/bin/perl
+BEGIN {
+ # Get function prototypes
+ require 'regen_lib.pl';
+}
-chmod 0666, "opcode.h", "opnames.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";
+$opcode_new = 'opcode.h-new';
+$opname_new = 'opnames.h-new';
+open(OC, ">$opcode_new") || die "Can't create $opcode_new: $!\n";
+open(ON, ">$opname_new") || die "Can't create $opname_new: $!\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!
-*/
+/*
+ * opcode.h
+ *
+ * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ * 2000, 2001, 2002, 2003, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! 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
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!
-*/
+/*
+ * opnames.h
+ *
+ * Copyright (C) 1999, 2000, 2001, 2002, 2003, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ *
+ * !!!!!!! 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
START_EXTERN_C
+
+#define OP_NAME(o) ((o)->op_type == OP_CUSTOM ? custom_op_name(o) : \\
+ PL_op_name[(o)->op_type])
+#define OP_DESC(o) ((o)->op_type == OP_CUSTOM ? custom_op_desc(o) : \\
+ PL_op_desc[(o)->op_type])
+
#ifndef DOINIT
EXT char *PL_op_name[];
#else
END
for (@ops) {
- print "\tMEMBER_TO_FPTR(Perl_pp_$_),\n";
+ print "\tMEMBER_TO_FPTR(Perl_pp_$_),\n" unless $_ eq "custom";
}
print <<END;
$argsum |= 32 if $flags =~ /I/; # has corresponding int op
$argsum |= 64 if $flags =~ /d/; # danger, unknown side effects
$argsum |= 128 if $flags =~ /u/; # defaults to $_
-
$flags =~ /([\W\d_])/ or die qq[Opcode "$_" has no class indicator];
$argsum |= $opclass{$1} << 9;
$mul = 0x2000; # 2 ^ OASHIFT
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: $!";
+foreach ('opcode.h', 'opnames.h') {
+ safer_rename_silent $_, "$_-old";
+}
+safer_rename $opcode_new, 'opcode.h';
+safer_rename $opname_new, 'opnames.h';
+
+$pp_proto_new = 'pp_proto.h-new';
+$pp_sym_new = 'pp.sym-new';
+
+open PP, ">$pp_proto_new" or die "Error creating $pp_proto_new: $!";
+open PPSYM, ">$pp_sym_new" or die "Error creating $pp_sym_new: $!";
print PP <<"END";
/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
for (@ops) {
next if /^i_(pre|post)(inc|dec)$/;
+ next if /^custom$/;
print PP "PERL_PPDEF(Perl_pp_$_)\n";
print PPSYM "Perl_pp_$_\n";
}
close PP or die "Error closing pp_proto.h: $!";
close PPSYM or die "Error closing pp.sym: $!";
+foreach ('pp_proto.h', 'pp.sym') {
+ safer_rename_silent $_, "$_-old";
+}
+safer_rename $pp_proto_new, 'pp_proto.h';
+safer_rename $pp_sym_new, 'pp.sym';
+
+END {
+ foreach ('opcode.h', 'opnames.h', 'pp_proto.h', 'pp.sym') {
+ 1 while unlink "$_-old";
+ }
+}
+
###########################################################################
sub tab {
local($l, $t) = @_;
__END__
-# New ops always go at the very end
+# New ops always go at the end, just before 'custom'
# A recapitulation of the format of this file:
# The file consists of five columns: the name of the op, an English
# logop - | listop - @ pmop - /
# padop/svop - $ padop - # (unused) loop - {
# baseop/unop - % loopexop - } filestatop - -
-# pvop/svop - "
+# pvop/svop - " cop - ;
# Other options are:
# needs stack mark - m
backtick quoted execution (``, qx) ck_open t%
# glob defaults its first arg to $_
glob glob ck_glob t@ S?
-readline <HANDLE> ck_null t%
-rcatline append I/O operator ck_null t%
+readline <HANDLE> ck_null t% F?
+rcatline append I/O operator ck_null t$
# Bindable operators.
regcomp regexp compilation ck_null s| S
match pattern match (m//) ck_match d/
qr pattern quote (qr//) ck_match s/
-subst substitution (s///) ck_null dis/ S
+subst substitution (s///) ck_match dis/ S
substcont substitution iterator ck_null dis|
-trans transliteration (tr///) ck_null is" S
+trans transliteration (tr///) ck_match is" S
# Lvalue operators.
# sassign is special-cased for op class
# Explosives and implosives.
-unpack unpack ck_fun @ S S
+unpack unpack ck_unpack @ S S?
pack pack ck_fun mst@ S L
split split ck_split t@ S S S
join join or string ck_join mst@ S L
splice splice ck_fun m@ A S? S? L
push push ck_fun imsT@ A L
-pop pop ck_shift s% A
-shift shift ck_shift s% A
+pop pop ck_shift s% A?
+shift shift ck_shift s% A?
unshift unshift ck_fun imsT@ A L
sort sort ck_sort m@ C? L
reverse reverse ck_fun mt@ L
leavesublv lvalue subroutine return ck_null 1
caller caller ck_fun t% S?
warn warn ck_fun imst@ L
-die die ck_fun dimst@ L
+die die ck_die dimst@ L
reset symbol reset ck_fun is% S?
lineseq line sequence ck_null @
syscall syscall ck_fun imst@ S L
# For multi-threading
-lock lock ck_rfun s% S
+lock lock ck_rfun s% R
threadsv per-thread value ck_null ds0
# Control (contd.)
setstate set statement info ck_null s;
method_named method with known name ck_null d$
+
+dor defined or (//) ck_null |
+dorassign defined or assignment (//=) ck_null s|
+
+# Add new ops before this, the custom operator.
+
+custom unknown custom operator ck_null 0