summaryrefslogtreecommitdiffstats
path: root/abs/core/perl_modules/perl-params-classify/op-sibling-fixes.patch
blob: 98dd25e482dfff6462f459319720084716e6ed39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
--- Params-Classify-0.013a/lib/Params/Classify.xs	2010-11-16 15:35:47.000000000 -0500
+++ Params-Classify-0.013b/lib/Params/Classify.xs	2017-03-26 15:38:12.384693301 -0400
@@ -41,6 +41,26 @@
 # define FPTR2DPTR(t,x) ((t)(UV)(x))
 #endif /* !FPTR2DPTR */
 
+#ifndef OpHAS_SIBLING
+#  define OpHAS_SIBLING(o)               (cBOOL((o)->op_sibling))
+#endif
+
+#ifndef OpSIBLING
+#  define OpSIBLING(o)                   (0 + (o)->op_sibling)
+#endif
+
+#ifndef OpMORESIB_set
+#  define OpMORESIB_set(o, sib)          ((o)->op_sibling = (sib))
+#endif
+
+#ifndef OpLASTSIB_set
+#  define OpLASTSIB_set(o, parent)       ((o)->op_sibling = NULL)
+#endif
+
+#ifndef OpMAYBESIB_set
+#  define OpMAYBESIB_set(o, sib, parent) ((o)->op_sibling = (sib))
+#endif
+
 #ifndef ptr_table_new
 
 struct q_ptr_tbl_ent {
@@ -625,8 +645,8 @@
 	OP *(*ppfunc)(pTHX);
 	I32 cvflags;
 	pushop = cUNOPx(op)->op_first;
-	if(!pushop->op_sibling) pushop = cUNOPx(pushop)->op_first;
-	for(cvop = pushop; cvop->op_sibling; cvop = cvop->op_sibling) ;
+	if(!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
+	for(cvop = pushop; OpHAS_SIBLING(cvop); cvop = OpSIBLING(cvop)) ;
 	if(!(cvop->op_type == OP_RV2CV &&
 			!(cvop->op_private & OPpENTERSUB_AMPER) &&
 			(cv = rvop_cv(cUNOPx(cvop)->op_first)) &&
@@ -635,20 +655,20 @@
 		return nxck_entersub(aTHX_ op);
 	cvflags = CvXSUBANY(cv).any_i32;
 	op = nxck_entersub(aTHX_ op);   /* for prototype checking */
-	aop = pushop->op_sibling;
-	bop = aop->op_sibling;
+	aop = OpSIBLING(pushop);
+	bop = OpSIBLING(aop);
 	if(bop == cvop) {
 		if(!(cvflags & PC_ALLOW_UNARY)) return op;
 		unary:
-		pushop->op_sibling = bop;
-		aop->op_sibling = NULL;
+		OpLASTSIB_set(pushop, bop);
+		OpLASTSIB_set(aop, NULL);
 		op_free(op);
 		op = newUNOP(OP_NULL, 0, aop);
 		op->op_type = OP_RAND;
 		op->op_ppaddr = ppfunc;
 		op->op_private = (U8)cvflags;
 		return op;
-	} else if(bop && bop->op_sibling == cvop) {
+	} else if(bop && OpSIBLING(op) == cvop) {
 		if(!(cvflags & PC_ALLOW_BINARY)) return op;
 		if(ppfunc == THX_pp_check_sclass &&
 				(cvflags & PC_TYPE_MASK) == SCLASS_REF) {
@@ -667,9 +687,9 @@
 			cvflags &= ~PC_TYPE_MASK;
 			ppfunc = THX_pp_check_dyn_battr;
 		}
-		pushop->op_sibling = cvop;
-		aop->op_sibling = NULL;
-		bop->op_sibling = NULL;
+		OpLASTSIB_set(pushop, cvop);
+		OpLASTSIB_set(aop, NULL);
+		OpLASTSIB_set(bop, NULL);
 		op_free(op);
 		op = newBINOP(OP_NULL, 0, aop, bop);
 		op->op_type = OP_RAND;