Mercurial > vim
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 */ |