X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fffi.lisp;h=db6a23ec21bf0606797ce00194bced400f4f8a19;hb=d0e2cc2ea3ae036fba1d085b9c88a5ffe24de956;hp=32b9f217533f0e348aa028b931da724e1b0137b5;hpb=bc239e6931441439be5afd9c6221a532340e5eb1;p=jscl.git diff --git a/src/ffi.lisp b/src/ffi.lisp index 32b9f21..db6a23e 100644 --- a/src/ffi.lisp +++ b/src/ffi.lisp @@ -13,24 +13,35 @@ ;; You should have received a copy of the GNU General Public License ;; along with JSCL. If not, see . -(defvar *js-package* - (make-package "JS")) +(/debug "loading ffi.lisp!") + +(define-setf-expander oget (object key &rest keys) + (let* ((keys (cons key keys)) + (g!object (gensym)) + (g!keys (mapcar (lambda (s) + (declare (ignore s)) + (gensym)) + keys)) + (g!value (gensym))) + (values `(,g!object ,@g!keys) + `(,object ,@keys) + `(,g!value) + `(oset ,g!value ,g!object ,@g!keys) + `(oget ,g!object ,@g!keys)))) + +(define-setf-expander oget* (object key &rest keys) + (let* ((keys (cons key keys)) + (g!object (gensym)) + (g!keys (mapcar (lambda (s) + (declare (ignore s)) + (gensym)) + keys)) + (g!value (gensym))) + (values `(,g!object ,@g!keys) + `(,object ,@keys) + `(,g!value) + `(oset* ,g!value ,g!object ,@g!keys) + `(oget* ,g!object ,@g!keys)))) -(defun ffi-intern-hook (symbol) - (when (eq (symbol-package symbol) *js-package*) - (let ((sym-name (symbol-name symbol)) - (args (gensym))) - ;; Generate a trampoline to call the JS function - ;; properly. This trampoline is very inefficient, - ;; but it still works. Ideas to optimize this are - ;; provide a special lambda keyword - ;; cl::&rest-vector to avoid list argument - ;; consing, as well as allow inline declarations. - (fset symbol (eval `(%js-vref ,sym-name))) - ;; Define it as a symbol macro to access to the - ;; Javascript variable literally. - (%define-symbol-macro symbol `(%js-vref ,(string symbol)))))) -(setq *intern-hook* #'ffi-intern-hook) -(defvar *root* (%js-vref "window"))