summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Sklar <177495+davidsklar@users.noreply.github.com>2023-01-14 14:28:09 -0500
committerJohn Wiegley <johnw@newartisans.com>2023-01-27 12:49:17 -0800
commit723dd41df17d3c4730ebbe8d1b10e4cb577870c7 (patch)
tree4ae8b6e696f6ce8d79a209acffe81605fede66f3 /src
parentb4445d99f15089d760a7dea874cac6ad2c11e4ff (diff)
downloadfork-ledger-723dd41df17d3c4730ebbe8d1b10e4cb577870c7.tar.gz
fork-ledger-723dd41df17d3c4730ebbe8d1b10e4cb577870c7.tar.bz2
fork-ledger-723dd41df17d3c4730ebbe8d1b10e4cb577870c7.zip
Fix python/c++ conversion for boost::optional<T>
Setters for types wrapped in boost::optional, such as item_t::note were broken, e.g. setting a note on a transaction resulted in garbled data that would cause Python to throw utf-8 errors when retrieving the note. (But setters that accessed strings directly, e.g. "payee" on a transaction worked fine.) This change alters the from-python conversion for optional-wrapped types based on the example at https://stackoverflow.com/questions/36485840/wrap-boostoptional-using-boostpython and a test case to verify the behavior.
Diffstat (limited to 'src')
-rw-r--r--src/pyutils.h9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/pyutils.h b/src/pyutils.h
index 6c9675b7..7bc0d0af 100644
--- a/src/pyutils.h
+++ b/src/pyutils.h
@@ -88,13 +88,14 @@ struct register_optional_to_python : public boost::noncopyable
{
using namespace boost::python::converter;
- void * const storage =
- reinterpret_cast<rvalue_from_python_storage<T> *>(data)->storage.bytes;
+ const T value = typename boost::python::extract<T>(source);
- if (data->convertible == source) // == None
+ void * storage = ((rvalue_from_python_storage<boost::optional<T>>*) data)->storage.bytes;
+
+ if (source == Py_None) // == None
new (storage) boost::optional<T>(); // A Boost uninitialized value
else
- new (storage) boost::optional<T>(*reinterpret_cast<T *>(data->convertible));
+ new (storage) boost::optional<T>(value);
data->convertible = storage;
}