Patchwork [4,of,4] mpatch: raise MemoryError instead of mpatchError if lalloc() failed

login
register
mail settings
Submitter Yuya Nishihara
Date Aug. 7, 2016, 12:09 p.m.
Message ID <fee7202891c3ef87f6c0.1470571798@mimosa>
Download mbox | patch
Permalink /patch/16173/
State Accepted
Headers show

Comments

Yuya Nishihara - Aug. 7, 2016, 12:09 p.m.
# HG changeset patch
# User Yuya Nishihara <yuya@tcha.org>
# Date 1470532016 -32400
#      Sun Aug 07 10:06:56 2016 +0900
# Node ID fee7202891c3ef87f6c0f5db36edfc3386faec41
# Parent  888e432366ac66145869421a67732e33b70a80c9
mpatch: raise MemoryError instead of mpatchError if lalloc() failed

MemoryError is handled differently in dispatch._runcatch().

Since mpatch_errors[] isn't that useful now, I've changed it to a simple
switch statement.
Pierre-Yves David - Aug. 8, 2016, 11:05 p.m.
Patch 4 have misteriously disappeared from patchwork.
Augie is do you have some over-enthusiastic automation?

On 08/07/2016 02:09 PM, Yuya Nishihara wrote:
> # HG changeset patch
> # User Yuya Nishihara <yuya@tcha.org>
> # Date 1470532016 -32400
> #      Sun Aug 07 10:06:56 2016 +0900
> # Node ID fee7202891c3ef87f6c0f5db36edfc3386faec41
> # Parent  888e432366ac66145869421a67732e33b70a80c9
> mpatch: raise MemoryError instead of mpatchError if lalloc() failed
>
> MemoryError is handled differently in dispatch._runcatch().
>
> Since mpatch_errors[] isn't that useful now, I've changed it to a simple
> switch statement.
>
> diff --git a/mercurial/mpatch.c b/mercurial/mpatch.c
> --- a/mercurial/mpatch.c
> +++ b/mercurial/mpatch.c
> @@ -27,9 +27,6 @@
>  #include "compat.h"
>  #include "mpatch.h"
>
> -char *mpatch_errors[] = {NULL, "invalid patch", "patch cannot be decoded",
> -						"no memory"};
> -
>  static struct mpatch_flist *lalloc(ssize_t size)
>  {
>  	struct mpatch_flist *a = NULL;
> diff --git a/mercurial/mpatch.h b/mercurial/mpatch.h
> --- a/mercurial/mpatch.h
> +++ b/mercurial/mpatch.h
> @@ -1,8 +1,6 @@
>  #ifndef _HG_MPATCH_H_
>  #define _HG_MPATCH_H_
>
> -extern char *mpatch_errors[];
> -
>  #define MPATCH_ERR_NO_MEM -3
>  #define MPATCH_ERR_CANNOT_BE_DECODED -2
>  #define MPATCH_ERR_INVALID_PATCH -1
> diff --git a/mercurial/mpatch_module.c b/mercurial/mpatch_module.c
> --- a/mercurial/mpatch_module.c
> +++ b/mercurial/mpatch_module.c
> @@ -33,6 +33,21 @@
>  static char mpatch_doc[] = "Efficient binary patching.";
>  static PyObject *mpatch_Error;
>
> +static void setpyerr(int r)
> +{
> +	switch (r) {
> +	case MPATCH_ERR_NO_MEM:
> +		PyErr_NoMemory();
> +		break;
> +	case MPATCH_ERR_CANNOT_BE_DECODED:
> +		PyErr_SetString(mpatch_Error, "patch cannot be decoded");
> +		break;
> +	case MPATCH_ERR_INVALID_PATCH:
> +		PyErr_SetString(mpatch_Error, "invalid patch");
> +		break;
> +	}
> +}
> +
>  struct mpatch_flist *cpygetitem(void *bins, ssize_t pos)
>  {
>  	const char *buffer;
> @@ -47,7 +62,7 @@ struct mpatch_flist *cpygetitem(void *bi
>  		return NULL;
>  	if ((r = mpatch_decode(buffer, blen, &res)) < 0) {
>  		if (!PyErr_Occurred())
> -			PyErr_SetString(mpatch_Error, mpatch_errors[-r]);
> +			setpyerr(r);
>  		return NULL;
>  	}
>  	return res;
> @@ -102,7 +117,7 @@ patches(PyObject *self, PyObject *args)
>  cleanup:
>  	mpatch_lfree(patch);
>  	if (!result && !PyErr_Occurred())
> -		PyErr_SetString(mpatch_Error, mpatch_errors[-r]);
> +		setpyerr(r);
>  	return result;
>  }
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>
Pierre-Yves David - Aug. 9, 2016, 12:55 a.m.
I've pushed that one too.

pypy tests seems broken for other reasons :-/

On 08/07/2016 02:09 PM, Yuya Nishihara wrote:
> # HG changeset patch
> # User Yuya Nishihara <yuya@tcha.org>
> # Date 1470532016 -32400
> #      Sun Aug 07 10:06:56 2016 +0900
> # Node ID fee7202891c3ef87f6c0f5db36edfc3386faec41
> # Parent  888e432366ac66145869421a67732e33b70a80c9
> mpatch: raise MemoryError instead of mpatchError if lalloc() failed
>
> MemoryError is handled differently in dispatch._runcatch().
>
> Since mpatch_errors[] isn't that useful now, I've changed it to a simple
> switch statement.
>
> diff --git a/mercurial/mpatch.c b/mercurial/mpatch.c
> --- a/mercurial/mpatch.c
> +++ b/mercurial/mpatch.c
> @@ -27,9 +27,6 @@
>  #include "compat.h"
>  #include "mpatch.h"
>
> -char *mpatch_errors[] = {NULL, "invalid patch", "patch cannot be decoded",
> -						"no memory"};
> -
>  static struct mpatch_flist *lalloc(ssize_t size)
>  {
>  	struct mpatch_flist *a = NULL;
> diff --git a/mercurial/mpatch.h b/mercurial/mpatch.h
> --- a/mercurial/mpatch.h
> +++ b/mercurial/mpatch.h
> @@ -1,8 +1,6 @@
>  #ifndef _HG_MPATCH_H_
>  #define _HG_MPATCH_H_
>
> -extern char *mpatch_errors[];
> -
>  #define MPATCH_ERR_NO_MEM -3
>  #define MPATCH_ERR_CANNOT_BE_DECODED -2
>  #define MPATCH_ERR_INVALID_PATCH -1
> diff --git a/mercurial/mpatch_module.c b/mercurial/mpatch_module.c
> --- a/mercurial/mpatch_module.c
> +++ b/mercurial/mpatch_module.c
> @@ -33,6 +33,21 @@
>  static char mpatch_doc[] = "Efficient binary patching.";
>  static PyObject *mpatch_Error;
>
> +static void setpyerr(int r)
> +{
> +	switch (r) {
> +	case MPATCH_ERR_NO_MEM:
> +		PyErr_NoMemory();
> +		break;
> +	case MPATCH_ERR_CANNOT_BE_DECODED:
> +		PyErr_SetString(mpatch_Error, "patch cannot be decoded");
> +		break;
> +	case MPATCH_ERR_INVALID_PATCH:
> +		PyErr_SetString(mpatch_Error, "invalid patch");
> +		break;
> +	}
> +}
> +
>  struct mpatch_flist *cpygetitem(void *bins, ssize_t pos)
>  {
>  	const char *buffer;
> @@ -47,7 +62,7 @@ struct mpatch_flist *cpygetitem(void *bi
>  		return NULL;
>  	if ((r = mpatch_decode(buffer, blen, &res)) < 0) {
>  		if (!PyErr_Occurred())
> -			PyErr_SetString(mpatch_Error, mpatch_errors[-r]);
> +			setpyerr(r);
>  		return NULL;
>  	}
>  	return res;
> @@ -102,7 +117,7 @@ patches(PyObject *self, PyObject *args)
>  cleanup:
>  	mpatch_lfree(patch);
>  	if (!result && !PyErr_Occurred())
> -		PyErr_SetString(mpatch_Error, mpatch_errors[-r]);
> +		setpyerr(r);
>  	return result;
>  }
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>

Patch

diff --git a/mercurial/mpatch.c b/mercurial/mpatch.c
--- a/mercurial/mpatch.c
+++ b/mercurial/mpatch.c
@@ -27,9 +27,6 @@ 
 #include "compat.h"
 #include "mpatch.h"
 
-char *mpatch_errors[] = {NULL, "invalid patch", "patch cannot be decoded",
-						"no memory"};
-
 static struct mpatch_flist *lalloc(ssize_t size)
 {
 	struct mpatch_flist *a = NULL;
diff --git a/mercurial/mpatch.h b/mercurial/mpatch.h
--- a/mercurial/mpatch.h
+++ b/mercurial/mpatch.h
@@ -1,8 +1,6 @@ 
 #ifndef _HG_MPATCH_H_
 #define _HG_MPATCH_H_
 
-extern char *mpatch_errors[];
-
 #define MPATCH_ERR_NO_MEM -3
 #define MPATCH_ERR_CANNOT_BE_DECODED -2
 #define MPATCH_ERR_INVALID_PATCH -1
diff --git a/mercurial/mpatch_module.c b/mercurial/mpatch_module.c
--- a/mercurial/mpatch_module.c
+++ b/mercurial/mpatch_module.c
@@ -33,6 +33,21 @@ 
 static char mpatch_doc[] = "Efficient binary patching.";
 static PyObject *mpatch_Error;
 
+static void setpyerr(int r)
+{
+	switch (r) {
+	case MPATCH_ERR_NO_MEM:
+		PyErr_NoMemory();
+		break;
+	case MPATCH_ERR_CANNOT_BE_DECODED:
+		PyErr_SetString(mpatch_Error, "patch cannot be decoded");
+		break;
+	case MPATCH_ERR_INVALID_PATCH:
+		PyErr_SetString(mpatch_Error, "invalid patch");
+		break;
+	}
+}
+
 struct mpatch_flist *cpygetitem(void *bins, ssize_t pos)
 {
 	const char *buffer;
@@ -47,7 +62,7 @@  struct mpatch_flist *cpygetitem(void *bi
 		return NULL;
 	if ((r = mpatch_decode(buffer, blen, &res)) < 0) {
 		if (!PyErr_Occurred())
-			PyErr_SetString(mpatch_Error, mpatch_errors[-r]);
+			setpyerr(r);
 		return NULL;
 	}
 	return res;
@@ -102,7 +117,7 @@  patches(PyObject *self, PyObject *args)
 cleanup:
 	mpatch_lfree(patch);
 	if (!result && !PyErr_Occurred())
-		PyErr_SetString(mpatch_Error, mpatch_errors[-r]);
+		setpyerr(r);
 	return result;
 }