Comp fix calls to redefined primtives with op-bytecode (bug#61917)

* lisp/emacs-lisp/comp.el (comp-emit-set-call-subr): Fix compilation
of calls to redefined primtives with dedicated op-bytecode.
* test/src/comp-tests.el (61917-1): New test.
This commit is contained in:
Andrea Corallo 2023-03-20 17:24:48 +01:00
parent 6bf441ff11
commit 263d6c3853
2 changed files with 32 additions and 11 deletions

View file

@ -1773,17 +1773,25 @@ SP-DELTA is the stack adjustment."
(maxarg (cdr arity)))
(when (eq maxarg 'unevalled)
(signal 'native-ice (list "subr contains unevalled args" subr-name)))
(if (eq maxarg 'many)
;; callref case.
(comp-emit-set-call (comp-callref subr-name nargs (comp-sp)))
;; Normal call.
(unless (and (>= maxarg nargs) (<= minarg nargs))
(signal 'native-ice
(list "incoherent stack adjustment" nargs maxarg minarg)))
(let* ((subr-name subr-name)
(slots (cl-loop for i from 0 below maxarg
collect (comp-slot-n (+ i (comp-sp))))))
(comp-emit-set-call (apply #'comp-call (cons subr-name slots))))))))
(if (not (subrp subr-name))
;; The primitive got redefined before the compiler is
;; invoked! (bug#61917)
(comp-emit-set-call `(callref funcall
,(make-comp-mvar :constant subr-name)
,@(cl-loop repeat nargs
for sp from (comp-sp)
collect (comp-slot-n sp))))
(if (eq maxarg 'many)
;; callref case.
(comp-emit-set-call (comp-callref subr-name nargs (comp-sp)))
;; Normal call.
(unless (and (>= maxarg nargs) (<= minarg nargs))
(signal 'native-ice
(list "incoherent stack adjustment" nargs maxarg minarg)))
(let* ((subr-name subr-name)
(slots (cl-loop for i from 0 below maxarg
collect (comp-slot-n (+ i (comp-sp))))))
(comp-emit-set-call (apply #'comp-call (cons subr-name slots)))))))))
(eval-when-compile
(defun comp-op-to-fun (x)

View file

@ -532,6 +532,19 @@ https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-03/msg00914.html."
(should (subr-native-elisp-p
(symbol-function 'comp-test-48029-nonascii-žžž-f))))
(comp-deftest 61917-1 ()
"Verify we can compile calls to redefined primitives with
dedicated byte-op code."
(let ((f (lambda (fn &rest args)
(apply fn args))))
(advice-add #'delete-region :around f)
(unwind-protect
(should (subr-native-elisp-p
(native-compile
'(lambda ()
(delete-region (point-min) (point-max))))))
(advice-remove #'delete-region f))))
;;;;;;;;;;;;;;;;;;;;;
;; Tromey's tests. ;;