X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fgeneric%2Fvm-tran.lisp;h=7c4cc00da832822b447fa959637e725d2d98e50d;hb=5930ee54090c03d242c70716683b12b95d74a089;hp=92dac91f5cd78a8fc6de3b889709e8d8a4df2b4d;hpb=8fb02633217a721b85487531709779f338d02438;p=sbcl.git diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index 92dac91..7c4cc00 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -121,19 +121,29 @@ (*)) index))))) -(deftransform %data-vector-and-index ((array index) - (simple-array t) - * - :important t) +(deftransform %data-vector-and-index ((%array %index) + (simple-array t) + * + :important t) + ;; KLUDGE: why the percent signs? Well, ARRAY and INDEX are + ;; respectively exported from the CL and SB!INT packages, which + ;; means that they're visible to all sorts of things. If the + ;; compiler can prove that the call to ARRAY-HEADER-P, below, either + ;; returns T or NIL, it will delete the irrelevant branch. However, + ;; user code might have got here with a variable named CL:ARRAY, and + ;; quite often compiler code with a variable named SB!INT:INDEX, so + ;; this can generate code deletion notes for innocuous user code: + ;; (DEFUN F (ARRAY I) (DECLARE (SIMPLE-VECTOR ARRAY)) (AREF ARRAY I)) + ;; -- CSR, 2003-04-01 ;; We do this solely for the -OR-GIVE-UP side effect, since we want ;; to know that the type can be figured out in the end before we ;; proceed, but we don't care yet what the type will turn out to be. - (upgraded-element-type-specifier-or-give-up array) + (upgraded-element-type-specifier-or-give-up %array) - '(if (array-header-p array) - (values (%array-data-vector array) index) - (values array index))) + '(if (array-header-p %array) + (values (%array-data-vector %array) %index) + (values %array %index))) ;;; transforms for getting at simple arrays of (UNSIGNED-BYTE N) when (< N 8) ;;;