This is a live mirror of the Perl 5 development currently hosted at
op.c: change Optype to I32 for cmpchain functions
authorYves Orton <>
Sat, 8 Feb 2020 09:51:48 +0000 (10:51 +0100)
committerKarl Williamson <>
Fri, 13 Mar 2020 04:34:26 +0000 (22:34 -0600)
Optype appears to be almost completely unused, and on Win32 builds
we saw warnings from the cmpchain patches:

    perly.y(1063) : warning C4244: 'function' : conversion from 'I32' to 'Optype', possible loss of data
    perly.y(1065) : warning C4244: 'function' : conversion from 'I32' to 'Optype', possible loss of data
    perly.y(1079) : warning C4244: 'function' : conversion from 'I32' to 'Optype', possible loss of data
    perly.y(1081) : warning C4244: 'function' : conversion from 'I32' to 'Optype', possible loss of data

Reviewing the code I noticed that functions like Perl_newBINOP() have
an I32 type argument, and functions like OpTYPE_set() coerce such
arguments into type OPCODE:

#define OpTYPE_set(o,type) \
STMT_START {                                \
    o->op_type = (OPCODE)type;              \
    o->op_ppaddr = PL_ppaddr[type];         \

this patch changes the signature to the new cmpchain functions so that
they do they same, and change the type for storage for op_type values
to also use OPCODE like most of the other op.c code.


index 2b58480..fc9d8b4 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -1000,9 +1000,9 @@ p |bool   |io_close       |NN IO* io|NULLOK GV *gv \
                                |bool not_implicit|bool warn_on_fail
 : Used in perly.y
 pR     |OP*    |invert         |NULLOK OP* cmd
-pR     |OP*    |cmpchain_start |Optype type|NULLOK OP* left \
+pR     |OP*    |cmpchain_start |I32 type|NULLOK OP* left \
                                |NULLOK OP* right
-pR     |OP*    |cmpchain_extend|Optype type|NN OP* ch|NULLOK OP* right
+pR     |OP*    |cmpchain_extend|I32 type|NN OP* ch|NULLOK OP* right
 pR     |OP*    |cmpchain_finish|NN OP* ch
 ApR    |I32    |is_lvalue_sub
 : Used in cop.h
diff --git a/op.c b/op.c
index 46685dc..954bb32 100644 (file)
--- a/op.c
+++ b/op.c
@@ -5500,7 +5500,7 @@ Perl_invert(pTHX_ OP *o)
 OP *
-Perl_cmpchain_start(pTHX_ Optype type, OP *left, OP *right)
+Perl_cmpchain_start(pTHX_ I32 type, OP *left, OP *right)
     BINOP *bop;
     OP *op;
@@ -5525,7 +5525,7 @@ Perl_cmpchain_start(pTHX_ Optype type, OP *left, OP *right)
 OP *
-Perl_cmpchain_extend(pTHX_ Optype type, OP *ch, OP *right)
+Perl_cmpchain_extend(pTHX_ I32 type, OP *ch, OP *right)
     BINOP *bop;
     OP *op;
@@ -5568,7 +5568,7 @@ Perl_cmpchain_finish(pTHX_ OP *ch)
     if (ch->op_type != OP_NULL) {
-       Optype cmpoptype = ch->op_type;
+       OPCODE cmpoptype = ch->op_type;
        ch = CHECKOP(cmpoptype, ch);
        if(!ch->op_next && ch->op_type == cmpoptype)
            ch = fold_constants(op_integerize(op_std_init(ch)));
@@ -5581,7 +5581,7 @@ Perl_cmpchain_finish(pTHX_ OP *ch)
        while (1) {
            OP *cmpop = cUNOPx(ch)->op_first;
            OP *leftarg = OpSIBLING(cmpop);
-           Optype cmpoptype = cmpop->op_type;
+           OPCODE cmpoptype = cmpop->op_type;
            OP *nextrightarg;
            bool is_last;
            is_last = !(cUNOPx(ch)->op_first = OpSIBLING(leftarg));
diff --git a/proto.h b/proto.h
index a35c287..6306918 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -656,7 +656,7 @@ PERL_CALLCONV void  Perl_clear_defarray(pTHX_ AV* av, bool abandon);
 PERL_CALLCONV const COP*       Perl_closest_cop(pTHX_ const COP *cop, const OP *o, const OP *curop, bool opnext);
-PERL_CALLCONV OP*      Perl_cmpchain_extend(pTHX_ Optype type, OP* ch, OP* right)
+PERL_CALLCONV OP*      Perl_cmpchain_extend(pTHX_ I32 type, OP* ch, OP* right)
@@ -666,7 +666,7 @@ PERL_CALLCONV OP*   Perl_cmpchain_finish(pTHX_ OP* ch)
-PERL_CALLCONV OP*      Perl_cmpchain_start(pTHX_ Optype type, OP* left, OP* right)
+PERL_CALLCONV OP*      Perl_cmpchain_start(pTHX_ I32 type, OP* left, OP* right)