From: BT Templeton Date: Sat, 20 Jul 2013 18:59:45 +0000 (-0400) Subject: coccinelle scripts for dynwind X-Git-Url: https://git.hcoop.net/bpt/emacs.git/commitdiff_plain/3dcf03a6c2cf080653fcfa9305214428fddf2136 coccinelle scripts for dynwind * admin/coccinelle/double_unbind.cocci: * admin/coccinelle/dynwind.cocci: * admin/coccinelle/int_specpdl.cocci: * admin/coccinelle/macros.h: New files. --- 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