aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generator/cppgenerator.cpp2
-rw-r--r--generator/shibokengenerator.cpp5
-rw-r--r--libshiboken/bindingmanager.cpp9
-rw-r--r--libshiboken/conversions.h17
-rw-r--r--libshiboken/sbkpython.h24
-rw-r--r--tests/samplebinding/bytearray_conversions.h16
-rw-r--r--tests/samplebinding/typesystem_sample.xml75
7 files changed, 80 insertions, 68 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp
index 35e9d2639..458a34d16 100644
--- a/generator/cppgenerator.cpp
+++ b/generator/cppgenerator.cpp
@@ -3720,7 +3720,7 @@ void CppGenerator::writeGetattroFunction(QTextStream& s, const AbstractMetaClass
s << INDENT << '}' << endl;
foreach (const AbstractMetaFunction* func, getMethodsWithBothStaticAndNonStaticMethods(metaClass)) {
- s << INDENT << "if (SBK_PyString_CompareWithASCIIString(name, \"" << func->name() << "\") == 0)" << endl;
+ s << INDENT << "if (Shiboken::String::compare(name, \"" << func->name() << "\") == 0)" << endl;
Indentation indent(INDENT);
s << INDENT << "return PyCFunction_NewEx(&" << cpythonMethodDefinitionName(func) << ", " PYTHON_SELF_VAR ", 0);" << endl;
}
diff --git a/generator/shibokengenerator.cpp b/generator/shibokengenerator.cpp
index 0be94bc6f..64c941460 100644
--- a/generator/shibokengenerator.cpp
+++ b/generator/shibokengenerator.cpp
@@ -903,11 +903,13 @@ QString ShibokenGenerator::cpythonCheckFunction(const AbstractMetaType* metaType
if (isNumber(baseName))
return genericNumberType ? QString("SbkNumber_Check") : QString("%1_Check").arg(baseName);
+
baseName.clear();
QTextStream b(&baseName);
// exclude const on Objects
Options flags = getConverterOptions(metaType);
writeBaseConversion(b, metaType, 0, flags);
+
return QString("%1checkType").arg(baseName);
}
@@ -941,6 +943,9 @@ QString ShibokenGenerator::guessCPythonCheckFunction(const QString& type, Abstra
if (type == "PyBuffer")
return "Shiboken::Buffer::checkType";
+ if (type == "str")
+ return "Shiboken::String::check";
+
*metaType = buildAbstractMetaTypeFromString(type);
if (*metaType && !(*metaType)->typeEntry()->isCustom())
return QString();
diff --git a/libshiboken/bindingmanager.cpp b/libshiboken/bindingmanager.cpp
index 15c478e88..26a3e1897 100644
--- a/libshiboken/bindingmanager.cpp
+++ b/libshiboken/bindingmanager.cpp
@@ -21,13 +21,16 @@
*/
#include "basewrapper.h"
-#include <cstddef>
-#include <fstream>
#include "basewrapper_p.h"
#include "bindingmanager.h"
#include "google/dense_hash_map"
#include "sbkdbg.h"
#include "gilstate.h"
+#include "sbkstring.h"
+
+#include <cstddef>
+#include <fstream>
+
namespace Shiboken
{
@@ -241,7 +244,7 @@ PyObject* BindingManager::getOverride(const void* cptr, const char* methodName)
}
}
- PyObject* pyMethodName = SBK_PyString_FromCString(methodName);
+ PyObject* pyMethodName = Shiboken::String::fromCString(methodName);
PyObject* method = PyObject_GetAttr((PyObject*)wrapper, pyMethodName);
if (method && PyMethod_Check(method)
diff --git a/libshiboken/conversions.h b/libshiboken/conversions.h
index 03d914a33..2749c2999 100644
--- a/libshiboken/conversions.h
+++ b/libshiboken/conversions.h
@@ -28,6 +28,7 @@
#include <memory>
#include <typeinfo>
+#include "sbkstring.h"
#include "sbkenum.h"
#include "basewrapper.h"
#include "bindingmanager.h"
@@ -451,19 +452,23 @@ template <typename CString>
struct Converter_CString
{
// Note: 0 is also a const char* in C++, so None is accepted in checkType
- static inline bool checkType(PyObject* pyObj) { return pyObj == Py_None || PyBytes_Check(pyObj); }
- static inline bool isConvertible(PyObject* pyObj) { return pyObj == Py_None || PyBytes_Check(pyObj); }
+ static inline bool checkType(PyObject* pyObj) {
+ return Shiboken::String::check(pyObj);
+ }
+ static inline bool isConvertible(PyObject* pyObj) {
+ return Shiboken::String::convertible(pyObj);
+ }
static inline PyObject* toPython(void* cppobj) { return toPython(reinterpret_cast<CString>(cppobj)); }
static inline PyObject* toPython(CString cppobj)
{
if (!cppobj)
Py_RETURN_NONE;
- return PyBytes_FromString(cppobj);
+ return Shiboken::String::fromCString(cppobj);
}
static inline CString toCpp(PyObject* pyobj) {
if (pyobj == Py_None)
return 0;
- return PyBytes_AS_STRING(pyobj);
+ return Shiboken::String::toCString(pyobj);
}
};
@@ -474,14 +479,14 @@ template <> struct Converter<std::string> : Converter_CString<std::string>
static inline PyObject* toPython(void* cppobj) { return toPython(*reinterpret_cast<std::string*>(cppobj)); }
static inline PyObject* toPython(std::string cppObj)
{
- return PyBytes_FromString(cppObj.c_str());
+ return Shiboken::String::fromCString(cppObj.c_str());
}
static inline std::string toCpp(PyObject* pyobj)
{
if (pyobj == Py_None)
return 0;
- return std::string(PyBytes_AS_STRING(pyobj));
+ return std::string(Shiboken::String::toCString(pyobj));
}
};
diff --git a/libshiboken/sbkpython.h b/libshiboken/sbkpython.h
index 24b70fe6d..84f92d25e 100644
--- a/libshiboken/sbkpython.h
+++ b/libshiboken/sbkpython.h
@@ -38,19 +38,7 @@
#define Py_TPFLAGS_CHECKTYPES 0
#define SBK_NB_BOOL(x) (x).nb_bool
- #define SBK_STR_NAME "bytes"
#define SBK_PyMethod_New PyMethod_New
- #define SBK_PyString_FromCString PyUnicode_FromString
- #define SBK_PyString_FromFormat PyUnicode_FromFormat
- #define SBK_PyString_CompareWithASCIIString PyUnicode_CompareWithASCIIString
-
- // Module MACROS
- #define SBK_MODULE_INIT_ERROR 0
- #define SBK_MODULE_INIT_FUNCTION_BEGIN(ModuleName) \
- extern "C" SBK_EXPORT_MODULE PyObject* PyInit_##ModuleName() {
-
- #define SBK_MODULE_INIT_FUNCTION_END \
- return module; }
#else
// Note: if there wasn't for the old-style classes, only a PyNumber_Check would suffice.
@@ -59,18 +47,6 @@
#define SBK_NB_BOOL(x) (x).nb_nonzero
#define SBK_STR_NAME "str"
#define SBK_PyMethod_New(X, Y) PyMethod_New(X, Y, (PyObject*)Py_TYPE(Y))
- #define SBK_PyString_FromCString PyBytes_FromString
- #define SBK_PyString_FromFormat PyString_FromFormat
- #define SBK_PyString_CompareWithASCIIString(X, Y) strcmp(PyString_AS_STRING(X), Y)
-
- // Module MACROS
- #define SBK_MODULE_INIT_ERROR
- #define SBK_MODULE_INIT_FUNCTION_BEGIN(ModuleName) \
- extern "C" SBK_EXPORT_MODULE void init##ModuleName()
-
- #define SBK_MODULE_INIT_FUNCTION_END \
- }
-
#endif
#endif
diff --git a/tests/samplebinding/bytearray_conversions.h b/tests/samplebinding/bytearray_conversions.h
index c37b28a99..0fd9a2b7d 100644
--- a/tests/samplebinding/bytearray_conversions.h
+++ b/tests/samplebinding/bytearray_conversions.h
@@ -8,17 +8,25 @@ inline bool Converter<ByteArray>::isConvertible(PyObject* pyObj)
if (ValueTypeConverter<ByteArray>::isConvertible(pyObj))
return true;
SbkObjectType* shiboType = reinterpret_cast<SbkObjectType*>(SbkType<ByteArray>());
- return Shiboken::Converter<const char*>::checkType(pyObj)
+
+ return Shiboken::Converter<const char*>::isConvertible(pyObj)
+ || PyBytes_Check(pyObj)
|| (ObjectType::isExternalConvertible(shiboType, pyObj));
}
inline ByteArray Converter<ByteArray>::toCpp(PyObject* pyObj)
{
- if (pyObj == Py_None)
+ if (pyObj == Py_None) {
return ByteArray();
- else if (PyObject_TypeCheck(pyObj, SbkType<ByteArray>()))
+ } else if (PyObject_TypeCheck(pyObj, SbkType<ByteArray>())) {
return *Converter<ByteArray*>::toCpp(pyObj);
- else if (PyBytes_Check(pyObj))
+ } else if (PyBytes_Check(pyObj)) {
return ByteArray(PyBytes_AS_STRING(pyObj), PyBytes_GET_SIZE(pyObj));
+ } else if (PyUnicode_Check(pyObj)) {
+ Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(pyObj));
+ return ByteArray(PyBytes_AsString(data.object()), PyBytes_GET_SIZE(data.object()));
+ } else if (Shiboken::String::check(pyObj)) {
+ return ByteArray(Shiboken::String::toCString(pyObj));
+ }
return ValueTypeConverter<ByteArray>::toCpp(pyObj);
}
inline PyObject* Converter<ByteArray>::toPython(const ByteArray& cppObj)
diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml
index a2b041a41..1c5664272 100644
--- a/tests/samplebinding/typesystem_sample.xml
+++ b/tests/samplebinding/typesystem_sample.xml
@@ -125,13 +125,13 @@
<modify-argument index="1">
<replace-type modified-type="const char*"/>
<conversion-rule class="native">
- unsigned char* %out = reinterpret_cast&lt;unsigned char*>(PyBytes_AS_STRING(%PYARG_1));
+ const unsigned char* %out = reinterpret_cast&lt;const unsigned char*>(Shiboken::String::toCString(%PYARG_1));
</conversion-rule>
</modify-argument>
<modify-argument index="2">
<remove-argument/>
<conversion-rule class="native">
- unsigned int %out = static_cast&lt;unsigned int>(PyBytes_GET_SIZE(%PYARG_1));
+ unsigned int %out = static_cast&lt;unsigned int>(Shiboken::String::len(%PYARG_1));
</conversion-rule>
</modify-argument>
</modify-function>
@@ -198,7 +198,7 @@
<object-type name="ModifiedConstructor">
<modify-function signature="ModifiedConstructor(int)">
<modify-argument index="1">
- <replace-type modified-type="PyBytes"/>
+ <replace-type modified-type="str"/>
</modify-argument>
<inject-code class='target' position='beginning'>
%0 = new %FUNCTION_NAME(atoi(%CONVERTTOCPP[const char*](%PYARG_1)));
@@ -1110,7 +1110,7 @@
Tested in InjectCodeTest.testTypeNativeBeginning_TypeTargetBeginning:
-->
<inject-code class="native" position="beginning">
- PyObject* InjectCode_tpstr(PyObject*) { return PyBytes_FromString("Hi! I'm the inject code dummy class."); }
+ PyObject* InjectCode_tpstr(PyObject*) { return Shiboken::String::fromCString("Hi! I'm the inject code dummy class."); }
</inject-code>
<!--
Register our tp_str class using another inject code
@@ -1126,8 +1126,8 @@
%1 += 1;
</inject-code>
<inject-code class="target" position="end">
- PyObject* tmp = PyBytes_FromString("end");
- PyBytes_Concat(&amp;%PYARG_0, tmp);
+ PyObject* tmp = Shiboken::String::fromCString("end");
+ Shiboken::String::concat(&amp;%PYARG_0, tmp);
Py_DECREF(tmp);
</inject-code>
</modify-function>
@@ -1135,8 +1135,8 @@
<!-- Tested in InjectCodeTest.testFunctionTargetBeginning -->
<modify-function signature="simpleMethod2()">
<inject-code class="target" position="end">
- PyObject* tmp = PyBytes_FromString("end");
- PyBytes_Concat(&amp;%PYARG_0, tmp);
+ PyObject* tmp = Shiboken::String::fromCString("end");
+ Shiboken::String::concat(&amp;%PYARG_0, tmp);
Py_DECREF(tmp);
</inject-code>
</modify-function>
@@ -1192,13 +1192,13 @@
<value-type name="SortedOverload">
<add-function signature="overload(PyObject *)" return-type="const char *">
<inject-code class="target" position="beginning">
- return PyBytes_FromString("PyObject");
+ return Shiboken::String::fromCString("PyObject");
</inject-code>
</add-function>
<add-function signature="overloadDeep(int, PyObject *)" return-type="const char *">
<inject-code class="target" position="beginning">
- return PyBytes_FromString("PyObject");
+ return Shiboken::String::fromCString("PyObject");
</inject-code>
</add-function>
<modify-function signature="pyObjOverload(unsigned char*, int)">
@@ -1219,7 +1219,7 @@
int x2 = ((int) (%CPPSELF.x() * 100)) - (x1 * 100);
int y1 = (int) %CPPSELF.y();
int y2 = ((int) (%CPPSELF.y() * 100)) - (y1 * 100);
- %PYARG_0 = SBK_PyString_FromFormat("Point(%d.%d, %d.%d)", x1, x2, y1, y2);
+ %PYARG_0 = Shiboken::String::fromFormat("Point(%d.%d, %d.%d)", x1, x2, y1, y2);
</inject-code>
</add-function>
<add-function signature="__repr__" return-type="PyObject*">
@@ -1228,7 +1228,7 @@
int x2 = ((int) (%CPPSELF.x() * 10)) - (x1 * 10);
int y1 = (int) %CPPSELF.y();
int y2 = ((int) (%CPPSELF.y() * 10)) - (y1 * 10);
- %PYARG_0 = SBK_PyString_FromFormat("&lt;Point object at %p: (%d.%d, %d.%d)&gt;", %CPPSELF, x1, x2, y1, y2);
+ %PYARG_0 = Shiboken::String::fromFormat("&lt;Point object at %p: (%d.%d, %d.%d)&gt;", %CPPSELF, x1, x2, y1, y2);
</inject-code>
</add-function>
@@ -1282,7 +1282,7 @@
int x2 = ((int) (%CPPSELF.x() * 100)) - (x1 * 100);
int y1 = (int) %CPPSELF.y();
int y2 = ((int) (%CPPSELF.y() * 100)) - (y1 * 100);
- %PYARG_0 = PyBytes_FromFormat("PointF(%d.%d, %d.%d)", x1, x2, y1, y2);
+ %PYARG_0 = Shiboken::String::fromFormat("PointF(%d.%d, %d.%d)", x1, x2, y1, y2);
</inject-code>
</add-function>
<add-function signature="__repr__" return-type="PyObject*">
@@ -1291,7 +1291,7 @@
int x2 = ((int) (%CPPSELF.x() * 10)) - (x1 * 10);
int y1 = (int) %CPPSELF.y();
int y2 = ((int) (%CPPSELF.y() * 10)) - (y1 * 10);
- %PYARG_0 = PyBytes_FromFormat("&lt;PointF object at %p: (%d.%d, %d.%d)&gt;", %CPPSELF, x1, x2, y1, y2);
+ %PYARG_0 = Shiboken::String::fromFormat("&lt;PointF object at %p: (%d.%d, %d.%d)&gt;", %CPPSELF, x1, x2, y1, y2);
</inject-code>
</add-function>
@@ -1423,7 +1423,7 @@
Shiboken::AutoDecRef strList(PySequence_Fast(%PYARG_1, "The argument must be a sequence."));
int lineCount = PySequence_Fast_GET_SIZE(strList.object());
for (int line = 0; line &lt; lineCount; ++line) {
- if (!PyBytes_Check(PySequence_Fast_GET_ITEM(strList.object(), line))) {
+ if (!Shiboken::String::check(PySequence_Fast_GET_ITEM(strList.object(), line))) {
PyErr_SetString(PyExc_TypeError, "The argument must be a sequence of strings.");
break;
}
@@ -1482,7 +1482,7 @@
<value-type name="Str" hash-function="strHash">
<add-function signature="__str__" return-type="PyObject*">
<inject-code class="target" position="beginning">
- %PYARG_0 = SBK_PyString_FromCString(%CPPSELF.cstring());
+ %PYARG_0 = Shiboken::String::fromCString(%CPPSELF.cstring());
</inject-code>
</add-function>
<add-function signature="__len__" >
@@ -1499,7 +1499,7 @@
char res[2];
res[0] = %CPPSELF.get_char(_i);
res[1] = 0;
- return PyBytes_FromString(res);
+ return Shiboken::String::fromCString(res);
}
</inject-code>
</add-function>
@@ -1540,7 +1540,16 @@
<replace-type modified-type="PyBytes"/>
</modify-argument>
<inject-code class="target" position="beginning">
- %0 = new %TYPE(PyBytes_AS_STRING(%PYARG_1), PyBytes_GET_SIZE(%PYARG_1));
+ PyObject* data = 0;
+ if (PyUnicode_CheckExact(%PYARG_1)) {
+ data = PyUnicode_AsASCIIString(%PYARG_1);
+ } else {
+ data = %PYARG_1;
+ Py_INCREF(data);
+ }
+
+ %0 = new %TYPE(PyBytes_AsString(data), PyBytes_GET_SIZE(data));
+ Py_DECREF(data);
</inject-code>
</modify-function>
@@ -1576,7 +1585,7 @@
Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(%PYARG_1));
if (!data.isNull()) {
ByteArray ba(*%CPPSELF);
- ba.append(PyBytes_AS_STRING(data.object()), PyBytes_GET_SIZE(data.object()));
+ ba.append(PyBytes_AsString(data.object()), PyBytes_GET_SIZE(data.object()));
%PYARG_0 = %CONVERTTOPYTHON[ByteArray](ba);
}
</inject-code>
@@ -1585,7 +1594,7 @@
<inject-code>
Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(%PYARG_1));
if (!data.isNull()) {
- ByteArray ba(PyBytes_AS_STRING(data.object()), PyBytes_GET_SIZE(data.object()));
+ ByteArray ba(PyBytes_AsString(data.object()), PyBytes_GET_SIZE(data.object()));
ba.append(*%CPPSELF);
%PYARG_0 = %CONVERTTOPYTHON[ByteArray](ba);
}
@@ -1593,12 +1602,18 @@
</add-function>
<add-function signature="operator+(PyBytes,ByteArray)">
<inject-code>
- ByteArray ba(PyBytes_AS_STRING(%PYARG_1), PyBytes_GET_SIZE(%PYARG_1));
- ba = ba + *%CPPSELF;
- %PYARG_0 = %CONVERTTOPYTHON[ByteArray](ba);
+ ByteArray ba(PyBytes_AsString(%PYARG_1), PyBytes_GET_SIZE(%PYARG_1));
+ ba = ba + *%CPPSELF;
+ %PYARG_0 = %CONVERTTOPYTHON[ByteArray](ba);
+ </inject-code>
+ </add-function>
+ <add-function signature="operator+(PyBytes)">
+ <inject-code>
+ ByteArray ba(PyBytes_AsString(%PYARG_1), PyBytes_GET_SIZE(%PYARG_1));
+ ba.append(*%CPPSELF);
+ %PYARG_0 = %CONVERTTOPYTHON[ByteArray](ba);
</inject-code>
</add-function>
-
<add-function signature="__repr__" return-type="PyObject*">
<inject-code class="target" position="beginning">
ByteArray ba(((PyObject*)%PYSELF)->ob_type->tp_name);
@@ -1610,9 +1625,9 @@
</inject-code>
</add-function>
- <add-function signature="__str__" return-type="PyBytes">
+ <add-function signature="__str__" return-type="str">
<inject-code class="target" position="beginning">
- %PYARG_0 = PyBytes_FromStringAndSize(%CPPSELF.data(), %CPPSELF.size());
+ %PYARG_0 = Shiboken::String::fromStringAndSize(%CPPSELF.data(), %CPPSELF.size());
</inject-code>
</add-function>
@@ -1703,7 +1718,7 @@
<value-type name="Echo">
<add-function signature="echo(const char *)" return-type="PyObject*">
<inject-code class="target" position="beginning">
- %PYARG_0 = PyBytes_FromString(%1);
+ %PYARG_0 = Shiboken::String::fromCString(%1);
</inject-code>
</add-function>
<add-function signature="operator>(int)">
@@ -1733,11 +1748,11 @@
</modify-function>
</value-type>
- <add-function signature="multiplyString(PyBytes*, unsigned int)" return-type="const char*">
+ <add-function signature="multiplyString(str, unsigned int)" return-type="const char*">
<inject-code class="target" position="beginning">
- %PYARG_0 = PyBytes_FromString("");
+ %PYARG_0 = Shiboken::String::fromCString("");
for (unsigned int i = 0; i &lt; %2; ++i)
- PyBytes_Concat(&amp;%PYARG_0, %PYARG_1);
+ Shiboken::String::concat(&amp;%PYARG_0, %PYARG_1);
</inject-code>
</add-function>