data.scm 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Mike Sperber, Marcus Crestani
  3. ; Scheme 48's data representations, for writing heap images.
  4. ; Defines things needed by TRANSPORT (which is called by WRITE-IMAGE, which
  5. ; is called by the static linker).
  6. ; Adapted from vm/util/vm-utilities.scm and vm/data/data.scm.
  7. (define (low-bits n k)
  8. (bitwise-and n (- (arithmetic-shift 1 k) 1)))
  9. (define (high-bits n k)
  10. (arithmetic-shift n (- 0 k)))
  11. (define (adjoin-bits high low width)
  12. (bitwise-ior (arithmetic-shift high width) low))
  13. ; Data descriptions copied from DATA.SCM
  14. (define-enumeration tag
  15. (fixnum
  16. immediate
  17. header
  18. stob))
  19. (define-enumeration imm
  20. (false ; #f
  21. true ; #t
  22. char
  23. unspecific
  24. undefined
  25. eof
  26. null))
  27. (define bits-per-fixnum
  28. (- (if (< bits-per-cell s48-useful-bits-per-word)
  29. bits-per-cell
  30. s48-useful-bits-per-word)
  31. tag-field-width))
  32. (define least-fixnum-value (- 0 (arithmetic-shift 1 (- bits-per-fixnum 1))))
  33. (define greatest-fixnum-value (- (arithmetic-shift 1 (- bits-per-fixnum 1))
  34. 1))
  35. (define (fixnum? x)
  36. (and (integer? x)
  37. (>= x least-fixnum-value)
  38. (<= x greatest-fixnum-value)))
  39. (define (immediate? x)
  40. (or (fixnum? x)
  41. (char? x)
  42. (eq? x #t)
  43. (eq? x '()) ; I think order is important here as () is a literal while
  44. (eq? x #f) ; #F is generated with an instruction. If () = #f then
  45. ; we still lose on something like '(#F) (which is
  46. ; present in the system).
  47. ;; (eq? thing (unspecific))
  48. ))
  49. (define car-offset 0)
  50. (define cdr-offset 1)
  51. (define closure-template-offset 0)
  52. (define closure-env-offset 1)
  53. (define location-id-offset 0)
  54. ; Procedures for manipulating bits
  55. (define (make-descriptor tag data)
  56. (adjoin-bits data tag tag-field-width))
  57. (define (make-immediate type info)
  58. (make-descriptor (enum tag immediate)
  59. (adjoin-bits info type immediate-type-field-width)))
  60. (define vm-true (make-immediate (enum imm true) 0))
  61. (define vm-false (make-immediate (enum imm false) 0))
  62. (define vm-null (make-immediate (enum imm null) 0))
  63. (define vm-unspecific (make-immediate (enum imm unspecific) 0))
  64. (define vm-unbound (make-immediate (enum imm undefined) 1))
  65. (define vm-unassigned (make-immediate (enum imm undefined) 2))
  66. (define header-type-field-width (- immediate-type-field-width 1))
  67. (define (make-header type length-in-bytes)
  68. (make-descriptor (enum tag header) (adjoin-bits length-in-bytes
  69. type
  70. (+ 1 header-type-field-width))))
  71. (define (make-header-immutable header)
  72. (bitwise-ior header (arithmetic-shift 1 (+ tag-field-width
  73. header-type-field-width))))
  74. (define (make-stob-descriptor addr)
  75. (bitwise-ior (enum tag stob) addr))
  76. (define (bytes->cells bytes)
  77. (quotient (+ bytes (- bytes-per-cell 1))
  78. bytes-per-cell))
  79. (define (cells->bytes cells)
  80. (* cells bytes-per-cell))
  81. (define (cells->a-units cells)
  82. (adjoin-bits cells 0 unused-field-width))
  83. (define (a-units->cells cells)
  84. (high-bits cells unused-field-width))
  85. (define (bytes->a-units byte-count)
  86. (cells->a-units (bytes->cells byte-count)))
  87. ;; Unicode code points
  88. (define bytes-per-scalar-value-unit 4) ; must be >= 3
  89. (define (bytes->scalar-value-units byte-count)
  90. (quotient byte-count bytes-per-scalar-value-unit))
  91. (define (scalar-value-units->bytes units)
  92. (* units bytes-per-scalar-value-unit))