package-defs.scm 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  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. ; David Frese, Martin Gasbichler
  4. ; The VM
  5. (define-structure vm vm-interface
  6. (open prescheme ps-receive vm-architecture vm-utilities
  7. external
  8. bignum-low
  9. integer-arithmetic
  10. flonum-arithmetic
  11. data struct stob
  12. text-encodings
  13. interpreter interpreter-internal
  14. stack gc interpreter-gc gc-util
  15. vmio
  16. arithmetic-opcodes
  17. external-opcodes
  18. external-events
  19. shared-bindings shared-bindings-access
  20. symbols
  21. io-opcodes
  22. external-gc-roots
  23. proposal-opcodes
  24. read-image
  25. return-codes
  26. ;; For debugging
  27. memory ;; fetch
  28. )
  29. (files (interp resume)
  30. (interp vm-external)))
  31. ; Byte code architecture.
  32. (define-structure vm-architecture vm-architecture-interface
  33. (open prescheme ps-platform)
  34. (files (interp arch)))
  35. ;----------------------------------------------------------------
  36. ; The interpreter.
  37. (define-structures ((interpreter interpreter-interface)
  38. (interpreter-internal interpreter-internal-interface))
  39. (open prescheme ps-receive vm-utilities vm-architecture enum-case
  40. events
  41. pending-interrupts
  42. memory data stob struct allocation vmio
  43. text-encodings
  44. return-codes
  45. gc-roots gc gc-util
  46. heap stack external external-events
  47. vm-records)
  48. (for-syntax (open scheme destructuring signals))
  49. (files (interp interp)
  50. (interp call)
  51. (interp define-primitive)
  52. (interp prim)
  53. (interp interrupt)
  54. )
  55. ;(optimize auto-integrate)
  56. )
  57. (define-structure pending-interrupts (export pending-interrupts-empty?
  58. pending-interrupts-remove!
  59. pending-interrupts-add!
  60. pending-interrupts-clear!
  61. pending-interrupts-mask
  62. interrupt-bit)
  63. (open prescheme)
  64. (begin
  65. (define *pending-interrupts*) ; bitmask of pending interrupts
  66. (define (pending-interrupts-add! interrupt-bit)
  67. (set! *pending-interrupts*
  68. (bitwise-ior *pending-interrupts* interrupt-bit)))
  69. (define (pending-interrupts-remove! interrupt-bit)
  70. (set! *pending-interrupts*
  71. (bitwise-and *pending-interrupts*
  72. (bitwise-not interrupt-bit))))
  73. (define (pending-interrupts-clear!)
  74. (set! *pending-interrupts* 0))
  75. (define (pending-interrupts-empty?)
  76. (= *pending-interrupts* 0))
  77. (define (pending-interrupts-mask)
  78. *pending-interrupts*)
  79. ; Return a bitmask for INTERRUPT.
  80. (define (interrupt-bit interrupt)
  81. (shift-left 1 interrupt))
  82. ))
  83. ; Assorted additional opcodes
  84. (define-structure arithmetic-opcodes (export)
  85. (open prescheme interpreter-internal
  86. interpreter-gc
  87. data struct
  88. fixnum-arithmetic
  89. vm-architecture
  90. bignum-arithmetic
  91. flonum-arithmetic
  92. integer-arithmetic)
  93. (files (arith integer-op)))
  94. (define-structure external-opcodes external-call-interface
  95. (open prescheme vm-architecture ps-receive
  96. interpreter-internal stack
  97. memory data struct
  98. gc gc-roots gc-util
  99. heap ; S48-GATHER-OBJECTS
  100. string-tables
  101. external
  102. shared-bindings shared-bindings-access)
  103. (files (interp external-call)))
  104. (define-structure external-events external-events-interface
  105. (open prescheme ps-record-types ps-memory
  106. data struct
  107. vm-utilities
  108. shared-bindings)
  109. (files (interp external-event)))
  110. (define-structures ((shared-bindings shared-bindings-interface)
  111. (shared-bindings-access shared-bindings-access-interface))
  112. (open prescheme
  113. vm-architecture data struct
  114. string-tables
  115. gc gc-roots gc-util)
  116. (files (interp shared-binding)))
  117. (define-structure io-opcodes (export message-element) ; for debugging
  118. (open prescheme vm-utilities vm-architecture ps-receive enum-case
  119. interpreter-internal
  120. channel-io vmio
  121. memory data struct
  122. read-image write-image
  123. gc-roots
  124. symbols external-opcodes
  125. stack ;pop
  126. stob ;immutable
  127. text-encodings
  128. vm-records)
  129. (files (interp prim-io)))
  130. (define-structure proposal-opcodes (export initialize-proposals!+gc)
  131. (open prescheme vm-utilities vm-architecture ps-receive
  132. interpreter-internal
  133. memory data struct
  134. gc-util
  135. stob
  136. external ;get-proposal-lock! release-proposal-lock!
  137. gc ;s48-trace-value
  138. gc-roots ;add-gc-root!
  139. vm-records)
  140. (files (interp proposal)))
  141. (define-structures ((stack stack-interface)
  142. (initialize-stack (export initialize-stack+gc)))
  143. (open prescheme vm-utilities ps-receive ps-memory
  144. vm-architecture memory data stob struct
  145. return-codes
  146. allocation
  147. gc-roots gc
  148. heap) ; for debugging function STACK-CHECK
  149. ;(optimize auto-integrate)
  150. (files (interp stack)
  151. (interp stack-gc)))
  152. (define-structure vmio vmio-interface
  153. (open prescheme ps-receive channel-io vm-utilities
  154. data stob struct allocation memory
  155. pending-interrupts
  156. vm-architecture) ;port-status
  157. ;(optimize auto-integrate)
  158. (files (interp vmio)))
  159. ; The VM needs return pointers for a few special continuations (bottom-of-stack,
  160. ; exceptions frame, and interrupt frames). These have to have the correct data
  161. ; format.
  162. (define-structure return-codes (export make-return-code
  163. s48-make-blank-return-code
  164. return-code-size
  165. return-code-pc)
  166. (open prescheme vm-architecture struct)
  167. (begin
  168. (define return-code-pc 13)
  169. ;; Number of entries of the code vector
  170. (define blank-return-code-count 15)
  171. (define (make-return-code-count opcode-count)
  172. (+ blank-return-code-count opcode-count))
  173. (define first-opcode-index 15)
  174. ;; value for VM
  175. (define return-code-count (make-return-code-count 1))
  176. ;; Size in bytes of the return code frame
  177. (define (make-return-code-size return-code-count)
  178. (code-vector-size return-code-count))
  179. ;; value for VM
  180. (define return-code-size (make-return-code-size return-code-count))
  181. ;; procedure for VM
  182. (define (make-return-code protocol template opcode frame-size key)
  183. (let ((blank-return-code (make-blank-return-code protocol template frame-size 1 key)))
  184. (code-vector-set! blank-return-code first-opcode-index opcode)
  185. blank-return-code))
  186. (define (make-blank-return-code protocol template frame-size opcode-count key)
  187. (let ((code (make-code-vector (make-return-code-count opcode-count) key)))
  188. ; A whole lot of stuff to make the GC and disassembler happy.
  189. (code-vector-set! code 0 (enum op protocol))
  190. (code-vector-set! code 1 protocol)
  191. (code-vector-set! code 2 #b00) ; no env or template - for disassembler
  192. (code-vector-set! code 3 (enum op cont-data)) ; - etc.
  193. (code-vector-set! code 4 0) ; high byte of size
  194. (code-vector-set! code 5 8) ; low byte of size
  195. ; no mask
  196. (code-vector-set! code 6 (high-byte template))
  197. (code-vector-set! code 7 (low-byte template))
  198. (code-vector-set! code 8 0) ; high byte of offset
  199. (code-vector-set! code 9 return-code-pc); low byte of offset
  200. (code-vector-set! code 10 0) ; GC mask size
  201. (code-vector-set! code 11 (high-byte frame-size))
  202. (code-vector-set! code 12 (low-byte frame-size))
  203. (code-vector-set! code 13 (enum op protocol))
  204. (code-vector-set! code 14 protocol)
  205. code))
  206. (define (s48-make-blank-return-code protocol template frame-size opcode-count)
  207. (make-blank-return-code protocol
  208. template
  209. frame-size
  210. opcode-count
  211. (ensure-space (make-return-code-size
  212. (make-return-code-count opcode-count)))))
  213. (define (high-byte n)
  214. (low-byte (arithmetic-shift-right n 8)))
  215. (define (low-byte n)
  216. (bitwise-and n #xFF))))
  217. ;----------------------------------------------------------------
  218. ; GC and allocation utilities for the interpreter.
  219. (define-structures ((interpreter-gc interpreter-gc-interface)
  220. (gc-roots gc-roots-interface))
  221. (open prescheme)
  222. (begin
  223. ; GC-ROOT and POST-GC-CLEANUP are defined incrementally.
  224. ;
  225. ; (ADD-GC-ROOT! <thunk>) ; call <thunk> when tracing the GC roots
  226. ; (ADD-POST-GC-CLEANUP! <thunk>) ; call <thunk> when a GC has finished
  227. ;
  228. ; (S48-GC-ROOT) ; call all the root thunks
  229. ; (S48-POST-GC-CLEANUP) ; call all the cleanup thunks
  230. (define-syntax define-extensible-proc
  231. (syntax-rules ()
  232. ((define-extensible-proc (proc arg ...) body-form extender temp)
  233. (begin
  234. (define (temp arg ...)
  235. body-form
  236. (unspecific))
  237. (define (proc arg ...) (temp arg ...))
  238. (define (extender more)
  239. (let ((old temp))
  240. (set! temp (lambda (arg ...)
  241. (more arg ...)
  242. (old arg ...)))))))))
  243. (define-extensible-proc (s48-gc-root)
  244. (unspecific)
  245. add-gc-root!
  246. *gc-root-proc*)
  247. (define-extensible-proc (s48-post-gc-cleanup major? in-trouble?)
  248. (begin
  249. (eq? major? #t)
  250. (eq? in-trouble? #t)) ; for the type checker
  251. add-post-gc-cleanup!
  252. *post-gc-cleanup*)))
  253. (define-structure gc-util gc-util-interface
  254. (open prescheme data gc gc-roots)
  255. (begin
  256. (define *temp0* false)
  257. (define *temp1* false)
  258. (add-gc-root! (lambda ()
  259. (set! *temp0* (s48-trace-value *temp0*))
  260. (set! *temp1* (s48-trace-value *temp1*))))
  261. (define (save-temp0! value)
  262. (set! *temp0* value))
  263. (define (recover-temp0!)
  264. (let ((value *temp0*))
  265. (set! *temp0* false)
  266. value))
  267. (define (save-temp1! value)
  268. (set! *temp1* value))
  269. (define (recover-temp1!)
  270. (let ((value *temp1*))
  271. (set! *temp1* false)
  272. value))))
  273. ; Registering and tracing external GC roots.
  274. (define-structure external-gc-roots external-gc-roots-interface
  275. (open prescheme ps-memory
  276. memory data
  277. gc gc-roots
  278. (subset external (trace-external-calls)))
  279. (files (heap gc-root)))
  280. ;----------------------------------------------------------------
  281. ; Data structures
  282. (define-structure data vm-data-interface
  283. (open prescheme ps-unsigned-integers vm-utilities
  284. ps-platform vm-architecture)
  285. ;(optimize auto-integrate)
  286. (files (data data)))
  287. (define-structure memory memory-interface
  288. (open prescheme ps-memory vm-utilities data)
  289. ;(optimize auto-integrate)
  290. (files (data memory)))
  291. (define-structure stob stob-interface
  292. (open prescheme ps-receive vm-utilities vm-architecture
  293. memory heap data allocation debugging)
  294. ;(optimize auto-integrate)
  295. (files (data stob)))
  296. (define-structure struct struct-interface
  297. (open prescheme vm-utilities
  298. vm-architecture memory data stob allocation)
  299. (for-syntax (open scheme vm-architecture destructuring))
  300. ;(optimize auto-integrate)
  301. (files (data defdata)
  302. (data struct)))
  303. (define-structure vm-records vm-records-interface
  304. (open prescheme
  305. struct
  306. data)
  307. (files (data record)))
  308. (define-structure string-tables string-table-interface
  309. (open prescheme vm-utilities vm-architecture
  310. data struct stob
  311. ps-memory ; address->integer - BIBOP
  312. memory ; address->stob-descriptor - BIBOP
  313. image-table ; image-location-new-descriptor - BIBOP
  314. )
  315. (files (data vm-tables)))
  316. (define-structure symbols (export s48-symbol-table
  317. install-symbols!+gc)
  318. (open prescheme vm-utilities vm-architecture
  319. interpreter-internal
  320. memory heap data struct string-tables
  321. gc gc-roots)
  322. (files (data symbol)))
  323. (define-structure text-encodings text-encodings-interface
  324. (open prescheme ps-memory enum-case
  325. (subset vm-architecture (text-encoding-option)))
  326. (files (data text-encoding)))
  327. ;----------------------------------------------------------------
  328. ;; DUMPER
  329. ;----------------------------------------------------------------
  330. ;; Reading and writing images
  331. ;; The new READ-IMAGE uses a helper structure READ-IMAGE-KERNEL
  332. (define-structure read-image read-image-interface
  333. (open prescheme enum-case ps-receive ps-memory
  334. debugging
  335. vm-utilities
  336. (subset vm-architecture (architecture-version))
  337. image-util
  338. read-image-gc-specific
  339. read-image-util
  340. data
  341. (subset memory (fetch))
  342. heap-init
  343. (subset gc (s48-trace-value)))
  344. (files (heap read-image)))
  345. (define-structure read-image-portable read-image-portable-interface
  346. (open prescheme ps-receive enum-case
  347. vm-utilities vm-architecture
  348. memory
  349. data struct
  350. (subset string-tables (relocate-table))
  351. ps-memory ;allocate/deallocate-memory
  352. heap ;s48-heap-size
  353. image-table ;make-table
  354. image-util
  355. heap-init
  356. read-image-util
  357. read-image-util-gc-specific
  358. )
  359. (files (heap read-image-portable)))
  360. (define-structure write-image write-image-interface
  361. (open prescheme ps-receive enum-case
  362. vm-utilities vm-architecture
  363. memory data struct
  364. ps-platform
  365. heap
  366. image-table
  367. image-util
  368. write-image-util
  369. string-tables
  370. symbols ;s48-symbol-table
  371. shared-bindings-access
  372. ps-record-types ;define-record-type
  373. write-image-gc-specific
  374. )
  375. (files (heap write-image)))
  376. (define-structure image-table image-table-interface
  377. (open prescheme ps-memory ps-record-types
  378. vm-utilities)
  379. (files (heap image-table)))
  380. (define-structure image-util image-util-interface
  381. (open prescheme enum-case)
  382. (files (heap image-util)))
  383. (define-structure read-image-util read-image-util-interface
  384. (open prescheme ps-receive
  385. data
  386. memory
  387. (subset ps-memory (read-block address+ address<))
  388. (subset data (bytes->a-units b-vector-header? header-length-in-a-units stob?))
  389. vm-utilities
  390. (subset allocation (s48-allocate-traced+gc))
  391. (subset struct (vm-symbol-next
  392. vm-set-symbol-next!
  393. shared-binding-next
  394. set-shared-binding-next!))
  395. string-tables)
  396. (files (heap read-image-util)))
  397. (define-structure write-image-util write-image-util-interface
  398. (open prescheme ps-memory
  399. (subset memory (address1+)))
  400. (files (heap write-image-util)))
  401. ;----------------------------------------------------------------
  402. ; Arithmetic
  403. (define-structure fixnum-arithmetic fixnum-arithmetic-interface
  404. (open prescheme vm-utilities data
  405. memory) ; bits-per-cell
  406. ;(optimize auto-integrate)
  407. (files (arith arith)))
  408. (define-structure bignum-low bignum-low-interface
  409. (open prescheme
  410. vm-utilities
  411. stob
  412. ps-platform
  413. gc
  414. struct memory
  415. vm-architecture
  416. external
  417. interpreter-gc
  418. data)
  419. (files (arith bignum-low)))
  420. (define-structure bignum-arithmetic bignum-arithmetic-interface
  421. (open prescheme
  422. vm-utilities
  423. external
  424. struct
  425. ps-receive
  426. interpreter-internal
  427. data
  428. gc-util
  429. bignum-low)
  430. (files (arith bignum-arith)))
  431. (define-structure integer-arithmetic integer-arithmetic-interface
  432. (open prescheme ps-unsigned-integers
  433. fixnum-arithmetic
  434. bignum-arithmetic
  435. external
  436. bignum-low
  437. struct
  438. data)
  439. (files (arith integer)))
  440. (define-structure flonum-arithmetic (export flonum-add
  441. flonum-subtract
  442. flonum-multiply
  443. flonum-divide
  444. flonum= flonum< flonum>
  445. flonum<= flonum>=
  446. flonum-rational?)
  447. (open prescheme
  448. ps-memory
  449. ps-flonums
  450. gc-util
  451. data ; false
  452. struct)
  453. (files (arith flonum-arith)))
  454. ;----------------------------------------------------------------
  455. ; Random utility
  456. (define-structure enum-case (export (enum-case :syntax))
  457. (open prescheme)
  458. (begin
  459. (define-syntax enum-case
  460. (syntax-rules (else)
  461. ((enum-case enumeration (x ...) clause ...)
  462. (let ((temp (x ...)))
  463. (enum-case enumeration temp clause ...)))
  464. ((enum-case enumeration value ((name ...) body ...) rest ...)
  465. (if (or (= value (enum enumeration name)) ...)
  466. (begin body ...)
  467. (enum-case enumeration value rest ...)))
  468. ((enum-case enumeration value (else body ...))
  469. (begin body ...))
  470. ((enum-case enumeration value)
  471. (unspecific))))))
  472. ; Memory management
  473. ;
  474. ; These are dummies to avoid warnings during compilation.
  475. ; The real modules are in each GC subdirectory (gc-twospace and gc-bibop)
  476. ; and will be loaded after this file.
  477. ;----------------------------------------------------------------
  478. (define-structures ((heap heap-interface)
  479. (heap-gc-util heap-gc-util-interface)
  480. (heap-init heap-init-interface)
  481. (gc gc-interface)
  482. (allocation allocation-interface)
  483. (read-image-gc-specific read-image-gc-specific-interface)
  484. (read-image-util-gc-specific read-image-util-gc-specific-interface)
  485. (write-image-gc-specific write-image-gc-specific-interface))
  486. (open)
  487. (files))
  488. ;; JUST FOR DEBUGGING:
  489. ;; To activate/deactivate it, the flag 'debug-mode?' must be set in
  490. ;; debugging.scm
  491. (define-structure debugging debugging-interface
  492. (open prescheme vm-utilities)
  493. (files debugging))