summaryrefslogtreecommitdiff
path: root/src/py_utils.cc
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-11-11 14:45:14 -0500
committerJohn Wiegley <johnw@newartisans.com>2009-11-11 14:45:14 -0500
commita034435c4287aba7fd32ed63a745e560350c924a (patch)
treef0acb080410a32c215c2c1938811cc14d512b580 /src/py_utils.cc
parent5ffa987daf4d97c52066e4c28733d826d3726297 (diff)
parentf0f1b0cdfa3a0a73695eda52b25de71bd40adc5a (diff)
downloadledger-a034435c4287aba7fd32ed63a745e560350c924a.tar.gz
ledger-a034435c4287aba7fd32ed63a745e560350c924a.tar.bz2
ledger-a034435c4287aba7fd32ed63a745e560350c924a.zip
Merge branch 'next'
Diffstat (limited to 'src/py_utils.cc')
-rw-r--r--src/py_utils.cc81
1 files changed, 58 insertions, 23 deletions
diff --git a/src/py_utils.cc b/src/py_utils.cc
index b2b9d0f8..2736ed3e 100644
--- a/src/py_utils.cc
+++ b/src/py_utils.cc
@@ -61,7 +61,8 @@ struct bool_from_python
static void construct(PyObject* obj_ptr,
converter::rvalue_from_python_stage1_data* data)
{
- void* storage = ((converter::rvalue_from_python_storage<bool>*) data)->storage.bytes;
+ void * storage =
+ ((converter::rvalue_from_python_storage<bool>*) data)->storage.bytes;
if (obj_ptr == Py_True)
new (storage) bool(true);
else
@@ -74,13 +75,19 @@ typedef register_python_conversion<bool, bool_to_python, bool_from_python>
bool_python_conversion;
-#if defined(STRING_VERIFY_ON)
-
struct string_to_python
{
- static PyObject* convert(const ledger::string& str)
+ static PyObject* convert(const string& str)
{
+#if 1
+ // Return a Unicode object
+ PyObject * pstr = PyString_FromString(str.c_str());
+ PyObject * uni = PyUnicode_FromEncodedObject(pstr, "UTF-8", NULL);
+ return object(handle<>(borrowed(uni))).ptr();
+#else
+ // Return a 7-bit ASCII string
return incref(object(static_cast<const std::string&>(str)).ptr());
+#endif
}
};
@@ -88,26 +95,49 @@ struct string_from_python
{
static void* convertible(PyObject* obj_ptr)
{
- if (!PyString_Check(obj_ptr)) return 0;
+ if (!PyUnicode_Check(obj_ptr) &&
+ !PyString_Check(obj_ptr)) return 0;
return obj_ptr;
}
- static void construct(PyObject* obj_ptr, converter::rvalue_from_python_stage1_data* data)
+ static void construct(PyObject* obj_ptr,
+ converter::rvalue_from_python_stage1_data* data)
{
- const char* value = PyString_AsString(obj_ptr);
- if (value == 0) throw_error_already_set();
- void* storage =
- reinterpret_cast<converter::rvalue_from_python_storage<ledger::string> *>(data)->storage.bytes;
- new (storage) ledger::string(value);
- data->convertible = storage;
+ if (PyString_Check(obj_ptr)) {
+ const char* value = PyString_AsString(obj_ptr);
+ if (value == 0) throw_error_already_set();
+ void* storage =
+ reinterpret_cast<converter::rvalue_from_python_storage<string> *>
+ (data)->storage.bytes;
+ new (storage) string(value);
+ data->convertible = storage;
+ } else {
+ VERIFY(PyUnicode_Check(obj_ptr));
+
+ Py_ssize_t size = PyUnicode_GET_SIZE(obj_ptr);
+ const Py_UNICODE* value = PyUnicode_AS_UNICODE(obj_ptr);
+
+ string str;
+ if (sizeof(Py_UNICODE) == 2) // UTF-16
+ utf8::unchecked::utf16to8(value, value + size, std::back_inserter(str));
+ else if (sizeof(Py_UNICODE) == 4) // UTF-32
+ utf8::unchecked::utf32to8(value, value + size, std::back_inserter(str));
+ else
+ assert(! "Py_UNICODE has an unexpected size");
+
+ if (value == 0) throw_error_already_set();
+ void* storage =
+ reinterpret_cast<converter::rvalue_from_python_storage<string> *>
+ (data)->storage.bytes;
+ new (storage) string(str);
+ data->convertible = storage;
+ }
}
};
-typedef register_python_conversion<ledger::string, string_to_python, string_from_python>
+typedef register_python_conversion<string, string_to_python, string_from_python>
string_python_conversion;
-#endif // STRING_VERIFY_ON
-
struct istream_to_python
{
@@ -125,16 +155,19 @@ struct istream_from_python
return obj_ptr;
}
- static void construct(PyObject* obj_ptr, converter::rvalue_from_python_stage1_data* data)
+ static void construct(PyObject* obj_ptr,
+ converter::rvalue_from_python_stage1_data* data)
{
void* storage =
- reinterpret_cast<converter::rvalue_from_python_storage<pyifstream> *>(data)->storage.bytes;
+ reinterpret_cast<converter::rvalue_from_python_storage<pyifstream> *>
+ (data)->storage.bytes;
new (storage) pyifstream(reinterpret_cast<PyFileObject *>(obj_ptr));
data->convertible = storage;
}
};
-typedef register_python_conversion<std::istream, istream_to_python, istream_from_python>
+typedef register_python_conversion<std::istream,
+ istream_to_python, istream_from_python>
istream_python_conversion;
@@ -154,15 +187,19 @@ struct ostream_from_python
return obj_ptr;
}
- static void construct(PyObject* obj_ptr, converter::rvalue_from_python_stage1_data* data)
+ static void construct(PyObject* obj_ptr,
+ converter::rvalue_from_python_stage1_data* data)
{
- void* storage = reinterpret_cast<converter::rvalue_from_python_storage<pyofstream> *>(data)->storage.bytes;
+ void* storage =
+ reinterpret_cast<converter::rvalue_from_python_storage<pyofstream> *>
+ (data)->storage.bytes;
new (storage) pyofstream(reinterpret_cast<PyFileObject *>(obj_ptr));
data->convertible = storage;
}
};
-typedef register_python_conversion<std::ostream, ostream_to_python, ostream_from_python>
+typedef register_python_conversion<std::ostream,
+ ostream_to_python, ostream_from_python>
ostream_python_conversion;
@@ -216,9 +253,7 @@ void export_utils()
;
bool_python_conversion();
-#if defined(STRING_VERIFY_ON)
string_python_conversion();
-#endif
istream_python_conversion();
ostream_python_conversion();
}