To: vim-dev@vim.org Subject: Patch 7.2.084 Fcc: outbox From: Bram Moolenaar 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 ///