diff options
| author | Chris Gregory | 2016-12-31 13:36:32 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2016-12-31 13:36:32 +0200 |
| commit | ff9adb759ad0ae47220715dd8d588ecda00c8810 (patch) | |
| tree | bf0924ec8b4bfc85f1d4b8a2ddd3abecdb7c06a7 /src | |
| parent | 1da34d6a9dbe35fd83906a16a7f730298c3f8ab3 (diff) | |
| download | emacs-ff9adb759ad0ae47220715dd8d588ecda00c8810.tar.gz emacs-ff9adb759ad0ae47220715dd8d588ecda00c8810.zip | |
Simplify code in eval.c that calls 'setjmp'
* src/eval.c (internal_catch, internal_condition_case)
(internal_condition_case_1, internal_condition_case_2)
(internal_condition_case_n): Factor out the common tail of the
functions.
Copyright-paperwork-exempt: yes
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval.c | 91 |
1 files changed, 48 insertions, 43 deletions
diff --git a/src/eval.c b/src/eval.c index 240b0ff380f..01ae3a178d8 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -1085,22 +1085,19 @@ internal_catch (Lisp_Object tag, | |||
| 1085 | { | 1085 | { |
| 1086 | /* This structure is made part of the chain `catchlist'. */ | 1086 | /* This structure is made part of the chain `catchlist'. */ |
| 1087 | struct handler *c = push_handler (tag, CATCHER); | 1087 | struct handler *c = push_handler (tag, CATCHER); |
| 1088 | Lisp_Object val; | ||
| 1088 | 1089 | ||
| 1089 | /* Call FUNC. */ | 1090 | /* Call FUNC. */ |
| 1090 | if (! sys_setjmp (c->jmp)) | 1091 | if (! sys_setjmp (c->jmp)) |
| 1091 | { | 1092 | val = func (arg); |
| 1092 | Lisp_Object val = func (arg); | ||
| 1093 | clobbered_eassert (handlerlist == c); | ||
| 1094 | handlerlist = handlerlist->next; | ||
| 1095 | return val; | ||
| 1096 | } | ||
| 1097 | else | 1093 | else |
| 1098 | { /* Throw works by a longjmp that comes right here. */ | 1094 | { |
| 1099 | Lisp_Object val = handlerlist->val; | 1095 | /* Throw works by a longjmp that comes right here. */ |
| 1100 | clobbered_eassert (handlerlist == c); | 1096 | val = handlerlist->val; |
| 1101 | handlerlist = handlerlist->next; | ||
| 1102 | return val; | ||
| 1103 | } | 1097 | } |
| 1098 | clobbered_eassert (handlerlist == c); | ||
| 1099 | handlerlist = handlerlist->next; | ||
| 1100 | return val; | ||
| 1104 | } | 1101 | } |
| 1105 | 1102 | ||
| 1106 | /* Unwind the specbind, catch, and handler stacks back to CATCH, and | 1103 | /* Unwind the specbind, catch, and handler stacks back to CATCH, and |
| @@ -1314,20 +1311,22 @@ internal_condition_case (Lisp_Object (*bfun) (void), Lisp_Object handlers, | |||
| 1314 | Lisp_Object (*hfun) (Lisp_Object)) | 1311 | Lisp_Object (*hfun) (Lisp_Object)) |
| 1315 | { | 1312 | { |
| 1316 | struct handler *c = push_handler (handlers, CONDITION_CASE); | 1313 | struct handler *c = push_handler (handlers, CONDITION_CASE); |
| 1314 | Lisp_Object val; | ||
| 1315 | bool call_hfun; | ||
| 1316 | |||
| 1317 | if (sys_setjmp (c->jmp)) | 1317 | if (sys_setjmp (c->jmp)) |
| 1318 | { | 1318 | { |
| 1319 | Lisp_Object val = handlerlist->val; | 1319 | val = handlerlist->val; |
| 1320 | clobbered_eassert (handlerlist == c); | 1320 | call_hfun = true; |
| 1321 | handlerlist = handlerlist->next; | ||
| 1322 | return hfun (val); | ||
| 1323 | } | 1321 | } |
| 1324 | else | 1322 | else |
| 1325 | { | 1323 | { |
| 1326 | Lisp_Object val = bfun (); | 1324 | val = bfun (); |
| 1327 | clobbered_eassert (handlerlist == c); | 1325 | call_hfun = false; |
| 1328 | handlerlist = handlerlist->next; | ||
| 1329 | return val; | ||
| 1330 | } | 1326 | } |
| 1327 | clobbered_eassert (handlerlist == c); | ||
| 1328 | handlerlist = handlerlist->next; | ||
| 1329 | return call_hfun ? hfun (val) : val; | ||
| 1331 | } | 1330 | } |
| 1332 | 1331 | ||
| 1333 | /* Like internal_condition_case but call BFUN with ARG as its argument. */ | 1332 | /* Like internal_condition_case but call BFUN with ARG as its argument. */ |
| @@ -1338,20 +1337,22 @@ internal_condition_case_1 (Lisp_Object (*bfun) (Lisp_Object), Lisp_Object arg, | |||
| 1338 | Lisp_Object (*hfun) (Lisp_Object)) | 1337 | Lisp_Object (*hfun) (Lisp_Object)) |
| 1339 | { | 1338 | { |
| 1340 | struct handler *c = push_handler (handlers, CONDITION_CASE); | 1339 | struct handler *c = push_handler (handlers, CONDITION_CASE); |
| 1340 | Lisp_Object val; | ||
| 1341 | bool call_hfun; | ||
| 1342 | |||
| 1341 | if (sys_setjmp (c->jmp)) | 1343 | if (sys_setjmp (c->jmp)) |
| 1342 | { | 1344 | { |
| 1343 | Lisp_Object val = handlerlist->val; | 1345 | val = handlerlist->val; |
| 1344 | clobbered_eassert (handlerlist == c); | 1346 | call_hfun = true; |
| 1345 | handlerlist = handlerlist->next; | ||
| 1346 | return hfun (val); | ||
| 1347 | } | 1347 | } |
| 1348 | else | 1348 | else |
| 1349 | { | 1349 | { |
| 1350 | Lisp_Object val = bfun (arg); | 1350 | val = bfun (arg); |
| 1351 | clobbered_eassert (handlerlist == c); | 1351 | call_hfun = false; |
| 1352 | handlerlist = handlerlist->next; | ||
| 1353 | return val; | ||
| 1354 | } | 1352 | } |
| 1353 | clobbered_eassert (handlerlist == c); | ||
| 1354 | handlerlist = handlerlist->next; | ||
| 1355 | return call_hfun ? hfun (val) : val; | ||
| 1355 | } | 1356 | } |
| 1356 | 1357 | ||
| 1357 | /* Like internal_condition_case_1 but call BFUN with ARG1 and ARG2 as | 1358 | /* Like internal_condition_case_1 but call BFUN with ARG1 and ARG2 as |
| @@ -1365,20 +1366,22 @@ internal_condition_case_2 (Lisp_Object (*bfun) (Lisp_Object, Lisp_Object), | |||
| 1365 | Lisp_Object (*hfun) (Lisp_Object)) | 1366 | Lisp_Object (*hfun) (Lisp_Object)) |
| 1366 | { | 1367 | { |
| 1367 | struct handler *c = push_handler (handlers, CONDITION_CASE); | 1368 | struct handler *c = push_handler (handlers, CONDITION_CASE); |
| 1369 | Lisp_Object val; | ||
| 1370 | bool call_hfun; | ||
| 1371 | |||
| 1368 | if (sys_setjmp (c->jmp)) | 1372 | if (sys_setjmp (c->jmp)) |
| 1369 | { | 1373 | { |
| 1370 | Lisp_Object val = handlerlist->val; | 1374 | val = handlerlist->val; |
| 1371 | clobbered_eassert (handlerlist == c); | 1375 | call_hfun = true; |
| 1372 | handlerlist = handlerlist->next; | ||
| 1373 | return hfun (val); | ||
| 1374 | } | 1376 | } |
| 1375 | else | 1377 | else |
| 1376 | { | 1378 | { |
| 1377 | Lisp_Object val = bfun (arg1, arg2); | 1379 | val = bfun (arg1, arg2); |
| 1378 | clobbered_eassert (handlerlist == c); | 1380 | call_hfun = false; |
| 1379 | handlerlist = handlerlist->next; | ||
| 1380 | return val; | ||
| 1381 | } | 1381 | } |
| 1382 | clobbered_eassert (handlerlist == c); | ||
| 1383 | handlerlist = handlerlist->next; | ||
| 1384 | return call_hfun ? hfun (val) : val; | ||
| 1382 | } | 1385 | } |
| 1383 | 1386 | ||
| 1384 | /* Like internal_condition_case but call BFUN with NARGS as first, | 1387 | /* Like internal_condition_case but call BFUN with NARGS as first, |
| @@ -1394,20 +1397,22 @@ internal_condition_case_n (Lisp_Object (*bfun) (ptrdiff_t, Lisp_Object *), | |||
| 1394 | Lisp_Object *args)) | 1397 | Lisp_Object *args)) |
| 1395 | { | 1398 | { |
| 1396 | struct handler *c = push_handler (handlers, CONDITION_CASE); | 1399 | struct handler *c = push_handler (handlers, CONDITION_CASE); |
| 1400 | Lisp_Object val; | ||
| 1401 | bool call_hfun; | ||
| 1402 | |||
| 1397 | if (sys_setjmp (c->jmp)) | 1403 | if (sys_setjmp (c->jmp)) |
| 1398 | { | 1404 | { |
| 1399 | Lisp_Object val = handlerlist->val; | 1405 | val = handlerlist->val; |
| 1400 | clobbered_eassert (handlerlist == c); | 1406 | call_hfun = true; |
| 1401 | handlerlist = handlerlist->next; | ||
| 1402 | return hfun (val, nargs, args); | ||
| 1403 | } | 1407 | } |
| 1404 | else | 1408 | else |
| 1405 | { | 1409 | { |
| 1406 | Lisp_Object val = bfun (nargs, args); | 1410 | val = bfun (nargs, args); |
| 1407 | clobbered_eassert (handlerlist == c); | 1411 | call_hfun = false; |
| 1408 | handlerlist = handlerlist->next; | ||
| 1409 | return val; | ||
| 1410 | } | 1412 | } |
| 1413 | clobbered_eassert (handlerlist == c); | ||
| 1414 | handlerlist = handlerlist->next; | ||
| 1415 | return call_hfun ? hfun (val, nargs, args) : val; | ||
| 1411 | } | 1416 | } |
| 1412 | 1417 | ||
| 1413 | struct handler * | 1418 | struct handler * |