comparison src/dict.c @ 30566:b3de17181c19 v9.0.0618

patch 9.0.0618: calling function for reduce() has too much overhead Commit: https://github.com/vim/vim/commit/82418263fa91792e851cb0de879d1595327d5531 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Sep 28 16:16:15 2022 +0100 patch 9.0.0618: calling function for reduce() has too much overhead Problem: Calling function for reduce() has too much overhead. Solution: Do not create a funccall_T every time.
author Bram Moolenaar <Bram@vim.org>
date Wed, 28 Sep 2022 17:30:04 +0200
parents 029c59bf78f1
children 360f286b5869
comparison
equal deleted inserted replaced
30565:ce8e4c9cc95a 30566:b3de17181c19
1313 hashtab_T *ht; 1313 hashtab_T *ht;
1314 hashitem_T *hi; 1314 hashitem_T *hi;
1315 dictitem_T *di; 1315 dictitem_T *di;
1316 int todo; 1316 int todo;
1317 int rem; 1317 int rem;
1318 typval_T newtv;
1319 funccall_T *fc;
1318 1320
1319 if (filtermap == FILTERMAP_MAPNEW) 1321 if (filtermap == FILTERMAP_MAPNEW)
1320 { 1322 {
1321 rettv->v_type = VAR_DICT; 1323 rettv->v_type = VAR_DICT;
1322 rettv->vval.v_dict = NULL; 1324 rettv->vval.v_dict = NULL;
1332 { 1334 {
1333 if (rettv_dict_alloc(rettv) == FAIL) 1335 if (rettv_dict_alloc(rettv) == FAIL)
1334 return; 1336 return;
1335 d_ret = rettv->vval.v_dict; 1337 d_ret = rettv->vval.v_dict;
1336 } 1338 }
1339
1340 // Create one funccal_T for all eval_expr_typval() calls.
1341 fc = eval_expr_get_funccal(expr, &newtv);
1337 1342
1338 if (filtermap != FILTERMAP_FILTER && d->dv_lock == 0) 1343 if (filtermap != FILTERMAP_FILTER && d->dv_lock == 0)
1339 d->dv_lock = VAR_LOCKED; 1344 d->dv_lock = VAR_LOCKED;
1340 ht = &d->dv_hashtab; 1345 ht = &d->dv_hashtab;
1341 hash_lock(ht); 1346 hash_lock(ht);
1343 for (hi = ht->ht_array; todo > 0; ++hi) 1348 for (hi = ht->ht_array; todo > 0; ++hi)
1344 { 1349 {
1345 if (!HASHITEM_EMPTY(hi)) 1350 if (!HASHITEM_EMPTY(hi))
1346 { 1351 {
1347 int r; 1352 int r;
1348 typval_T newtv;
1349 1353
1350 --todo; 1354 --todo;
1351 di = HI2DI(hi); 1355 di = HI2DI(hi);
1352 if (filtermap == FILTERMAP_MAP 1356 if (filtermap == FILTERMAP_MAP
1353 && (value_check_lock(di->di_tv.v_lock, 1357 && (value_check_lock(di->di_tv.v_lock,
1355 || var_check_ro(di->di_flags, 1359 || var_check_ro(di->di_flags,
1356 arg_errmsg, TRUE))) 1360 arg_errmsg, TRUE)))
1357 break; 1361 break;
1358 set_vim_var_string(VV_KEY, di->di_key, -1); 1362 set_vim_var_string(VV_KEY, di->di_key, -1);
1359 newtv.v_type = VAR_UNKNOWN; 1363 newtv.v_type = VAR_UNKNOWN;
1360 r = filter_map_one(&di->di_tv, expr, filtermap, 1364 r = filter_map_one(&di->di_tv, expr, filtermap, fc, &newtv, &rem);
1361 &newtv, &rem);
1362 clear_tv(get_vim_var_tv(VV_KEY)); 1365 clear_tv(get_vim_var_tv(VV_KEY));
1363 if (r == FAIL || did_emsg) 1366 if (r == FAIL || did_emsg)
1364 { 1367 {
1365 clear_tv(&newtv); 1368 clear_tv(&newtv);
1366 break; 1369 break;
1396 } 1399 }
1397 } 1400 }
1398 } 1401 }
1399 hash_unlock(ht); 1402 hash_unlock(ht);
1400 d->dv_lock = prev_lock; 1403 d->dv_lock = prev_lock;
1404 if (fc != NULL)
1405 remove_funccal();
1401 } 1406 }
1402 1407
1403 /* 1408 /*
1404 * "remove({dict})" function 1409 * "remove({dict})" function
1405 */ 1410 */