You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/dev-python/fuse-python/files/fuse_python_accept_none.patch

76 lines
2.0 KiB

--- fuseparts/_fusemodule.c.old 2007-06-18 16:20:09.000000000 +0200
+++ fuseparts/_fusemodule.c 2008-04-08 01:18:43.000000000 +0200
@@ -182,8 +182,50 @@
* the getattr type functions.
*/
-#define fetchattr_soft_d(st, attr, defa) \
- fetchattr_soft(st, attr) else st->attr = defa
+// <spaghetti_code> (sorry ...)
+
+#define good(attr) _GOOD_SPAGHETTI_ ## attr
+#define bad(attr) _BAD_SPAGHETTI_ ## attr
+
+/*
+ * This macro checks whether an attribute is available and not None.
+ * Success --> set attribute and goto _GOOD_SPAGHETTI
+ * Failure --> goto _BAD_SPAGHETTI
+ * Error --> goto OUT_DECREF
+ */
+#define fetchattr_soft_none_pre(st, attr) \
+ if (PyObject_HasAttrString(v, #attr)) { \
+ if (!(pytmp = PyObject_GetAttrString(v, #attr))) \
+ goto OUT_DECREF; \
+ else if (pytmp != Py_None) { \
+ py2attr(st, attr) \
+ goto good(attr); \
+ } \
+ else { \
+ Py_DECREF(pytmp); \
+ goto bad(attr); \
+ } \
+ } \
+ goto bad(attr);
+
+/**
+ * Calls fetchattr_soft_none_pre and ignores failure.
+ */
+#define fetchattr_soft_none(st, attr) \
+ fetchattr_soft_none_pre(st, attr); \
+ good(attr): ; \
+ bad(attr): ;
+
+/**
+ * Calls fetchattr_soft_none_pre and sets a default value on failure.
+ */
+#define fetchattr_soft_d(st, attr, defa) \
+ fetchattr_soft_none_pre(st, attr); \
+ bad(attr): \
+ st->attr = defa; \
+ good(attr): ;
+
+// </spaghetti_code>
#define FETCH_STAT_DATA() \
fetchattr(st, st_mode); \
@@ -206,7 +248,7 @@
* autotools so we just dare to throw these in as is. \
*/ \
\
- fetchattr_soft(st, st_rdev); \
+ fetchattr_soft_none(st, st_rdev); \
fetchattr_soft_d(st, st_blksize, 4096); \
fetchattr_soft_d(st, st_blocks, (st->st_size + 511)/512)
@@ -245,6 +287,10 @@
#endif
#undef fetchattr_soft_d
+#undef fetchattr_soft_none
+#undef fetchattr_soft_none_pre
+#undef good
+#undef bad
#undef FETCH_STAT_DATA
static int