|
|
|
@ -16,6 +16,8 @@
|
|
|
|
|
call $memory_markBlockSize
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
;; this runs into issue when allocating the final block in memory
|
|
|
|
|
;; our end spot is not aligned with our block size rounding
|
|
|
|
|
(func $memory_alloc (export "alloc") (param $requestedBytes i32) (result i32)
|
|
|
|
|
(local $blockAddr i32)
|
|
|
|
|
local.get $requestedBytes
|
|
|
|
@ -45,6 +47,87 @@
|
|
|
|
|
return
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
(func $memory_free (export "free_block") (param $pointer i32)
|
|
|
|
|
(local $startPointer i32)
|
|
|
|
|
(local $blockSize i32)
|
|
|
|
|
(local $temp i32)
|
|
|
|
|
|
|
|
|
|
;; start with the direct block
|
|
|
|
|
local.get $pointer
|
|
|
|
|
i32.const 4
|
|
|
|
|
i32.sub
|
|
|
|
|
local.tee $startPointer
|
|
|
|
|
call $memory_getUsableSizeOfBlock
|
|
|
|
|
i32.const 8
|
|
|
|
|
i32.add
|
|
|
|
|
local.set $blockSize
|
|
|
|
|
|
|
|
|
|
;; check block before
|
|
|
|
|
local.get $startPointer
|
|
|
|
|
i32.const 4
|
|
|
|
|
i32.sub
|
|
|
|
|
local.tee $temp
|
|
|
|
|
call $memory_isBlockUsed
|
|
|
|
|
i32.eqz
|
|
|
|
|
local.get $temp
|
|
|
|
|
i32.const 4 ;; start of allocateable memory
|
|
|
|
|
i32.ge_u
|
|
|
|
|
i32.and
|
|
|
|
|
|
|
|
|
|
if
|
|
|
|
|
;; update start of block
|
|
|
|
|
local.get $temp
|
|
|
|
|
local.get $temp
|
|
|
|
|
call $memory_getUsableSizeOfBlock
|
|
|
|
|
i32.const 4
|
|
|
|
|
i32.add
|
|
|
|
|
i32.sub
|
|
|
|
|
local.tee $startPointer
|
|
|
|
|
|
|
|
|
|
;; update size
|
|
|
|
|
call $memory_getUsableSizeOfBlock
|
|
|
|
|
local.get $blockSize
|
|
|
|
|
i32.const 8
|
|
|
|
|
i32.add
|
|
|
|
|
i32.add
|
|
|
|
|
local.set $blockSize
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
;; check block after
|
|
|
|
|
local.get $startPointer
|
|
|
|
|
local.get $blockSize
|
|
|
|
|
i32.add
|
|
|
|
|
local.tee $temp
|
|
|
|
|
|
|
|
|
|
memory.size ;; first make sure it's inside memory
|
|
|
|
|
i32.const 16
|
|
|
|
|
i32.shl
|
|
|
|
|
i32.lt_u
|
|
|
|
|
|
|
|
|
|
if
|
|
|
|
|
;; check if not used
|
|
|
|
|
local.get $temp
|
|
|
|
|
call $memory_isBlockUsed
|
|
|
|
|
i32.eqz
|
|
|
|
|
|
|
|
|
|
if
|
|
|
|
|
;; update size
|
|
|
|
|
local.get $temp
|
|
|
|
|
call $memory_getUsableSizeOfBlock
|
|
|
|
|
local.get $blockSize
|
|
|
|
|
i32.const 8
|
|
|
|
|
i32.add
|
|
|
|
|
i32.add
|
|
|
|
|
local.set $blockSize
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
;; re-init block
|
|
|
|
|
local.get $startPointer
|
|
|
|
|
local.get $blockSize
|
|
|
|
|
call $memory_markBlockSize
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
;; returns address of boundary word for first free block
|
|
|
|
|
(func $memory_findFreeBlock (export "findFree") (param $minimumBytes i32) (result i32)
|
|
|
|
|
(local $memorySize i32)
|
|
|
|
|