From eeb1ab5c2d3577c5b7c37fbda97a29b90f747fcb Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 4 Feb 2017 21:00:13 +0300 Subject: [PATCH] Add MAKE-DUMMY-FDEFN function. To be used by undefined-fun-error restarts, since the old MAKE-FDEFN VOP is unavailable on #+immobile-space. --- package-data-list.lisp-expr | 1 + src/code/fdefinition.lisp | 5 +++++ src/compiler/generic/vm-fndb.lisp | 1 + src/compiler/x86-64/alloc.lisp | 10 ++++++++++ 4 files changed, 17 insertions(+) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 3f317db4d..555577d1b 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -2031,6 +2031,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries." "%FUN-NAME" "FDEFN" "MAKE-FDEFN" "FDEFN-P" "FDEFN-NAME" "FDEFN-FUN" + "MAKE-DUMMY-FDEFN" "FDEFN-MAKUNBOUND" "%COERCE-CALLABLE-TO-FUN" "FUN-SUBTYPE" "*MAXIMUM-ERROR-DEPTH*" "%SET-SYMBOL-PLIST" diff --git a/src/code/fdefinition.lisp b/src/code/fdefinition.lisp index c7f9cbe35..1060aa352 100644 --- a/src/code/fdefinition.lisp +++ b/src/code/fdefinition.lisp @@ -18,6 +18,11 @@ ;;;; fdefinition (fdefn) objects +;;; This is used for undefined-fun-error restarts +(defun make-dummy-fdefn () + #!-immobile-space (make-fdefn nil) + #!+immobile-space (make-dummy-fdefn)) + (defun make-fdefn (name) #!-immobile-space (make-fdefn name) ;; This is %primitive because it needs pseudo-atomic, diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index c203db7f7..751aa6ba2 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -430,6 +430,7 @@ (flushable)) (defknown make-fdefn (t) fdefn (flushable movable)) +(defknown make-dummy-fdefn () fdefn (flushable movable)) (defknown fdefn-p (t) boolean (movable foldable flushable)) (defknown fdefn-name (fdefn) t (foldable flushable)) (defknown fdefn-fun (fdefn) (or function null) (flushable)) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index 0f443d96f..77eee16b8 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -280,6 +280,16 @@ (storew nil-value result fdefn-fun-slot other-pointer-lowtag) (storew (make-fixup 'undefined-tramp :assembly-routine) result fdefn-raw-addr-slot other-pointer-lowtag)))) +#!+immobile-space +(define-vop (make-dummy-fdefn) + (:policy :fast-safe) + (:translate make-dummy-fdefn) + (:results (result :scs (descriptor-reg))) + (:node-var node) + (:generator 37 + (with-fixed-allocation (result fdefn-widetag fdefn-size node) + (storew nil-value result fdefn-name-slot other-pointer-lowtag) + (storew nil-value result fdefn-fun-slot other-pointer-lowtag)))) (define-vop (make-closure) (:args (function :to :save :scs (descriptor-reg))) -- 2.11.4.GIT