aboutsummaryrefslogtreecommitdiffstats
path: root/admin
diff options
context:
space:
mode:
authorBT Templeton <[email protected]>2013-07-20 14:59:45 -0400
committerRobin Templeton <[email protected]>2015-04-18 18:49:11 -0400
commit3dcf03a6c2cf080653fcfa9305214428fddf2136 (patch)
treef594557573abd6385c6732989f1bd01c78d10477 /admin
parentf99f5844f6dbf01fe77cdf92dec1c07028e5bec8 (diff)
coccinelle scripts for dynwind
* admin/coccinelle/double_unbind.cocci: * admin/coccinelle/dynwind.cocci: * admin/coccinelle/int_specpdl.cocci: * admin/coccinelle/macros.h: New files.
Diffstat (limited to 'admin')
-rw-r--r--admin/coccinelle/double_unbind.cocci25
-rw-r--r--admin/coccinelle/dynwind.cocci57
-rw-r--r--admin/coccinelle/int_specpdl.cocci5
-rw-r--r--admin/coccinelle/macros.h21
4 files changed, 108 insertions, 0 deletions
diff --git a/admin/coccinelle/double_unbind.cocci b/admin/coccinelle/double_unbind.cocci
new file mode 100644
index 0000000000..35ae7836f6
--- /dev/null
+++ b/admin/coccinelle/double_unbind.cocci
@@ -0,0 +1,25 @@
+@double_unbind@
+identifier X1;
+position p;
+@@
+unbind_to (X1, ...)
+... when != X1 = SPECPDL_INDEX ()
+unbind_to@p (X1, ...)
+
+@script:python@
+p << double_unbind.p;
+@@
+coccilib.report.print_report (p[0], "double unbind")
+
+@count_condition@
+identifier X1;
+position p;
+@@
+X1 = SPECPDL_INDEX ()
+...
+if (<+... X1@p ...+>) { ... }
+
+@script:python@
+p << count_condition.p;
+@@
+coccilib.report.print_report (p[0], "specpdl count in condition")
diff --git a/admin/coccinelle/dynwind.cocci b/admin/coccinelle/dynwind.cocci
new file mode 100644
index 0000000000..575f79a1a9
--- /dev/null
+++ b/admin/coccinelle/dynwind.cocci
@@ -0,0 +1,57 @@
+@normal_return@
+expression E1;
+@@
+- RETURN_UNGCPRO (E1);
++ return E1;
+
+@unbind_to_expr@
+expression E;
+position p;
+@@
+unbind_to(...)@E@p
+
+@rule@
+identifier X1, X2, fld;
+expression E1, E2;
+fresh identifier tem = "tem";
+position p != unbind_to_expr.p;
+@@
+(
+- ptrdiff_t X1 = SPECPDL_INDEX ();
++ dynwind_begin ();
+|
+- X1 = SPECPDL_INDEX ();
++ dynwind_begin ();
+)
+... when strict
+ when != X1
+(
++ dynwind_end ();
+ return;
+|
++ dynwind_end ();
+ return E1@p;
+|
+- return unbind_to (X1, X2);
++ dynwind_end();
++ return X2;
+|
+- return unbind_to (X1, X2->fld);
++ dynwind_end();
++ return X2;
+|
+- return unbind_to (X1, E2);
++ Lisp_Object tem = E2;
++ dynwind_end ();
++ return tem;
+|
+- unbind_to (X1, X2);
++ dynwind_end ();
+|
+- unbind_to (X1, X2->fld);
++ dynwind_end ();
+|
+- unbind_to (X1, E2);
++ E2;
++ dynwind_end ();
+)
diff --git a/admin/coccinelle/int_specpdl.cocci b/admin/coccinelle/int_specpdl.cocci
new file mode 100644
index 0000000000..dea9b13f87
--- /dev/null
+++ b/admin/coccinelle/int_specpdl.cocci
@@ -0,0 +1,5 @@
+@@
+identifier X;
+@@
+- int X = SPECPDL_INDEX ();
++ ptrdiff_t X = SPECPDL_INDEX ();
diff --git a/admin/coccinelle/macros.h b/admin/coccinelle/macros.h
new file mode 100644
index 0000000000..d74a0efcfa
--- /dev/null
+++ b/admin/coccinelle/macros.h
@@ -0,0 +1,21 @@
+#define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) Lisp_Object fnname
+#define DEFVAR_LISP(...) ((void) 0)
+#define DEFVAR_LISP_NOPRO(...) ((void) 0)
+#define DEFVAR_BOOL(...) ((void) 0)
+#define DEFVAR_INT(...) ((void) 0)
+#define DEFVAR_BUFFER_DEFAULTS(...) ((void) 0)
+#define DEFVAR_KBOARD(...) ((void) 0)
+#define IF_LINT(x)
+#define EXTERNALLY_VISIBLE
+#define alignas(x)
+#define DEF_IMGLIB_FN(...)
+#define ATTRIBUTE_FORMAT(...)
+#define ATTRIBUTE_FORMAT_PRINTF(...)
+#define UNSIGNED_CMP(a,op,b) (a op b)
+#define RETURN_UNGCPRO(x) return x
+#define PASCAL
+#define __int64 int
+#define IN
+#define OUT
+#define FAR
+#define CDECL