aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChris Gregory2016-12-31 13:36:32 +0200
committerEli Zaretskii2016-12-31 13:36:32 +0200
commitff9adb759ad0ae47220715dd8d588ecda00c8810 (patch)
treebf0924ec8b4bfc85f1d4b8a2ddd3abecdb7c06a7 /src
parent1da34d6a9dbe35fd83906a16a7f730298c3f8ab3 (diff)
downloademacs-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.c91
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
1413struct handler * 1418struct handler *