diff --git a/makefiles/Mf-install.in b/makefiles/Mf-install.in index 17489555e1..bc93bee18a 100644 --- a/makefiles/Mf-install.in +++ b/makefiles/Mf-install.in @@ -62,7 +62,7 @@ InstallLZ4Target= # no changes should be needed below this point # ############################################################################### -Version=csv9.5.3.16 +Version=csv9.5.3.17 Include=boot/$m PetiteBoot=boot/$m/petite.boot SchemeBoot=boot/$m/scheme.boot diff --git a/s/cmacros.ss b/s/cmacros.ss index a3846d7a64..73d7fad1ea 100644 --- a/s/cmacros.ss +++ b/s/cmacros.ss @@ -328,7 +328,7 @@ [(_ foo e1 e2) e1] ... [(_ bar e1 e2) e2]))))]))) -(define-constant scheme-version #x09050310) +(define-constant scheme-version #x09050311) (define-syntax define-machine-types (lambda (x) diff --git a/s/cpnanopass.ss b/s/cpnanopass.ss index b2dffae410..386ab39fb9 100644 --- a/s/cpnanopass.ss +++ b/s/cpnanopass.ss @@ -9716,6 +9716,11 @@ [else #f])]) (define-inline 2 $sealed-record? [(e e-rtd) (build-sealed-isa? e e-rtd)]) + (define-inline 3 $record-type-field-count + [(e) (%inline srl ,(%inline - ,(%mref ,e ,(constant record-type-size-disp)) + (immediate ,(fxsll (fx- (constant record-data-disp) (constant record-type-disp)) + (constant fixnum-offset)))) + ,(%constant log2-ptr-bytes))]) (define-inline 2 eq-hashtable? [(e) (let ([rtd (let () (include "hashtable-types.ss") (record-type-descriptor eq-ht))]) (let ([e-rtd `(quote ,rtd)]) diff --git a/s/primdata.ss b/s/primdata.ss index bc41a5e55a..0fda26e60b 100644 --- a/s/primdata.ss +++ b/s/primdata.ss @@ -2236,6 +2236,7 @@ ($record-set! [sig [(ptr sub-index ptr) -> (void)]] [flags true]) ($record-type-descriptor [flags single-valued pure mifoldable discard true]) ($record-type-field-offsets [flags single-valued pure mifoldable discard true]) + ($record-type-field-count [sig [(ptr) -> (fixnum)]] [flags single-valued pure mifoldable discard true]) ($reloc [flags single-valued]) ($remake-rtd [flags single-valued]) ($report-string [flags single-valued]) diff --git a/s/prims.ss b/s/prims.ss index 82c2f55fda..8e528c88f0 100644 --- a/s/prims.ss +++ b/s/prims.ss @@ -2054,6 +2054,12 @@ (unless ($record? r) ($oops who "~s is not a record" r)) (#3%$record-type-descriptor r)) +;; Assumes that the record that has only pointer fields: +(define-who ($record-type-field-count rtd) + (unless (record-type-descriptor? rtd) + ($oops who "~s is not a record type descriptor" rtd)) + ($record-type-field-count rtd)) + (define-who utf8->string (let () (define slurp