coccinelle scripts for dynwind
authorBT Templeton <bt@hcoop.net>
Sat, 20 Jul 2013 18:59:45 +0000 (14:59 -0400)
committerRobin Templeton <robin@terpri.org>
Sat, 18 Apr 2015 22:49:11 +0000 (18:49 -0400)
* admin/coccinelle/double_unbind.cocci:
* admin/coccinelle/dynwind.cocci:
* admin/coccinelle/int_specpdl.cocci:
* admin/coccinelle/macros.h: New files.

admin/coccinelle/double_unbind.cocci [new file with mode: 0644]
admin/coccinelle/dynwind.cocci [new file with mode: 0644]
admin/coccinelle/int_specpdl.cocci [new file with mode: 0644]
admin/coccinelle/macros.h [new file with mode: 0644]

diff --git a/admin/coccinelle/double_unbind.cocci b/admin/coccinelle/double_unbind.cocci
new file mode 100644 (file)
index 0000000..35ae783
--- /dev/null
@@ -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 (file)
index 0000000..575f79a
--- /dev/null
@@ -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 (file)
index 0000000..dea9b13
--- /dev/null
@@ -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 (file)
index 0000000..d74a0ef
--- /dev/null
@@ -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