annotate lisp/emacs-lisp/eieio-comp.el @ 104452:688cf3b99678

lisp/cedet/semantic/bovine/c-by.el lisp/cedet/semantic/bovine/c.el lisp/cedet/semantic/bovine/debug.el lisp/cedet/semantic/bovine/el.el lisp/cedet/semantic/bovine/gcc.el lisp/cedet/semantic/bovine/java.el lisp/cedet/semantic/bovine/make-by.el lisp/cedet/semantic/bovine/make.el lisp/cedet/semantic/bovine/scm-by.el lisp/cedet/semantic/bovine/scm.el: New files.
author Chong Yidong <cyd@stupidchicken.com>
date Sat, 05 Sep 2009 20:47:41 +0000
parents a64f3429f0ac
children 25e047f7f6a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
104431
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1 ;;; eieio-comp.el -- eieio routines to help with byte compilation
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3 ;;; Copyright (C) 1995,1996, 1998, 1999, 2000, 2001, 2002, 2005, 2008,
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
4 ;;; 2009 Free Software Foundation, Inc.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
5
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
6 ;; Author: Eric M. Ludlam <zappo@gnu.org>
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
7 ;; Version: 0.2
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
8 ;; Keywords: oop, lisp, tools
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
9
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
11
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
14 ;; the Free Software Foundation, either version 3 of the License, or
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
15 ;; (at your option) any later version.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
16
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
20 ;; GNU General Public License for more details.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
21
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
24
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
25 ;;; Commentary:
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
26
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
27 ;; Byte compiler functions for defmethod. This will affect the new GNU
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
28 ;; byte compiler for Emacs 19 and better. This function will be called by
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
29 ;; the byte compiler whenever a `defmethod' is encountered in a file.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
30 ;; It will output a function call to `eieio-defmethod' with the byte
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
31 ;; compiled function as a parameter.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
32
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
33 ;;; Code:
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
34
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
35 (eval-and-compile
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
36 (if (featurep 'xemacs)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
37 (progn
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
38 ;; XEmacs compatibility settings.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
39 (if (not (fboundp 'byte-compile-compiled-obj-to-list))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
40 (defun byte-compile-compiled-obj-to-list (moose) nil))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
41 (if (not (boundp 'byte-compile-outbuffer))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
42 (defvar byte-compile-outbuffer nil))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
43 (defmacro eieio-byte-compile-princ-code (code outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
44 `(progn (if (atom ,code)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
45 (princ "#[" ,outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
46 (princ "'(" ,outbuffer))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
47 (let ((codelist (if (byte-code-function-p ,code)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
48 (byte-compile-compiled-obj-to-list ,code)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
49 (append ,code nil))))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
50 (while codelist
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
51 (eieio-prin1 (car codelist) ,outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
52 (princ " " ,outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
53 (setq codelist (cdr codelist))))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
54 (if (atom ,code)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
55 (princ "]" ,outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
56 (princ ")" ,outbuffer))))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
57 (defun eieio-prin1 (code outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
58 (cond ((byte-code-function-p code)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
59 (let ((codelist (byte-compile-compiled-obj-to-list code)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
60 (princ "#[" outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
61 (while codelist
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
62 (eieio-prin1 (car codelist) outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
63 (princ " " outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
64 (setq codelist (cdr codelist)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
65 (princ "]" outbuffer)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
66 ((vectorp code)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
67 (let ((i 0) (ln (length code)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
68 (princ "[" outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
69 (while (< i ln)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
70 (eieio-prin1 (aref code i) outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
71 (princ " " outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
72 (setq i (1+ i)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
73 (princ "]" outbuffer)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
74 (t (prin1 code outbuffer)))))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
75 ;; Emacs:
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
76 (defmacro eieio-byte-compile-princ-code (code outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
77 (list 'prin1 code outbuffer))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
78 ;; Dynamically bound in byte-compile-from-buffer.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
79 (defvar bytecomp-outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
80 (defvar bytecomp-filename)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
81
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
82 (declare-function eieio-defgeneric-form "eieio" (method doc-string))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
83
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
84 (defun byte-compile-defmethod-param-convert (paramlist)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
85 "Convert method params into the params used by the defmethod thingy.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
86 Argument PARAMLIST is the paramter list to convert."
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
87 (let ((argfix nil))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
88 (while paramlist
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
89 (setq argfix (cons (if (listp (car paramlist))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
90 (car (car paramlist))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
91 (car paramlist))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
92 argfix))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
93 (setq paramlist (cdr paramlist)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
94 (nreverse argfix)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
95
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
96 ;; This teaches the byte compiler how to do this sort of thing.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
97 (put 'defmethod 'byte-hunk-handler 'byte-compile-file-form-defmethod)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
98
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
99 (defun byte-compile-file-form-defmethod (form)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
100 "Mumble about the method we are compiling.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
101 This function is mostly ripped from `byte-compile-file-form-defun', but
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
102 it's been modified to handle the special syntax of the defmethod
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
103 command. There should probably be one for defgeneric as well, but
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
104 that is called but rarely. Argument FORM is the body of the method."
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
105 (setq form (cdr form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
106 (let* ((meth (car form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
107 (key (progn (setq form (cdr form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
108 (cond ((or (eq ':BEFORE (car form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
109 (eq ':before (car form)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
110 (setq form (cdr form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
111 ":before ")
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
112 ((or (eq ':AFTER (car form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
113 (eq ':after (car form)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
114 (setq form (cdr form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
115 ":after ")
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
116 ((or (eq ':PRIMARY (car form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
117 (eq ':primary (car form)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
118 (setq form (cdr form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
119 ":primary ")
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
120 ((or (eq ':STATIC (car form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
121 (eq ':static (car form)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
122 (setq form (cdr form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
123 ":static ")
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
124 (t ""))))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
125 (params (car form))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
126 (lamparams (byte-compile-defmethod-param-convert params))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
127 (arg1 (car params))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
128 (class (if (listp arg1) (nth 1 arg1) nil))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
129 (my-outbuffer (if (featurep 'xemacs)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
130 byte-compile-outbuffer
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
131 bytecomp-outbuffer)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
132 (let ((name (format "%s::%s" (or class "#<generic>") meth)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
133 (if byte-compile-verbose
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
134 ;; bytecomp-filename is from byte-compile-from-buffer.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
135 (message "Compiling %s... (%s)" (or bytecomp-filename "") name))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
136 (setq byte-compile-current-form name)) ; for warnings
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
137 ;; Flush any pending output
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
138 (byte-compile-flush-pending)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
139 ;; Byte compile the body. For the byte compiled forms, add the
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
140 ;; rest arguments, which will get ignored by the engine which will
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
141 ;; add them later (I hope)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
142 (let* ((new-one (byte-compile-lambda
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
143 (append (list 'lambda lamparams)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
144 (cdr form))))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
145 (code (byte-compile-byte-code-maker new-one)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
146 (princ "\n(eieio-defmethod '" my-outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
147 (princ meth my-outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
148 (princ " '(" my-outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
149 (princ key my-outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
150 (prin1 params my-outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
151 (princ " " my-outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
152 (eieio-byte-compile-princ-code code my-outbuffer)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
153 (princ "))" my-outbuffer))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
154 ;; Now add this function to the list of known functions.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
155 ;; Don't bother with a doc string. Not relevant here.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
156 (add-to-list 'byte-compile-function-environment
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
157 (cons meth
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
158 (eieio-defgeneric-form meth "")))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
159
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
160 ;; Remove it from the undefined list if it is there.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
161 (let ((elt (assq meth byte-compile-unresolved-functions)))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
162 (if elt (setq byte-compile-unresolved-functions
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
163 (delq elt byte-compile-unresolved-functions))))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
164
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
165 ;; nil prevents cruft from appearing in the output buffer.
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
166 nil))
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
167
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
168 (provide 'eieio-comp)
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
169
a64f3429f0ac emacs-lisp/eieio-base.el, emacs-lisp/eieio-comp.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
170 ;;; eieio-comp.el ends here