]> git.eshelyaron.com Git - emacs.git/commitdiff
add comp-emit-narg-prologue
authorAndrea Corallo <andrea_corallo@yahoo.it>
Sun, 11 Aug 2019 14:44:12 +0000 (16:44 +0200)
committerAndrea Corallo <akrl@sdf.org>
Wed, 1 Jan 2020 10:33:59 +0000 (11:33 +0100)
lisp/emacs-lisp/comp.el

index 3ce35983828b5b048874bb1f79a39986009b6ef8..0a8ab551ebf49fa30830c18fd730765ff846a23a 100644 (file)
@@ -701,6 +701,29 @@ the annotation emission."
        (comp-stack-adjust (- arg))
        (comp-copy-slot (+ arg (comp-sp)))))))
 
+(defun comp-emit-narg-prologue (args-min non-rest)
+  "Emit the prologue for a narg function."
+  (cl-loop for i below args-min
+           do (progn
+                (comp-emit `(set-args-to-local ,i))
+                (comp-emit '(inc-args))))
+  (cl-loop for i from args-min below non-rest
+           for bb = (intern (format "entry_%s" i))
+           for fallback = (intern (format "entry_fallback_%s" i))
+           do (progn
+                (comp-emit `(cond-jump-narg-leq ,i ,bb ,fallback))
+                (comp-mark-block-closed)
+                (comp-emit-block bb)
+                (comp-emit `(set-args-to-local ,i))
+                (comp-emit '(inc-args)))
+           finally (comp-emit-jump 'entry_rest_args))
+  (cl-loop for i from args-min below non-rest
+           do (comp-with-sp i
+                (comp-emit-block (intern (format "entry_fallback_%s" i)))
+                (comp-emit-set-const nil)))
+  (comp-emit-block 'entry_rest_args)
+  (comp-emit `(set-rest-args-to-local ,non-rest)))
+
 (defun comp-limplify (func)
   "Given FUNC compute its LIMPLE ir."
   (let* ((frame-size (comp-func-frame-size func))
@@ -720,7 +743,7 @@ the annotation emission."
                do (cl-incf (comp-sp))
                do (comp-emit `(setpar ,(comp-slot) ,i)))
       (let ((nonrest (comp-nargs-nonrest args)))
-        (comp-emit `(ncall-prolog ,nonrest))
+        (comp-emit-narg-prologue args-min nonrest)
         (cl-incf (comp-sp) (1+ nonrest))))
     ;; Body
     (comp-emit-block 'bb_1)