Discussion:
[SATYR PATCH] python: treat UINT64_MAX as None
Martin Milata
2013-08-16 15:56:57 UTC
Permalink
Note: this patch depends on "[SATYR PATCH 7/7] tests for json
deserialization of stacktraces" as it modifies one of the tests.

-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8--
Some structures (namely struct sr_core_frame) use (uint64_t)-1 to denote
unknown value. This is difficult to compare with in python, so this
patch introduces translation to None in uint64 accessor function.

Signed-off-by: Martin Milata <mmilata-H+wXaHxf7aLQT0dZR+***@public.gmane.org>
---
python/py_common.c | 20 ++++++++++++++++----
tests/python/core.py | 6 +++---
2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/python/py_common.c b/python/py_common.c
index 90a0ccb..c1366dd 100644
--- a/python/py_common.c
+++ b/python/py_common.c
@@ -162,6 +162,10 @@ sr_py_getter_uint64(PyObject *self, void *data)

uint64_t num
= MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset);
+
+ if (num == -1)
+ Py_RETURN_NONE;
+
return PyLong_FromUnsignedLongLong(num);
}

@@ -174,12 +178,20 @@ sr_py_setter_uint64(PyObject *self, PyObject *rhs, void *data)
return -1;
}

- struct getset_offsets *gsoff = data;
+ uint64_t newvalue;

- unsigned long long newvalue = PyInt_AsUnsignedLongLongMask(rhs);
- if (PyErr_Occurred())
- return -1;
+ if (rhs == Py_None)
+ {
+ newvalue = -1;
+ }
+ else
+ {
+ newvalue = (uint64_t)PyInt_AsUnsignedLongLongMask(rhs);
+ if (PyErr_Occurred())
+ return -1;
+ }

+ struct getset_offsets *gsoff = data;
MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset) = newvalue;
return 0;
}
diff --git a/tests/python/core.py b/tests/python/core.py
index e4593b4..cb880ae 100755
--- a/tests/python/core.py
+++ b/tests/python/core.py
@@ -113,9 +113,9 @@ class TestCoreStacktrace(BindingsTestCase):
self.assertEqual(trace.threads[0].frames[0].fingerprint, '1234123412341234123412341234')
self.assertTrue(trace.threads[0].frames[0].fingerprint_hashed)

- self.assertEqual(trace.threads[0].frames[1].address, 18446744073709551615L) # !!! FIXME
+ self.assertEqual(trace.threads[0].frames[1].address, None)
self.assertEqual(trace.threads[0].frames[1].build_id, None)
- self.assertEqual(trace.threads[0].frames[1].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[1].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[1].function_name, None)
self.assertEqual(trace.threads[0].frames[1].file_name, None)
self.assertEqual(trace.threads[0].frames[1].fingerprint, None)
@@ -123,7 +123,7 @@ class TestCoreStacktrace(BindingsTestCase):

self.assertEqual(trace.threads[0].frames[2].address, 2)
self.assertEqual(trace.threads[0].frames[2].build_id, None)
- self.assertEqual(trace.threads[0].frames[2].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[2].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[2].function_name, None)
self.assertEqual(trace.threads[0].frames[2].file_name, None)
self.assertEqual(trace.threads[0].frames[2].fingerprint, 'a b c d')
--
1.8.3.1
Martin Milata
2013-08-16 15:59:17 UTC
Permalink
Note: this patch depends on "[SATYR PATCH 7/7] tests for json
deserialization of stacktraces" as it modifies one of the tests.

-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8--
Some structures (namely struct sr_core_frame) use (uint64_t)-1 to denote
unknown value. This is difficult to compare with in python, so this
patch introduces translation to None in uint64 accessor function.

Closes #98.

Signed-off-by: Martin Milata <mmilata-H+wXaHxf7aLQT0dZR+***@public.gmane.org>
---
python/py_common.c | 20 ++++++++++++++++----
tests/python/core.py | 6 +++---
2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/python/py_common.c b/python/py_common.c
index 90a0ccb..c1366dd 100644
--- a/python/py_common.c
+++ b/python/py_common.c
@@ -162,6 +162,10 @@ sr_py_getter_uint64(PyObject *self, void *data)

uint64_t num
= MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset);
+
+ if (num == -1)
+ Py_RETURN_NONE;
+
return PyLong_FromUnsignedLongLong(num);
}

@@ -174,12 +178,20 @@ sr_py_setter_uint64(PyObject *self, PyObject *rhs, void *data)
return -1;
}

- struct getset_offsets *gsoff = data;
+ uint64_t newvalue;

- unsigned long long newvalue = PyInt_AsUnsignedLongLongMask(rhs);
- if (PyErr_Occurred())
- return -1;
+ if (rhs == Py_None)
+ {
+ newvalue = -1;
+ }
+ else
+ {
+ newvalue = (uint64_t)PyInt_AsUnsignedLongLongMask(rhs);
+ if (PyErr_Occurred())
+ return -1;
+ }

+ struct getset_offsets *gsoff = data;
MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset) = newvalue;
return 0;
}
diff --git a/tests/python/core.py b/tests/python/core.py
index e4593b4..cb880ae 100755
--- a/tests/python/core.py
+++ b/tests/python/core.py
@@ -113,9 +113,9 @@ class TestCoreStacktrace(BindingsTestCase):
self.assertEqual(trace.threads[0].frames[0].fingerprint, '1234123412341234123412341234')
self.assertTrue(trace.threads[0].frames[0].fingerprint_hashed)

- self.assertEqual(trace.threads[0].frames[1].address, 18446744073709551615L) # !!! FIXME
+ self.assertEqual(trace.threads[0].frames[1].address, None)
self.assertEqual(trace.threads[0].frames[1].build_id, None)
- self.assertEqual(trace.threads[0].frames[1].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[1].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[1].function_name, None)
self.assertEqual(trace.threads[0].frames[1].file_name, None)
self.assertEqual(trace.threads[0].frames[1].fingerprint, None)
@@ -123,7 +123,7 @@ class TestCoreStacktrace(BindingsTestCase):

self.assertEqual(trace.threads[0].frames[2].address, 2)
self.assertEqual(trace.threads[0].frames[2].build_id, None)
- self.assertEqual(trace.threads[0].frames[2].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[2].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[2].function_name, None)
self.assertEqual(trace.threads[0].frames[2].file_name, None)
self.assertEqual(trace.threads[0].frames[2].fingerprint, 'a b c d')
--
1.8.3.1
Jiri Moskovcak
2013-08-19 07:09:40 UTC
Permalink
- please add a comment about the conversion also in the code, so it's
clear on the first sight

thx,
Jirka
Post by Martin Milata
Note: this patch depends on "[SATYR PATCH 7/7] tests for json
deserialization of stacktraces" as it modifies one of the tests.
-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8--
Some structures (namely struct sr_core_frame) use (uint64_t)-1 to denote
unknown value. This is difficult to compare with in python, so this
patch introduces translation to None in uint64 accessor function.
---
python/py_common.c | 20 ++++++++++++++++----
tests/python/core.py | 6 +++---
2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/python/py_common.c b/python/py_common.c
index 90a0ccb..c1366dd 100644
--- a/python/py_common.c
+++ b/python/py_common.c
@@ -162,6 +162,10 @@ sr_py_getter_uint64(PyObject *self, void *data)
uint64_t num
= MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset);
+
+ if (num == -1)
+ Py_RETURN_NONE;
+
return PyLong_FromUnsignedLongLong(num);
}
@@ -174,12 +178,20 @@ sr_py_setter_uint64(PyObject *self, PyObject *rhs, void *data)
return -1;
}
- struct getset_offsets *gsoff = data;
+ uint64_t newvalue;
- unsigned long long newvalue = PyInt_AsUnsignedLongLongMask(rhs);
- if (PyErr_Occurred())
- return -1;
+ if (rhs == Py_None)
+ {
+ newvalue = -1;
+ }
+ else
+ {
+ newvalue = (uint64_t)PyInt_AsUnsignedLongLongMask(rhs);
+ if (PyErr_Occurred())
+ return -1;
+ }
+ struct getset_offsets *gsoff = data;
MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset) = newvalue;
return 0;
}
diff --git a/tests/python/core.py b/tests/python/core.py
index e4593b4..cb880ae 100755
--- a/tests/python/core.py
+++ b/tests/python/core.py
self.assertEqual(trace.threads[0].frames[0].fingerprint, '1234123412341234123412341234')
self.assertTrue(trace.threads[0].frames[0].fingerprint_hashed)
- self.assertEqual(trace.threads[0].frames[1].address, 18446744073709551615L) # !!! FIXME
+ self.assertEqual(trace.threads[0].frames[1].address, None)
self.assertEqual(trace.threads[0].frames[1].build_id, None)
- self.assertEqual(trace.threads[0].frames[1].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[1].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[1].function_name, None)
self.assertEqual(trace.threads[0].frames[1].file_name, None)
self.assertEqual(trace.threads[0].frames[1].fingerprint, None)
self.assertEqual(trace.threads[0].frames[2].address, 2)
self.assertEqual(trace.threads[0].frames[2].build_id, None)
- self.assertEqual(trace.threads[0].frames[2].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[2].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[2].function_name, None)
self.assertEqual(trace.threads[0].frames[2].file_name, None)
self.assertEqual(trace.threads[0].frames[2].fingerprint, 'a b c d')
Martin Milata
2013-08-19 10:26:52 UTC
Permalink
Note: this patch depends on "[SATYR PATCH 7/7] tests for json
deserialization of stacktraces" as it modifies one of the tests.

-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8--
Some structures (namely struct sr_core_frame) use (uint64_t)-1 to denote
unknown value. This is difficult to compare with in python, so this
patch introduces translation of this value to None in uint64 accessor
functions.

Signed-off-by: Martin Milata <mmilata-H+wXaHxf7aLQT0dZR+***@public.gmane.org>
---
python/py_common.c | 22 ++++++++++++++++++----
python/py_common.h | 2 ++
tests/python/core.py | 6 +++---
3 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/python/py_common.c b/python/py_common.c
index 90a0ccb..80b76f1 100644
--- a/python/py_common.c
+++ b/python/py_common.c
@@ -162,6 +162,11 @@ sr_py_getter_uint64(PyObject *self, void *data)

uint64_t num
= MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset);
+
+ /* If the attribute is UINT64_MAX, return None. */
+ if (num == -1)
+ Py_RETURN_NONE;
+
return PyLong_FromUnsignedLongLong(num);
}

@@ -174,12 +179,21 @@ sr_py_setter_uint64(PyObject *self, PyObject *rhs, void *data)
return -1;
}

- struct getset_offsets *gsoff = data;
+ uint64_t newvalue;

- unsigned long long newvalue = PyInt_AsUnsignedLongLongMask(rhs);
- if (PyErr_Occurred())
- return -1;
+ /* If rhs is None, set the attribute to UINT64_MAX. */
+ if (rhs == Py_None)
+ {
+ newvalue = -1;
+ }
+ else
+ {
+ newvalue = (uint64_t)PyInt_AsUnsignedLongLongMask(rhs);
+ if (PyErr_Occurred())
+ return -1;
+ }

+ struct getset_offsets *gsoff = data;
MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset) = newvalue;
return 0;
}
diff --git a/python/py_common.h b/python/py_common.h
index f64a43a..757df21 100644
--- a/python/py_common.h
+++ b/python/py_common.h
@@ -123,7 +123,9 @@ int sr_py_setter_uint32(PyObject *self, PyObject *rhs, void *data);
PyObject *sr_py_getter_bool(PyObject *self, void *data);
int sr_py_setter_bool(PyObject *self, PyObject *rhs, void *data);

+/* NOTE: if the attribute is UINT64_MAX, None object is returned */
PyObject *sr_py_getter_uint64(PyObject *self, void *data);
+/* NOTE: when rhs is None, the attribute is set to UINT64_MAX */
int sr_py_setter_uint64(PyObject *self, PyObject *rhs, void *data);

/*
diff --git a/tests/python/core.py b/tests/python/core.py
index e4593b4..cb880ae 100755
--- a/tests/python/core.py
+++ b/tests/python/core.py
@@ -113,9 +113,9 @@ class TestCoreStacktrace(BindingsTestCase):
self.assertEqual(trace.threads[0].frames[0].fingerprint, '1234123412341234123412341234')
self.assertTrue(trace.threads[0].frames[0].fingerprint_hashed)

- self.assertEqual(trace.threads[0].frames[1].address, 18446744073709551615L) # !!! FIXME
+ self.assertEqual(trace.threads[0].frames[1].address, None)
self.assertEqual(trace.threads[0].frames[1].build_id, None)
- self.assertEqual(trace.threads[0].frames[1].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[1].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[1].function_name, None)
self.assertEqual(trace.threads[0].frames[1].file_name, None)
self.assertEqual(trace.threads[0].frames[1].fingerprint, None)
@@ -123,7 +123,7 @@ class TestCoreStacktrace(BindingsTestCase):

self.assertEqual(trace.threads[0].frames[2].address, 2)
self.assertEqual(trace.threads[0].frames[2].build_id, None)
- self.assertEqual(trace.threads[0].frames[2].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[2].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[2].function_name, None)
self.assertEqual(trace.threads[0].frames[2].file_name, None)
self.assertEqual(trace.threads[0].frames[2].fingerprint, 'a b c d')
--
1.8.3.1
Richard Marko
2013-08-28 09:45:28 UTC
Permalink
Pushed.
Post by Martin Milata
Note: this patch depends on "[SATYR PATCH 7/7] tests for json
deserialization of stacktraces" as it modifies one of the tests.
-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8--
Some structures (namely struct sr_core_frame) use (uint64_t)-1 to denote
unknown value. This is difficult to compare with in python, so this
patch introduces translation of this value to None in uint64 accessor
functions.
---
python/py_common.c | 22 ++++++++++++++++++----
python/py_common.h | 2 ++
tests/python/core.py | 6 +++---
3 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/python/py_common.c b/python/py_common.c
index 90a0ccb..80b76f1 100644
--- a/python/py_common.c
+++ b/python/py_common.c
@@ -162,6 +162,11 @@ sr_py_getter_uint64(PyObject *self, void *data)
uint64_t num
= MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset);
+
+ /* If the attribute is UINT64_MAX, return None. */
+ if (num == -1)
+ Py_RETURN_NONE;
+
return PyLong_FromUnsignedLongLong(num);
}
@@ -174,12 +179,21 @@ sr_py_setter_uint64(PyObject *self, PyObject *rhs, void *data)
return -1;
}
- struct getset_offsets *gsoff = data;
+ uint64_t newvalue;
- unsigned long long newvalue = PyInt_AsUnsignedLongLongMask(rhs);
- if (PyErr_Occurred())
- return -1;
+ /* If rhs is None, set the attribute to UINT64_MAX. */
+ if (rhs == Py_None)
+ {
+ newvalue = -1;
+ }
+ else
+ {
+ newvalue = (uint64_t)PyInt_AsUnsignedLongLongMask(rhs);
+ if (PyErr_Occurred())
+ return -1;
+ }
+ struct getset_offsets *gsoff = data;
MEMB_T(uint64_t, MEMB(self, gsoff->c_struct_offset), gsoff->member_offset) = newvalue;
return 0;
}
diff --git a/python/py_common.h b/python/py_common.h
index f64a43a..757df21 100644
--- a/python/py_common.h
+++ b/python/py_common.h
@@ -123,7 +123,9 @@ int sr_py_setter_uint32(PyObject *self, PyObject *rhs, void *data);
PyObject *sr_py_getter_bool(PyObject *self, void *data);
int sr_py_setter_bool(PyObject *self, PyObject *rhs, void *data);
+/* NOTE: if the attribute is UINT64_MAX, None object is returned */
PyObject *sr_py_getter_uint64(PyObject *self, void *data);
+/* NOTE: when rhs is None, the attribute is set to UINT64_MAX */
int sr_py_setter_uint64(PyObject *self, PyObject *rhs, void *data);
/*
diff --git a/tests/python/core.py b/tests/python/core.py
index e4593b4..cb880ae 100755
--- a/tests/python/core.py
+++ b/tests/python/core.py
self.assertEqual(trace.threads[0].frames[0].fingerprint, '1234123412341234123412341234')
self.assertTrue(trace.threads[0].frames[0].fingerprint_hashed)
- self.assertEqual(trace.threads[0].frames[1].address, 18446744073709551615L) # !!! FIXME
+ self.assertEqual(trace.threads[0].frames[1].address, None)
self.assertEqual(trace.threads[0].frames[1].build_id, None)
- self.assertEqual(trace.threads[0].frames[1].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[1].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[1].function_name, None)
self.assertEqual(trace.threads[0].frames[1].file_name, None)
self.assertEqual(trace.threads[0].frames[1].fingerprint, None)
self.assertEqual(trace.threads[0].frames[2].address, 2)
self.assertEqual(trace.threads[0].frames[2].build_id, None)
- self.assertEqual(trace.threads[0].frames[2].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[2].build_id_offset, None)
self.assertEqual(trace.threads[0].frames[2].function_name, None)
self.assertEqual(trace.threads[0].frames[2].file_name, None)
self.assertEqual(trace.threads[0].frames[2].fingerprint, 'a b c d')
--
Richard Marko
Loading...