KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > lisp > Autoload


1 /*
2  * Autoload.java
3  *
4  * Copyright (C) 2003-2004 Peter Graves
5  * $Id: Autoload.java,v 1.196 2004/09/09 12:44:21 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.lisp;
23
24 public class Autoload extends Function
25 {
26     protected final String JavaDoc fileName;
27     protected final String JavaDoc className;
28
29     protected Autoload(Symbol symbol)
30     {
31         super(symbol);
32         fileName = null;
33         className = null;
34         symbol.setBuiltInFunction(false);
35     }
36
37     protected Autoload(Symbol symbol, String JavaDoc fileName, String JavaDoc className)
38     {
39         super(symbol);
40         this.fileName = fileName;
41         this.className = className;
42         symbol.setBuiltInFunction(false);
43     }
44
45     public static void autoload(String JavaDoc symbolName, String JavaDoc className)
46     {
47         autoload(PACKAGE_CL, symbolName, className);
48     }
49
50     public static void autoload(Package JavaDoc pkg, String JavaDoc symbolName,
51                                 String JavaDoc className)
52     {
53         autoload(pkg, symbolName, className, false);
54     }
55
56     public static void autoload(Package JavaDoc pkg, String JavaDoc symbolName,
57                                 String JavaDoc className, boolean exported)
58     {
59         Symbol symbol = intern(symbolName.toUpperCase(), pkg);
60         if (pkg != PACKAGE_CL && exported) {
61             try {
62                 pkg.export(symbol);
63             }
64             catch (ConditionThrowable t) {
65                 Debug.assertTrue(false);
66             }
67         }
68         if (symbol.getSymbolFunction() == null)
69             symbol.setSymbolFunction(new Autoload(symbol, null,
70                                                   "org.armedbear.lisp.".concat(className)));
71     }
72
73     public void load() throws ConditionThrowable
74     {
75         if (className != null) {
76             final LispThread thread = LispThread.currentThread();
77             final Environment oldDynEnv = thread.getDynamicEnvironment();
78             int loadDepth = Fixnum.getInt(_LOAD_DEPTH_.symbolValue());
79             thread.bindSpecial(_LOAD_DEPTH_, new Fixnum(++loadDepth));
80             try {
81                 if (_AUTOLOAD_VERBOSE_.symbolValue(thread) != NIL) {
82                     final String JavaDoc prefix = Load.getLoadVerbosePrefix(loadDepth);
83                     Stream out = getStandardOutput();
84                     out._writeString(prefix);
85                     out._writeString(" Autoloading ");
86                     out._writeString(className);
87                     out._writeLine(" ...");
88                     out._finishOutput();
89                     long start = System.currentTimeMillis();
90                     Class.forName(className);
91                     long elapsed = System.currentTimeMillis() - start;
92                     out._writeString(prefix);
93                     out._writeString(" Autoloaded ");
94                     out._writeString(className);
95                     out._writeString(" (");
96                     out._writeString(String.valueOf(((float)elapsed)/1000));
97                     out._writeLine(" seconds)");
98                     out._finishOutput();
99                 } else
100                     Class.forName(className);
101             }
102             catch (ClassNotFoundException JavaDoc e) {
103                 e.printStackTrace();
104             }
105             finally {
106                 thread.setDynamicEnvironment(oldDynEnv);
107             }
108         } else
109             Load.loadSystemFile(getFileName(), true);
110     }
111
112     protected final String JavaDoc getFileName()
113     {
114         if (fileName != null)
115             return fileName;
116         return getSymbol().getName().toLowerCase();
117     }
118
119     public final int getFunctionalType()
120     {
121         return FTYPE_AUTOLOAD;
122     }
123
124     public String JavaDoc writeToString() throws ConditionThrowable
125     {
126         StringBuffer JavaDoc sb = new StringBuffer JavaDoc("#<AUTOLOAD ");
127         sb.append(getSymbol().writeToString());
128         sb.append(" \"");
129         if (className != null) {
130             int index = className.lastIndexOf('.');
131             if (index >= 0)
132                 sb.append(className.substring(index + 1));
133             else
134                 sb.append(className);
135             sb.append(".class");
136         } else
137             sb.append(getFileName());
138         sb.append("\">");
139         return sb.toString();
140     }
141
142     private static final Primitive AUTOLOAD =
143         new Primitive("autoload", PACKAGE_EXT, true)
144     {
145         public LispObject execute(LispObject first) throws ConditionThrowable
146         {
147             if (first instanceof Symbol) {
148                 Symbol symbol = (Symbol) first;
149                 symbol.setSymbolFunction(new Autoload(symbol));
150                 return T;
151             }
152             if (first instanceof Cons) {
153                 for (LispObject list = first; list != NIL; list = list.cdr()) {
154                     Symbol symbol = checkSymbol(list.car());
155                     symbol.setSymbolFunction(new Autoload(symbol));
156                 }
157                 return T;
158             }
159             return signal(new TypeError(first));
160         }
161         public LispObject execute(LispObject first, LispObject second)
162             throws ConditionThrowable
163         {
164             final String JavaDoc fileName = second.getStringValue();
165             if (first instanceof Symbol) {
166                 Symbol symbol = (Symbol) first;
167                 symbol.setSymbolFunction(new Autoload(symbol, fileName, null));
168                 return T;
169             }
170             if (first instanceof Cons) {
171                 for (LispObject list = first; list != NIL; list = list.cdr()) {
172                     Symbol symbol = checkSymbol(list.car());
173                     symbol.setSymbolFunction(new Autoload(symbol, fileName, null));
174                 }
175                 return T;
176             }
177             return signal(new TypeError(first));
178         }
179     };
180
181     // ### resolve
182
// Force autoload to be resolved.
183
private static final Primitive1 RESOLVE =
184         new Primitive1("resolve", PACKAGE_EXT, true, "symbol")
185     {
186         public LispObject execute(LispObject arg) throws ConditionThrowable
187         {
188             Symbol symbol = checkSymbol(arg);
189             LispObject fun = symbol.getSymbolFunction();
190             if (fun instanceof Autoload) {
191                 Autoload autoload = (Autoload) fun;
192                 autoload.load();
193                 return autoload.getSymbol().getSymbolFunction();
194             }
195             return fun;
196         }
197     };
198
199     // ### autoloadp
200
private static final Primitive1 AUTOLOADP =
201         new Primitive1("autoloadp", PACKAGE_EXT, true, "symbol")
202     {
203         public LispObject execute(LispObject arg) throws ConditionThrowable
204         {
205             if (arg instanceof Symbol) {
206                 if (arg.getSymbolFunction() instanceof Autoload)
207                     return T;
208             }
209             return NIL;
210         }
211     };
212
213     static {
214         autoload("acos", "MathFunctions");
215         autoload("acosh", "MathFunctions");
216         autoload("arithmetic-error-operands", "ArithmeticError");
217         autoload("arithmetic-error-operation", "ArithmeticError");
218         autoload("ash", "ash");
219         autoload("asin", "MathFunctions");
220         autoload("asinh", "MathFunctions");
221         autoload("atan", "MathFunctions");
222         autoload("atanh", "MathFunctions");
223         autoload("broadcast-stream-streams", "BroadcastStream");
224         autoload("ceiling", "ceiling");
225         autoload("cell-error-name", "cell_error_name");
226         autoload("char", "StringFunctions");
227         autoload("char-equal", "CharacterFunctions");
228         autoload("char-greaterp", "CharacterFunctions");
229         autoload("char-lessp", "CharacterFunctions");
230         autoload("char-not-greaterp", "CharacterFunctions");
231         autoload("char-not-lessp", "CharacterFunctions");
232         autoload("char<=", "CharacterFunctions");
233         autoload("char=", "CharacterFunctions");
234         autoload("clrhash", "HashTable");
235         autoload("concatenated-stream-streams", "ConcatenatedStream");
236         autoload("cos", "MathFunctions");
237         autoload("cosh", "MathFunctions");
238         autoload("delete-file", "delete_file");
239         autoload("delete-package", "PackageFunctions");
240         autoload("describe", "describe");
241         autoload("echo-stream-input-stream", "EchoStream");
242         autoload("echo-stream-output-stream", "EchoStream");
243         autoload("exp", "MathFunctions");
244         autoload("file-author", "file_author");
245         autoload("file-error-pathname", "file_error_pathname");
246         autoload("file-length", "file_length");
247         autoload("file-string-length", "file_string_length");
248         autoload("file-write-date", "file_write_date");
249         autoload("float-sign", "float_sign");
250         autoload("floor", "floor");
251         autoload("ftruncate", "ftruncate");
252         autoload("get-internal-real-time", "Time");
253         autoload("get-internal-run-time", "Time");
254         autoload("get-output-stream-string", "StringOutputStream");
255         autoload("get-properties", "get_properties");
256         autoload("get-universal-time", "Time");
257         autoload("gethash", "HashTable");
258         autoload("hash-table-count", "HashTable");
259         autoload("hash-table-p", "HashTable");
260         autoload("hash-table-rehash-size", "HashTable");
261         autoload("hash-table-rehash-threshold", "HashTable");
262         autoload("hash-table-size", "HashTable");
263         autoload("hash-table-test", "HashTable");
264         autoload("import", "PackageFunctions");
265         autoload("input-stream-p", "input_stream_p");
266         autoload("interactive-stream-p", "interactive_stream_p");
267         autoload("last", "last");
268         autoload("lisp-implementation-type", "lisp_implementation_type");
269         autoload("lisp-implementation-version", "lisp_implementation_version");
270         autoload("list-all-packages", "PackageFunctions");
271         autoload("listen", "listen");
272         autoload("load-logical-pathname-translations", "LogicalPathname");
273         autoload("log", "MathFunctions");
274         autoload("logand", "logand");
275         autoload("logandc1", "logandc1");
276         autoload("logandc2", "logandc2");
277         autoload("logbitp", "logbitp");
278         autoload("logcount", "logcount");
279         autoload("logeqv", "logeqv");
280         autoload("logical-pathname", "LogicalPathname");
281         autoload("logical-pathname-translations", "LogicalPathname");
282         autoload("logior", "logior");
283         autoload("lognand", "lognand");
284         autoload("lognor", "lognor");
285         autoload("lognot", "lognot");
286         autoload("logorc1", "logorc1");
287         autoload("logorc2", "logorc2");
288         autoload("logtest", "logtest");
289         autoload("logxor", "logxor");
290         autoload("long-site-name", "SiteName");
291         autoload("machine-instance", "SiteName");
292         autoload("machine-type", "machine_type");
293         autoload("machine-version", "machine_version");
294         autoload("make-broadcast-stream", "BroadcastStream");
295         autoload("make-concatenated-stream", "ConcatenatedStream");
296         autoload("make-echo-stream", "EchoStream");
297         autoload("make-string-input-stream", "StringInputStream");
298         autoload("make-synonym-stream", "SynonymStream");
299         autoload("mod", "mod");
300         autoload("open-stream-p", "open_stream_p");
301         autoload("output-stream-p", "output_stream_p");
302         autoload("package-error-package", "PackageError");
303         autoload("package-name", "PackageFunctions");
304         autoload("package-nicknames", "PackageFunctions");
305         autoload("package-shadowing-symbols", "PackageFunctions");
306         autoload("package-use-list", "PackageFunctions");
307         autoload("package-used-by-list", "PackageFunctions");
308         autoload("packagep", "PackageFunctions");
309         autoload("peek-char", "peek_char");
310         autoload("print-not-readable-object", "PrintNotReadable");
311         autoload("probe-file", "probe_file");
312         autoload("read-char-no-hang", "read_char_no_hang");
313         autoload("read-delimited-list", "read_delimited_list");
314         autoload("rem", "rem");
315         autoload("remhash", "HashTable");
316         autoload("rename-package", "PackageFunctions");
317         autoload("room", "room");
318         autoload("shadow", "PackageFunctions");
319         autoload("shadowing-import", "PackageFunctions");
320         autoload("short-site-name", "SiteName");
321         autoload("simple-condition-format-arguments", "SimpleCondition");
322         autoload("simple-condition-format-control", "SimpleCondition");
323         autoload("simple-string-p", "StringFunctions");
324         autoload("sin", "MathFunctions");
325         autoload("sinh", "MathFunctions");
326         autoload("software-type", "software_type");
327         autoload("software-version", "software_version");
328         autoload("sqrt", "MathFunctions");
329         autoload("stream-element-type", "stream_element_type");
330         autoload("stream-error-stream", "StreamError");
331         autoload("stream-external-format", "stream_external_format");
332         autoload("stringp", "StringFunctions");
333         autoload("sxhash", "HashTable");
334         autoload("synonym-stream-symbol", "SynonymStream");
335         autoload("tan", "MathFunctions");
336         autoload("tanh", "MathFunctions");
337         autoload("truename", "probe_file");
338         autoload("truncate", "truncate");
339         autoload("unbound-slot-instance", "unbound_slot_instance");
340         autoload("unexport", "PackageFunctions");
341         autoload("unuse-package", "PackageFunctions");
342         autoload(PACKAGE_EXT, "arglist", "arglist", true);
343         autoload(PACKAGE_EXT, "assq", "assq", true);
344         autoload(PACKAGE_EXT, "assql", "assql", true);
345         autoload(PACKAGE_EXT, "file-directory-p", "probe_file", true);
346         autoload(PACKAGE_EXT, "gc", "gc", true);
347         autoload(PACKAGE_EXT, "get-mutex", "Mutex", true);
348         autoload(PACKAGE_EXT, "mailbox-empty-p", "Mailbox", true);
349         autoload(PACKAGE_EXT, "mailbox-peek", "Mailbox", true);
350         autoload(PACKAGE_EXT, "mailbox-read", "Mailbox", true);
351         autoload(PACKAGE_EXT, "mailbox-send", "Mailbox", true);
352         autoload(PACKAGE_EXT, "make-mailbox", "Mailbox", true);
353         autoload(PACKAGE_EXT, "make-mutex", "Mutex", true);
354         autoload(PACKAGE_EXT, "make-thread-lock", "ThreadLock", true);
355         autoload(PACKAGE_EXT, "probe-directory", "probe_file", true);
356         autoload(PACKAGE_EXT, "release-mutex", "Mutex", true);
357         autoload(PACKAGE_EXT, "simple-string-fill", "StringFunctions");
358         autoload(PACKAGE_EXT, "simple-string-search", "StringFunctions");
359         autoload(PACKAGE_EXT, "string-input-stream-current", "StringInputStream", true);
360         autoload(PACKAGE_EXT, "string-position", "StringFunctions");
361         autoload(PACKAGE_EXT, "thread-lock", "ThreadLock", true);
362         autoload(PACKAGE_EXT, "thread-unlock", "ThreadLock", true);
363         autoload(PACKAGE_JAVA, "%jnew-proxy", "JProxy");
364         autoload(PACKAGE_JAVA, "%jnew-runtime-class", "RuntimeClass");
365         autoload(PACKAGE_JAVA, "%jredefine-method", "RuntimeClass");
366         autoload(PACKAGE_JAVA, "%jregister-handler", "JHandler");
367         autoload(PACKAGE_JAVA, "%load-java-class-from-byte-array", "RuntimeClass");
368         autoload(PACKAGE_PROF, "%start-profiler", "Profiler", true);
369         autoload(PACKAGE_PROF, "stop-profiler", "Profiler", true);
370         autoload(PACKAGE_SYS, "%%string=", "StringFunctions");
371         autoload(PACKAGE_SYS, "%adjust-array", "adjust_array");
372         autoload(PACKAGE_SYS, "%defpackage", "PackageFunctions");
373         autoload(PACKAGE_SYS, "%make-array", "make_array");
374         autoload(PACKAGE_SYS, "%make-condition", "make_condition");
375         autoload(PACKAGE_SYS, "%make-hash-table", "HashTable");
376         autoload(PACKAGE_SYS, "%make-server-socket", "make_server_socket");
377         autoload(PACKAGE_SYS, "%make-socket", "make_socket");
378         autoload(PACKAGE_SYS, "%make-string", "StringFunctions");
379         autoload(PACKAGE_SYS, "%make-string-output-stream", "StringOutputStream");
380         autoload(PACKAGE_SYS, "%nstring-capitalize", "StringFunctions");
381         autoload(PACKAGE_SYS, "%nstring-downcase", "StringFunctions");
382         autoload(PACKAGE_SYS, "%nstring-upcase", "StringFunctions");
383         autoload(PACKAGE_SYS, "%run-shell-command", "ShellCommand");
384         autoload(PACKAGE_SYS, "%server-socket-close", "server_socket_close");
385         autoload(PACKAGE_SYS, "%set-arglist", "arglist");
386         autoload(PACKAGE_SYS, "%set-char", "StringFunctions");
387         autoload(PACKAGE_SYS, "%set-class-direct-slots", "SlotClass");
388         autoload(PACKAGE_SYS, "%set-class-slots", "SlotClass");
389         autoload(PACKAGE_SYS, "%set-function-info", "function_info");
390         autoload(PACKAGE_SYS, "%set-generic-function-discriminating-function", "GenericFunction");
391         autoload(PACKAGE_SYS, "%set-instance-ref", "StandardObject");
392         autoload(PACKAGE_SYS, "%set-logical-pathname-translations", "LogicalPathname");
393         autoload(PACKAGE_SYS, "%socket-accept", "socket_accept");
394         autoload(PACKAGE_SYS, "%socket-close", "socket_close");
395         autoload(PACKAGE_SYS, "%socket-stream", "socket_stream");
396         autoload(PACKAGE_SYS, "%string-capitalize", "StringFunctions");
397         autoload(PACKAGE_SYS, "%string-downcase", "StringFunctions");
398         autoload(PACKAGE_SYS, "%string-equal", "StringFunctions");
399         autoload(PACKAGE_SYS, "%string-greaterp", "StringFunctions");
400         autoload(PACKAGE_SYS, "%string-lessp", "StringFunctions");
401         autoload(PACKAGE_SYS, "%string-not-equal", "StringFunctions");
402         autoload(PACKAGE_SYS, "%string-not-greaterp", "StringFunctions");
403         autoload(PACKAGE_SYS, "%string-not-lessp", "StringFunctions");
404         autoload(PACKAGE_SYS, "%string-upcase", "StringFunctions");
405         autoload(PACKAGE_SYS, "%string/=", "StringFunctions");
406         autoload(PACKAGE_SYS, "%string<", "StringFunctions");
407         autoload(PACKAGE_SYS, "%string<=", "StringFunctions");
408         autoload(PACKAGE_SYS, "%string=", "StringFunctions");
409         autoload(PACKAGE_SYS, "%string>", "StringFunctions");
410         autoload(PACKAGE_SYS, "%string>=", "StringFunctions");
411         autoload(PACKAGE_SYS, "%time", "Time");
412         autoload(PACKAGE_SYS, "allocate-slot-storage", "StandardObject");
413         autoload(PACKAGE_SYS, "allocate-std-instance", "StandardObject");
414         autoload(PACKAGE_SYS, "class-direct-slots", "SlotClass");
415         autoload(PACKAGE_SYS, "class-slots", "SlotClass");
416         autoload(PACKAGE_SYS, "condition-report", "Condition");
417         autoload(PACKAGE_SYS, "create-new-file", "create_new_file");
418         autoload(PACKAGE_SYS, "function-info", "function_info");
419         autoload(PACKAGE_SYS, "default-time-zone", "Time");
420         autoload(PACKAGE_SYS, "generic-function-discriminating-function", "GenericFunction");
421         autoload(PACKAGE_SYS, "hash-table-entries", "HashTable");
422         autoload(PACKAGE_SYS, "instance-ref", "StandardObject");
423         autoload(PACKAGE_SYS, "layout-class", "Layout");
424         autoload(PACKAGE_SYS, "layout-length", "Layout");
425         autoload(PACKAGE_SYS, "make-case-frob-stream", "CaseFrobStream");
426         autoload(PACKAGE_SYS, "make-file-stream", "FileStream");
427         autoload(PACKAGE_SYS, "make-fill-pointer-output-stream", "FillPointerOutputStream");
428         autoload(PACKAGE_SYS, "make-instance-standard-class", "StandardClass");
429         autoload(PACKAGE_SYS, "make-layout", "Layout");
430         autoload(PACKAGE_SYS, "make-structure-class", "StructureClass");
431         autoload(PACKAGE_SYS, "make-symbol-macro", "SymbolMacro");
432         autoload(PACKAGE_SYS, "puthash", "HashTable");
433         autoload(PACKAGE_SYS, "simple-list-remove-duplicates", "simple_list_remove_duplicates");
434         autoload(PACKAGE_SYS, "std-instance-slots", "StandardObject");
435     }
436 }
437
Popular Tags