Changeset 12672
- Timestamp:
- 05/12/10 22:52:33 (13 years ago)
- Location:
- branches/less-reflection/abcl/src/org/armedbear/lisp
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/less-reflection/abcl/src/org/armedbear/lisp/Autoload.java
r12630 r12672 98 98 "org.armedbear.lisp.".concat(className))); 99 99 } 100 100 101 101 public void load() 102 102 { -
branches/less-reflection/abcl/src/org/armedbear/lisp/FaslClassLoader.java
r12631 r12672 39 39 40 40 public class FaslClassLoader extends JavaClassLoader { 41 42 private final LispObject[] functions; 43 private String baseName; 44 private LispObject loader; //The function used to load FASL functions by number 45 private final JavaObject boxedThis = new JavaObject(this); 41 46 47 public FaslClassLoader(int functionCount, String baseName, boolean useLoaderFunction) { 48 functions = new LispObject[functionCount]; 49 this.baseName = baseName; 50 if(useLoaderFunction) { 51 try { 52 this.loader = (LispObject) loadClass(baseName + "_0").newInstance(); 53 } catch(Exception e) { 54 //e.printStackTrace(); 55 Debug.trace("useLoaderFunction = true but couldn't fully init FASL loader, will fall back to reflection!"); 56 } 57 } 58 } 59 42 60 protected Class<?> findClass(String name) throws ClassNotFoundException { 43 61 try { … … 52 70 } 53 71 54 //TODO have compiler generate subclass, TEST ONLY!!! 55 protected Map<String, LispObject> functions = new HashMap<String, LispObject>(); 56 57 public LispObject loadFunction(String className) { 72 public LispObject loadFunction(int fnNumber) { 58 73 try { 59 LispObject o = (LispObject) loadClass(className).newInstance(); 60 functions.put(className, o); 74 //Function name is fnIndex + 1 75 LispObject o = (LispObject) loadClass(baseName + "_" + (fnNumber + 1)).newInstance(); 76 functions[fnNumber] = o; 61 77 return o; 62 78 } catch(Exception e) { … … 67 83 } 68 84 69 public LispObject getFunction(final String className) { 70 LispObject o = functions.get(className); 85 public LispObject getFunction(int fnNumber) { 86 if(fnNumber >= functions.length) { 87 return error(new LispError("Compiled function not found: " + baseName + "_" + (fnNumber + 1) + " " + Symbol.LOAD_TRUENAME.symbolValue())); 88 } 89 LispObject o = functions[fnNumber]; 71 90 if(o == null) { 72 o = loadFunction(className); 91 if(loader != null) { 92 loader.execute(boxedThis, Fixnum.getInstance(fnNumber)); 93 return functions[fnNumber]; 94 } else { //Fallback to reflection 95 return loadFunction(fnNumber); 96 } 97 } else { 98 return o; 73 99 } 74 return o;75 100 } 76 101 77 public static LispObject faslLoadFunction(String className) {78 FaslClassLoader cl = (FaslClassLoader) LispThread.currentThread().safeSymbolValue(_FASL_LOADER_).javaInstance();79 return cl.getFunction(className);102 public LispObject putFunction(int fnNumber, LispObject fn) { 103 functions[fnNumber] = fn; 104 return fn; 80 105 } 81 106 … … 83 108 private static final class pf_make_fasl_class_loader extends Primitive { 84 109 pf_make_fasl_class_loader() { 85 super("make-fasl-class-loader", PACKAGE_SYS, false, " ");110 super("make-fasl-class-loader", PACKAGE_SYS, false, "function-count base-name"); 86 111 } 87 112 88 113 @Override 89 public LispObject execute() { 90 return new JavaObject(new FaslClassLoader()); 114 public LispObject execute(LispObject functionCount, LispObject baseName) { 115 return execute(functionCount, baseName, T); 116 } 117 118 @Override 119 public LispObject execute(LispObject functionCount, LispObject baseName, LispObject init) { 120 return new FaslClassLoader(functionCount.intValue(), baseName.getStringValue(), init != NIL).boxedThis; 91 121 } 92 122 }; … … 95 125 private static final class pf_get_fasl_function extends Primitive { 96 126 pf_get_fasl_function() { 97 super("get-fasl-function", PACKAGE_SYS, false, "loader class-name");127 super("get-fasl-function", PACKAGE_SYS, false, "loader function-number"); 98 128 } 99 129 100 130 @Override 101 public LispObject execute(LispObject loader, LispObject className) {131 public LispObject execute(LispObject loader, LispObject fnNumber) { 102 132 FaslClassLoader l = (FaslClassLoader) loader.javaInstance(FaslClassLoader.class); 103 return l.getFunction( "org.armedbear.lisp." + className.getStringValue());133 return l.getFunction(fnNumber.intValue()); 104 134 } 105 135 }; -
branches/less-reflection/abcl/src/org/armedbear/lisp/Function.java
r12288 r12672 179 179 public LispObject execute() 180 180 { 181 return error(new WrongNumberOfArgumentsException(this ));181 return error(new WrongNumberOfArgumentsException(this, 0)); 182 182 } 183 183 … … 185 185 public LispObject execute(LispObject arg) 186 186 { 187 return error(new WrongNumberOfArgumentsException(this ));187 return error(new WrongNumberOfArgumentsException(this, 1)); 188 188 } 189 189 … … 192 192 193 193 { 194 return error(new WrongNumberOfArgumentsException(this ));194 return error(new WrongNumberOfArgumentsException(this, 2)); 195 195 } 196 196 … … 200 200 201 201 { 202 return error(new WrongNumberOfArgumentsException(this ));202 return error(new WrongNumberOfArgumentsException(this, 3)); 203 203 } 204 204 … … 208 208 209 209 { 210 return error(new WrongNumberOfArgumentsException(this ));210 return error(new WrongNumberOfArgumentsException(this, 4)); 211 211 } 212 212 … … 217 217 218 218 { 219 return error(new WrongNumberOfArgumentsException(this ));219 return error(new WrongNumberOfArgumentsException(this, 5)); 220 220 } 221 221 … … 226 226 227 227 { 228 return error(new WrongNumberOfArgumentsException(this ));228 return error(new WrongNumberOfArgumentsException(this, 6)); 229 229 } 230 230 … … 236 236 237 237 { 238 return error(new WrongNumberOfArgumentsException(this ));238 return error(new WrongNumberOfArgumentsException(this, 7)); 239 239 } 240 240 … … 246 246 247 247 { 248 return error(new WrongNumberOfArgumentsException(this ));248 return error(new WrongNumberOfArgumentsException(this, 8)); 249 249 } 250 250 -
branches/less-reflection/abcl/src/org/armedbear/lisp/Interpreter.java
r12597 r12672 282 282 sb.append(separator); 283 283 System.err.print(sb.toString()); 284 System.err.println("backtrace: "); 285 evaluate("(princ (sys::backtrace))"); 284 286 System.exit(2); 285 287 } -
branches/less-reflection/abcl/src/org/armedbear/lisp/Lisp.java
r12638 r12672 1244 1244 input = url.openStream(); 1245 1245 } catch (IOException e) { 1246 System.err.println("Failed to read class bytes from boot class " + url); 1246 1247 error(new LispError("Failed to read class bytes from boot class " + url)); 1247 1248 } -
branches/less-reflection/abcl/src/org/armedbear/lisp/Load.java
r12630 r12672 253 253 } 254 254 255 private static final Symbol FASL_LOADER = PACKAGE_SYS.intern("*FASL-LOADER*"); 255 256 static final LispObject COMPILE_FILE_INIT_FASL_TYPE = new SimpleString("_"); 256 257 … … 333 334 final SpecialBindingsMark mark = thread.markSpecialBindings(); 334 335 thread.bindSpecial(_WARN_ON_REDEFINITION_, NIL); 336 thread.bindSpecial(FASL_LOADER, NIL); 335 337 try { 336 338 Stream stream = new Stream(Symbol.SYSTEM_STREAM, in, Symbol.CHARACTER); … … 558 560 if (obj == EOF) 559 561 break; 560 562 result = eval(obj, env, thread); 561 563 if (print) { 562 564 Stream out = -
branches/less-reflection/abcl/src/org/armedbear/lisp/compile-file.lisp
r12630 r12672 41 41 (defvar *output-file-pathname*) 42 42 43 (defvar *function-packages* nil "An alist containing mappings (function-number . package). Every time an (IN-PACKAGE pkg) form is found at top-level, (*class-number* . pkg) is pushed onto this list.") 44 45 (defun base-classname (&optional (output-file-pathname *output-file-pathname*)) 46 (sanitize-class-name (pathname-name output-file-pathname))) 47 48 (defun fasl-loader-classname (&optional (output-file-pathname *output-file-pathname*)) 49 (%format nil "~A_0" (base-classname output-file-pathname))) 50 43 51 (declaim (ftype (function (t) t) compute-classfile-name)) 44 52 (defun compute-classfile-name (n &optional (output-file-pathname … … 52 60 53 61 (defun sanitize-class-name (name) 54 (dotimes (i (length name)) 62 (let ((name (copy-seq name))) 63 (dotimes (i (length name)) 55 64 (declare (type fixnum i)) 56 65 (when (or (char= (char name i) #\-) … … 58 67 (char= (char name i) #\Space)) 59 68 (setf (char name i) #\_))) 60 name)69 name)) 61 70 62 71 … … 125 134 ((IN-PACKAGE DEFPACKAGE) 126 135 (note-toplevel-form form) 136 (if (eq operator 'in-package) 137 (push (cons (1+ *class-number*) (cadr form)) *function-packages*)) 127 138 (setf form (precompiler:precompile-form form nil *compile-file-environment*)) 128 139 (eval form) … … 157 168 (let* ((expr `(lambda ,lambda-list 158 169 ,@decls (block ,block-name ,@body))) 170 (saved-class-number *class-number*) 159 171 (classfile (next-classfile-name)) 160 172 (internal-compiler-errors nil) … … 182 194 `(fset ',name 183 195 (sys::get-fasl-function *fasl-loader* 184 ,(pathname-name classfile))196 ,saved-class-number) 185 197 ; (proxy-preloaded-function ',name ,(file-namestring classfile)) 186 198 ,*source-position* … … 240 252 (eval form) 241 253 (let* ((expr (function-lambda-expression (macro-function name))) 254 (saved-class-number *class-number*) 242 255 (classfile (next-classfile-name))) 243 256 (with-open-file … … 259 272 ; '(macro-function ,name) 260 273 ; ,(file-namestring classfile)) 261 (sys::get-fasl-function *fasl-loader* , (pathname-name classfile))))274 (sys::get-fasl-function *fasl-loader* ,saved-class-number))) 262 275 `(fset ',name 263 276 (make-macro ',name … … 265 278 ; '(macro-function ,name) 266 279 ; ,(file-namestring classfile)) 267 (sys::get-fasl-function *fasl-loader* , (pathname-name classfile)))280 (sys::get-fasl-function *fasl-loader* ,saved-class-number)) 268 281 ,*source-position* 269 282 ',(third form))))))))) … … 367 380 (when compile-time-too 368 381 (let ((*load-truename* *output-file-pathname*) 369 (*fasl-loader* (make-fasl-class-loader))) 382 (*fasl-loader* (make-fasl-class-loader 383 *class-number* 384 (concatenate 'string "org.armedbear.lisp." (base-classname)) 385 nil))) 370 386 (eval form)))) 371 387 … … 384 400 (let ((lambda-expression (cadr function-form))) 385 401 (jvm::with-saved-compiler-policy 386 (let* ((classfile (next-classfile-name)) 402 (let* ((saved-class-number *class-number*) 403 (classfile (next-classfile-name)) 387 404 (result 388 405 (with-open-file … … 397 414 (cond (compiled-function 398 415 (setf (getf tail key) 399 `(sys::get-fasl-function *fasl-loader* , (pathname-name classfile))))416 `(sys::get-fasl-function *fasl-loader* ,saved-class-number))) 400 417 ;; `(load-compiled-function ,(file-namestring classfile)))) 401 418 (t … … 431 448 (precompiler:precompile-form form nil *compile-file-environment*))) 432 449 (let* ((expr `(lambda () ,form)) 450 (saved-class-number *class-number*) 433 451 (classfile (next-classfile-name)) 434 452 (result … … 444 462 (setf form 445 463 (if compiled-function 446 `(funcall (sys::get-fasl-function *fasl-loader* , (pathname-name classfile)));(load-compiled-function ,(file-namestring classfile)))464 `(funcall (sys::get-fasl-function *fasl-loader* ,saved-class-number)) 447 465 (precompiler:precompile-form form nil *compile-file-environment*))))) 448 466 … … 531 549 (*source* *compile-file-truename*) 532 550 (*class-number* 0) 551 (*function-packages* nil) 533 552 (namestring (namestring *compile-file-truename*)) 534 553 (start (get-internal-real-time)) … … 593 612 (%stream-terpri out) 594 613 595 ;;TODO FAKE TEST ONLY!!!596 614 (when (> *class-number* 0) 615 (let* ((basename (base-classname)) 616 (expr `(lambda (fasl-loader fn-index) 617 (identity fasl-loader) ;;to avoid unused arg 618 ;;Ugly: should export & import JVM:: symbols 619 #|(let ((*package* *package*)) 620 ,(let ((x (cdr (assoc 0 *function-packages*)))) ;;in-package before any function was defined 621 (when x 622 `(in-package ,(string x))))|# 623 (ecase fn-index 624 ,@(loop 625 :for i :from 1 :to *class-number* 626 :collect 627 (let ((class (%format nil "org/armedbear/lisp/~A_~A" basename i))) 628 `(,(1- i) (jvm::with-inline-code () 629 ;(jvm::emit 'jvm::ldc (jvm::pool-string (symbol-name 'sys::*fasl-loader*))) 630 ;(jvm::emit 'jvm::ldc (jvm::pool-string (string :system))) 631 ;(jvm::emit-invokestatic jvm::+lisp-class+ "internInPackage" 632 ;(list jvm::+java-string+ jvm::+java-string+) jvm::+lisp-symbol+) 633 ;(jvm::emit-push-current-thread) 634 ; (jvm::emit-invokevirtual jvm::+lisp-symbol-class+ "symbolValue" 635 ; (list jvm::+lisp-thread+) jvm::+lisp-object+) 636 (jvm::emit 'jvm::aload 1) 637 (jvm::emit-invokevirtual jvm::+lisp-object-class+ "javaInstance" 638 nil jvm::+java-object+) 639 (jvm::emit 'jvm::checkcast "org/armedbear/lisp/FaslClassLoader") 640 (jvm::emit 'jvm::dup) 641 (jvm::emit-push-constant-int ,(1- i)) 642 (jvm::emit 'jvm::new ,class) 643 (jvm::emit 'jvm::dup) 644 (jvm::emit-invokespecial-init ,class '()) 645 (jvm::emit-invokevirtual "org/armedbear/lisp/FaslClassLoader" "putFunction" 646 (list "I" jvm::+lisp-object+) jvm::+lisp-object+) 647 (jvm::emit 'jvm::pop)) 648 t)))))) 649 (classname (fasl-loader-classname)) 650 (classfile (namestring (merge-pathnames (make-pathname :name classname :type "cls") 651 *output-file-pathname*)))) 652 (jvm::with-saved-compiler-policy 653 (jvm::with-file-compilation 654 (with-open-file 655 (f classfile 656 :direction :output 657 :element-type '(unsigned-byte 8) 658 :if-exists :supersede) 659 (jvm:compile-defun nil expr nil 660 classfile f nil))))) 597 661 (write (list 'setq '*fasl-loader* 598 '(sys::make-fasl-class-loader)) :stream out) 662 `(sys::make-fasl-class-loader 663 ,*class-number* 664 ,(concatenate 'string "org.armedbear.lisp." (base-classname)))) :stream out) 599 665 (%stream-terpri out)) 600 666 #| (dump-form … … 634 700 (merge-pathnames (make-pathname :type type) 635 701 output-file))) 636 (pathnames ())) 702 (pathnames (list (namestring (merge-pathnames (make-pathname :name (fasl-loader-classname) :type "cls") 703 output-file))))) 637 704 (dotimes (i *class-number*) 638 705 (let* ((pathname (compute-classfile-name (1+ i)))) -
branches/less-reflection/abcl/src/org/armedbear/lisp/precompiler.lisp
r12638 r12672 959 959 'precompiler)))) 960 960 (unless (and handler (fboundp handler)) 961 (error "No handler for ~S." symbol)) 961 (error "No handler for ~S." (let ((*package* (find-package :keyword))) 962 (format nil "~S" symbol)))) 962 963 (setf (get symbol 'precompile-handler) handler))) 963 964
Note: See TracChangeset
for help on using the changeset viewer.