diff options
author | Andrea Corallo <akrl@sdf.org> | 2020-06-30 19:10:19 +0200 |
---|---|---|
committer | Andrea Corallo <akrl@sdf.org> | 2020-06-30 21:30:35 +0200 |
commit | 4681f330714b1ac1114f79d6bd2ac33150e1fcc4 (patch) | |
tree | f011c3aff1a898bd25d39d9a1d6e111179fe96f9 /lisp/emacs-lisp/comp.el | |
parent | d3ac3534b45f50769d866c25e795d4ca20572a18 (diff) | |
download | emacs-4681f330714b1ac1114f79d6bd2ac33150e1fcc4.tar.gz emacs-4681f330714b1ac1114f79d6bd2ac33150e1fcc4.tar.bz2 emacs-4681f330714b1ac1114f79d6bd2ac33150e1fcc4.zip |
Fix lambda-list relocation class
Lambda-lists must stay in the same relocation class of the object
referenced by code to respect uninterned symbols.
* lisp/emacs-lisp/comp.el (comp-prepare-args-for-top-level): Break
the original function in a generic specializing for
dynamic/lexical functions. When allocating the lambda-list for
dynamic functions do that in the default relocation class.
(comp-emit-for-top-level): Make use of the new
`comp-prepare-args-for-top-level'.
(comp-emit-lambda-for-top-level): Likewise.
Diffstat (limited to 'lisp/emacs-lisp/comp.el')
-rw-r--r-- | lisp/emacs-lisp/comp.el | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index cde9899d26c..39b47f079e2 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -1365,16 +1365,25 @@ the annotation emission." (comp-log-func func 2) func) -(defun comp-prepare-args-for-top-level (function) - "Given FUNCTION return the two args arguments for comp--register-..." - (if (comp-func-l-p function) - (let ((args (comp-func-l-args function))) - (cons (comp-args-base-min args) - (if (comp-args-p args) - (comp-args-max args) - 'many))) - (cons (func-arity (comp-func-byte-func function)) - (comp-func-d-lambda-list function)))) +(cl-defgeneric comp-prepare-args-for-top-level (function) + "Given FUNCTION return the two args arguments for comp--register-...") + +(cl-defmethod comp-prepare-args-for-top-level ((function comp-func-l)) + "Lexical scoped FUNCTION." + (let ((args (comp-func-l-args function))) + (cons (make-comp-mvar :constant (comp-args-base-min args)) + (make-comp-mvar :constant (if (comp-args-p args) + (comp-args-max args) + 'many))))) + +(cl-defmethod comp-prepare-args-for-top-level ((function comp-func-d)) + "Dynamic scoped FUNCTION." + (cons (make-comp-mvar :constant (func-arity (comp-func-byte-func function))) + (let ((comp-curr-allocation-class 'd-default)) + ;; Lambda-lists must stay in the same relocation class of + ;; the object referenced by code to respect uninterned + ;; symbols. + (make-comp-mvar :constant (comp-func-d-lambda-list function))))) (cl-defgeneric comp-emit-for-top-level (form for-late-load) "Emit the limple code for top level FORM.") @@ -1390,8 +1399,8 @@ the annotation emission." 'comp--late-register-subr 'comp--register-subr) (make-comp-mvar :constant name) - (make-comp-mvar :constant (car args)) - (make-comp-mvar :constant (cdr args)) + (car args) + (cdr args) (make-comp-mvar :constant c-name) (make-comp-mvar :constant @@ -1431,8 +1440,8 @@ These are stored in the reloc data array." (puthash (comp-func-byte-func func) (make-comp-mvar :constant nil) (comp-ctxt-lambda-fixups-h comp-ctxt))) - (make-comp-mvar :constant (car args)) - (make-comp-mvar :constant (cdr args)) + (car args) + (cdr args) (make-comp-mvar :constant (comp-func-c-name func)) (make-comp-mvar :constant (let* ((h (comp-ctxt-function-docs comp-ctxt)) |