To: vim-dev@vim.org
Subject: Patch 7.2.084
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------
Patch 7.2.084
Problem: Recursive structures are not handled properly in Python
vim.eval().
Solution: Keep track of references in a better way. (Yukihiro Nakadaira)
Files: src/if_python.c
*** ../vim-7.2.083/src/if_python.c Thu Nov 20 11:04:01 2008
--- src/if_python.c Tue Jan 13 18:08:06 2009
***************
*** 1151,1164 ****
/* Check if we run into a recursive loop. The item must be in lookupDict
* then and we can use it again. */
! sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U, (long_u)our_tv);
! result = PyDict_GetItemString(lookupDict, ptrBuf);
! if (result != NULL)
! Py_INCREF(result);
! else if (our_tv->v_type == VAR_STRING)
{
result = Py_BuildValue("s", our_tv->vval.v_string);
- PyDict_SetItemString(lookupDict, ptrBuf, result);
}
else if (our_tv->v_type == VAR_NUMBER)
{
--- 1151,1173 ----
/* Check if we run into a recursive loop. The item must be in lookupDict
* then and we can use it again. */
! if ((our_tv->v_type == VAR_LIST && our_tv->vval.v_list != NULL)
! || (our_tv->v_type == VAR_DICT && our_tv->vval.v_dict != NULL))
! {
! sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U,
! our_tv->v_type == VAR_LIST ? (long_u)our_tv->vval.v_list
! : (long_u)our_tv->vval.v_dict);
! result = PyDict_GetItemString(lookupDict, ptrBuf);
! if (result != NULL)
! {
! Py_INCREF(result);
! return result;
! }
! }
!
! if (our_tv->v_type == VAR_STRING)
{
result = Py_BuildValue("s", our_tv->vval.v_string);
}
else if (our_tv->v_type == VAR_NUMBER)
{
***************
*** 1167,1173 ****
/* For backwards compatibility numbers are stored as strings. */
sprintf(buf, "%ld", (long)our_tv->vval.v_number);
result = Py_BuildValue("s", buf);
- PyDict_SetItemString(lookupDict, ptrBuf, result);
}
# ifdef FEAT_FLOAT
else if (our_tv->v_type == VAR_FLOAT)
--- 1176,1181 ----
***************
*** 1176,1182 ****
sprintf(buf, "%f", our_tv->vval.v_float);
result = Py_BuildValue("s", buf);
- PyDict_SetItemString(lookupDict, ptrBuf, result);
}
# endif
else if (our_tv->v_type == VAR_LIST)
--- 1184,1189 ----
***************
*** 1185,1194 ****
listitem_T *curr;
result = PyList_New(0);
- PyDict_SetItemString(lookupDict, ptrBuf, result);
if (list != NULL)
{
for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
{
newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict);
--- 1192,1202 ----
listitem_T *curr;
result = PyList_New(0);
if (list != NULL)
{
+ PyDict_SetItemString(lookupDict, ptrBuf, result);
+
for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
{
newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict);
***************
*** 1200,1206 ****
else if (our_tv->v_type == VAR_DICT)
{
result = PyDict_New();
- PyDict_SetItemString(lookupDict, ptrBuf, result);
if (our_tv->vval.v_dict != NULL)
{
--- 1208,1213 ----
***************
*** 1209,1214 ****
--- 1216,1223 ----
hashitem_T *hi;
dictitem_T *di;
+ PyDict_SetItemString(lookupDict, ptrBuf, result);
+
for (hi = ht->ht_array; todo > 0; ++hi)
{
if (!HASHITEM_EMPTY(hi))
*** ../vim-7.2.083/src/version.c Tue Jan 13 17:27:18 2009
--- src/version.c Tue Jan 13 17:54:14 2009
***************
*** 678,679 ****
--- 678,681 ----
{ /* Add new patch number below this line */
+ /**/
+ 84,
/**/
--
Article in the first Free Software Magazine: "Bram Moolenaar studied electrical
engineering at the Technical University of Delft and graduated in 1985 on a
multi-processor Unix architecture."
Response by "dimator": Could the school not afford a proper stage for the
ceremony?
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ download, build and distribute -- http://www.A-A-P.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///