目前學習到第三章PyStringObject的內容,在最后一小節Hack PyStringObject操作的時候,作者并沒有給源代碼,或者說沒有直接說明如何修改源代碼,這里是我的一些探索,
運行環境:
window10
vs2010
python2.7.13,編譯的是PC目錄里面的VS9.0的專案
這是原文中的描述:

作者說是通過在string_ength中添加代碼,而這個函式實際上是這樣的:
static Py_ssize_t
string_length(PyStringObject *a)
{
return Py_SIZE(a);
}
同時,我在stringobject.c檔案中找不到ShowCharacter()函式,于是我打算自己寫一個,然后加入string_length()函式,看看執行len()的結果,代碼如下:
static Py_ssize_t
string_length(PyStringObject *a)
{
ShowCharacter();
return Py_SIZE(a);
}
其中ShowCharacter()代碼和原文一致,但是這樣編譯出來的python,會在打開的時候卡死,然后退出,我猜是ShowCharacter()的問題,于是在前面輸出一行文字:
static Py_ssize_t
string_length(PyStringObject *a)
{
printf("begin");
ShowCharacter();
return Py_SIZE(a);
}
果不其然,編譯以后,打開python,命令列中會輸出很多begin,然后直接退出,就是ShowCharacter()的問題了,目前還不太清楚問題具體出在哪,但是至少知道了一件事,當我們運行python時,它的內部會執行string_length()函式,我猜測在執行期間,運行到ShowCharacter()函式,這個函式內容會呼叫一些還未初始化的變數/型別,導致程式出錯,

最后,為了實作這個功能,我先嘗試了修改函式引數,加入一個flag引數,默認值為false,然后如果flag為true時,這個函式執行ShowCharacter(),但不幸的時,加入這個引數,系統會編譯的時候報錯,可能是其他用到這個string_length函式的地方不兼容,于是,我便嘗試讓ShowCharacter()在滿足某些條件的情況下,才執行,最終,調整引數,實作了這個結果,代碼如下:
static Py_ssize_t
string_length(PyStringObject *a)
{
// -----------------------
if (a->ob_size >= 500)
{
ShowCharacter();
}
// -----------------------
return Py_SIZE(a);
}
這樣一來,我們可以設定一個長度大于500的字串s,呼叫len(s)來間接查看字符緩沖區的參考變化,最終結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272497.html
標籤:python
