[movitz-cvs] CVS update: movitz/storage-types.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Mon May 24 14:58:22 UTC 2004


Update of /project/movitz/cvsroot/movitz
In directory common-lisp.net:/tmp/cvs-serv22002

Modified Files:
	storage-types.lisp 
Log Message:
Starting to add some bignum support.

Date: Mon May 24 10:58:22 2004
Author: ffjeld

Index: movitz/storage-types.lisp
diff -u movitz/storage-types.lisp:1.17 movitz/storage-types.lisp:1.18
--- movitz/storage-types.lisp:1.17	Fri May 21 05:39:30 2004
+++ movitz/storage-types.lisp	Mon May 24 10:58:22 2004
@@ -9,7 +9,7 @@
 ;;;; Created at:    Sun Oct 22 00:22:43 2000
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: storage-types.lisp,v 1.17 2004/05/21 09:39:30 ffjeld Exp $
+;;;; $Id: storage-types.lisp,v 1.18 2004/05/24 14:58:22 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -74,6 +74,7 @@
   :run-time-context #x50
   :illegal #x13
   :infant-object #x23
+  :bignum #x4a
 
   ;; :simple-vector #x20
   ;; :character-vector 
@@ -84,8 +85,9 @@
 (defconstant +fixnum-tags+ '(:even-fixnum :odd-fixnum))
 (defparameter +scan-skip-word+ #x00000003)
 
-(defun tag (type)
-  (bt:enum-value 'other-type-byte type))
+(defun tag (type &optional (wide-tag 0))
+  (logior (bt:enum-value 'other-type-byte type)
+	  (ash wide-tag 8)))
 
 (defun tag-name (number)
   (bt:enum-symbolic-value 'other-type-byte number))
@@ -1289,3 +1291,42 @@
 	       :stream stream))))
   object)
 
+;;;;
+
+(define-binary-class movitz-bignum (movitz-heap-object-other)
+  ((type
+    :binary-type other-type-byte
+    :initform :bignum)
+   (sign
+    :binary-type u8
+    :initarg :sign
+    :accessor movitz-bignum-sign)
+   (length
+    :binary-type lu16
+    :initarg :length
+    :accessor movitz-bignum-length)
+   (bigit0 :binary-type :label)
+   (value
+    :initarg :value
+    :accessor movitz-bignum-value))
+  (:slot-align type #.+other-type-offset+))
+
+(defmethod write-binary-record ((obj movitz-bignum) stream)
+  (let* ((num (movitz-bignum-value obj))
+	 (length (ceiling (integer-length (abs num)) 32)))
+    (check-type length (unsigned-byte 16))
+    (setf (movitz-bignum-length obj) length
+	  (movitz-bignum-sign obj) (if (minusp num) #xff #x00))
+    (+ (call-next-method)		; header
+       (loop for b from 0 below length
+	   summing (write-binary 'lu32 stream (ldb (byte 32 (* b 32)) (abs num)))))))
+
+(defun make-movitz-integer (value)
+  (if (<= +movitz-most-negative-fixnum+ value +movitz-most-positive-fixnum+)
+      (make-movitz-fixnum value)
+    (make-instance 'movitz-bignum
+      :value value)))
+
+(defmethod sizeof ((obj movitz-bignum))
+  (+ (sizeof 'movitz-bignum)
+     (* 4 (ceiling (integer-length (abs (movitz-bignum-value obj))) 32))))





More information about the Movitz-cvs mailing list