@@ -11,10 +11,6 @@ import {
1111 MAX_SIZE_32
1212} from "../internal/allocator" ;
1313
14- import {
15- __gc_iterate_roots
16- } from "../builtins" ;
17-
1814// ╒═══════════════ Managed object layout (32-bit) ════════════════╕
1915// 3 2 1
2016// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits
@@ -145,7 +141,7 @@ var set2: ManagedObject;
145141var iter : ManagedObject ;
146142
147143/** Performs a single step according to the current state. */
148- function gc_step ( ) : void {
144+ function step ( ) : void {
149145 var obj : ManagedObject ;
150146 switch ( state ) {
151147 case State . INIT : {
@@ -158,7 +154,7 @@ function gc_step(): void {
158154 }
159155 case State . IDLE : {
160156 // start by marking roots
161- __gc_iterate_roots ( function mark_root ( ref : usize ) : void {
157+ gc . iterateRoots ( function mark_root ( ref : usize ) : void {
162158 if ( ref ) {
163159 let obj = changetype < ManagedObject > ( ref - ManagedObject . SIZE ) ;
164160 obj . makeBlack ( ) ;
@@ -202,42 +198,50 @@ function gc_step(): void {
202198 }
203199}
204200
205- /** Garbage collector interface. */
206- @global
207- export namespace gc {
208-
209- /** Allocates a managed object. */
210- export function alloc (
211- size : usize ,
212- visitFn : ( ref : usize ) => void
213- ) : usize {
214- assert ( size <= MAX_SIZE_32 - ManagedObject . SIZE ) ;
215- var obj = changetype < ManagedObject > ( memory . allocate ( ManagedObject . SIZE + size ) ) ;
216- obj . makeWhite ( ) ;
217- obj . visitFn = visitFn ;
218- set1 . insert ( obj ) ;
219- return changetype < usize > ( obj ) + ManagedObject . SIZE ;
220- }
201+ @inline function refToObj ( ref : usize ) : ManagedObject {
202+ return changetype < ManagedObject > ( ref - ManagedObject . SIZE ) ;
203+ }
221204
222- /** Visits a reachable object. Called from the visitFn functions. */
223- export function visit ( obj : ManagedObject ) : void {
224- if ( state == State . SWEEP ) return ;
225- if ( obj . isWhite ) obj . makeGray ( ) ;
226- }
205+ @inline function objToRef ( obj : ManagedObject ) : usize {
206+ return changetype < usize > ( obj ) + ManagedObject . SIZE ;
207+ }
227208
228- /** References a managed child object from its parent object. */
229- export function ref ( parent : ManagedObject , child : ManagedObject ) : void {
230- if ( parent . isBlack && child . isWhite ) parent . makeGray ( ) ;
231- }
209+ // Garbage collector interface
210+
211+ /** Allocates a managed object. */
212+ @global export function __gc_allocate (
213+ size : usize ,
214+ visitFn : ( ref : usize ) => void
215+ ) : usize {
216+ assert ( size <= MAX_SIZE_32 - ManagedObject . SIZE ) ;
217+ var obj = changetype < ManagedObject > ( memory . allocate ( ManagedObject . SIZE + size ) ) ;
218+ obj . makeWhite ( ) ;
219+ obj . visitFn = visitFn ;
220+ set1 . insert ( obj ) ;
221+ return objToRef ( obj ) ;
222+ }
232223
233- /** Performs a full garbage collection cycle. */
234- export function collect ( ) : void {
235- // begin collecting if not yet collecting
236- switch ( state ) {
237- case State . INIT :
238- case State . IDLE : gc_step ( ) ;
239- }
240- // finish the cycle
241- while ( state != State . IDLE ) gc_step ( ) ;
224+ /** Marks a reachable object. Called from the visitFn functions. */
225+ @global export function __gc_mark ( ref : usize ) : void {
226+ var obj = refToObj ( ref ) ;
227+ if ( state == State . SWEEP ) return ;
228+ if ( obj . isWhite ) obj . makeGray ( ) ;
229+ }
230+
231+ /** Links a managed child object to its parent object. */
232+ @global export function __gc_link ( parentRef : usize , childRef : usize ) : void {
233+ var parent = refToObj ( parentRef ) ;
234+ var child = refToObj ( childRef ) ;
235+ if ( parent . isBlack && child . isWhite ) parent . makeGray ( ) ;
236+ }
237+
238+ /** Performs a full garbage collection cycle. */
239+ @global export function __gc_collect ( ) : void {
240+ // begin collecting if not yet collecting
241+ switch ( state ) {
242+ case State . INIT :
243+ case State . IDLE : step ( ) ;
242244 }
245+ // finish the cycle
246+ while ( state != State . IDLE ) step ( ) ;
243247}
0 commit comments