emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/native-comp 8861ee8 3/7: Have `native-elisp-load' return the las


From: Andrea Corallo
Subject: feature/native-comp 8861ee8 3/7: Have `native-elisp-load' return the last registerd function
Date: Wed, 14 Oct 2020 05:13:47 -0400 (EDT)

branch: feature/native-comp
commit 8861ee8b087b4e5d9ac9186a2c2d8e44b07fc186
Author: Andrea Corallo <akrl@sdf.org>
Commit: Andrea Corallo <akrl@sdf.org>

    Have `native-elisp-load' return the last registerd function
    
        * lisp/emacs-lisp/comp.el (comp-emit-for-top-level): Synthesize
        'top_level_run' so it returns the last value returned by
        `comp--register-subr'.
        * src/comp.c (load_comp_unit): Return what 'top_level_run'
        returns.
        (Fnative_elisp_load): Return what 'load_comp_unit' returns.
        * src/comp.h (load_comp_unit): Update signature.
---
 lisp/emacs-lisp/comp.el | 47 +++++++++++++++++++++++++++--------------------
 src/comp.c              | 11 +++++------
 src/comp.h              |  4 ++--
 3 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 89b4230..98f5525 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -1480,24 +1480,26 @@ the annotation emission."
          (f (gethash c-name (comp-ctxt-funcs-h comp-ctxt)))
          (args (comp-prepare-args-for-top-level f)))
     (cl-assert (and name f))
-    (comp-emit (comp-call (if for-late-load
-                              'comp--late-register-subr
-                            'comp--register-subr)
-                          (make-comp-mvar :constant name)
-                          (car args)
-                          (cdr args)
-                          (make-comp-mvar :constant c-name)
-                          (make-comp-mvar
-                           :constant
-                           (let* ((h (comp-ctxt-function-docs comp-ctxt))
-                                  (i (hash-table-count h)))
-                             (puthash i (comp-func-doc f) h)
-                             i))
-                          (make-comp-mvar :constant
-                                          (comp-func-int-spec f))
-                          ;; This is the compilation unit it-self passed as
-                          ;; parameter.
-                          (make-comp-mvar :slot 0)))))
+    (comp-emit
+     `(set ,(make-comp-mvar :slot 1)
+           ,(comp-call (if for-late-load
+                           'comp--late-register-subr
+                         'comp--register-subr)
+                       (make-comp-mvar :constant name)
+                       (car args)
+                       (cdr args)
+                       (make-comp-mvar :constant c-name)
+                       (make-comp-mvar
+                        :constant
+                        (let* ((h (comp-ctxt-function-docs comp-ctxt))
+                               (i (hash-table-count h)))
+                          (puthash i (comp-func-doc f) h)
+                          i))
+                       (make-comp-mvar :constant
+                                       (comp-func-int-spec f))
+                       ;; This is the compilation unit it-self passed as
+                       ;; parameter.
+                       (make-comp-mvar :slot 0))))))
 
 (cl-defmethod comp-emit-for-top-level ((form byte-to-native-top-level)
                                        for-late-load)
@@ -1558,7 +1560,12 @@ into the C code forwarding the compilation unit."
                                              "late_top_level_run"
                                            "top_level_run")
                                  :args (make-comp-args :min 1 :max 1)
-                                 :frame-size 1
+                                 ;; Frame is 2 wide: Slot 0 is the
+                                 ;; compilation unit being loaded
+                                 ;; (incoming parameter).  Slot 1 is
+                                 ;; the last function being
+                                 ;; registered.
+                                 :frame-size 2
                                  :speed comp-speed))
          (comp-func func)
          (comp-pass (make-comp-limplify
@@ -1575,7 +1582,7 @@ into the C code forwarding the compilation unit."
              (comp-ctxt-byte-func-to-func-h comp-ctxt))
     (mapc (lambda (x) (comp-emit-for-top-level x for-late-load))
           (comp-ctxt-top-level-forms comp-ctxt))
-    (comp-emit `(return ,(make-comp-mvar :constant t)))
+    (comp-emit `(return ,(make-comp-mvar :slot 1)))
     (puthash 0 (comp-func-frame-size func) (comp-func-array-h func))
     (comp-limplify-finalize-function func)))
 
diff --git a/src/comp.c b/src/comp.c
index 0b5a49f..f80172e 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -4768,10 +4768,11 @@ unset_cu_load_ongoing (Lisp_Object comp_u)
   XNATIVE_COMP_UNIT (comp_u)->load_ongoing = false;
 }
 
-void
+Lisp_Object
 load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
                bool late_load)
 {
+  Lisp_Object res = Qnil;
   dynlib_handle_ptr handle = comp_u->handle;
   Lisp_Object comp_u_lisp_obj;
   XSETNATIVE_COMP_UNIT (comp_u_lisp_obj, comp_u);
@@ -4897,7 +4898,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, 
bool loading_dump,
        }
       /* Executing this will perform all the expected environment
         modifications.  */
-      top_level_run (comp_u_lisp_obj);
+      res = top_level_run (comp_u_lisp_obj);
       /* Make sure data_ephemeral_vec still exists after top_level_run has run.
         Guard against sibling call optimization (or any other).  */
       data_ephemeral_vec = data_ephemeral_vec;
@@ -4910,7 +4911,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, 
bool loading_dump,
 
   register_native_comp_unit (comp_u_lisp_obj);
 
-  return;
+  return res;
 }
 
 Lisp_Object
@@ -5090,9 +5091,7 @@ DEFUN ("native-elisp-load", Fnative_elisp_load, 
Snative_elisp_load, 1, 2, 0,
   comp_u->data_vec = Qnil;
   comp_u->lambda_gc_guard_h = CALLN (Fmake_hash_table, QCtest, Qeq);
   comp_u->lambda_c_name_idx_h = CALLN (Fmake_hash_table, QCtest, Qequal);
-  load_comp_unit (comp_u, false, !NILP (late_load));
-
-  return Qt;
+  return load_comp_unit (comp_u, false, !NILP (late_load));
 }
 
 #endif /* HAVE_NATIVE_COMP */
diff --git a/src/comp.h b/src/comp.h
index 5c7bed6..077250e 100644
--- a/src/comp.h
+++ b/src/comp.h
@@ -75,8 +75,8 @@ XNATIVE_COMP_UNIT (Lisp_Object a)
 
 extern void hash_native_abi (void);
 
-extern void load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u,
-                           bool loading_dump, bool late_load);
+extern Lisp_Object load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u,
+                                  bool loading_dump, bool late_load);
 
 extern Lisp_Object native_function_doc (Lisp_Object function);
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]