-*- Mode:TEXT; Package:USER -*- Argument Descriptor Modularizations A Proposal - - - [Proposal #9] Keith M. Corbett Oct. 12, 1988 - - - A. INTRODUCTION Argument descriptors have been implemented on the Lambda in a processor-dependent fashion, and they are used quite widely throughout the system. The following is a proposal for modularizing the implementation, thereby facilitating the Falcon port. I suspect that Lambda argument descriptors are just the tip of this particular iceberg. There are many related parts of the system that use system constants and microcode routines, and they may be handled in a similar fashion. B. BACKGROUND/CURRENT IMPLEMENTATION An argument descriptor is a fixnum which is packed with information describing how a function takes arguments. The most common use is to get the minimum and maximum number of arguments accepted by a function. (Note that the current implementation allows at most 63 function arguments.) ARGS-INFO and %ARGS-INFO are both used in system code both return the numeric argument descriptor for a given function. The LISP version accepts function specs and invokes the microcode "%" version once it has processed its argument. The following table of byte specs and bit field values is taken from the file SYS:COLD;QCOM.LISP, which defines these constants for the processor (they are loaded during the cold system build and are used by microcode routines). Constants with two percent signs prefixed (%%) are byte specifiers for use with, e.g., LDB or DBP (and thus would have to change for the Falcon). Constants with one percent sign prefixed (%) are bit field values for use with, e.g., LOGAND. CONSTANT VALUE (OCTAL) COMMENTS --------------------------------------------------------------------------- %ARG-DESC-QUOTED-REST 10000000 ;has quoted rest argument %%ARG-DESC-QUOTED-REST (BYTE 1. 21.) %ARG-DESC-EVALED-REST 40000000 ;has evaluated rest argument %%ARG-DESC-QUOTED-REST (BYTE 1. 20.) %ARG-DESC-ANY-REST (BYTE 2. 20.) ;has either kind of rest argument %ARG-DESC-FEF-QUOTE-HAIR 20000000 ;compiled fcn with hairy quoting %%ARG-DESC-FEF-QUOTE-HAIR (BYTE 1. 19.) ; must check ADL for full info %ARG-DESC-INTERPRETED 10000000 ;interpreted function, and/or %%ARG-DESC-INTERPRETED (BYTE 1. 18.) ; no information available ; (VALUE = 1000077) *** %ARG-DESC-FEF-BIND-HAIR 40000000 ;compiled function with hairy %ARG-DESC-FEF-BIND-HAIR (BYTE 1. 17.) ; binding, linear enter must check ; ADL %ARG-DESC-MIN-ARGS (BYTE 6. 6.) ;minimum number of required args %ARG-DESC-MAX-ARGS (BYTE 6. 0.) ; maximum number of required + ; optional (all positional, not ; rest) args *** NOTE: Interpreted functions do not necessarily have this value. C. SCOPE/WHERE ARGUMENT DESCRIPTORS ARE USED The modules that utilize argument descriptors include: o Interpreter o Compiler o DESCRIBE (describing functions) o Macro-expansion (AUTOMATIC-DISPLACE) o Debugger / error handler (displaying/modifying frames) o Resources (getting arg-lists of parametizer functions) o Function typing (FUNCTIONP) For my own convenience, I assembled a list of functions and files calling %ARGS-INFO or ARGS-INFO, and collected these definitions (DEFUNs and fragments thereof) into one file. I verified this information by doing a Tags Search on SYSTEM for "%ARG-DESC". D. PORTABILITY RECOMMENDATIONS 1.) Fix QCOM to compute these values via calls to BYTE, if possible. This requires that a d ecision be made how QCOM type definitions (and cold loading generally) will be handled for the Falcon system. 2.) Define WITH-ARGS-INFO (macro) and functions for getting the args-desc elements with a single call to ARGS-INFO. This facility is designed to minimize calls to AREGS-INFO, a goal of the existing implemntation. WITH-ARGS-INFO (MACRO): (FUNC VARLIST &BODY BODY)