diff options
| author | Paul Eggert | 2017-01-22 00:18:40 -0800 |
|---|---|---|
| committer | Paul Eggert | 2017-01-22 00:25:35 -0800 |
| commit | 0a49f158f1598fb92989f3cbdc238a7e5f1bd8a3 (patch) | |
| tree | 34ff3896930886b9a072423fdb310d482bec283a /src | |
| parent | ade0652cc2a7103cd910accda8165ff8ee7c719f (diff) | |
| download | emacs-0a49f158f1598fb92989f3cbdc238a7e5f1bd8a3.tar.gz emacs-0a49f158f1598fb92989f3cbdc238a7e5f1bd8a3.zip | |
Improve uses of CHECK_LIST etc.
* src/eval.c (FletX): Report an error for invalid constructs like
‘(let* (a . 0))’, so that ‘let*’ is more consistent with ‘let’.
(lambda_arity): Use plain CHECK_CONS.
* src/fns.c (CHECK_LIST_END): Move from here to lisp.h.
(Fcopy_alist): Remove unnecessary CHECK_LIST call, since
concat does that for us.
(Fnthcdr, Fmember, Fmemql, Fdelete, Fnreverse):
Use CHECK_LIST_END, not CHECK_LIST_CONS. This hoists a
runtime check out of the loop.
(Fmemq): Simplify and use CHECK_LIST_END instead of CHECK_LIST.
(Fassq, Fassoc, Frassq, Frassoc):
Simplify and use CHECK_LIST_END instead of CAR.
(assq_no_quit, assoc_no_quit): Simplify and assume proper list.
(Fnconc): Use plain CHECK_CONS, and do-while instead of while loop.
* src/fontset.c (Fnew_fontset):
* src/frame.c (Fmodify_frame_parameters):
Use CHECK_LIST_END at end, rather than CHECK_LIST at start, for a
more-complete check.
* src/gfilenotify.c (Fgfile_add_watch):
Omit unnecessary CHECK_LIST, since Fmember does that for us.
* src/lisp.h (lisp_h_CHECK_LIST_CONS, CHECK_LIST_CONS):
Remove; no longer used.
(CHECK_LIST_END): New inline function.
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval.c | 9 | ||||
| -rw-r--r-- | src/fns.c | 248 | ||||
| -rw-r--r-- | src/fontset.c | 8 | ||||
| -rw-r--r-- | src/frame.c | 5 | ||||
| -rw-r--r-- | src/gfilenotify.c | 8 | ||||
| -rw-r--r-- | src/lisp.h | 6 |
6 files changed, 94 insertions, 190 deletions
diff --git a/src/eval.c b/src/eval.c index c05c8d8f8de..01e3db44082 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -856,9 +856,7 @@ usage: (let* VARLIST BODY...) */) | |||
| 856 | 856 | ||
| 857 | lexenv = Vinternal_interpreter_environment; | 857 | lexenv = Vinternal_interpreter_environment; |
| 858 | 858 | ||
| 859 | varlist = XCAR (args); | 859 | for (varlist = XCAR (args); CONSP (varlist); varlist = XCDR (varlist)) |
| 860 | CHECK_LIST (varlist); | ||
| 861 | while (CONSP (varlist)) | ||
| 862 | { | 860 | { |
| 863 | QUIT; | 861 | QUIT; |
| 864 | 862 | ||
| @@ -894,9 +892,8 @@ usage: (let* VARLIST BODY...) */) | |||
| 894 | } | 892 | } |
| 895 | else | 893 | else |
| 896 | specbind (var, val); | 894 | specbind (var, val); |
| 897 | |||
| 898 | varlist = XCDR (varlist); | ||
| 899 | } | 895 | } |
| 896 | CHECK_LIST_END (varlist, XCAR (args)); | ||
| 900 | 897 | ||
| 901 | val = Fprogn (XCDR (args)); | 898 | val = Fprogn (XCDR (args)); |
| 902 | return unbind_to (count, val); | 899 | return unbind_to (count, val); |
| @@ -3098,7 +3095,7 @@ lambda_arity (Lisp_Object fun) | |||
| 3098 | if (EQ (XCAR (fun), Qclosure)) | 3095 | if (EQ (XCAR (fun), Qclosure)) |
| 3099 | { | 3096 | { |
| 3100 | fun = XCDR (fun); /* Drop `closure'. */ | 3097 | fun = XCDR (fun); /* Drop `closure'. */ |
| 3101 | CHECK_LIST_CONS (fun, fun); | 3098 | CHECK_CONS (fun); |
| 3102 | } | 3099 | } |
| 3103 | syms_left = XCDR (fun); | 3100 | syms_left = XCDR (fun); |
| 3104 | if (CONSP (syms_left)) | 3101 | if (CONSP (syms_left)) |
| @@ -89,12 +89,6 @@ enum { QUIT_COUNT_HEURISTIC = 1 << 16 }; | |||
| 89 | 89 | ||
| 90 | /* Random data-structure functions. */ | 90 | /* Random data-structure functions. */ |
| 91 | 91 | ||
| 92 | static void | ||
| 93 | CHECK_LIST_END (Lisp_Object x, Lisp_Object y) | ||
| 94 | { | ||
| 95 | CHECK_TYPE (NILP (x), Qlistp, y); | ||
| 96 | } | ||
| 97 | |||
| 98 | DEFUN ("length", Flength, Slength, 1, 1, 0, | 92 | DEFUN ("length", Flength, Slength, 1, 1, 0, |
| 99 | doc: /* Return the length of vector, list or string SEQUENCE. | 93 | doc: /* Return the length of vector, list or string SEQUENCE. |
| 100 | A byte-code function object is also allowed. | 94 | A byte-code function object is also allowed. |
| @@ -1202,17 +1196,12 @@ are shared, however. | |||
| 1202 | Elements of ALIST that are not conses are also shared. */) | 1196 | Elements of ALIST that are not conses are also shared. */) |
| 1203 | (Lisp_Object alist) | 1197 | (Lisp_Object alist) |
| 1204 | { | 1198 | { |
| 1205 | register Lisp_Object tem; | ||
| 1206 | |||
| 1207 | CHECK_LIST (alist); | ||
| 1208 | if (NILP (alist)) | 1199 | if (NILP (alist)) |
| 1209 | return alist; | 1200 | return alist; |
| 1210 | alist = concat (1, &alist, Lisp_Cons, 0); | 1201 | alist = concat (1, &alist, Lisp_Cons, false); |
| 1211 | for (tem = alist; CONSP (tem); tem = XCDR (tem)) | 1202 | for (Lisp_Object tem = alist; !NILP (tem); tem = XCDR (tem)) |
| 1212 | { | 1203 | { |
| 1213 | register Lisp_Object car; | 1204 | Lisp_Object car = XCAR (tem); |
| 1214 | car = XCAR (tem); | ||
| 1215 | |||
| 1216 | if (CONSP (car)) | 1205 | if (CONSP (car)) |
| 1217 | XSETCAR (tem, Fcons (XCAR (car), XCDR (car))); | 1206 | XSETCAR (tem, Fcons (XCAR (car), XCDR (car))); |
| 1218 | } | 1207 | } |
| @@ -1356,16 +1345,20 @@ DEFUN ("nthcdr", Fnthcdr, Snthcdr, 2, 2, 0, | |||
| 1356 | doc: /* Take cdr N times on LIST, return the result. */) | 1345 | doc: /* Take cdr N times on LIST, return the result. */) |
| 1357 | (Lisp_Object n, Lisp_Object list) | 1346 | (Lisp_Object n, Lisp_Object list) |
| 1358 | { | 1347 | { |
| 1359 | EMACS_INT i, num; | ||
| 1360 | CHECK_NUMBER (n); | 1348 | CHECK_NUMBER (n); |
| 1361 | num = XINT (n); | 1349 | EMACS_INT num = XINT (n); |
| 1362 | for (i = 0; i < num && !NILP (list); i++) | 1350 | Lisp_Object tail = list; |
| 1351 | for (EMACS_INT i = 0; i < num; i++) | ||
| 1363 | { | 1352 | { |
| 1353 | if (! CONSP (tail)) | ||
| 1354 | { | ||
| 1355 | CHECK_LIST_END (tail, list); | ||
| 1356 | return Qnil; | ||
| 1357 | } | ||
| 1358 | tail = XCDR (tail); | ||
| 1364 | QUIT; | 1359 | QUIT; |
| 1365 | CHECK_LIST_CONS (list, list); | ||
| 1366 | list = XCDR (list); | ||
| 1367 | } | 1360 | } |
| 1368 | return list; | 1361 | return tail; |
| 1369 | } | 1362 | } |
| 1370 | 1363 | ||
| 1371 | DEFUN ("nth", Fnth, Snth, 2, 2, 0, | 1364 | DEFUN ("nth", Fnth, Snth, 2, 2, 0, |
| @@ -1392,66 +1385,52 @@ DEFUN ("elt", Felt, Selt, 2, 2, 0, | |||
| 1392 | DEFUN ("member", Fmember, Smember, 2, 2, 0, | 1385 | DEFUN ("member", Fmember, Smember, 2, 2, 0, |
| 1393 | doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'. | 1386 | doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'. |
| 1394 | The value is actually the tail of LIST whose car is ELT. */) | 1387 | The value is actually the tail of LIST whose car is ELT. */) |
| 1395 | (register Lisp_Object elt, Lisp_Object list) | 1388 | (Lisp_Object elt, Lisp_Object list) |
| 1396 | { | 1389 | { |
| 1397 | register Lisp_Object tail; | 1390 | Lisp_Object tail; |
| 1398 | for (tail = list; !NILP (tail); tail = XCDR (tail)) | 1391 | for (tail = list; CONSP (tail); tail = XCDR (tail)) |
| 1399 | { | 1392 | { |
| 1400 | register Lisp_Object tem; | 1393 | if (! NILP (Fequal (elt, XCAR (tail)))) |
| 1401 | CHECK_LIST_CONS (tail, list); | ||
| 1402 | tem = XCAR (tail); | ||
| 1403 | if (! NILP (Fequal (elt, tem))) | ||
| 1404 | return tail; | 1394 | return tail; |
| 1405 | QUIT; | 1395 | QUIT; |
| 1406 | } | 1396 | } |
| 1397 | CHECK_LIST_END (tail, list); | ||
| 1407 | return Qnil; | 1398 | return Qnil; |
| 1408 | } | 1399 | } |
| 1409 | 1400 | ||
| 1410 | DEFUN ("memq", Fmemq, Smemq, 2, 2, 0, | 1401 | DEFUN ("memq", Fmemq, Smemq, 2, 2, 0, |
| 1411 | doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'. | 1402 | doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'. |
| 1412 | The value is actually the tail of LIST whose car is ELT. */) | 1403 | The value is actually the tail of LIST whose car is ELT. */) |
| 1413 | (register Lisp_Object elt, Lisp_Object list) | 1404 | (Lisp_Object elt, Lisp_Object list) |
| 1414 | { | 1405 | { |
| 1415 | while (1) | 1406 | Lisp_Object tail; |
| 1407 | for (tail = list; CONSP (tail); tail = XCDR (tail)) | ||
| 1416 | { | 1408 | { |
| 1417 | if (!CONSP (list) || EQ (XCAR (list), elt)) | 1409 | if (EQ (XCAR (tail), elt)) |
| 1418 | break; | 1410 | return tail; |
| 1419 | |||
| 1420 | list = XCDR (list); | ||
| 1421 | if (!CONSP (list) || EQ (XCAR (list), elt)) | ||
| 1422 | break; | ||
| 1423 | |||
| 1424 | list = XCDR (list); | ||
| 1425 | if (!CONSP (list) || EQ (XCAR (list), elt)) | ||
| 1426 | break; | ||
| 1427 | |||
| 1428 | list = XCDR (list); | ||
| 1429 | QUIT; | 1411 | QUIT; |
| 1430 | } | 1412 | } |
| 1431 | 1413 | CHECK_LIST_END (tail, list); | |
| 1432 | CHECK_LIST (list); | 1414 | return Qnil; |
| 1433 | return list; | ||
| 1434 | } | 1415 | } |
| 1435 | 1416 | ||
| 1436 | DEFUN ("memql", Fmemql, Smemql, 2, 2, 0, | 1417 | DEFUN ("memql", Fmemql, Smemql, 2, 2, 0, |
| 1437 | doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'. | 1418 | doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'. |
| 1438 | The value is actually the tail of LIST whose car is ELT. */) | 1419 | The value is actually the tail of LIST whose car is ELT. */) |
| 1439 | (register Lisp_Object elt, Lisp_Object list) | 1420 | (Lisp_Object elt, Lisp_Object list) |
| 1440 | { | 1421 | { |
| 1441 | register Lisp_Object tail; | ||
| 1442 | |||
| 1443 | if (!FLOATP (elt)) | 1422 | if (!FLOATP (elt)) |
| 1444 | return Fmemq (elt, list); | 1423 | return Fmemq (elt, list); |
| 1445 | 1424 | ||
| 1446 | for (tail = list; !NILP (tail); tail = XCDR (tail)) | 1425 | Lisp_Object tail; |
| 1426 | for (tail = list; CONSP (tail); tail = XCDR (tail)) | ||
| 1447 | { | 1427 | { |
| 1448 | register Lisp_Object tem; | 1428 | Lisp_Object tem = XCAR (tail); |
| 1449 | CHECK_LIST_CONS (tail, list); | ||
| 1450 | tem = XCAR (tail); | ||
| 1451 | if (FLOATP (tem) && internal_equal (elt, tem, 0, 0, Qnil)) | 1429 | if (FLOATP (tem) && internal_equal (elt, tem, 0, 0, Qnil)) |
| 1452 | return tail; | 1430 | return tail; |
| 1453 | QUIT; | 1431 | QUIT; |
| 1454 | } | 1432 | } |
| 1433 | CHECK_LIST_END (tail, list); | ||
| 1455 | return Qnil; | 1434 | return Qnil; |
| 1456 | } | 1435 | } |
| 1457 | 1436 | ||
| @@ -1461,44 +1440,27 @@ The value is actually the first element of LIST whose car is KEY. | |||
| 1461 | Elements of LIST that are not conses are ignored. */) | 1440 | Elements of LIST that are not conses are ignored. */) |
| 1462 | (Lisp_Object key, Lisp_Object list) | 1441 | (Lisp_Object key, Lisp_Object list) |
| 1463 | { | 1442 | { |
| 1464 | while (1) | 1443 | Lisp_Object tail; |
| 1444 | for (tail = list; CONSP (tail); tail = XCDR (tail)) | ||
| 1465 | { | 1445 | { |
| 1466 | if (!CONSP (list) | 1446 | if (CONSP (XCAR (tail)) && EQ (XCAR (XCAR (tail)), key)) |
| 1467 | || (CONSP (XCAR (list)) | 1447 | return XCAR (tail); |
| 1468 | && EQ (XCAR (XCAR (list)), key))) | ||
| 1469 | break; | ||
| 1470 | |||
| 1471 | list = XCDR (list); | ||
| 1472 | if (!CONSP (list) | ||
| 1473 | || (CONSP (XCAR (list)) | ||
| 1474 | && EQ (XCAR (XCAR (list)), key))) | ||
| 1475 | break; | ||
| 1476 | |||
| 1477 | list = XCDR (list); | ||
| 1478 | if (!CONSP (list) | ||
| 1479 | || (CONSP (XCAR (list)) | ||
| 1480 | && EQ (XCAR (XCAR (list)), key))) | ||
| 1481 | break; | ||
| 1482 | |||
| 1483 | list = XCDR (list); | ||
| 1484 | QUIT; | 1448 | QUIT; |
| 1485 | } | 1449 | } |
| 1486 | 1450 | CHECK_LIST_END (tail, list); | |
| 1487 | return CAR (list); | 1451 | return Qnil; |
| 1488 | } | 1452 | } |
| 1489 | 1453 | ||
| 1490 | /* Like Fassq but never report an error and do not allow quits. | 1454 | /* Like Fassq but never report an error and do not allow quits. |
| 1491 | Use only on lists known never to be circular. */ | 1455 | Use only on objects known to be non-circular lists. */ |
| 1492 | 1456 | ||
| 1493 | Lisp_Object | 1457 | Lisp_Object |
| 1494 | assq_no_quit (Lisp_Object key, Lisp_Object list) | 1458 | assq_no_quit (Lisp_Object key, Lisp_Object list) |
| 1495 | { | 1459 | { |
| 1496 | while (CONSP (list) | 1460 | for (; ! NILP (list); list = XCDR (list)) |
| 1497 | && (!CONSP (XCAR (list)) | 1461 | if (CONSP (XCAR (list)) && EQ (XCAR (XCAR (list)), key)) |
| 1498 | || !EQ (XCAR (XCAR (list)), key))) | 1462 | return XCAR (list); |
| 1499 | list = XCDR (list); | 1463 | return Qnil; |
| 1500 | |||
| 1501 | return CAR_SAFE (list); | ||
| 1502 | } | 1464 | } |
| 1503 | 1465 | ||
| 1504 | DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0, | 1466 | DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0, |
| @@ -1506,81 +1468,49 @@ DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0, | |||
| 1506 | The value is actually the first element of LIST whose car equals KEY. */) | 1468 | The value is actually the first element of LIST whose car equals KEY. */) |
| 1507 | (Lisp_Object key, Lisp_Object list) | 1469 | (Lisp_Object key, Lisp_Object list) |
| 1508 | { | 1470 | { |
| 1509 | Lisp_Object car; | 1471 | Lisp_Object tail; |
| 1510 | 1472 | for (tail = list; CONSP (tail); tail = XCDR (tail)) | |
| 1511 | while (1) | ||
| 1512 | { | 1473 | { |
| 1513 | if (!CONSP (list) | 1474 | Lisp_Object car = XCAR (tail); |
| 1514 | || (CONSP (XCAR (list)) | 1475 | if (CONSP (car) |
| 1515 | && (car = XCAR (XCAR (list)), | 1476 | && (EQ (XCAR (car), key) || !NILP (Fequal (XCAR (car), key)))) |
| 1516 | EQ (car, key) || !NILP (Fequal (car, key))))) | 1477 | return car; |
| 1517 | break; | ||
| 1518 | |||
| 1519 | list = XCDR (list); | ||
| 1520 | if (!CONSP (list) | ||
| 1521 | || (CONSP (XCAR (list)) | ||
| 1522 | && (car = XCAR (XCAR (list)), | ||
| 1523 | EQ (car, key) || !NILP (Fequal (car, key))))) | ||
| 1524 | break; | ||
| 1525 | |||
| 1526 | list = XCDR (list); | ||
| 1527 | if (!CONSP (list) | ||
| 1528 | || (CONSP (XCAR (list)) | ||
| 1529 | && (car = XCAR (XCAR (list)), | ||
| 1530 | EQ (car, key) || !NILP (Fequal (car, key))))) | ||
| 1531 | break; | ||
| 1532 | |||
| 1533 | list = XCDR (list); | ||
| 1534 | QUIT; | 1478 | QUIT; |
| 1535 | } | 1479 | } |
| 1536 | 1480 | CHECK_LIST_END (tail, list); | |
| 1537 | return CAR (list); | 1481 | return Qnil; |
| 1538 | } | 1482 | } |
| 1539 | 1483 | ||
| 1540 | /* Like Fassoc but never report an error and do not allow quits. | 1484 | /* Like Fassoc but never report an error and do not allow quits. |
| 1541 | Use only on lists known never to be circular. */ | 1485 | Use only on objects known to be non-circular lists. */ |
| 1542 | 1486 | ||
| 1543 | Lisp_Object | 1487 | Lisp_Object |
| 1544 | assoc_no_quit (Lisp_Object key, Lisp_Object list) | 1488 | assoc_no_quit (Lisp_Object key, Lisp_Object list) |
| 1545 | { | 1489 | { |
| 1546 | while (CONSP (list) | 1490 | for (; ! NILP (list); list = XCDR (list)) |
| 1547 | && (!CONSP (XCAR (list)) | 1491 | { |
| 1548 | || (!EQ (XCAR (XCAR (list)), key) | 1492 | Lisp_Object car = XCAR (list); |
| 1549 | && NILP (Fequal (XCAR (XCAR (list)), key))))) | 1493 | if (CONSP (car) |
| 1550 | list = XCDR (list); | 1494 | && (EQ (XCAR (car), key) || !NILP (Fequal (XCAR (car), key)))) |
| 1551 | 1495 | return car; | |
| 1552 | return CONSP (list) ? XCAR (list) : Qnil; | 1496 | } |
| 1497 | return Qnil; | ||
| 1553 | } | 1498 | } |
| 1554 | 1499 | ||
| 1555 | DEFUN ("rassq", Frassq, Srassq, 2, 2, 0, | 1500 | DEFUN ("rassq", Frassq, Srassq, 2, 2, 0, |
| 1556 | doc: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST. | 1501 | doc: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST. |
| 1557 | The value is actually the first element of LIST whose cdr is KEY. */) | 1502 | The value is actually the first element of LIST whose cdr is KEY. */) |
| 1558 | (register Lisp_Object key, Lisp_Object list) | 1503 | (Lisp_Object key, Lisp_Object list) |
| 1559 | { | 1504 | { |
| 1560 | while (1) | 1505 | Lisp_Object tail; |
| 1506 | for (tail = list; CONSP (tail); tail = XCDR (tail)) | ||
| 1561 | { | 1507 | { |
| 1562 | if (!CONSP (list) | 1508 | if (CONSP (XCAR (tail)) && EQ (XCDR (XCAR (tail)), key)) |
| 1563 | || (CONSP (XCAR (list)) | 1509 | return XCAR (tail); |
| 1564 | && EQ (XCDR (XCAR (list)), key))) | ||
| 1565 | break; | ||
| 1566 | |||
| 1567 | list = XCDR (list); | ||
| 1568 | if (!CONSP (list) | ||
| 1569 | || (CONSP (XCAR (list)) | ||
| 1570 | && EQ (XCDR (XCAR (list)), key))) | ||
| 1571 | break; | ||
| 1572 | |||
| 1573 | list = XCDR (list); | ||
| 1574 | if (!CONSP (list) | ||
| 1575 | || (CONSP (XCAR (list)) | ||
| 1576 | && EQ (XCDR (XCAR (list)), key))) | ||
| 1577 | break; | ||
| 1578 | |||
| 1579 | list = XCDR (list); | ||
| 1580 | QUIT; | 1510 | QUIT; |
| 1581 | } | 1511 | } |
| 1582 | 1512 | CHECK_LIST_END (tail, list); | |
| 1583 | return CAR (list); | 1513 | return Qnil; |
| 1584 | } | 1514 | } |
| 1585 | 1515 | ||
| 1586 | DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0, | 1516 | DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0, |
| @@ -1588,35 +1518,17 @@ DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0, | |||
| 1588 | The value is actually the first element of LIST whose cdr equals KEY. */) | 1518 | The value is actually the first element of LIST whose cdr equals KEY. */) |
| 1589 | (Lisp_Object key, Lisp_Object list) | 1519 | (Lisp_Object key, Lisp_Object list) |
| 1590 | { | 1520 | { |
| 1591 | Lisp_Object cdr; | 1521 | Lisp_Object tail; |
| 1592 | 1522 | for (tail = list; CONSP (tail); tail = XCDR (tail)) | |
| 1593 | while (1) | ||
| 1594 | { | 1523 | { |
| 1595 | if (!CONSP (list) | 1524 | Lisp_Object car = XCAR (tail); |
| 1596 | || (CONSP (XCAR (list)) | 1525 | if (CONSP (car) |
| 1597 | && (cdr = XCDR (XCAR (list)), | 1526 | && (EQ (XCDR (car), key) || !NILP (Fequal (XCDR (car), key)))) |
| 1598 | EQ (cdr, key) || !NILP (Fequal (cdr, key))))) | 1527 | return car; |
| 1599 | break; | ||
| 1600 | |||
| 1601 | list = XCDR (list); | ||
| 1602 | if (!CONSP (list) | ||
| 1603 | || (CONSP (XCAR (list)) | ||
| 1604 | && (cdr = XCDR (XCAR (list)), | ||
| 1605 | EQ (cdr, key) || !NILP (Fequal (cdr, key))))) | ||
| 1606 | break; | ||
| 1607 | |||
| 1608 | list = XCDR (list); | ||
| 1609 | if (!CONSP (list) | ||
| 1610 | || (CONSP (XCAR (list)) | ||
| 1611 | && (cdr = XCDR (XCAR (list)), | ||
| 1612 | EQ (cdr, key) || !NILP (Fequal (cdr, key))))) | ||
| 1613 | break; | ||
| 1614 | |||
| 1615 | list = XCDR (list); | ||
| 1616 | QUIT; | 1528 | QUIT; |
| 1617 | } | 1529 | } |
| 1618 | 1530 | CHECK_LIST_END (tail, list); | |
| 1619 | return CAR (list); | 1531 | return Qnil; |
| 1620 | } | 1532 | } |
| 1621 | 1533 | ||
| 1622 | DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0, | 1534 | DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0, |
| @@ -1756,10 +1668,8 @@ changing the value of a sequence `foo'. */) | |||
| 1756 | { | 1668 | { |
| 1757 | Lisp_Object tail, prev; | 1669 | Lisp_Object tail, prev; |
| 1758 | 1670 | ||
| 1759 | for (tail = seq, prev = Qnil; !NILP (tail); tail = XCDR (tail)) | 1671 | for (tail = seq, prev = Qnil; CONSP (tail); tail = XCDR (tail)) |
| 1760 | { | 1672 | { |
| 1761 | CHECK_LIST_CONS (tail, seq); | ||
| 1762 | |||
| 1763 | if (!NILP (Fequal (elt, XCAR (tail)))) | 1673 | if (!NILP (Fequal (elt, XCAR (tail)))) |
| 1764 | { | 1674 | { |
| 1765 | if (NILP (prev)) | 1675 | if (NILP (prev)) |
| @@ -1771,6 +1681,7 @@ changing the value of a sequence `foo'. */) | |||
| 1771 | prev = tail; | 1681 | prev = tail; |
| 1772 | QUIT; | 1682 | QUIT; |
| 1773 | } | 1683 | } |
| 1684 | CHECK_LIST_END (tail, seq); | ||
| 1774 | } | 1685 | } |
| 1775 | 1686 | ||
| 1776 | return seq; | 1687 | return seq; |
| @@ -1790,14 +1701,14 @@ This function may destructively modify SEQ to produce the value. */) | |||
| 1790 | { | 1701 | { |
| 1791 | Lisp_Object prev, tail, next; | 1702 | Lisp_Object prev, tail, next; |
| 1792 | 1703 | ||
| 1793 | for (prev = Qnil, tail = seq; !NILP (tail); tail = next) | 1704 | for (prev = Qnil, tail = seq; CONSP (tail); tail = next) |
| 1794 | { | 1705 | { |
| 1795 | QUIT; | 1706 | QUIT; |
| 1796 | CHECK_LIST_CONS (tail, tail); | ||
| 1797 | next = XCDR (tail); | 1707 | next = XCDR (tail); |
| 1798 | Fsetcdr (tail, prev); | 1708 | Fsetcdr (tail, prev); |
| 1799 | prev = tail; | 1709 | prev = tail; |
| 1800 | } | 1710 | } |
| 1711 | CHECK_LIST_END (tail, seq); | ||
| 1801 | seq = prev; | 1712 | seq = prev; |
| 1802 | } | 1713 | } |
| 1803 | else if (VECTORP (seq)) | 1714 | else if (VECTORP (seq)) |
| @@ -2498,14 +2409,15 @@ usage: (nconc &rest LISTS) */) | |||
| 2498 | 2409 | ||
| 2499 | if (argnum + 1 == nargs) break; | 2410 | if (argnum + 1 == nargs) break; |
| 2500 | 2411 | ||
| 2501 | CHECK_LIST_CONS (tem, tem); | 2412 | CHECK_CONS (tem); |
| 2502 | 2413 | ||
| 2503 | while (CONSP (tem)) | 2414 | do |
| 2504 | { | 2415 | { |
| 2505 | tail = tem; | 2416 | tail = tem; |
| 2506 | tem = XCDR (tail); | 2417 | tem = XCDR (tail); |
| 2507 | QUIT; | 2418 | QUIT; |
| 2508 | } | 2419 | } |
| 2420 | while (CONSP (tem)); | ||
| 2509 | 2421 | ||
| 2510 | tem = args[argnum + 1]; | 2422 | tem = args[argnum + 1]; |
| 2511 | Fsetcdr (tail, tem); | 2423 | Fsetcdr (tail, tem); |
diff --git a/src/fontset.c b/src/fontset.c index 33d1d24e5b3..850558b08a0 100644 --- a/src/fontset.c +++ b/src/fontset.c | |||
| @@ -1677,11 +1677,10 @@ FONT-SPEC is a vector, a cons, or a string. See the documentation of | |||
| 1677 | `set-fontset-font' for the meaning. */) | 1677 | `set-fontset-font' for the meaning. */) |
| 1678 | (Lisp_Object name, Lisp_Object fontlist) | 1678 | (Lisp_Object name, Lisp_Object fontlist) |
| 1679 | { | 1679 | { |
| 1680 | Lisp_Object fontset; | 1680 | Lisp_Object fontset, tail; |
| 1681 | int id; | 1681 | int id; |
| 1682 | 1682 | ||
| 1683 | CHECK_STRING (name); | 1683 | CHECK_STRING (name); |
| 1684 | CHECK_LIST (fontlist); | ||
| 1685 | 1684 | ||
| 1686 | name = Fdowncase (name); | 1685 | name = Fdowncase (name); |
| 1687 | id = fs_query_fontset (name, 0); | 1686 | id = fs_query_fontset (name, 0); |
| @@ -1714,11 +1713,11 @@ FONT-SPEC is a vector, a cons, or a string. See the documentation of | |||
| 1714 | Fset_char_table_range (fontset, Qt, Qnil); | 1713 | Fset_char_table_range (fontset, Qt, Qnil); |
| 1715 | } | 1714 | } |
| 1716 | 1715 | ||
| 1717 | for (; CONSP (fontlist); fontlist = XCDR (fontlist)) | 1716 | for (tail = fontlist; CONSP (tail); tail = XCDR (tail)) |
| 1718 | { | 1717 | { |
| 1719 | Lisp_Object elt, script; | 1718 | Lisp_Object elt, script; |
| 1720 | 1719 | ||
| 1721 | elt = XCAR (fontlist); | 1720 | elt = XCAR (tail); |
| 1722 | script = Fcar (elt); | 1721 | script = Fcar (elt); |
| 1723 | elt = Fcdr (elt); | 1722 | elt = Fcdr (elt); |
| 1724 | if (CONSP (elt) && (NILP (XCDR (elt)) || CONSP (XCDR (elt)))) | 1723 | if (CONSP (elt) && (NILP (XCDR (elt)) || CONSP (XCDR (elt)))) |
| @@ -1727,6 +1726,7 @@ FONT-SPEC is a vector, a cons, or a string. See the documentation of | |||
| 1727 | else | 1726 | else |
| 1728 | Fset_fontset_font (name, script, elt, Qnil, Qappend); | 1727 | Fset_fontset_font (name, script, elt, Qnil, Qappend); |
| 1729 | } | 1728 | } |
| 1729 | CHECK_LIST_END (tail, fontlist); | ||
| 1730 | return name; | 1730 | return name; |
| 1731 | } | 1731 | } |
| 1732 | 1732 | ||
diff --git a/src/frame.c b/src/frame.c index 2c2c1e150d4..d0f653fc762 100644 --- a/src/frame.c +++ b/src/frame.c | |||
| @@ -2691,9 +2691,7 @@ list, but are otherwise ignored. */) | |||
| 2691 | (Lisp_Object frame, Lisp_Object alist) | 2691 | (Lisp_Object frame, Lisp_Object alist) |
| 2692 | { | 2692 | { |
| 2693 | struct frame *f = decode_live_frame (frame); | 2693 | struct frame *f = decode_live_frame (frame); |
| 2694 | register Lisp_Object prop, val; | 2694 | Lisp_Object prop, val; |
| 2695 | |||
| 2696 | CHECK_LIST (alist); | ||
| 2697 | 2695 | ||
| 2698 | /* I think this should be done with a hook. */ | 2696 | /* I think this should be done with a hook. */ |
| 2699 | #ifdef HAVE_WINDOW_SYSTEM | 2697 | #ifdef HAVE_WINDOW_SYSTEM |
| @@ -3142,6 +3140,7 @@ x_set_frame_parameters (struct frame *f, Lisp_Object alist) | |||
| 3142 | 3140 | ||
| 3143 | for (size = 0, tail = alist; CONSP (tail); tail = XCDR (tail)) | 3141 | for (size = 0, tail = alist; CONSP (tail); tail = XCDR (tail)) |
| 3144 | size++; | 3142 | size++; |
| 3143 | CHECK_LIST_END (tail, alist); | ||
| 3145 | 3144 | ||
| 3146 | USE_SAFE_ALLOCA; | 3145 | USE_SAFE_ALLOCA; |
| 3147 | SAFE_ALLOCA_LISP (parms, 2 * size); | 3146 | SAFE_ALLOCA_LISP (parms, 2 * size); |
diff --git a/src/gfilenotify.c b/src/gfilenotify.c index 6ec5c642825..285a253733d 100644 --- a/src/gfilenotify.c +++ b/src/gfilenotify.c | |||
| @@ -178,20 +178,18 @@ will be reported only in case of the `moved' event. */) | |||
| 178 | if (NILP (Ffile_exists_p (file))) | 178 | if (NILP (Ffile_exists_p (file))) |
| 179 | report_file_error ("File does not exist", file); | 179 | report_file_error ("File does not exist", file); |
| 180 | 180 | ||
| 181 | CHECK_LIST (flags); | ||
| 182 | |||
| 183 | if (!FUNCTIONP (callback)) | 181 | if (!FUNCTIONP (callback)) |
| 184 | wrong_type_argument (Qinvalid_function, callback); | 182 | wrong_type_argument (Qinvalid_function, callback); |
| 185 | 183 | ||
| 186 | /* Create GFile name. */ | ||
| 187 | gfile = g_file_new_for_path (SSDATA (ENCODE_FILE (file))); | ||
| 188 | |||
| 189 | /* Assemble flags. */ | 184 | /* Assemble flags. */ |
| 190 | if (!NILP (Fmember (Qwatch_mounts, flags))) | 185 | if (!NILP (Fmember (Qwatch_mounts, flags))) |
| 191 | gflags |= G_FILE_MONITOR_WATCH_MOUNTS; | 186 | gflags |= G_FILE_MONITOR_WATCH_MOUNTS; |
| 192 | if (!NILP (Fmember (Qsend_moved, flags))) | 187 | if (!NILP (Fmember (Qsend_moved, flags))) |
| 193 | gflags |= G_FILE_MONITOR_SEND_MOVED; | 188 | gflags |= G_FILE_MONITOR_SEND_MOVED; |
| 194 | 189 | ||
| 190 | /* Create GFile name. */ | ||
| 191 | gfile = g_file_new_for_path (SSDATA (ENCODE_FILE (file))); | ||
| 192 | |||
| 195 | /* Enable watch. */ | 193 | /* Enable watch. */ |
| 196 | monitor = g_file_monitor (gfile, gflags, NULL, &gerror); | 194 | monitor = g_file_monitor (gfile, gflags, NULL, &gerror); |
| 197 | g_object_unref (gfile); | 195 | g_object_unref (gfile); |
diff --git a/src/lisp.h b/src/lisp.h index e7747563085..7e918249935 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -310,7 +310,6 @@ error !; | |||
| 310 | # define lisp_h_XLI(o) (o) | 310 | # define lisp_h_XLI(o) (o) |
| 311 | # define lisp_h_XIL(i) (i) | 311 | # define lisp_h_XIL(i) (i) |
| 312 | #endif | 312 | #endif |
| 313 | #define lisp_h_CHECK_LIST_CONS(x, y) CHECK_TYPE (CONSP (x), Qlistp, y) | ||
| 314 | #define lisp_h_CHECK_NUMBER(x) CHECK_TYPE (INTEGERP (x), Qintegerp, x) | 313 | #define lisp_h_CHECK_NUMBER(x) CHECK_TYPE (INTEGERP (x), Qintegerp, x) |
| 315 | #define lisp_h_CHECK_SYMBOL(x) CHECK_TYPE (SYMBOLP (x), Qsymbolp, x) | 314 | #define lisp_h_CHECK_SYMBOL(x) CHECK_TYPE (SYMBOLP (x), Qsymbolp, x) |
| 316 | #define lisp_h_CHECK_TYPE(ok, predicate, x) \ | 315 | #define lisp_h_CHECK_TYPE(ok, predicate, x) \ |
| @@ -367,7 +366,6 @@ error !; | |||
| 367 | #if DEFINE_KEY_OPS_AS_MACROS | 366 | #if DEFINE_KEY_OPS_AS_MACROS |
| 368 | # define XLI(o) lisp_h_XLI (o) | 367 | # define XLI(o) lisp_h_XLI (o) |
| 369 | # define XIL(i) lisp_h_XIL (i) | 368 | # define XIL(i) lisp_h_XIL (i) |
| 370 | # define CHECK_LIST_CONS(x, y) lisp_h_CHECK_LIST_CONS (x, y) | ||
| 371 | # define CHECK_NUMBER(x) lisp_h_CHECK_NUMBER (x) | 369 | # define CHECK_NUMBER(x) lisp_h_CHECK_NUMBER (x) |
| 372 | # define CHECK_SYMBOL(x) lisp_h_CHECK_SYMBOL (x) | 370 | # define CHECK_SYMBOL(x) lisp_h_CHECK_SYMBOL (x) |
| 373 | # define CHECK_TYPE(ok, predicate, x) lisp_h_CHECK_TYPE (ok, predicate, x) | 371 | # define CHECK_TYPE(ok, predicate, x) lisp_h_CHECK_TYPE (ok, predicate, x) |
| @@ -2751,9 +2749,9 @@ CHECK_LIST (Lisp_Object x) | |||
| 2751 | } | 2749 | } |
| 2752 | 2750 | ||
| 2753 | INLINE void | 2751 | INLINE void |
| 2754 | (CHECK_LIST_CONS) (Lisp_Object x, Lisp_Object y) | 2752 | CHECK_LIST_END (Lisp_Object x, Lisp_Object y) |
| 2755 | { | 2753 | { |
| 2756 | lisp_h_CHECK_LIST_CONS (x, y); | 2754 | CHECK_TYPE (NILP (x), Qlistp, y); |
| 2757 | } | 2755 | } |
| 2758 | 2756 | ||
| 2759 | INLINE void | 2757 | INLINE void |