There is now a single kind of primitive. Both mechanisms have been
authorGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Tue, 17 Nov 1987 20:12:41 +0000 (20:12 +0000)
committerGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Tue, 17 Nov 1987 20:12:41 +0000 (20:12 +0000)
merged.

v7/src/runtime/emacs.scm
v7/src/runtime/error.scm
v7/src/runtime/intrpt.scm
v7/src/runtime/syntax.scm
v7/src/runtime/system.scm
v7/src/runtime/unpars.scm
v7/src/runtime/unsyn.scm
v7/src/runtime/utabs.scm

index cda909e828e345338e1d8a5a2e0a524255b217c1..77ed540e2bb1ae9dc55b7d52937588b664ca34a8 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/emacs.scm,v 13.47 1987/10/09 14:41:00 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/emacs.scm,v 13.48 1987/11/17 20:09:38 jinx Exp $
 ;;;
 ;;;    Copyright (c) 1987 Massachusetts Institute of Technology
 ;;;
        normal-check-and-clean-up-input-channel))
 
 (define under-emacs?
-  (make-primitive-procedure 'UNDER-EMACS?))
+  (make-primitive-procedure 'UNDER-EMACS? 0))
 
 (define (install!)
   ((if (under-emacs?)
index 58b2681871c4aeabf4cb4f26a765da60b6c8b687..aa5c68a66772ca71a2db58d6538abec59a639ec4 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/error.scm,v 13.48 1987/06/11 21:30:21 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/error.scm,v 13.49 1987/11/17 20:09:48 jinx Rel $
 ;;;
 ;;;    Copyright (c) 1987 Massachusetts Institute of Technology
 ;;;
@@ -43,7 +43,7 @@
         (integrate-primitive-procedures set-fixed-objects-vector!))
 \f
 (define error-procedure
-  (make-primitive-procedure 'ERROR-PROCEDURE))
+  (make-primitive-procedure 'ERROR-PROCEDURE 3))
 
 (define (error-from-compiled-code message . irritant-info)
   (error-procedure message
@@ -340,12 +340,12 @@ using the current read-eval-print environment."))
 (define-unbound-variable-error assignment? assignment-name)
 (define-unbound-variable-error combination-operator? combination-operator-name)
 (define-unbound-variable-error
-  (list (make-primitive-procedure 'LEXICAL-REFERENCE)
-       (make-primitive-procedure 'LEXICAL-ASSIGNMENT))
+  (list (make-primitive-procedure 'LEXICAL-REFERENCE 2)
+       (make-primitive-procedure 'LEXICAL-ASSIGNMENT 3))
   combination-second-operand)
 
 (define-unbound-variable-error
-  (list (make-primitive-procedure 'ADD-FLUID-BINDING! true))
+  (list (make-primitive-procedure 'ADD-FLUID-BINDING! 3))
   (lambda (obj)
     (let ((object (combination-second-operand obj)))
       (cond ((variable? object) (variable-name object))
@@ -361,7 +361,7 @@ using the current read-eval-print environment."))
 (define-unassigned-variable-error combination-operator?
   combination-operator-name)
 (define-unassigned-variable-error
-  (list (make-primitive-procedure 'LEXICAL-REFERENCE))
+  (list (make-primitive-procedure 'LEXICAL-REFERENCE 2))
   combination-second-operand)
 
 (define define-bad-frame-error
@@ -421,22 +421,27 @@ using the current read-eval-print environment."))
 \f
 ;;;; Primitive Operator Errors
 
-(define-operation-specific-error 'FASL-FILE-TOO-BIG
-  (list (make-primitive-procedure 'BINARY-FASLOAD))
-  "Not enough room to Fasload"
-  combination-first-operand)
+(let ((fasload (make-primitive-procedure 'BINARY-FASLOAD 1)))
 
-(define-operation-specific-error 'FASL-FILE-BAD-DATA
-  (list (make-primitive-procedure 'BINARY-FASLOAD))
-  "Fasload file would not relocate correctly"
-  combination-first-operand)
+  (define-operation-specific-error 'FASL-FILE-TOO-BIG
+    (list fasload)
+    "FASLOAD: Not enough room"
+    combination-first-operand)
 
-#|
-(define-operation-specific-error 'RAN-OUT-OF-HASH-NUMBERS
-  (list (make-primitive-procedure 'OBJECT-HASH))
-  "Hashed too many objects -- get a wizard"
-  combination-first-operand)
-|#
+  (define-operation-specific-error 'FASL-FILE-BAD-DATA
+    (list fasload)
+    "FASLOAD: Bad binary file"
+    combination-first-operand)
+
+  (define-operation-specific-error 'IO-ERROR
+    (list fasload)
+    "FASLOAD: I/O error"
+    combination-first-operand)
+
+  (define-operation-specific-error 'WRONG-ARITY-PRIMITIVES
+    (list fasload)
+    "FASLOAD: Primitives in binary file have the wrong arity"
+    combination-first-operand))
 
 ;;; This will trap any external-primitive errors that
 ;;; aren't caught by special handlers.
@@ -445,12 +450,12 @@ using the current read-eval-print environment."))
   "Error during External Application")
 
 (define-operation-specific-error 'EXTERNAL-RETURN
-  (list (make-primitive-procedure 'FILE-OPEN-CHANNEL))
+  (list (make-primitive-procedure 'FILE-OPEN-CHANNEL 2))
   "Unable to open file"
   combination-first-operand)
 
 (define-operation-specific-error 'OUT-OF-FILE-HANDLES
-  (list (make-primitive-procedure 'FILE-OPEN-CHANNEL))
+  (list (make-primitive-procedure 'FILE-OPEN-CHANNEL 2))
   "Too many open files"
   combination-first-operand)
 \f
index a414790581897742b2e10437731cba48bfecbd9c..d0bfe35172faca12a2718d42463329a3708c2400 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/intrpt.scm,v 13.44 1987/05/27 14:58:22 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/intrpt.scm,v 13.45 1987/11/17 20:10:00 jinx Exp $
 ;;;
 ;;;    Copyright (c) 1987 Massachusetts Institute of Technology
 ;;;
@@ -46,7 +46,7 @@
 
 (define timer-interrupt
   (let ((setup-timer-interrupt
-        (make-primitive-procedure 'SETUP-TIMER-INTERRUPT true)))
+        (make-primitive-procedure 'SETUP-TIMER-INTERRUPT 2)))
     (named-lambda (timer-interrupt)
       (setup-timer-interrupt '() '())
       (error "Unhandled Timer interrupt received"))))
index 4a0f777173d4c22c9c0ec2ceda6f380fb6cc982d..617ebaab5fc16f85907831c0a9ff5b2110a618ef 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/Attic/syntax.scm,v 13.50 1987/07/07 20:27:14 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/Attic/syntax.scm,v 13.51 1987/11/17 20:11:13 jinx Rel $
 ;;;
 ;;;    Copyright (c) 1987 Massachusetts Institute of Technology
 ;;;
   ;;        ...
   ;;        <body>))
   (let ((with-saved-fluid-bindings
-        (make-primitive-procedure 'WITH-SAVED-FLUID-BINDINGS true)))
+        (make-primitive-procedure 'WITH-SAVED-FLUID-BINDINGS 1)))
     (spread-arguments
      (lambda (bindings . body)
        (syntax-fluid-bindings bindings
               (syntax-error "Binding not a pair" binding)))))))
 
 (set! syntax-FLUID-LET-form-deep
-  (make-fluid-let (make-primitive-procedure 'ADD-FLUID-BINDING! true)
+  (make-fluid-let (make-primitive-procedure 'ADD-FLUID-BINDING! 3)
                  lambda-tag:deep-fluid-let))
 
 (set! syntax-FLUID-LET-form-common-lisp
   ;; This -- groan -- is for Common Lisp support
-  (make-fluid-let (make-primitive-procedure 'MAKE-FLUID-BINDING! true)
+  (make-fluid-let (make-primitive-procedure 'MAKE-FLUID-BINDING! 3)
                  lambda-tag:common-lisp-fluid-let))
 
 ;;; end special FLUID-LETs.
index 33f5130fa400d940345ef24cf28f6426a20ef343..e2e1d20058d087d5b73f4e2ebe8e1afe0d2fede0 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/system.scm,v 13.50 1987/06/05 20:41:54 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/system.scm,v 13.51 1987/11/17 20:11:40 jinx Rel $
 ;;;
 ;;;    Copyright (c) 1987 Massachusetts Institute of Technology
 ;;;
 
 (set! dump-world
   (setup-image
-   (let ((primitive (make-primitive-procedure 'DUMP-WORLD true)))
+   (let ((primitive (make-primitive-procedure 'DUMP-WORLD 1)))
      (lambda (filename after-dumping after-restoring)
        (let ((ie (set-interrupt-enables! interrupt-mask-none)))
         ((if (primitive filename)
index f5a93978fd643b1d68a5e5511a0fabaf7e14f7eb..a23d5b41bec50b8fb43759444954db03a183192a 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/unpars.scm,v 13.52 1987/08/01 09:17:54 jinx Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/unpars.scm,v 13.53 1987/11/17 20:11:54 jinx Rel $
 ;;;
 ;;;    Copyright (c) 1987 Massachusetts Institute of Technology
 ;;;
      (*unparse-object (primitive-procedure-name proc)))))
 
 (define-type 'PRIMITIVE unparse-primitive-procedure)
-(define-type 'PRIMITIVE-EXTERNAL unparse-primitive-procedure)
 
 (define (unparse-compiled-procedure procedure)
   (unparse-with-brackets
index 73657d2ba115bafbf849d8d23c3eda9cc3e45e79..1ebc1e0d1d50ae19dae7ef96f158d745c96db472 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/unsyn.scm,v 13.47 1987/06/02 13:24:17 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/unsyn.scm,v 13.48 1987/11/17 20:12:08 jinx Rel $
 ;;;
 ;;;    Copyright (c) 1987 Massachusetts Institute of Technology
 ;;;
 
 (define unsyntax-deep-FLUID-LET
   (unsyntax-deep-or-common-FLUID-LET
-   'FLUID-LET (make-primitive-procedure 'add-fluid-binding! true)))
+   'FLUID-LET (make-primitive-procedure 'add-fluid-binding! 3)))
 
 (define unsyntax-common-lisp-FLUID-LET
   (unsyntax-deep-or-common-FLUID-LET
-   'FLUID-BIND (make-primitive-procedure 'make-fluid-binding! true)))
+   'FLUID-BIND (make-primitive-procedure 'make-fluid-binding! 3)))
 
 (define (unsyntax-MAKE-ENVIRONMENT names values body)
   `(MAKE-ENVIRONMENT ,@(except-last-pair (unsyntax-sequence body))))
index e41ddf3cbdd570f29abcfc3edf68bf123bf50985..e6511e1e7abf804ad0f1e9ba27f3aa2ed2d41e22 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/utabs.scm,v 13.46 1987/04/29 15:41:59 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/utabs.scm,v 13.47 1987/11/17 20:12:41 jinx Rel $
 ;;;
 ;;;    Copyright (c) 1987 Massachusetts Institute of Technology
 ;;;
@@ -63,8 +63,6 @@
 (define microcode-termination)
 (define microcode-termination-name)
 
-(define number-of-internal-primitive-procedures)
-(define number-of-external-primitive-procedures)
 (define make-primitive-procedure)
 (define primitive-procedure?)
 (define primitive-procedure-name)
 (define :release)
 
 (let-syntax ((define-primitive
-              (macro (name)
-                `(DEFINE ,name ,(make-primitive-procedure name)))))
-  (define-primitive binary-fasload)
-  (define-primitive microcode-identify)
-  (define-primitive microcode-tables-filename)
-  (define-primitive map-machine-address-to-code)
-  (define-primitive map-code-to-machine-address)
-  (define-primitive get-external-counts)
-  (define-primitive get-external-number)
-  (define-primitive get-external-name))
+              (macro (name arity)
+                `(DEFINE ,name ,(make-primitive-procedure name arity)))))
+  (define-primitive binary-fasload 1)
+  (define-primitive microcode-identify 0)
+  (define-primitive microcode-tables-filename 0)
+  (define-primitive map-machine-address-to-code 2)
+  (define-primitive map-code-to-machine-address 2)
+  (define-primitive get-primitive-address 2)
+  (define-primitive get-primitive-name 1)
+  (define-primitive get-primitive-counts 0))
 \f
 ;;;; Fixed Objects Vector
 
     (EXTENDED-PROCEDURE . PROCEDURE)
     (COMPILED-PROCEDURE . PROCEDURE)
     (PRIMITIVE . PRIMITIVE-PROCEDURE)
-    (PRIMITIVE-EXTERNAL . PRIMITIVE-PROCEDURE)
     (LEXPR . LAMBDA)
     (EXTENDED-LAMBDA . LAMBDA)
     (COMBINATION-1 . COMBINATION)
 \f
 ;;;; Microcode Primitives
 
-(define primitives-slot)
 (define primitive-type-code)
-(define external-type-code)
+
+(define renamed-user-primitives
+  '((NOT . NULL?)
+    (FALSE? . NULL?)
+    (FIRST . CAR)
+    (FIRST-TAIL . CDR)
+    (SET-FIRST! . SET-CAR!)
+    (SET-FIRST-TAIL! . SET-CDR!)
+    (VECTOR-SIZE . VECTOR-LENGTH)
+    (STRING-SIZE . VECTOR-8B-SIZE)
+    (&OBJECT-REF . SYSTEM-MEMORY-REF)
+    (&OBJECT-SET! . SYSTEM-MEMORY-SET!)))
 
 (set! primitive-procedure?
 (named-lambda (primitive-procedure? object)
-  (or (primitive-type? primitive-type-code object)
-      (primitive-type? external-type-code object))))
+  (primitive-type? primitive-type-code object)))
 
 (set! make-primitive-procedure
-(named-lambda (make-primitive-procedure name #!optional force?)
-  (let ((code (name->code primitives-slot 'PRIMITIVE name)))
-    (if code
-       (map-code-to-machine-address primitive-type-code code)
-       (or (get-external-number name (if (unassigned? force?) #f force?))
-           (error "MAKE-PRIMITIVE-PROCEDURE: Unknown name" name))))))
+(named-lambda (make-primitive-procedure name #!optional arity)
+  (if (unassigned? arity)
+      (set! arity false))
+  (let* ((name (let ((place (assq name renamed-user-primitives)))
+                (if (not (null? place))
+                    (cdr place)
+                    name)))
+        (result (get-primitive-address name arity)))
+    (cond ((or (primitive-type? primitive-type-code result)
+              (eq? arity true))
+          result)
+         ((false? result)
+          (error "MAKE-PRIMITIVE-PROCEDURE: Unknown name" name))
+         (else
+          (error "MAKE-PRIMITIVE-PROCEDURE: Inconsistent arity"
+                 `(,name new: ,arity old: ,result)))))))
 
 (set! implemented-primitive-procedure?
 (named-lambda (implemented-primitive-procedure? object)
-  (cond ((primitive-type? primitive-type-code object) true)
-       ((primitive-type? external-type-code object)
-        (get-external-number (external-code->name (primitive-datum object))
-                             false))
-       (else
-        (error "Not a primitive procedure" implemented-primitive-procedure?
-               object)))))
+  (if (primitive-type? primitive-type-code object)
+      (get-primitive-address (get-primitive-name (primitive-datum object))
+                            false)
+      (error "Not a primitive procedure" implemented-primitive-procedure?
+            object))))
 
 (set! primitive-procedure-name
 (named-lambda (primitive-procedure-name primitive-procedure)
-  (cond ((primitive-type? primitive-type-code primitive-procedure)
-        (code->name primitives-slot
-                    'PRIMITIVE
-                    (map-machine-address-to-code primitive-type-code
-                                                 primitive-procedure)))
-       ((primitive-type? external-type-code primitive-procedure)
-        (external-code->name (primitive-datum primitive-procedure)))
-       (else
-        (error "Not a primitive procedure" primitive-procedure-name
-               primitive-procedure)))))
+  (if (primitive-type? primitive-type-code primitive-procedure)
+      (get-primitive-name (primitive-datum primitive-procedure))
+      (error "Not a primitive procedure" primitive-procedure-name
+            primitive-procedure))))
 \f
 (define (name->code slot type name)
   (or (and (pair? name)
   (or (and (not (negative? code))
           (microcode-table-ref slot code))
       (list type code)))
-
-(define (external-code->name code)
-  (let ((current-counts (get-external-counts)))
-    (cond ((< code (car current-counts)) (get-external-name code))
-         ((< code (+ (car current-counts) (cdr current-counts)))
-          (get-external-name code))    ;Maybe should warn about undefined
-         (else
-          (error "Not an external procedure name" external-code->name
-                 code)))))
 \f
 ;;;; Initialization
 
   (set! number-of-microcode-errors
        (vector-length (vector-ref fixed-objects errors-slot)))
 
-  (set! primitives-slot
-       (fixed-objects-vector-slot 'MICROCODE-PRIMITIVES-VECTOR))
   (set! primitive-type-code (microcode-type 'PRIMITIVE))
-  (set! number-of-internal-primitive-procedures
-       (vector-length (vector-ref fixed-objects primitives-slot)))
-  (set! number-of-external-primitive-procedures
-       (car (get-external-counts)))
-
-  (set! external-type-code (microcode-type 'PRIMITIVE-EXTERNAL))
 
   (set! termination-vector-slot
        (fixed-objects-vector-slot 'MICROCODE-TERMINATIONS-VECTOR))
 
   ;; Predicate to test if object is a future without touching it.
   (set! future? 
-       (let ((primitive (make-primitive-procedure 'FUTURE? true)))
+       (let ((primitive (make-primitive-procedure 'FUTURE? 1)))
          (if (implemented-primitive-procedure? primitive)
              primitive
              (lambda (object) false)))))