components/vim/vim72-patches/7.2.084
changeset 379 c6a17bba1da3
parent 378 f0b61ed1d10d
child 380 e92b3b4a1c66
equal deleted inserted replaced
378:f0b61ed1d10d 379:c6a17bba1da3
     1 To: [email protected]
       
     2 Subject: Patch 7.2.084
       
     3 Fcc: outbox
       
     4 From: Bram Moolenaar <[email protected]>
       
     5 Mime-Version: 1.0
       
     6 Content-Type: text/plain; charset=ISO-8859-1
       
     7 Content-Transfer-Encoding: 8bit
       
     8 ------------
       
     9 
       
    10 Patch 7.2.084
       
    11 Problem:    Recursive structures are not handled properly in Python
       
    12 	    vim.eval().
       
    13 Solution:   Keep track of references in a better way. (Yukihiro Nakadaira)
       
    14 Files:	    src/if_python.c
       
    15 
       
    16 
       
    17 *** ../vim-7.2.083/src/if_python.c	Thu Nov 20 11:04:01 2008
       
    18 --- src/if_python.c	Tue Jan 13 18:08:06 2009
       
    19 ***************
       
    20 *** 1151,1164 ****
       
    21   
       
    22       /* Check if we run into a recursive loop.  The item must be in lookupDict
       
    23        * then and we can use it again. */
       
    24 !     sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U, (long_u)our_tv);
       
    25 !     result = PyDict_GetItemString(lookupDict, ptrBuf);
       
    26 !     if (result != NULL)
       
    27 ! 	Py_INCREF(result);
       
    28 !     else if (our_tv->v_type == VAR_STRING)
       
    29       {
       
    30   	result = Py_BuildValue("s", our_tv->vval.v_string);
       
    31 - 	PyDict_SetItemString(lookupDict, ptrBuf, result);
       
    32       }
       
    33       else if (our_tv->v_type == VAR_NUMBER)
       
    34       {
       
    35 --- 1151,1173 ----
       
    36   
       
    37       /* Check if we run into a recursive loop.  The item must be in lookupDict
       
    38        * then and we can use it again. */
       
    39 !     if ((our_tv->v_type == VAR_LIST && our_tv->vval.v_list != NULL)
       
    40 ! 	    || (our_tv->v_type == VAR_DICT && our_tv->vval.v_dict != NULL))
       
    41 !     {
       
    42 ! 	sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U,
       
    43 ! 	        our_tv->v_type == VAR_LIST ? (long_u)our_tv->vval.v_list
       
    44 ! 		                           : (long_u)our_tv->vval.v_dict);
       
    45 ! 	result = PyDict_GetItemString(lookupDict, ptrBuf);
       
    46 ! 	if (result != NULL)
       
    47 ! 	{
       
    48 ! 	    Py_INCREF(result);
       
    49 ! 	    return result;
       
    50 ! 	}
       
    51 !     }
       
    52 ! 
       
    53 !     if (our_tv->v_type == VAR_STRING)
       
    54       {
       
    55   	result = Py_BuildValue("s", our_tv->vval.v_string);
       
    56       }
       
    57       else if (our_tv->v_type == VAR_NUMBER)
       
    58       {
       
    59 ***************
       
    60 *** 1167,1173 ****
       
    61   	/* For backwards compatibility numbers are stored as strings. */
       
    62   	sprintf(buf, "%ld", (long)our_tv->vval.v_number);
       
    63   	result = Py_BuildValue("s", buf);
       
    64 - 	PyDict_SetItemString(lookupDict, ptrBuf, result);
       
    65       }
       
    66   # ifdef FEAT_FLOAT
       
    67       else if (our_tv->v_type == VAR_FLOAT)
       
    68 --- 1176,1181 ----
       
    69 ***************
       
    70 *** 1176,1182 ****
       
    71   
       
    72   	sprintf(buf, "%f", our_tv->vval.v_float);
       
    73   	result = Py_BuildValue("s", buf);
       
    74 - 	PyDict_SetItemString(lookupDict, ptrBuf, result);
       
    75       }
       
    76   # endif
       
    77       else if (our_tv->v_type == VAR_LIST)
       
    78 --- 1184,1189 ----
       
    79 ***************
       
    80 *** 1185,1194 ****
       
    81   	listitem_T	*curr;
       
    82   
       
    83   	result = PyList_New(0);
       
    84 - 	PyDict_SetItemString(lookupDict, ptrBuf, result);
       
    85   
       
    86   	if (list != NULL)
       
    87   	{
       
    88   	    for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
       
    89   	    {
       
    90   		newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict);
       
    91 --- 1192,1202 ----
       
    92   	listitem_T	*curr;
       
    93   
       
    94   	result = PyList_New(0);
       
    95   
       
    96   	if (list != NULL)
       
    97   	{
       
    98 + 	    PyDict_SetItemString(lookupDict, ptrBuf, result);
       
    99 + 
       
   100   	    for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
       
   101   	    {
       
   102   		newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict);
       
   103 ***************
       
   104 *** 1200,1206 ****
       
   105       else if (our_tv->v_type == VAR_DICT)
       
   106       {
       
   107   	result = PyDict_New();
       
   108 - 	PyDict_SetItemString(lookupDict, ptrBuf, result);
       
   109   
       
   110   	if (our_tv->vval.v_dict != NULL)
       
   111   	{
       
   112 --- 1208,1213 ----
       
   113 ***************
       
   114 *** 1209,1214 ****
       
   115 --- 1216,1223 ----
       
   116   	    hashitem_T	*hi;
       
   117   	    dictitem_T	*di;
       
   118   
       
   119 + 	    PyDict_SetItemString(lookupDict, ptrBuf, result);
       
   120 + 
       
   121   	    for (hi = ht->ht_array; todo > 0; ++hi)
       
   122   	    {
       
   123   		if (!HASHITEM_EMPTY(hi))
       
   124 *** ../vim-7.2.083/src/version.c	Tue Jan 13 17:27:18 2009
       
   125 --- src/version.c	Tue Jan 13 17:54:14 2009
       
   126 ***************
       
   127 *** 678,679 ****
       
   128 --- 678,681 ----
       
   129   {   /* Add new patch number below this line */
       
   130 + /**/
       
   131 +     84,
       
   132   /**/
       
   133 
       
   134 -- 
       
   135 Article in the first Free Software Magazine: "Bram Moolenaar studied electrical
       
   136 engineering at the Technical University of Delft and graduated in 1985 on a
       
   137 multi-processor Unix architecture."
       
   138 Response by "dimator": Could the school not afford a proper stage for the
       
   139 ceremony?
       
   140 
       
   141  /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
       
   142 ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
       
   143 \\\        download, build and distribute -- http://www.A-A-P.org        ///
       
   144  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///