]> git.eshelyaron.com Git - emacs.git/commitdiff
fix native call to MANY func
authorAndrea Corallo <andrea_corallo@yahoo.it>
Sun, 30 Jun 2019 18:53:59 +0000 (20:53 +0200)
committerAndrea Corallo <akrl@sdf.org>
Wed, 1 Jan 2020 10:33:48 +0000 (11:33 +0100)
src/comp.c
test/src/comp-tests.el

index 3cd1c3c8dbb29bb4aff9783e6def7884b58df3f6..d86bd1eb0c1d77d6aa121966a1a91e8841056856 100644 (file)
@@ -2286,7 +2286,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name,
            if (stack->const_set &&
                stack->type == Lisp_Symbol)
              {
-               ptrdiff_t native_nargs = nargs - 1;
+               ptrdiff_t native_nargs = op;
                char *sym_name = (char *) SDATA (SYMBOL_NAME (stack->constant));
                if (!strcmp (sym_name,
                             lisp_f_name))
@@ -2304,29 +2304,39 @@ compile_f (const char *lisp_f_name, const char *c_f_name,
                                                 sym_name));
                    struct Lisp_Subr *subr =
                      XSUBR ((XSYMBOL (stack->constant)->u.s.function));
-                   gcc_jit_type *types[native_nargs];
-
-                   for (int i = 0; i < native_nargs; i++)
-                     types[i] = comp.lisp_obj_type;
-
-                   gcc_jit_type *fn_ptr_type =
-                     gcc_jit_context_new_function_ptr_type (comp.ctxt,
-                                                            NULL,
-                                                            comp.lisp_obj_type,
-                                                            native_nargs,
-                                                            types,
-                                                            0);
-                   res =
-                     gcc_jit_context_new_call_through_ptr (
-                       comp.ctxt,
-                       NULL,
-                       gcc_jit_context_new_rvalue_from_ptr (comp.ctxt,
-                                                            fn_ptr_type,
-                                                            subr->function.a0),
-                       native_nargs,
-                       args + 1);
+                   if (subr->max_args == MANY)
+                     {
+                       /* FIXME: do we want to optimize this case too?  */
+                       goto dofuncall;
+                     } else
+                     {
+                       gcc_jit_type *types[native_nargs];
+
+                       for (int i = 0; i < native_nargs; i++)
+                         types[i] = comp.lisp_obj_type;
+
+                       gcc_jit_type *fn_ptr_type =
+                         gcc_jit_context_new_function_ptr_type (
+                           comp.ctxt,
+                           NULL,
+                           comp.lisp_obj_type,
+                           native_nargs,
+                           types,
+                           0);
+                       res =
+                         gcc_jit_context_new_call_through_ptr (
+                           comp.ctxt,
+                           NULL,
+                           gcc_jit_context_new_rvalue_from_ptr (
+                             comp.ctxt,
+                             fn_ptr_type,
+                             subr->function.a0),
+                           native_nargs,
+                           args + 1);
+                     }
                  }
              }
+         dofuncall:
            /* Fall back to regular funcall dispatch mechanism. */
            if (!res)
              res = emit_call_n_ref ("Ffuncall", nargs, stack->gcc_lval);
index afb2a663c0be7973bc82eafe2934bd5c42f09c4b..42e10ba511481037e8a121308647f17963f10f97 100644 (file)
   (byte-compile #'comp-tests-ffuncall-native-f)
   (native-compile #'comp-tests-ffuncall-native-f)
 
-  (should (vectorp (comp-tests-ffuncall-native-f))))
+  (should (vectorp (comp-tests-ffuncall-native-f)))
+
+  (defun comp-tests-ffuncall-apply-many-f (x)
+    (apply #'list x))
+
+  (byte-compile #'comp-tests-ffuncall-apply-many-f)
+  (native-compile #'comp-tests-ffuncall-apply-many-f)
+
+  (should (equal (comp-tests-ffuncall-apply-many-f '(1 2 3)) '(1 2 3))))
 
 (ert-deftest  comp-tests-conditionals ()
   "Testing conditionals."