From 30d3a57eb757633aee2ef2a316ec3ddb2f668c70 Mon Sep 17 00:00:00 2001 From: Tamito Kajiyama Date: Thu, 16 May 2013 23:49:05 +0000 Subject: [PATCH] Fix for Freestyle built-in style module sketchy_multiple_parameterization.py not working correctly. Suitable for inclusion in 2.67a. Logical AND, OR and XOR operations on freestyle.Nature instances gave an error in some cases. The updated C implementation of these bitwise operations is intended to reproduce the following Python implementation: class Nature(int): def __and__(self, other): return Nature(int(self) & int(other)) def __or__(self, other): return Nature(int(self) | int(other)) def __xor__(self, other): return Nature(int(self) ^ int(other)) The problem report was by plasmasolutions on IRC, thanks a lot! --- .../freestyle/intern/python/BPy_Nature.cpp | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/source/blender/freestyle/intern/python/BPy_Nature.cpp b/source/blender/freestyle/intern/python/BPy_Nature.cpp index 4f8b1f8f4d5..da09de99590 100644 --- a/source/blender/freestyle/intern/python/BPy_Nature.cpp +++ b/source/blender/freestyle/intern/python/BPy_Nature.cpp @@ -263,41 +263,34 @@ int Nature_Init(PyObject *module) static PyObject *BPy_Nature_bitwise(PyObject *a, int op, PyObject *b) { BPy_Nature *result; + long op1, op2; if (!BPy_Nature_Check(a) || !BPy_Nature_Check(b)) { PyErr_SetString(PyExc_TypeError, "operands must be a Nature object"); return NULL; } - if (Py_SIZE(a) != 1) { - stringstream msg; - msg << "operand 1: unexpected Nature byte length: " << Py_SIZE(a); - PyErr_SetString(PyExc_TypeError, msg.str().c_str()); + op1 = PyLong_AsLong(a); + if (PyErr_Occurred()) { + PyErr_SetString(PyExc_ValueError, "operand 1: unexpected Nature value"); return NULL; } - if (Py_SIZE(b) != 1) { - stringstream msg; - msg << "operand 2: unexpected Nature byte length: " << Py_SIZE(b); - PyErr_SetString(PyExc_TypeError, msg.str().c_str()); + op2 = PyLong_AsLong(b); + if (PyErr_Occurred()) { + PyErr_SetString(PyExc_ValueError, "operand 2: unexpected Nature value"); return NULL; } result = PyObject_NewVar(BPy_Nature, &Nature_Type, 1); if (!result) return NULL; - if (Py_SIZE(result) != 1) { - stringstream msg; - msg << "unexpected Nature byte length: " << Py_SIZE(result); - PyErr_SetString(PyExc_TypeError, msg.str().c_str()); - return NULL; - } switch (op) { case '&': - result->i.ob_digit[0] = (((PyLongObject *)a)->ob_digit[0]) & (((PyLongObject *)b)->ob_digit)[0]; + result->i.ob_digit[0] = op1 & op2; break; case '^': - result->i.ob_digit[0] = (((PyLongObject *)a)->ob_digit[0]) ^ (((PyLongObject *)b)->ob_digit)[0]; + result->i.ob_digit[0] = op1 ^ op2; break; case '|': - result->i.ob_digit[0] = (((PyLongObject *)a)->ob_digit[0]) | (((PyLongObject *)b)->ob_digit)[0]; + result->i.ob_digit[0] = op1 | op2; break; } return (PyObject *)result;