diff options
| -rw-r--r-- | lisp/emacs-lisp/byte-opt.el | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index bf9e6a728a3..971e4ddbcc9 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el | |||
| @@ -557,7 +557,10 @@ | |||
| 557 | (let ((args (mapcar #'byte-optimize-form (cdr form)))) | 557 | (let ((args (mapcar #'byte-optimize-form (cdr form)))) |
| 558 | (if (and (get fn 'pure) | 558 | (if (and (get fn 'pure) |
| 559 | (byte-optimize-all-constp args)) | 559 | (byte-optimize-all-constp args)) |
| 560 | (list 'quote (apply fn (mapcar #'eval args))) | 560 | (let ((arg-values (mapcar #'eval args))) |
| 561 | (condition-case nil | ||
| 562 | (list 'quote (apply fn arg-values)) | ||
| 563 | (error (cons fn args)))) | ||
| 561 | (cons fn args))))))) | 564 | (cons fn args))))))) |
| 562 | 565 | ||
| 563 | (defun byte-optimize-all-constp (list) | 566 | (defun byte-optimize-all-constp (list) |
| @@ -1274,9 +1277,9 @@ | |||
| 1274 | ;; Pure functions are side-effect free functions whose values depend | 1277 | ;; Pure functions are side-effect free functions whose values depend |
| 1275 | ;; only on their arguments, not on the platform. For these functions, | 1278 | ;; only on their arguments, not on the platform. For these functions, |
| 1276 | ;; calls with constant arguments can be evaluated at compile time. | 1279 | ;; calls with constant arguments can be evaluated at compile time. |
| 1277 | ;; This may shift runtime errors to compile time. For example, logand | 1280 | ;; For example, ash is pure since its results are machine-independent, |
| 1278 | ;; is pure since its results are machine-independent, whereas ash is | 1281 | ;; whereas lsh is not pure because (lsh -1 -1)'s value depends on the |
| 1279 | ;; not pure because (ash 1 29)'s value depends on machine word size. | 1282 | ;; fixnum range. |
| 1280 | ;; | 1283 | ;; |
| 1281 | ;; When deciding whether a function is pure, do not worry about | 1284 | ;; When deciding whether a function is pure, do not worry about |
| 1282 | ;; mutable strings or markers, as they are so unlikely in real code | 1285 | ;; mutable strings or markers, as they are so unlikely in real code |
| @@ -1286,9 +1289,41 @@ | |||
| 1286 | ;; values if a marker is moved. | 1289 | ;; values if a marker is moved. |
| 1287 | 1290 | ||
| 1288 | (let ((pure-fns | 1291 | (let ((pure-fns |
| 1289 | '(% concat logand logcount logior lognot logxor | 1292 | '(concat regexp-opt regexp-quote |
| 1290 | regexp-opt regexp-quote | 1293 | string-to-char string-to-syntax symbol-name |
| 1291 | string-to-char string-to-syntax symbol-name))) | 1294 | eq eql |
| 1295 | = /= < <= => > min max | ||
| 1296 | + - * / % mod abs ash 1+ 1- sqrt | ||
| 1297 | logand logior lognot logxor logcount | ||
| 1298 | copysign isnan ldexp float logb | ||
| 1299 | floor ceiling round truncate | ||
| 1300 | ffloor fceiling fround ftruncate | ||
| 1301 | string= string-equal string< string-lessp | ||
| 1302 | consp atom listp nlistp propert-list-p | ||
| 1303 | sequencep arrayp vectorp stringp bool-vector-p hash-table-p | ||
| 1304 | null not | ||
| 1305 | numberp integerp floatp natnump characterp | ||
| 1306 | integer-or-marker-p number-or-marker-p char-or-string-p | ||
| 1307 | symbolp keywordp | ||
| 1308 | type-of | ||
| 1309 | identity ignore | ||
| 1310 | |||
| 1311 | ;; The following functions are pure up to mutation of their | ||
| 1312 | ;; arguments. This is pure enough for the purposes of | ||
| 1313 | ;; constant folding, but not necessarily for all kinds of | ||
| 1314 | ;; code motion. | ||
| 1315 | car cdr car-safe cdr-safe nth nthcdr last | ||
| 1316 | equal | ||
| 1317 | length safe-length | ||
| 1318 | memq memql member | ||
| 1319 | ;; `assoc' and `assoc-default' are excluded since they are | ||
| 1320 | ;; impure if the test function is (consider `string-match'). | ||
| 1321 | assq rassq rassoc | ||
| 1322 | plist-get lax-plist-get plist-member | ||
| 1323 | aref elt | ||
| 1324 | bool-vector-subsetp | ||
| 1325 | bool-vector-count-population bool-vector-count-consecutive | ||
| 1326 | ))) | ||
| 1292 | (while pure-fns | 1327 | (while pure-fns |
| 1293 | (put (car pure-fns) 'pure t) | 1328 | (put (car pure-fns) 'pure t) |
| 1294 | (setq pure-fns (cdr pure-fns))) | 1329 | (setq pure-fns (cdr pure-fns))) |