Annotation of GNUtools/emacs/lisp/bytecomp.el, revision 1.1.1.1

1.1       root        1: ;; Compilation of Lisp code into byte code.
                      2: ;; Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
                      3: 
                      4: ;; This file is part of GNU Emacs.
                      5: 
                      6: ;; GNU Emacs is free software; you can redistribute it and/or modify
                      7: ;; it under the terms of the GNU General Public License as published by
                      8: ;; the Free Software Foundation; either version 1, or (at your option)
                      9: ;; any later version.
                     10: 
                     11: ;; GNU Emacs is distributed in the hope that it will be useful,
                     12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: ;; GNU General Public License for more details.
                     15: 
                     16: ;; You should have received a copy of the GNU General Public License
                     17: ;; along with GNU Emacs; see the file COPYING.  If not, write to
                     18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     19: 
                     20: (provide 'byte-compile)
                     21: 
                     22: (defvar byte-compile-constnum -1
                     23:   "Transfer vector index of last constant allocated.")
                     24: (defvar byte-compile-constants nil
                     25:   "Alist describing contents to put in transfer vector.
                     26: Each element is (CONTENTS . INDEX)")
                     27: (defvar byte-compile-macro-environment nil
                     28:   "Alist of (MACRONAME . DEFINITION) macros defined in the file
                     29: which is being compiled.")
                     30: (defvar byte-compile-pc 0
                     31:   "Index in byte string to store next opcode at.")
                     32: (defvar byte-compile-output nil
                     33:   "Alist describing contents to put in byte code string.
                     34: Each element is (INDEX . VALUE)")
                     35: (defvar byte-compile-depth 0
                     36:   "Current depth of execution stack.")
                     37: (defvar byte-compile-maxdepth 0
                     38:   "Maximum depth of execution stack.")
                     39: 
                     40: (defconst byte-varref 8
                     41:   "Byte code opcode for variable reference.")
                     42: (defconst byte-varset 16
                     43:   "Byte code opcode for setting a variable.")
                     44: (defconst byte-varbind 24
                     45:   "Byte code opcode for binding a variable.")
                     46: (defconst byte-call 32
                     47:   "Byte code opcode for calling a function.")
                     48: (defconst byte-unbind 40
                     49:   "Byte code opcode for unbinding special bindings.")
                     50: 
                     51: (defconst byte-constant 192
                     52:   "Byte code opcode for reference to a constant.")
                     53: (defconst byte-constant-limit 64
                     54:   "Maximum index usable in  byte-constant  opcode.")
                     55: 
                     56: (defconst byte-constant2 129
                     57:   "Byte code opcode for reference to a constant with vector index >= 0100.")
                     58: 
                     59: (defconst byte-goto 130
                     60:   "Byte code opcode for unconditional jump")
                     61: 
                     62: (defconst byte-goto-if-nil 131
                     63:   "Byte code opcode for pop value and jump if it's nil.")
                     64: 
                     65: (defconst byte-goto-if-not-nil 132
                     66:   "Byte code opcode for pop value and jump if it's not nil.")
                     67: 
                     68: (defconst byte-goto-if-nil-else-pop 133
                     69:   "Byte code opcode for examine top-of-stack, jump and don't pop it if it's nil,
                     70: otherwise pop it.")
                     71: 
                     72: (defconst byte-goto-if-not-nil-else-pop 134
                     73:   "Byte code opcode for examine top-of-stack, jump and don't pop it if it's not nil,
                     74: otherwise pop it.")
                     75: 
                     76: (defconst byte-return 135
                     77:   "Byte code opcode for pop value and return it from byte code interpreter.")
                     78: 
                     79: (defconst byte-discard 136
                     80:   "Byte code opcode to discard one value from stack.")
                     81: 
                     82: (defconst byte-dup 137
                     83:   "Byte code opcode to duplicate the top of the stack.")
                     84: 
                     85: (defconst byte-save-excursion 138
                     86:   "Byte code opcode to make a binding to record the buffer, point and mark.")
                     87: 
                     88: (defconst byte-save-window-excursion 139
                     89:   "Byte code opcode to make a binding to record entire window configuration.")
                     90: 
                     91: (defconst byte-save-restriction 140
                     92:   "Byte code opcode to make a binding to record the current buffer clipping restrictions.")
                     93: 
                     94: (defconst byte-catch 141
                     95:   "Byte code opcode for catch.  Takes, on stack, the tag and an expression for the body.")
                     96: 
                     97: (defconst byte-unwind-protect 142
                     98:   "Byte code opcode for unwind-protect.  Takes, on stack, an expression for the body
                     99: and an expression for the unwind-action.")
                    100: 
                    101: (defconst byte-condition-case 143
                    102:   "Byte code opcode for condition-case.  Takes, on stack, the variable to bind,
                    103: an expression for the body, and a list of clauses.")
                    104: 
                    105: (defconst byte-temp-output-buffer-setup 144
                    106:   "Byte code opcode for entry to with-output-to-temp-buffer.
                    107: Takes, on stack, the buffer name.
                    108: Binds standard-output and does some other things.
                    109: Returns with temp buffer on the stack in place of buffer name.")
                    110: 
                    111: (defconst byte-temp-output-buffer-show 145
                    112:   "Byte code opcode for exit from with-output-to-temp-buffer.
                    113: Expects the temp buffer on the stack underneath value to return.
                    114: Pops them both, then pushes the value back on.
                    115: Unbinds standard-output and makes the temp buffer visible.")
                    116: 
                    117: (defconst byte-nth 56)
                    118: (defconst byte-symbolp 57)
                    119: (defconst byte-consp 58)
                    120: (defconst byte-stringp 59)
                    121: (defconst byte-listp 60)
                    122: (defconst byte-eq 61)
                    123: (defconst byte-memq 62)
                    124: (defconst byte-not 63)
                    125: (defconst byte-car 64)
                    126: (defconst byte-cdr 65)
                    127: (defconst byte-cons 66)
                    128: (defconst byte-list1 67)
                    129: (defconst byte-list2 68)
                    130: (defconst byte-list3 69)
                    131: (defconst byte-list4 70)
                    132: (defconst byte-length 71)
                    133: (defconst byte-aref 72)
                    134: (defconst byte-aset 73)
                    135: (defconst byte-symbol-value 74)
                    136: (defconst byte-symbol-function 75)
                    137: (defconst byte-set 76)
                    138: (defconst byte-fset 77)
                    139: (defconst byte-get 78)
                    140: (defconst byte-substring 79)
                    141: (defconst byte-concat2 80)
                    142: (defconst byte-concat3 81)
                    143: (defconst byte-concat4 82)
                    144: (defconst byte-sub1 83)
                    145: (defconst byte-add1 84)
                    146: (defconst byte-eqlsign 85)
                    147: (defconst byte-gtr 86)
                    148: (defconst byte-lss 87)
                    149: (defconst byte-leq 88)
                    150: (defconst byte-geq 89)
                    151: (defconst byte-diff 90)
                    152: (defconst byte-negate 91)
                    153: (defconst byte-plus 92)
                    154: (defconst byte-max 93)
                    155: (defconst byte-min 94)
                    156: 
                    157: (defconst byte-point 96)
                    158: ;(defconst byte-mark 97) no longer generated -- lisp code shouldn't call this very frequently
                    159: (defconst byte-goto-char 98)
                    160: (defconst byte-insert 99)
                    161: (defconst byte-point-max 100)
                    162: (defconst byte-point-min 101)
                    163: (defconst byte-char-after 102)
                    164: (defconst byte-following-char 103)
                    165: (defconst byte-preceding-char 104)
                    166: (defconst byte-current-column 105)
                    167: (defconst byte-indent-to 106)
                    168: ;(defconst byte-scan-buffer 107) no longer generated
                    169: (defconst byte-eolp 108)
                    170: (defconst byte-eobp 109)
                    171: (defconst byte-bolp 110)
                    172: (defconst byte-bobp 111)
                    173: (defconst byte-current-buffer 112)
                    174: (defconst byte-set-buffer 113)
                    175: (defconst byte-read-char 114)
                    176: ;(defconst byte-set-mark 115)       ;obsolete
                    177: (defconst byte-interactive-p 116)
                    178: 
                    179: (defun byte-recompile-directory (directory &optional arg)
                    180:   "Recompile every .el file in DIRECTORY that needs recompilation.
                    181: This is if a .elc file exists but is older than the .el file.
                    182: If the .elc file does not exist, offer to compile the .el file
                    183: only if a prefix argument has been specified." 
                    184:   (interactive "DByte recompile directory: \nP")
                    185:   (save-some-buffers)
                    186:   (setq directory (expand-file-name directory))
                    187:   (let ((files (directory-files directory nil "\\.el\\'"))
                    188:        (count 0)
                    189:        source dest)
                    190:     (while files
                    191:       (if (and (not (auto-save-file-name-p (car files)))
                    192:               (setq source (expand-file-name (car files) directory))
                    193:               (setq dest (concat (file-name-sans-versions source) "c"))
                    194:               (if (file-exists-p dest)
                    195:                   (file-newer-than-file-p source dest)
                    196:                   (and arg (y-or-n-p (concat "Compile " source "? ")))))
                    197:          (progn (byte-compile-file source)
                    198:                 (setq count (1+ count))))
                    199:       (setq files (cdr files)))
                    200:     (message "Done (Total of %d file%s compiled)"
                    201:             count (if (= count 1) "" "s"))))
                    202: 
                    203: (defun byte-compile-file (filename)
                    204:   "Compile a file of Lisp code named FILENAME into a file of byte code.
                    205: The output file's name is made by appending \"c\" to the end of FILENAME."
                    206:   (interactive "fByte compile file: ")
                    207:   ;; Expand now so we get the current buffer's defaults
                    208:   (setq filename (expand-file-name filename))
                    209:   (message "Compiling %s..." filename)
                    210:   (let ((inbuffer (get-buffer-create " *Compiler Input*"))
                    211:        (outbuffer (get-buffer-create " *Compiler Output*"))
                    212:        (byte-compile-macro-environment nil)
                    213:        (case-fold-search nil)
                    214:        sexp)
                    215:     (save-excursion
                    216:       (set-buffer inbuffer)
                    217:       (erase-buffer)
                    218:       (insert-file-contents filename)
                    219:       (goto-char 1)
                    220:       (set-buffer outbuffer)
                    221:       ;; Avoid running hooks; all we really want is the syntax table.
                    222:       (let (emacs-lisp-mode-hook)
                    223:        (emacs-lisp-mode))
                    224:       (erase-buffer)
                    225:       (while (save-excursion
                    226:               (set-buffer inbuffer)
                    227:               (while (progn (skip-chars-forward " \t\n\^l")
                    228:                             (looking-at ";"))
                    229:                 (forward-line 1))
                    230:               (not (eobp)))
                    231:        (setq sexp (read inbuffer))
                    232:        (print (byte-compile-file-form sexp) outbuffer))
                    233:       (set-buffer outbuffer)
                    234:       (goto-char 1)
                    235:       ;; In each defun or autoload, if there is a doc string,
                    236:       ;; put a backslash-newline at the front of it.
                    237:       (while (search-forward "\n(" nil t)
                    238:        (cond ((looking-at "defun \\|autoload ")
                    239:               (forward-sexp 3)
                    240:               (skip-chars-forward " ")
                    241:               (if (looking-at "\"")
                    242:                   (progn (forward-char 1)
                    243:                          (insert "\\\n"))))))
                    244:       (goto-char 1)
                    245:       ;; In each defconst or defvar, if there is a doc string
                    246:       ;; and it starts on the same line as the form begins
                    247:       ;; (i.e. if there is no newline in a string in the initial value)
                    248:       ;; then put in backslash-newline at the start of the doc string.
                    249:       (while (search-forward "\n(" nil t)
                    250:        (if (looking-at "defvar \\|defconst ")
                    251:            (let ((this-line (1- (point))))
                    252:              ;;Go to end of initial value expression
                    253:              (if (condition-case ()
                    254:                      (progn (forward-sexp 3) t)
                    255:                    (error nil))
                    256:                  (progn
                    257:                    (skip-chars-forward " ")
                    258:                    (and (eq this-line
                    259:                             (save-excursion (beginning-of-line) (point)))
                    260:                         (looking-at "\"")
                    261:                         (progn (forward-char 1)
                    262:                                (insert "\\\n"))))))))
                    263:       (let ((vms-stmlf-recfm t))
                    264:        (write-region 1 (point-max)
                    265:                      (concat (file-name-sans-versions filename) "c")))
                    266:       (kill-buffer (current-buffer))
                    267:       (kill-buffer inbuffer)))
                    268:   t)
                    269: 
                    270: 
                    271: (defun byte-compile-file-form (form)
                    272:   (cond ((not (listp form))
                    273:         form)
                    274:        ((memq (car form) '(defun defmacro))
                    275:         (let* ((name (car (cdr form)))
                    276:                (tem (assq name byte-compile-macro-environment)))
                    277:           (if (eq (car form) 'defun)
                    278:               (progn
                    279:                 (message "Compiling %s (%s)..." filename (nth 1 form))
                    280:                 (cond (tem (setcdr tem nil))
                    281:                       ((and (fboundp name)
                    282:                             (eq (car-safe (symbol-function name)) 'macro))
                    283:                        ;; shadow existing macro definition
                    284:                        (setq byte-compile-macro-environment
                    285:                              (cons (cons name nil)
                    286:                                    byte-compile-macro-environment))))
                    287:                 (prog1 (cons 'defun (byte-compile-lambda (cdr form)))
                    288:                   (if (not noninteractive)
                    289:                       (message "Compiling %s..." filename))))
                    290:             ;; defmacro
                    291:             (if tem
                    292:                 (setcdr tem (cons 'lambda (cdr (cdr form))))
                    293:               (setq byte-compile-macro-environment
                    294:                     (cons (cons name (cons 'lambda (cdr (cdr form))))
                    295:                           byte-compile-macro-environment)))
                    296:             (cons 'defmacro (byte-compile-lambda (cdr form))))))
                    297:        ((eq (car form) 'require)
                    298:         (eval form)
                    299:         form)
                    300:        (t form)))
                    301: 
                    302: (defun byte-compile (funname)
                    303:   "Byte-compile the definition of function FUNNAME (a symbol)."
                    304:   (if (and (fboundp funname)
                    305:           (eq (car-safe (symbol-function funname)) 'lambda))
                    306:       (fset funname (byte-compile-lambda (symbol-function funname)))))
                    307: 
                    308: (defun byte-compile-lambda (fun)
                    309:   (let* ((bodyptr (cdr fun))
                    310:         (int (assq 'interactive (cdr bodyptr)))
                    311:         newbody)
                    312:     ;; Skip doc string.
                    313:     (if (and (cdr (cdr bodyptr)) (stringp (car (cdr bodyptr))))
                    314:        (setq bodyptr (cdr bodyptr)))
                    315:     (setq newbody (list (byte-compile-top-level
                    316:                          (cons 'progn (cdr bodyptr)))))
                    317:     (if int
                    318:        (setq newbody (cons (if (or (stringp (car (cdr int)))
                    319:                                    (null (car (cdr int))))
                    320:                                int
                    321:                              (list 'interactive
                    322:                                    (byte-compile-top-level (car (cdr int)))))
                    323:                            newbody)))
                    324:     (if (not (eq bodyptr (cdr fun)))
                    325:        (setq newbody (cons (nth 2 fun) newbody)))
                    326:     (cons (car fun) (cons (car (cdr fun)) newbody))))
                    327: 
                    328: (defun byte-compile-top-level (form)
                    329:   (let ((byte-compile-constants nil)
                    330:        (byte-compile-constnum nil)
                    331:        (byte-compile-pc 0)
                    332:        (byte-compile-depth 0)
                    333:        (byte-compile-maxdepth 0)
                    334:        (byte-compile-output nil)
                    335:        (byte-compile-string nil)
                    336:        (byte-compile-vector nil))
                    337:     (let (vars temp (i -1))
                    338:       (setq temp (byte-compile-find-vars form))
                    339:       (setq form (car temp))
                    340:       (setq vars (nreverse (cdr temp)))
                    341:       (while vars
                    342:        (setq i (1+ i))
                    343:        (setq byte-compile-constants (cons (cons (car vars) i)
                    344:                                           byte-compile-constants))
                    345:        (setq vars (cdr vars)))
                    346:       (setq byte-compile-constnum i))
                    347:     (byte-compile-form form)
                    348:     (byte-compile-out 'byte-return 0)
                    349:     (setq byte-compile-vector (make-vector (1+ byte-compile-constnum)
                    350:                                           nil))
                    351:     (while byte-compile-constants
                    352:       (aset byte-compile-vector (cdr (car byte-compile-constants))
                    353:            (car (car byte-compile-constants)))
                    354:       (setq byte-compile-constants (cdr byte-compile-constants)))
                    355:     (setq byte-compile-string (make-string byte-compile-pc 0))
                    356:     (while byte-compile-output
                    357:       (aset byte-compile-string (car (car byte-compile-output))
                    358:            (cdr (car byte-compile-output)))
                    359:       (setq byte-compile-output (cdr byte-compile-output)))
                    360:     (list 'byte-code byte-compile-string
                    361:                     byte-compile-vector byte-compile-maxdepth)))
                    362: 
                    363: ;; Expand all macros in FORM and find all variables it uses.
                    364: ;; Return a pair (EXPANDEDFORM . VARS)
                    365: ;; VARS is ordered with the variables encountered earliest
                    366: ;; at the end.
                    367: ;; The body and cases of a condition-case, and the body of a catch,
                    368: ;; are not scanned; variables used in them are not reported,
                    369: ;; and they are not macroexpanded.  This is because they will
                    370: ;; be compiled separately when encountered during the main
                    371: ;; compilation pass.
                    372: (defun byte-compile-find-vars (form)
                    373:   (let ((all-vars nil))
                    374:     (cons (byte-compile-find-vars-1 form)
                    375:          all-vars)))
                    376: 
                    377: ;; Walk FORM, making sure all variables it uses are in ALL-VARS,
                    378: ;; and also expanding macros.
                    379: ;; Return the result of expanding all macros in FORM.
                    380: ;; This is a copy; FORM itself is not altered.
                    381: (defun byte-compile-find-vars-1 (form)
                    382:   (cond ((symbolp form)
                    383:         (if (not (memq form all-vars))
                    384:             (setq all-vars (cons form all-vars)))
                    385:         form)
                    386:        ((or (not (consp form)) (eq (car form) 'quote))
                    387:         form)
                    388:        ((memq (car form) '(let let*))
                    389:         (let* ((binds (copy-sequence (car (cdr form))))
                    390:                (body (cdr (cdr form)))
                    391:                (tail binds))
                    392:           (while tail
                    393:             (if (symbolp (car tail))
                    394:                 (if (not (memq (car tail) all-vars))
                    395:                     (setq all-vars (cons (car tail) all-vars)))
                    396:               (if (consp (car tail))
                    397:                   (progn
                    398:                     (if (not (memq (car (car tail)) all-vars))
                    399:                         (setq all-vars (cons (car (car tail)) all-vars)))
                    400:                     (setcar tail
                    401:                             (list (car (car tail))
                    402:                                   (byte-compile-find-vars-1 (car (cdr (car tail)))))))))
                    403:             (setq tail (cdr tail)))
                    404:           (cons (car form)
                    405:                 (cons binds
                    406:                       (mapcar 'byte-compile-find-vars-1 body)))))
                    407:        ((or (eq (car form) 'function)
                    408:             ;; Because condition-case is compiled by breaking out
                    409:             ;; all its subexpressions and compiling them separately,
                    410:             ;; we regard it here as containing nothing but constants.
                    411:             (eq (car form) 'condition-case))
                    412:         form)
                    413:        ((eq (car form) 'catch)
                    414:         ;; catch is almost like condition case, but we
                    415:         ;; treat its first argument normally.
                    416:         (cons 'catch
                    417:               (cons (byte-compile-find-vars-1 (nth 1 form))
                    418:                     (nthcdr 2 form))))
                    419:        ((eq (car form) 'cond)
                    420:         (let* ((clauses (copy-sequence (cdr form)))
                    421:                (tail clauses))
                    422:           (while tail
                    423:             (setcar tail (mapcar 'byte-compile-find-vars-1 (car tail)))
                    424:             (setq tail (cdr tail)))
                    425:           (cons 'cond clauses)))
                    426:        ((not (eq form (setq form (macroexpand form byte-compile-macro-environment))))
                    427:         (byte-compile-find-vars-1 form))
                    428:        ((symbolp (car form))
                    429:         (cons (car form) (mapcar 'byte-compile-find-vars-1 (cdr form))))
                    430:        (t (mapcar 'byte-compile-find-vars-1 form))))
                    431: 
                    432: ;; This is the recursive entry point for compiling each subform of an expression.
                    433: 
                    434: ;; Note that handler functions SHOULD NOT increment byte-compile-depth
                    435: ;; for the values they are returning!  That is done on return here.
                    436: ;; Handlers should make sure that the depth on exit is the same as
                    437: ;; it was when the handler was called.
                    438: 
                    439: (defun byte-compile-form (form)
                    440:   (setq form (macroexpand form byte-compile-macro-environment))
                    441:   (cond ((eq form 'nil)
                    442:         (byte-compile-constant form))
                    443:        ((eq form 't)
                    444:         (byte-compile-constant form))
                    445:        ((symbolp form)
                    446:         (byte-compile-variable-ref 'byte-varref form))
                    447:        ((not (consp form))
                    448:         (byte-compile-constant form))
                    449:        ((not (symbolp (car form)))
                    450:         (if (eq (car-safe (car form)) 'lambda)
                    451:             (let ((vars (nth 1 (car form)))
                    452:                   (vals (cdr form))
                    453:                   result)
                    454:               (while vars
                    455:                 (setq result (cons (list (car vars) (car vals)) result))
                    456:                 (setq vars (cdr vars) vals (cdr vals)))
                    457:               (byte-compile-form
                    458:                (cons 'let (cons (nreverse result) (cdr (cdr (car form)))))))
                    459:           (byte-compile-normal-call form)))
                    460:        (t
                    461:         (let ((handler (get (car form) 'byte-compile)))
                    462:           (if handler
                    463:               (funcall handler form)
                    464:             (byte-compile-normal-call form)))))
                    465:   (setq byte-compile-maxdepth
                    466:        (max byte-compile-maxdepth
                    467:             (setq byte-compile-depth (1+ byte-compile-depth)))))
                    468: 
                    469: (defun byte-compile-normal-call (form)
                    470:   (byte-compile-push-constant (car form))
                    471:   (let ((copy (cdr form)))
                    472:     (while copy (byte-compile-form (car copy)) (setq copy (cdr copy))))
                    473:   (byte-compile-out 'byte-call (length (cdr form)))
                    474:   (setq byte-compile-depth (- byte-compile-depth (length (cdr form)))))
                    475: 
                    476: (defun byte-compile-variable-ref (base-op var)
                    477:   (let ((data (assq var byte-compile-constants)))
                    478:     (if data
                    479:        (byte-compile-out base-op (cdr data))
                    480:       (error (format "Variable %s seen on pass 2 of byte compiler but not pass 1"
                    481:                     (prin1-to-string var))))))
                    482: 
                    483: ;; Use this when the value of a form is a constant,
                    484: ;; because byte-compile-depth will be incremented accordingly
                    485: ;; on return to byte-compile-form, so it should not be done by the handler.
                    486: (defun byte-compile-constant (const)
                    487:   (let ((data (if (stringp const)
                    488:                  (assoc const byte-compile-constants)
                    489:                (assq const byte-compile-constants))))
                    490:     (if data
                    491:        (byte-compile-out-const (cdr data))
                    492:       (setq byte-compile-constants
                    493:            (cons (cons const (setq byte-compile-constnum (1+ byte-compile-constnum)))
                    494:                  byte-compile-constants))
                    495:       (byte-compile-out-const byte-compile-constnum))))
                    496: 
                    497: ;; Use this for a constant that is not the value of its containing form.
                    498: ;; Note that the calling function must explicitly decrement byte-compile-depth
                    499: ;; (or perhaps call byte-compile-discard to do so)
                    500: ;; for the word pushed by this function.
                    501: (defun byte-compile-push-constant (const)
                    502:   (byte-compile-constant const)
                    503:   (setq byte-compile-maxdepth
                    504:        (max byte-compile-maxdepth
                    505:             (setq byte-compile-depth (1+ byte-compile-depth)))))
                    506: 
                    507: ;; Compile those primitive ordinary functions
                    508: ;; which have special byte codes just for speed.
                    509: 
                    510: (put 'point 'byte-compile 'byte-compile-no-args)
                    511: (put 'point 'byte-opcode 'byte-point)
                    512: 
                    513: (put 'dot 'byte-compile 'byte-compile-no-args)
                    514: (put 'dot 'byte-opcode 'byte-point)
                    515: 
                    516: ;(put 'mark 'byte-compile 'byte-compile-no-args)
                    517: ;(put 'mark 'byte-opcode 'byte-mark)
                    518: 
                    519: (put 'point-max 'byte-compile 'byte-compile-no-args)
                    520: (put 'point-max 'byte-opcode 'byte-point-max)
                    521: 
                    522: (put 'point-min 'byte-compile 'byte-compile-no-args)
                    523: (put 'point-min 'byte-opcode 'byte-point-min)
                    524: 
                    525: (put 'dot-max 'byte-compile 'byte-compile-no-args)
                    526: (put 'dot-max 'byte-opcode 'byte-point-max)
                    527: 
                    528: (put 'dot-min 'byte-compile 'byte-compile-no-args)
                    529: (put 'dot-min 'byte-opcode 'byte-point-min)
                    530: 
                    531: (put 'following-char 'byte-compile 'byte-compile-no-args)
                    532: (put 'following-char 'byte-opcode 'byte-following-char)
                    533: 
                    534: (put 'preceding-char 'byte-compile 'byte-compile-no-args)
                    535: (put 'preceding-char 'byte-opcode 'byte-preceding-char)
                    536: 
                    537: (put 'current-column 'byte-compile 'byte-compile-no-args)
                    538: (put 'current-column 'byte-opcode 'byte-current-column)
                    539: 
                    540: (put 'eolp 'byte-compile 'byte-compile-no-args)
                    541: (put 'eolp 'byte-opcode 'byte-eolp)
                    542: 
                    543: (put 'eobp 'byte-compile 'byte-compile-no-args)
                    544: (put 'eobp 'byte-opcode 'byte-eobp)
                    545: 
                    546: (put 'bolp 'byte-compile 'byte-compile-no-args)
                    547: (put 'bolp 'byte-opcode 'byte-bolp)
                    548: 
                    549: (put 'bobp 'byte-compile 'byte-compile-no-args)
                    550: (put 'bobp 'byte-opcode 'byte-bobp)
                    551: 
                    552: (put 'current-buffer 'byte-compile 'byte-compile-no-args)
                    553: (put 'current-buffer 'byte-opcode 'byte-current-buffer)
                    554: 
                    555: (put 'read-char 'byte-compile 'byte-compile-no-args)
                    556: (put 'read-char 'byte-opcode 'byte-read-char)
                    557: 
                    558: 
                    559: (put 'symbolp 'byte-compile 'byte-compile-one-arg)
                    560: (put 'symbolp 'byte-opcode 'byte-symbolp)
                    561: 
                    562: (put 'consp 'byte-compile 'byte-compile-one-arg)
                    563: (put 'consp 'byte-opcode 'byte-consp)
                    564: 
                    565: (put 'stringp 'byte-compile 'byte-compile-one-arg)
                    566: (put 'stringp 'byte-opcode 'byte-stringp)
                    567: 
                    568: (put 'listp 'byte-compile 'byte-compile-one-arg)
                    569: (put 'listp 'byte-opcode 'byte-listp)
                    570: 
                    571: (put 'not 'byte-compile 'byte-compile-one-arg)
                    572: (put 'not 'byte-opcode 'byte-not)
                    573: 
                    574: (put 'null 'byte-compile 'byte-compile-one-arg)
                    575: (put 'null 'byte-opcode 'byte-not)
                    576: 
                    577: (put 'car 'byte-compile 'byte-compile-one-arg)
                    578: (put 'car 'byte-opcode 'byte-car)
                    579: 
                    580: (put 'cdr 'byte-compile 'byte-compile-one-arg)
                    581: (put 'cdr 'byte-opcode 'byte-cdr)
                    582: 
                    583: (put 'length 'byte-compile 'byte-compile-one-arg)
                    584: (put 'length 'byte-opcode 'byte-length)
                    585: 
                    586: (put 'symbol-value 'byte-compile 'byte-compile-one-arg)
                    587: (put 'symbol-value 'byte-opcode 'byte-symbol-value)
                    588: 
                    589: (put 'symbol-function 'byte-compile 'byte-compile-one-arg)
                    590: (put 'symbol-function 'byte-opcode 'byte-symbol-function)
                    591: 
                    592: (put '1+ 'byte-compile 'byte-compile-one-arg)
                    593: (put '1+ 'byte-opcode 'byte-add1)
                    594: 
                    595: (put '1- 'byte-compile 'byte-compile-one-arg)
                    596: (put '1- 'byte-opcode 'byte-sub1)
                    597: 
                    598: (put 'goto-char 'byte-compile 'byte-compile-one-arg)
                    599: (put 'goto-char 'byte-opcode 'byte-goto-char)
                    600: 
                    601: (put 'char-after 'byte-compile 'byte-compile-one-arg)
                    602: (put 'char-after 'byte-opcode 'byte-char-after)
                    603: 
                    604: (put 'set-buffer 'byte-compile 'byte-compile-one-arg)
                    605: (put 'set-buffer 'byte-opcode 'byte-set-buffer)
                    606: 
                    607: ;set-mark turns out to be too unimportant for its own opcode.
                    608: ;(put 'set-mark 'byte-compile 'byte-compile-one-arg)
                    609: ;(put 'set-mark 'byte-opcode 'byte-set-mark)
                    610: 
                    611: 
                    612: (put 'eq 'byte-compile 'byte-compile-two-args)
                    613: (put 'eq 'byte-opcode 'byte-eq)
                    614: (put 'eql 'byte-compile 'byte-compile-two-args)
                    615: (put 'eql 'byte-opcode 'byte-eq)
                    616: 
                    617: (put 'memq 'byte-compile 'byte-compile-two-args)
                    618: (put 'memq 'byte-opcode 'byte-memq)
                    619: 
                    620: (put 'cons 'byte-compile 'byte-compile-two-args)
                    621: (put 'cons 'byte-opcode 'byte-cons)
                    622: 
                    623: (put 'aref 'byte-compile 'byte-compile-two-args)
                    624: (put 'aref 'byte-opcode 'byte-aref)
                    625: 
                    626: (put 'set 'byte-compile 'byte-compile-two-args)
                    627: (put 'set 'byte-opcode 'byte-set)
                    628: 
                    629: (put 'fset 'byte-compile 'byte-compile-two-args)
                    630: (put 'fset 'byte-opcode 'byte-fset)
                    631: 
                    632: (put '= 'byte-compile 'byte-compile-two-args)
                    633: (put '= 'byte-opcode 'byte-eqlsign)
                    634: 
                    635: (put '< 'byte-compile 'byte-compile-two-args)
                    636: (put '< 'byte-opcode 'byte-lss)
                    637: 
                    638: (put '> 'byte-compile 'byte-compile-two-args)
                    639: (put '> 'byte-opcode 'byte-gtr)
                    640: 
                    641: (put '<= 'byte-compile 'byte-compile-two-args)
                    642: (put '<= 'byte-opcode 'byte-leq)
                    643: 
                    644: (put '>= 'byte-compile 'byte-compile-two-args)
                    645: (put '>= 'byte-opcode 'byte-geq)
                    646: 
                    647: (put 'get 'byte-compile 'byte-compile-two-args)
                    648: (put 'get 'byte-opcode 'byte-get)
                    649: 
                    650: (put 'nth 'byte-compile 'byte-compile-two-args)
                    651: (put 'nth 'byte-opcode 'byte-nth)
                    652: 
                    653: (put 'aset 'byte-compile 'byte-compile-three-args)
                    654: (put 'aset 'byte-opcode 'byte-aset)
                    655: 
                    656: (defun byte-compile-no-args (form)
                    657:   (if (/= (length form) 1)
                    658:       ;; get run-time wrong-number-of-args error.
                    659:       ;; Would be nice if there were some way to do
                    660:       ;;  compile-time warnings.
                    661:       (byte-compile-normal-call form)
                    662:     (byte-compile-out (symbol-value (get (car form) 'byte-opcode)) 0)))
                    663: 
                    664: (defun byte-compile-one-arg (form)
                    665:   (if (/= (length form) 2)
                    666:       (byte-compile-normal-call form)
                    667:     (byte-compile-form (car (cdr form)))  ;; Push the argument
                    668:     (setq byte-compile-depth (1- byte-compile-depth))
                    669:     (byte-compile-out (symbol-value (get (car form) 'byte-opcode)) 0)))
                    670: 
                    671: (defun byte-compile-two-args (form)
                    672:   (if (/= (length form) 3)
                    673:       (byte-compile-normal-call form)
                    674:     (byte-compile-form (car (cdr form)))  ;; Push the arguments
                    675:     (byte-compile-form (nth 2 form))
                    676:     (setq byte-compile-depth (- byte-compile-depth 2))
                    677:     (byte-compile-out (symbol-value (get (car form) 'byte-opcode)) 0)))
                    678: 
                    679: (defun byte-compile-three-args (form)
                    680:   (if (/= (length form) 4)
                    681:       (byte-compile-normal-call form)
                    682:     (byte-compile-form (car (cdr form)))  ;; Push the arguments
                    683:     (byte-compile-form (nth 2 form))
                    684:     (byte-compile-form (nth 3 form))
                    685:     (setq byte-compile-depth (- byte-compile-depth 3))
                    686:     (byte-compile-out (symbol-value (get (car form) 'byte-opcode)) 0)))
                    687: 
                    688: (put 'substring 'byte-compile 'byte-compile-substring)
                    689: (defun byte-compile-substring (form)
                    690:   (if (or (> (length form) 4)
                    691:          (< (length form) 2))
                    692:       (byte-compile-normal-call form)
                    693:     (byte-compile-form (nth 1 form))
                    694:     (byte-compile-form (or (nth 2 form) ''nil))        ;Optional arguments
                    695:     (byte-compile-form (or (nth 3 form) ''nil))
                    696:     (setq byte-compile-depth (- byte-compile-depth 3))
                    697:     (byte-compile-out byte-substring 0)))
                    698: 
                    699: (put 'interactive-p 'byte-compile 'byte-compile-interactive-p)
                    700: (defun byte-compile-interactive-p (form)
                    701:   (byte-compile-out byte-interactive-p 0))
                    702:   
                    703: (put 'list 'byte-compile 'byte-compile-list)
                    704: (defun byte-compile-list (form)
                    705:   (let ((len (length form)))
                    706:     (if (= len 1)
                    707:        (byte-compile-constant nil)
                    708:       (if (< len 6)
                    709:          (let ((args (cdr form)))
                    710:           (while args
                    711:             (byte-compile-form (car args))
                    712:             (setq args (cdr args)))
                    713:           (setq byte-compile-depth (- byte-compile-depth (1- len)))
                    714:           (byte-compile-out (symbol-value
                    715:                              (nth (- len 2)
                    716:                                   '(byte-list1 byte-list2 byte-list3 byte-list4)))
                    717:                             0))
                    718:        (byte-compile-normal-call form)))))
                    719: 
                    720: (put 'concat 'byte-compile 'byte-compile-concat)
                    721: (defun byte-compile-concat (form)
                    722:   (let ((len (length form)))
                    723:     (cond ((= len 1)
                    724:           (byte-compile-form ""))
                    725:          ((= len 2)
                    726:           ;; Concat of one arg is not a no-op if arg is not a string.
                    727:           (byte-compile-normal-call form))
                    728:          ((< len 6)
                    729:           (let ((args (cdr form)))
                    730:             (while args
                    731:               (byte-compile-form (car args))
                    732:               (setq args (cdr args)))
                    733:             (setq byte-compile-depth (- byte-compile-depth (1- len)))
                    734:             (byte-compile-out
                    735:               (symbol-value (nth (- len 3)
                    736:                                  '(byte-concat2 byte-concat3 byte-concat4)))
                    737:               0)))
                    738:          (t
                    739:           (byte-compile-normal-call form)))))
                    740: 
                    741: (put '- 'byte-compile 'byte-compile-minus)
                    742: (defun byte-compile-minus (form)
                    743:   (let ((len (length form)))
                    744:     (cond ((= len 2)
                    745:           (byte-compile-form (car (cdr form)))
                    746:           (setq byte-compile-depth (- byte-compile-depth 1))
                    747:           (byte-compile-out byte-negate 0))
                    748:          ((= len 3)
                    749:           (byte-compile-form (car (cdr form)))
                    750:           (byte-compile-form (nth 2 form))
                    751:           (setq byte-compile-depth (- byte-compile-depth 2))
                    752:           (byte-compile-out byte-diff 0))
                    753:          (t (byte-compile-normal-call form)))))
                    754: 
                    755: (put '+ 'byte-compile 'byte-compile-maybe-two-args)
                    756: (put '+ 'byte-opcode 'byte-plus)
                    757: 
                    758: (put 'max 'byte-compile 'byte-compile-maybe-two-args)
                    759: (put 'max 'byte-opcode 'byte-max)
                    760: 
                    761: (put 'min 'byte-compile 'byte-compile-maybe-two-args)
                    762: (put 'min 'byte-opcode 'byte-min)
                    763: 
                    764: (defun byte-compile-maybe-two-args (form)
                    765:   (let ((len (length form)))
                    766:     (if (= len 3)
                    767:        (progn
                    768:          (byte-compile-form (car (cdr form)))
                    769:          (byte-compile-form (nth 2 form))
                    770:          (setq byte-compile-depth (- byte-compile-depth 2))
                    771:          (byte-compile-out (symbol-value (get (car form) 'byte-opcode)) 0))
                    772:       (byte-compile-normal-call form))))
                    773:        
                    774: (put 'function 'byte-compile 'byte-compile-function-form)
                    775: (defun byte-compile-function-form (form)
                    776:   (cond ((symbolp (car (cdr form)))
                    777:         (byte-compile-form
                    778:          (list 'symbol-function (list 'quote (nth 1 form)))))
                    779:        (t
                    780:         (byte-compile-constant (byte-compile-lambda (car (cdr form)))))))
                    781: 
                    782: (put 'indent-to 'byte-compile 'byte-compile-indent-to)
                    783: (defun byte-compile-indent-to (form)
                    784:   (let ((len (length form)))
                    785:     (if (= len 2)
                    786:        (progn
                    787:          (byte-compile-form (car (cdr form)))
                    788:          (setq byte-compile-depth (- byte-compile-depth 1))
                    789:          (byte-compile-out byte-indent-to 0))
                    790:       (byte-compile-normal-call form))))
                    791: 
                    792: (put 'insert 'byte-compile 'byte-compile-insert)
                    793: (defun byte-compile-insert (form)
                    794:   (let ((len (length form)))
                    795:     (if (< len 3)
                    796:        (let ((args (cdr form)))
                    797:          (while args
                    798:            (byte-compile-form (car args))
                    799:            (setq byte-compile-depth (- byte-compile-depth 1))
                    800:            (byte-compile-out byte-insert 0)
                    801:            (setq args (cdr args))))
                    802:       (byte-compile-normal-call form))))
                    803: 
                    804: (put 'setq-default 'byte-compile 'byte-compile-setq-default)
                    805: (defun byte-compile-setq-default (form)
                    806:   (byte-compile-form (cons 'set-default (cons (list 'quote (nth 1 form))
                    807:                                              (nthcdr 2 form)))))
                    808: 
                    809: (put 'quote 'byte-compile 'byte-compile-quote)
                    810: (defun byte-compile-quote (form)
                    811:   (byte-compile-constant (car (cdr form))))
                    812: 
                    813: (put 'setq 'byte-compile 'byte-compile-setq)
                    814: (defun byte-compile-setq (form)
                    815:   (let ((args (cdr form)))
                    816:     (if args
                    817:        (while args
                    818:          (byte-compile-form (car (cdr args)))
                    819:          (if (null (cdr (cdr args)))
                    820:              (progn
                    821:                (byte-compile-out 'byte-dup 0)
                    822:                (setq byte-compile-maxdepth (max byte-compile-maxdepth (1+ byte-compile-depth)))))
                    823:          (setq byte-compile-depth (1- byte-compile-depth))
                    824:          (byte-compile-variable-ref 'byte-varset (car args))
                    825:          (setq args (cdr (cdr args))))
                    826:       ;; (setq), with no arguments.
                    827:       (byte-compile-constant nil))))
                    828: 
                    829: (put 'let 'byte-compile 'byte-compile-let)
                    830: (defun byte-compile-let (form)
                    831:   (let ((varlist (car (cdr form))))
                    832:     (while varlist
                    833:       (if (symbolp (car varlist))
                    834:          (byte-compile-push-constant nil)
                    835:        (byte-compile-form (car (cdr (car varlist)))))
                    836:       (setq varlist (cdr varlist))))
                    837:   (let ((varlist (reverse (car (cdr form)))))
                    838:     (setq byte-compile-depth (- byte-compile-depth (length varlist)))
                    839:     (while varlist
                    840:       (if (symbolp (car varlist))
                    841:          (byte-compile-variable-ref 'byte-varbind (car varlist))
                    842:        (byte-compile-variable-ref 'byte-varbind (car (car varlist))))
                    843:       (setq varlist (cdr varlist))))
                    844:   (byte-compile-body (cdr (cdr form)))
                    845:   (byte-compile-out 'byte-unbind (length (car (cdr form)))))
                    846: 
                    847: (put 'let* 'byte-compile 'byte-compile-let*)
                    848: (defun byte-compile-let* (form)
                    849:   (let ((varlist (car (cdr form))))
                    850:     (while varlist
                    851:       (if (symbolp (car varlist))
                    852:          (byte-compile-push-constant nil)
                    853:        (byte-compile-form (car (cdr (car varlist)))))
                    854:       (setq byte-compile-depth (1- byte-compile-depth))
                    855:       (if (symbolp (car varlist))
                    856:          (byte-compile-variable-ref 'byte-varbind (car varlist))
                    857:        (byte-compile-variable-ref 'byte-varbind (car (car varlist))))
                    858:       (setq varlist (cdr varlist))))
                    859:   (byte-compile-body (cdr (cdr form)))
                    860:   (byte-compile-out 'byte-unbind (length (car (cdr form)))))
                    861: 
                    862: (put 'save-excursion 'byte-compile 'byte-compile-save-excursion)
                    863: (defun byte-compile-save-excursion (form)
                    864:   (byte-compile-out 'byte-save-excursion 0)
                    865:   (byte-compile-body (cdr form))
                    866:   (byte-compile-out 'byte-unbind 1))
                    867: 
                    868: (put 'save-restriction 'byte-compile 'byte-compile-save-restriction)
                    869: (defun byte-compile-save-restriction (form)
                    870:   (byte-compile-out 'byte-save-restriction 0)
                    871:   (byte-compile-body (cdr form))
                    872:   (byte-compile-out 'byte-unbind 1))
                    873: 
                    874: (put 'with-output-to-temp-buffer 'byte-compile 'byte-compile-with-output-to-temp-buffer)
                    875: (defun byte-compile-with-output-to-temp-buffer (form)
                    876:   (byte-compile-form (car (cdr form)))
                    877:   (byte-compile-out 'byte-temp-output-buffer-setup 0)
                    878:   (byte-compile-body (cdr (cdr form)))
                    879:   (byte-compile-out 'byte-temp-output-buffer-show 0)
                    880:   (setq byte-compile-depth (1- byte-compile-depth)))
                    881: 
                    882: (put 'progn 'byte-compile 'byte-compile-progn)
                    883: (defun byte-compile-progn (form)
                    884:   (byte-compile-body (cdr form)))
                    885: 
                    886: (put 'interactive 'byte-compile 'byte-compile-noop)
                    887: (defun byte-compile-noop (form)
                    888:   (byte-compile-constant nil))
                    889: 
                    890: (defun byte-compile-body (body)
                    891:   (if (null body)
                    892:       (byte-compile-constant nil)
                    893:     (while body
                    894:       (byte-compile-form (car body))
                    895:       (if (cdr body)
                    896:          (byte-compile-discard)
                    897:        ;; Convention is this will be counted after we return.
                    898:        (setq byte-compile-depth (1- byte-compile-depth)))
                    899:       (setq body (cdr body)))))
                    900: 
                    901: (put 'prog1 'byte-compile 'byte-compile-prog1)
                    902: (defun byte-compile-prog1 (form)
                    903:   (byte-compile-form (car (cdr form)))
                    904:   (if (cdr (cdr form))
                    905:       (progn
                    906:        (byte-compile-body (cdr (cdr form)))
                    907:        ;; This discards the value pushed by ..-body
                    908:        ;; (which is not counted now in byte-compile-depth)
                    909:        ;; and decrements byte-compile-depth for the value
                    910:        ;; pushed by byte-compile-form above, which by convention
                    911:        ;; will be counted in byte-compile-depth after we return.
                    912:        (byte-compile-discard))))
                    913: 
                    914: (put 'prog2 'byte-compile 'byte-compile-prog2)
                    915: (defun byte-compile-prog2 (form)
                    916:   (byte-compile-form (car (cdr form)))
                    917:   (byte-compile-discard)
                    918:   (byte-compile-form (nth 2 form))
                    919:   (if (cdr (cdr (cdr form)))
                    920:       (progn
                    921:        (byte-compile-body (cdr (cdr (cdr form))))
                    922:        (byte-compile-discard))))
                    923: 
                    924: (defun byte-compile-discard ()
                    925:   (byte-compile-out 'byte-discard 0)
                    926:   (setq byte-compile-depth (1- byte-compile-depth)))
                    927: 
                    928: (put 'if 'byte-compile 'byte-compile-if)
                    929: (defun byte-compile-if (form)
                    930:   (if (null (nthcdr 3 form))
                    931:       ;; No else-forms
                    932:       (let ((donetag (byte-compile-make-tag)))
                    933:        (byte-compile-form (car (cdr form)))
                    934:        (byte-compile-goto 'byte-goto-if-nil-else-pop donetag)
                    935:        (setq byte-compile-depth (1- byte-compile-depth))
                    936:        (byte-compile-form (nth 2 form))
                    937:        (setq byte-compile-depth (1- byte-compile-depth))
                    938:        (byte-compile-out-tag donetag))
                    939:     (let ((donetag (byte-compile-make-tag)) (elsetag (byte-compile-make-tag)))
                    940:       (byte-compile-form (car (cdr form)))
                    941:       (byte-compile-goto 'byte-goto-if-nil elsetag)
                    942:       (setq byte-compile-depth (1- byte-compile-depth))
                    943:       (byte-compile-form (nth 2 form))
                    944:       (setq byte-compile-depth (1- byte-compile-depth))
                    945:       (byte-compile-goto 'byte-goto donetag)
                    946:       (byte-compile-out-tag elsetag)
                    947:       (byte-compile-body (cdr (cdr (cdr form))))
                    948:       (byte-compile-out-tag donetag))))
                    949: 
                    950: (put 'cond 'byte-compile 'byte-compile-cond)
                    951: (defun byte-compile-cond (form)
                    952:   (if (cdr form)
                    953:       (byte-compile-cond-1 (cdr form))
                    954:     (byte-compile-constant nil)))
                    955: 
                    956: (defun byte-compile-cond-1 (clauses)
                    957:   (if (or (eq (car (car clauses)) t)
                    958:          (and (eq (car-safe (car (car clauses))) 'quote)
                    959:               (car-safe (cdr-safe (car (car clauses))))))
                    960:       ;; Unconditional clause
                    961:       (if (cdr (car clauses))
                    962:          (byte-compile-body (cdr (car clauses)))
                    963:        (byte-compile-form (car (car clauses))))
                    964:     (if (null (cdr clauses))
                    965:        ;; Only one clause
                    966:        (let ((donetag (byte-compile-make-tag)))
                    967:          (byte-compile-form (car (car clauses)))
                    968:          (cond ((cdr (car clauses))
                    969:                 (byte-compile-goto 'byte-goto-if-nil-else-pop donetag)
                    970:                 (setq byte-compile-depth (1- byte-compile-depth))
                    971:                 (byte-compile-body (cdr (car clauses)))
                    972:                 (byte-compile-out-tag donetag))))
                    973:       (let ((donetag (byte-compile-make-tag))
                    974:            (elsetag (byte-compile-make-tag)))
                    975:        (byte-compile-form (car (car clauses)))
                    976:        (if (null (cdr (car clauses)))
                    977:            ;; First clause is a singleton.
                    978:            (progn
                    979:              (byte-compile-goto 'byte-goto-if-not-nil-else-pop donetag)
                    980:              (setq byte-compile-depth (1- byte-compile-depth)))
                    981:          (byte-compile-goto 'byte-goto-if-nil elsetag)
                    982:          (setq byte-compile-depth (1- byte-compile-depth))
                    983:          (byte-compile-body (cdr (car clauses)))
                    984:          (byte-compile-goto 'byte-goto donetag)
                    985:          (byte-compile-out-tag elsetag))
                    986:        (byte-compile-cond-1 (cdr clauses))
                    987:        (byte-compile-out-tag donetag)))))
                    988: 
                    989: (put 'and 'byte-compile 'byte-compile-and)
                    990: (defun byte-compile-and (form)
                    991:   (let ((failtag (byte-compile-make-tag))
                    992:        (args (cdr form)))
                    993:     (if (null args)
                    994:        (progn
                    995:          (byte-compile-form t)
                    996:          (setq byte-compile-depth (1- byte-compile-depth)))
                    997:       (while args
                    998:        (byte-compile-form (car args))
                    999:        (setq byte-compile-depth (1- byte-compile-depth))
                   1000:        (if (null (cdr args))
                   1001:            (byte-compile-out-tag failtag)
                   1002:          (byte-compile-goto 'byte-goto-if-nil-else-pop failtag))
                   1003:        (setq args (cdr args))))))
                   1004: 
                   1005: (put 'or 'byte-compile 'byte-compile-or)
                   1006: (defun byte-compile-or (form)
                   1007:   (let ((wintag (byte-compile-make-tag))
                   1008:        (args (cdr form)))
                   1009:     (if (null args)
                   1010:        (byte-compile-constant nil)
                   1011:       (while args
                   1012:        (byte-compile-form (car args))
                   1013:        (setq byte-compile-depth (1- byte-compile-depth))
                   1014:        (if (null (cdr args))
                   1015:            (byte-compile-out-tag wintag)
                   1016:          (byte-compile-goto 'byte-goto-if-not-nil-else-pop wintag))
                   1017:        (setq args (cdr args))))))
                   1018: 
                   1019: (put 'while 'byte-compile 'byte-compile-while)
                   1020: (defun byte-compile-while (form)
                   1021:   (let ((endtag (byte-compile-make-tag))
                   1022:        (looptag (byte-compile-make-tag))
                   1023:        (args (cdr (cdr form))))
                   1024:     (byte-compile-out-tag looptag)
                   1025:     (byte-compile-form (car (cdr form)))
                   1026:     (byte-compile-goto 'byte-goto-if-nil-else-pop endtag)
                   1027:     (byte-compile-body (cdr (cdr form)))
                   1028:     (byte-compile-discard)
                   1029:     (byte-compile-goto 'byte-goto looptag)
                   1030:     (byte-compile-out-tag endtag)))
                   1031: 
                   1032: (put 'catch 'byte-compile 'byte-compile-catch)
                   1033: (defun byte-compile-catch (form)
                   1034:   (byte-compile-form (car (cdr form)))
                   1035:   (byte-compile-push-constant (byte-compile-top-level (cons 'progn (cdr (cdr form)))))
                   1036:   (setq byte-compile-depth (- byte-compile-depth 2))
                   1037:   (byte-compile-out 'byte-catch 0))
                   1038: 
                   1039: (put 'save-window-excursion 'byte-compile 'byte-compile-save-window-excursion)
                   1040: (defun byte-compile-save-window-excursion (form)
                   1041:   (byte-compile-push-constant
                   1042:     (list (byte-compile-top-level (cons 'progn (cdr form)))))
                   1043:   (setq byte-compile-depth (1- byte-compile-depth))
                   1044:   (byte-compile-out 'byte-save-window-excursion 0))
                   1045: 
                   1046: (put 'unwind-protect 'byte-compile 'byte-compile-unwind-protect)
                   1047: (defun byte-compile-unwind-protect (form)
                   1048:   (byte-compile-push-constant
                   1049:     (list (byte-compile-top-level (cons 'progn (cdr (cdr form))))))
                   1050:   (setq byte-compile-depth (1- byte-compile-depth))
                   1051:   (byte-compile-out 'byte-unwind-protect 0)
                   1052:   (byte-compile-form (car (cdr form)))
                   1053:   (setq byte-compile-depth (1- byte-compile-depth))
                   1054:   (byte-compile-out 'byte-unbind 1))
                   1055: 
                   1056: (put 'condition-case 'byte-compile 'byte-compile-condition-case)
                   1057: (defun byte-compile-condition-case (form)
                   1058:   (byte-compile-push-constant (car (cdr form)))
                   1059:   (byte-compile-push-constant (byte-compile-top-level (nth 2 form)))
                   1060:   (let ((clauses (cdr (cdr (cdr form))))
                   1061:        compiled-clauses)
                   1062:     (while clauses
                   1063:       (let ((clause (car clauses)))
                   1064:        (setq compiled-clauses
                   1065:              (cons (list (car clause)
                   1066:                          (byte-compile-top-level (cons 'progn (cdr clause))))
                   1067:                    compiled-clauses)))
                   1068:       (setq clauses (cdr clauses)))
                   1069:     (byte-compile-push-constant (nreverse compiled-clauses)))
                   1070:   (setq byte-compile-depth (- byte-compile-depth 3))
                   1071:   (byte-compile-out 'byte-condition-case 0))
                   1072: 
                   1073: (defun byte-compile-make-tag ()
                   1074:   (cons nil nil))
                   1075: 
                   1076: (defun byte-compile-out-tag (tag)
                   1077:   (let ((uses (car tag)))
                   1078:     (setcar tag byte-compile-pc)
                   1079:     (while uses
                   1080:       (byte-compile-store-goto (car uses) byte-compile-pc)
                   1081:       (setq uses (cdr uses)))))
                   1082: 
                   1083: (defun byte-compile-goto (opcode tag)
                   1084:   (byte-compile-out opcode 0)
                   1085:   (if (integerp (car tag))
                   1086:       (byte-compile-store-goto byte-compile-pc (car tag))
                   1087:     (setcar tag (cons byte-compile-pc (car tag))))
                   1088:   (setq byte-compile-pc (+ byte-compile-pc 2)))
                   1089: 
                   1090: (defun byte-compile-store-goto (at-pc to-pc)
                   1091:   (setq byte-compile-output
                   1092:        (cons (cons at-pc (logand to-pc 255))
                   1093:              byte-compile-output))
                   1094:   (setq byte-compile-output
                   1095:        (cons (cons (1+ at-pc) (lsh to-pc -8))
                   1096:              byte-compile-output)))
                   1097: 
                   1098: (defun byte-compile-out (opcode offset)
                   1099:   (setq opcode (eval opcode))
                   1100:   (if (< offset 6)
                   1101:       (byte-compile-out-1 (+ opcode offset))
                   1102:     (if (< offset 256)
                   1103:        (progn
                   1104:          (byte-compile-out-1 (+ opcode 6))
                   1105:          (byte-compile-out-1 offset))
                   1106:       (byte-compile-out-1 (+ opcode 7))
                   1107:       (byte-compile-out-1 (logand offset 255))
                   1108:       (byte-compile-out-1 (lsh offset -8)))))
                   1109: 
                   1110: (defun byte-compile-out-const (offset)
                   1111:   (if (< offset byte-constant-limit)
                   1112:       (byte-compile-out-1 (+ byte-constant offset))
                   1113:     (byte-compile-out-1 byte-constant2)
                   1114:     (byte-compile-out-1 (logand offset 255))
                   1115:     (byte-compile-out-1 (lsh offset -8))))
                   1116: 
                   1117: (defun byte-compile-out-1 (code)
                   1118:   (setq byte-compile-output
                   1119:        (cons (cons byte-compile-pc code)
                   1120:              byte-compile-output))
                   1121:   (setq byte-compile-pc (1+ byte-compile-pc)))
                   1122: 
                   1123: ;;; by [email protected]
                   1124: ;;;  Only works noninteractively.
                   1125: (defun batch-byte-compile ()
                   1126:   "Runs byte-compile-file on the files remaining on the command line.
                   1127: Must be used only with -batch, and kills emacs on completion.
                   1128: Each file will be processed even if an error occurred previously.
                   1129: For example, invoke \"emacs -batch -f batch-byte-compile $emacs/ ~/*.el\""
                   1130:   ;; command-line-args-left is what is left of the command line (from startup.el)
                   1131:   (if (not noninteractive)
                   1132:       (error "batch-byte-compile is to be used only with -batch"))
                   1133:   (let ((error nil))
                   1134:     (while command-line-args-left
                   1135:       (if (file-directory-p (expand-file-name (car command-line-args-left)))
                   1136:          (let ((files (directory-files (car command-line-args-left)))
                   1137:                source dest)
                   1138:            (while files
                   1139:              (if (and (string-match ".el$" (car files))
                   1140:                       (not (auto-save-file-name-p (car files)))
                   1141:                       (setq source (expand-file-name (car files)
                   1142:                                                      (car command-line-args-left)))
                   1143:                       (setq dest (concat (file-name-sans-versions source) "c"))
                   1144:                       (file-exists-p dest)
                   1145:                       (file-newer-than-file-p source dest))
                   1146:                  (if (null (batch-byte-compile-file source))
                   1147:                      (setq error t)))
                   1148:              (setq files (cdr files))))
                   1149:        (if (null (batch-byte-compile-file (car command-line-args-left)))
                   1150:            (setq error t)))
                   1151:       (setq command-line-args-left (cdr command-line-args-left)))
                   1152:     (message "Done")
                   1153:     (kill-emacs (if error 1 0))))
                   1154: 
                   1155: (defun batch-byte-compile-file (file)
                   1156:   (condition-case err
                   1157:       (progn (byte-compile-file file) t)
                   1158:     (error
                   1159:      (message (if (cdr err)
                   1160:                  ">>Error occurred processing %s: %s (%s)"
                   1161:                  ">>Error occurred processing %s: %s")
                   1162:              file
                   1163:              (get (car err) 'error-message)
                   1164:              (prin1-to-string (cdr err)))
                   1165:      nil)))

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.