Changeset 12630


Ignore:
Timestamp:
04/23/10 21:23:02 (13 years ago)
Author:
astalla
Message:

First rough attempt at a fasl classloader to load local functions using new.
Top-level functions are loaded through the same classloader but still using
reflection.

Location:
branches/less-reflection/abcl/src/org/armedbear/lisp
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • branches/less-reflection/abcl/src/org/armedbear/lisp/Autoload.java

    r12583 r12630  
    684684        autoload(Symbol.COPY_LIST, "copy_list");
    685685
     686  autoload(PACKAGE_SYS, "make-fasl-class-loader", "FaslClassLoader", false);
     687  autoload(PACKAGE_SYS, "get-fasl-function", "FaslClassLoader", false);
     688
    686689        autoload(Symbol.SET_CHAR, "StringFunctions");
    687690        autoload(Symbol.SET_SCHAR, "StringFunctions");
  • branches/less-reflection/abcl/src/org/armedbear/lisp/Lisp.java

    r12607 r12630  
    23632363    internSpecial("*LOAD-STREAM*", PACKAGE_SYS, NIL);
    23642364
     2365    // ### *fasl-loader*
     2366    public static final Symbol _FASL_LOADER_ =
     2367  exportSpecial("*FASL-LOADER*", PACKAGE_SYS, NIL);
     2368
    23652369  // ### *source*
    23662370  // internal symbol
  • branches/less-reflection/abcl/src/org/armedbear/lisp/Load.java

    r12607 r12630  
    279279            url = Lisp.class.getResource(path);
    280280            if (url == null || url.toString().endsWith("/")) {
    281                 url = Lisp.class.getResource(path + ".abcl");
     281                url = Lisp.class.getResource(path.replace('-', '_') + ".abcl");
    282282                if (url == null) {
    283283                    url = Lisp.class.getResource(path + ".lisp");
  • branches/less-reflection/abcl/src/org/armedbear/lisp/compile-file.lisp

    r12626 r12630  
    4646  "Computes the name of the class file associated with number `n'."
    4747  (let ((name
    48          (%format nil "~A-~D"
    49                   (substitute #\_ #\.
    50                               (pathname-name output-file-pathname)) n)))
     48         (sanitize-class-name
     49    (%format nil "~A_~D" (pathname-name output-file-pathname) n))))
    5150    (namestring (merge-pathnames (make-pathname :name name :type "cls")
    5251                                 output-file-pathname))))
     52
     53(defun sanitize-class-name (name)
     54  (dotimes (i (length name))
     55      (declare (type fixnum i))
     56      (when (or (char= (char name i) #\-)
     57    (char= (char name i) #\.)
     58    (char= (char name i) #\Space))
     59        (setf (char name i) #\_)))
     60  name)
     61 
    5362
    5463(declaim (ftype (function () t) next-classfile-name))
     
    7079(declaim (ftype (function (t) t) verify-load))
    7180(defun verify-load (classfile)
    72   (if (> *safety* 0)
    73     (and classfile
     81 
     82  #|(if (> *safety* 0)
     83      (and classfile
    7484         (let ((*load-truename* *output-file-pathname*))
    7585           (report-error
    7686            (load-compiled-function classfile))))
    77     t))
     87    t)|#
     88  (declare (ignore classfile))
     89  t)
    7890   
    7991(declaim (ftype (function (t) t) process-defconstant))
     
    169181                      (setf form
    170182                            `(fset ',name
    171                                    (proxy-preloaded-function ',name ,(file-namestring classfile))
     183           (sys::get-fasl-function *fasl-loader*
     184                 ,(pathname-name classfile))
     185;                                   (proxy-preloaded-function ',name ,(file-namestring classfile))
    172186                                   ,*source-position*
    173187                                   ',lambda-list
     
    242256                             `(put ',name 'macroexpand-macro
    243257                                   (make-macro ',name
    244                                                (proxy-preloaded-function
    245                                                 '(macro-function ,name)
    246                                                 ,(file-namestring classfile))))
     258                                               ;(proxy-preloaded-function
     259                                               ; '(macro-function ,name)
     260                                               ; ,(file-namestring classfile))
     261                 (sys::get-fasl-function *fasl-loader* ,(pathname-name classfile))))
    247262                             `(fset ',name
    248263                                    (make-macro ',name
    249                                                 (proxy-preloaded-function
    250                                                  '(macro-function ,name)
    251                                                  ,(file-namestring classfile)))
     264                                                ;(proxy-preloaded-function
     265                                                ; '(macro-function ,name)
     266                                                ; ,(file-namestring classfile))
     267            (sys::get-fasl-function *fasl-loader* ,(pathname-name classfile)))
    252268                                    ,*source-position*
    253269                                    ',(third form)))))))))
     
    349365  ;; was already used in verify-load before I used it,
    350366  ;; however, binding *load-truename* isn't fully compliant, I think.
    351   (let ((*load-truename* *output-file-pathname*))
    352     (when compile-time-too
     367  (when compile-time-too
     368    (let ((*load-truename* *output-file-pathname*)
     369    (*fasl-loader* (make-fasl-class-loader)))
    353370      (eval form))))
    354371
     
    380397            (cond (compiled-function
    381398                   (setf (getf tail key)
    382                          `(load-compiled-function ,(file-namestring classfile))))
     399       `(sys::get-fasl-function *fasl-loader* ,(pathname-name classfile))))
     400;;                         `(load-compiled-function ,(file-namestring classfile))))
    383401                  (t
    384402                   ;; FIXME This should be a warning or error of some sort...
     
    426444    (setf form
    427445          (if compiled-function
    428               `(funcall (load-compiled-function ,(file-namestring classfile)))
     446              `(funcall (sys::get-fasl-function *fasl-loader* ,(pathname-name classfile)));(load-compiled-function ,(file-namestring classfile)))
    429447              (precompiler:precompile-form form nil *compile-file-environment*)))))
    430448
     
    566584            (write "; -*- Mode: Lisp -*-" :escape nil :stream out)
    567585            (%stream-terpri out)
    568             (let ((*package* (find-package '#:cl))
    569                   (count-sym (gensym)))
     586            (let ((*package* (find-package '#:cl)))
     587                  ;(count-sym (gensym)))
    570588              (write (list 'init-fasl :version *fasl-version*)
    571589                     :stream out)
     
    574592                     :stream out)
    575593              (%stream-terpri out)
    576               (dump-form `(dotimes (,count-sym ,*class-number*)
     594
     595        ;;TODO FAKE TEST ONLY!!!
     596        (when (> *class-number* 0)
     597    (write (list 'setq '*fasl-loader*
     598           '(sys::make-fasl-class-loader)) :stream out)
     599    (%stream-terpri out))
     600#|        (dump-form
     601         `(dotimes (,count-sym ,*class-number*)
     602      (java:jcall "loadFunction" *fasl-loader*
     603            (%format nil "~A_~D"
     604               ,(sanitize-class-name
     605           (pathname-name output-file))
     606               (1+ ,count-sym))))
     607         out)|#
     608
     609        ;;END TODO
     610
     611#|              (dump-form `(dotimes (,count-sym ,*class-number*)
    577612                            (function-preload
    578                              (%format nil "~A-~D.cls"
    579                                       ,(substitute #\_ #\. (pathname-name output-file))
    580                                       (1+ ,count-sym)))) out)
     613                             (%format nil "~A_~D.cls"
     614                                      ,(sanitize-class-name
     615          (pathname-name output-file))
     616                                      (1+ ,count-sym))))
     617       out)|#
    581618              (%stream-terpri out))
    582619
  • branches/less-reflection/abcl/src/org/armedbear/lisp/compiler-pass1.lisp

    r12562 r12630  
    12991299                 (return-from p1-function-call
    13001300       (let ((*inline-declarations*
    1301         (remove op *inline-declarations* :key #'car)))
     1301        (remove op *inline-declarations* :key #'car :test #'equal)))
    13021302         (p1 expansion))))))
    13031303
  • branches/less-reflection/abcl/src/org/armedbear/lisp/compiler-pass2.lisp

    r12622 r12630  
    199199          n)))
    200200
     201(defconstant +fasl-loader-class+
     202  "org/armedbear/lisp/FaslClassLoader")
    201203(defconstant +java-string+ "Ljava/lang/String;")
    202204(defconstant +java-object+ "Ljava/lang/Object;")
     
    21752177   (setf g (symbol-name (gensym "LFUN")))
    21762178   (let* ((pathname (abcl-class-file-pathname (local-function-class-file local-function)))
     2179    (class-name (concatenate 'string "org/armedbear/lisp/" (pathname-name pathname)))
    21772180    (*code* *static-code*))
    21782181     ;; fixme *declare-inline*
    21792182     (declare-field g +lisp-object+ +field-access-default+)
    2180      (emit 'ldc (pool-string (file-namestring pathname)))
    2181      (emit-invokestatic +lisp-function-proxy-class+ "loadPreloadedFunction"
    2182       (list +java-string+) +lisp-object+)
     2183     (emit 'new class-name)
     2184     (emit 'dup)
     2185     (emit-invokespecial-init class-name '())
     2186
     2187     ;(emit 'ldc (pool-string (pathname-name pathname)))
     2188     ;(emit-invokestatic +fasl-loader-class+ "faslLoadFunction"
     2189     ;(list +java-string+) +lisp-object+)
     2190
     2191;     (emit 'ldc (pool-string (file-namestring pathname)))
     2192     
     2193;     (emit-invokestatic +lisp-function-proxy-class+ "loadPreloadedFunction"
     2194;     (list +java-string+) +lisp-object+)
    21832195     (emit 'putstatic *this-class* g +lisp-object+)
    21842196     (setf *static-code* *code*)
     
    23312343  (let ((g (symbol-name (gensym "INSTANCE")))
    23322344        saved-code)
     2345    (sys::%format t "OBJ = ~A ~S~%" (type-of obj) obj)
    23332346    (let* ((s (with-output-to-string (stream) (dump-form obj stream)))
    23342347           (*code* (if *declare-inline* *code* *static-code*)))
     
    53165329               (emit 'getstatic *this-class*
    53175330                     g +lisp-object+))))) ; Stack: template-function
    5318          ((member name *functions-defined-in-current-file* :test #'equal)
     5331         ((and (member name *functions-defined-in-current-file* :test #'equal)
     5332         (not (notinline-p name)))
    53195333          (emit 'getstatic *this-class*
    53205334                (declare-setf-function name) +lisp-object+)
     
    78927906      (compile-function-call form target representation))))
    78937907
     7908#|(defknown p2-java-jcall (t t t) t)
     7909(define-inlined-function p2-java-jcall (form target representation)
     7910  ((and (> *speed* *safety*)
     7911  (< 1 (length form))
     7912  (eq 'jmethod (car (cadr form)))
     7913  (every #'stringp (cdr (cadr form)))))
     7914  (let ((m (ignore-errors (eval (cadr form)))))
     7915    (if m
     7916  (let ((must-clear-values nil)
     7917        (arg-types (raw-arg-types (jmethod-params m))))
     7918    (declare (type boolean must-clear-values))
     7919    (dolist (arg (cddr form))
     7920      (compile-form arg 'stack nil)
     7921      (unless must-clear-values
     7922        (unless (single-valued-p arg)
     7923    (setf must-clear-values t))))
     7924    (when must-clear-values
     7925      (emit-clear-values))
     7926    (dotimes (i (jarray-length raw-arg-types))
     7927      (push (jarray-ref raw-arg-types i) arg-types))
     7928    (emit-invokevirtual (jclass-name (jmethod-declaring-class m))
     7929            (jmethod-name m)
     7930            (nreverse arg-types)
     7931            (jmethod-return-type m)))
     7932      ;; delay resolving the method to run-time; it's unavailable now
     7933      (compile-function-call form target representation))))|#
    78947934
    78957935(defknown p2-char= (t t t) t)
     
    88628902  (install-p2-handler 'java:jconstructor   'p2-java-jconstructor)
    88638903  (install-p2-handler 'java:jmethod        'p2-java-jmethod)
     8904;  (install-p2-handler 'java:jcall          'p2-java-jcall)
    88648905  (install-p2-handler 'char=               'p2-char=)
    88658906  (install-p2-handler 'characterp          'p2-characterp)
  • branches/less-reflection/abcl/src/org/armedbear/lisp/gui.lisp

    r12029 r12630  
    11(in-package :extensions)
     2
     3(require :java)
    24
    35(defvar *gui-backend* :swing)
  • branches/less-reflection/abcl/src/org/armedbear/lisp/java.lisp

    r12583 r12630  
    337337  class
    338338  (%register-java-class
    339    jclass (mop::ensure-class (make-symbol (jclass-name jclass))
    340            :metaclass (find-class 'java-class)
    341            :direct-superclasses (if (jclass-superclass-p jclass (jclass "java.lang.Object"))
    342                   (list (find-class 'java-object))
    343                   (mapcar #'ensure-java-class
    344                     (delete nil
    345                       (concatenate 'list (list (jclass-superclass jclass))
    346                        (jclass-interfaces jclass)))))
    347            :java-class jclass)))))
    348    
     339   jclass (mop::ensure-class
     340     (make-symbol (jclass-name jclass))
     341     :metaclass (find-class 'java-class)
     342     :direct-superclasses
     343     (if (jclass-superclass-p jclass (jclass "java.lang.Object"))
     344         (list (find-class 'java-object))
     345         (mapcar #'ensure-java-class
     346           (delete nil
     347             (concatenate 'list (list (jclass-superclass jclass))
     348              (jclass-interfaces jclass)))))
     349     :java-class jclass)))))
     350
    349351(defmethod make-instance ((class java-class) &rest initargs &key &allow-other-keys)
    350352  (declare (ignore initargs))
  • branches/less-reflection/abcl/src/org/armedbear/lisp/load.lisp

    r11856 r12630  
    3939             (external-format :default))
    4040  (declare (ignore external-format)) ; FIXME
    41   (%load (if (streamp filespec)
    42              filespec
    43              (merge-pathnames (pathname filespec)))
    44          verbose print if-does-not-exist))
     41  (let (*fasl-loader*)
     42    (%load (if (streamp filespec)
     43         filespec
     44         (merge-pathnames (pathname filespec)))
     45     verbose print if-does-not-exist)))
    4546
    4647(defun load-returning-last-result (filespec
     
    5152             (external-format :default))
    5253  (declare (ignore external-format)) ; FIXME
    53   (%load-returning-last-result (if (streamp filespec)
    54              filespec
    55              (merge-pathnames (pathname filespec)))
    56          verbose print if-does-not-exist))
     54  (let (*fasl-loader*)
     55    (%load-returning-last-result (if (streamp filespec)
     56             filespec
     57             (merge-pathnames (pathname filespec)))
     58         verbose print if-does-not-exist)))
  • branches/less-reflection/abcl/src/org/armedbear/lisp/precompiler.lisp

    r12340 r12630  
    3333
    3434
    35 (export '(*inline-declarations*
    36           process-optimization-declarations
     35(export '(process-optimization-declarations
    3736          inline-p notinline-p inline-expansion expand-inline
    3837          *defined-functions* *undefined-functions* note-name-defined))
    39 
    40 (defvar *inline-declarations* nil)
    4138
    4239(declaim (ftype (function (t) t) process-optimization-declarations))
     
    8784(defun inline-p (name)
    8885  (declare (optimize speed))
    89   (let ((entry (assoc name *inline-declarations*)))
     86  (let ((entry (assoc name *inline-declarations* :test #'equal)))
    9087    (if entry
    9188        (eq (cdr entry) 'INLINE)
     
    9592(defun notinline-p (name)
    9693  (declare (optimize speed))
    97   (let ((entry (assoc name *inline-declarations*)))
     94  (let ((entry (assoc name *inline-declarations* :test #'equal)))
    9895    (if entry
    9996        (eq (cdr entry) 'NOTINLINE)
  • branches/less-reflection/abcl/src/org/armedbear/lisp/proclaim.lisp

    r11391 r12630  
    3232(in-package #:system)
    3333
    34 (export '(check-declaration-type proclaimed-type proclaimed-ftype ftype-result-type))
     34(export '(check-declaration-type proclaimed-type proclaimed-ftype ftype-result-type *inline-declarations*))
    3535
    3636(defmacro declaim (&rest decls)
     
    4444         :format-arguments (list name)))
    4545
     46(defvar *inline-declarations* nil)
    4647(defvar *declaration-types* (make-hash-table :test 'eq))
    4748
     
    9293    ((INLINE NOTINLINE)
    9394     (dolist (name (cdr declaration-specifier))
    94        (when (symbolp name) ; FIXME Need to support non-symbol function names.
    95          (setf (get name '%inline) (car declaration-specifier)))))
     95       (if (symbolp name)
     96         (setf (get name '%inline) (car declaration-specifier))
     97   (push (cons name (car declaration-specifier)) *inline-declarations*))))
    9698    (DECLARATION
    9799     (dolist (name (cdr declaration-specifier))
  • branches/less-reflection/abcl/src/org/armedbear/lisp/subtypep.lisp

    r11586 r12630  
    6868                 (HASH-TABLE)
    6969                 (INTEGER RATIONAL)
     70     (JAVA-CLASS STANDARD-CLASS)
    7071                 (KEYWORD SYMBOL)
    7172                 (LIST SEQUENCE)
Note: See TracChangeset for help on using the changeset viewer.