---------------------------------------
wklejam:
static PyObject * py_test1(PyObject *self, PyObject *args)
{
PyObject *SO,*temp;
char *s;
if (!PyArg_ParseTuple(args,"U",&SO)) return NULL;
temp = PyUnicode_AsEncodedString(SO,"iso8859-2","replace");
if ( temp == NULL ) return NULL;
s = PyBytes_AsString(temp);
if ( s == NULL ) return NULL;
Py_DECREF(temp);
printf("<%s>\n",s);
temp = PyUnicode_Decode( s, strlen(s), "iso8859-2","strict");
printf("[%s]\n",s);
return Py_BuildValue("s",s);
}
----------------------------------
jak wo�am dla ci�gu: "ala,ma,kota " (4 spacje za kota)
to dostajďż˝:
"<ala,ma,kota >"
"[ala,ma,kota ]"
'ala,ma,kota '
a jak dla ci�gu: "ala,ma,kota " (5..12 spacji za kota,dla 13 jest O.K.)
to dostajďż˝:
"<ala,ma,kota >"
"[8]"
'8'
?? PyUnicode_(tak, bez jego wywo�ania nic si� nie dzieje) zniszczy�
zawarto�� �r�d�a?
To jest Bug czy ja czego� nie zrozumia�em?
pozdrawiam
> s = PyBytes_AsString(temp);
> Py_DECREF(temp);
OK, zapomia�em a dokumentacja przypomnia�a, �e jest zwracany wska�nik do
wewn�trznego bufora (tu obiektu temp) a ja go zaraz potem "niszcz�"
(DECREF). Tak�e nowy dzie�, �wie�e spojrzenie, rozwi�za�o problem.
> Napisa�em tak� funkcj� w swoim module (C) dla testu:
> Python 3.1.1
B��d tkwi w Twoim kodzie. Patrz ni�ej.
>
> ---------------------------------------
> wklejam:
>
> static PyObject * py_test1(PyObject *self, PyObject *args)
> {
> PyObject *SO,*temp;
> char *s;
>
> if (!PyArg_ParseTuple(args,"U",&SO)) return NULL;
>
> temp = PyUnicode_AsEncodedString(SO,"iso8859-2","replace");
> if ( temp == NULL ) return NULL;
> s = PyBytes_AsString(temp);
Tu pobierasz wska�nik do wewn�trznego bufora obiektu `temp`
a nie jego kopiďż˝ [1]_.
> if ( s == NULL ) return NULL;
> Py_DECREF(temp);
A tu zwalniasz pami�� obiektu `temp` wraz z jego wewn�trznym buforem.
Wszystko co si� dalej dzieje le�y w r�kach GC i przypadkowej
zawarto�ci bufora, na kt�ry wskazuje `s`.
>
> printf("<%s>\n",s);
> temp = PyUnicode_Decode( s, strlen(s), "iso8859-2","strict");
> printf("[%s]\n",s);
>
> return Py_BuildValue("s",s);
> }
>
> ----------------------------------
> jak wo�am dla ci�gu: "ala,ma,kota " (4 spacje za kota)
> to dostajďż˝:
> "<ala,ma,kota >"
> "[ala,ma,kota ]"
> 'ala,ma,kota '
>
> a jak dla ci�gu: "ala,ma,kota " (5..12 spacji za kota,dla 13 jest O.K.)
> to dostajďż˝:
> "<ala,ma,kota >"
> "[8]"
> '8'
> ?? PyUnicode_(tak, bez jego wywo�ania nic si� nie dzieje) zniszczy�
> zawarto�� �r�d�a?
> To jest Bug czy ja czego� nie zrozumia�em?
Dlatego tak kocham r�czne zarz�dzanie pami�ci�.
B��d pope�niony w jednym miejscu mo�e doprowadzi� do wysnuwania
szalonych teorii w innym. ;)
.. [1] http://docs.python.org/3.1/c-api/bytes.html?highlight=pybytes_asstring#PyBytes_AsString
RW