Skip to content

Commit

Permalink
feat: Simplify pointer semantics
Browse files Browse the repository at this point in the history
  • Loading branch information
spotandjake committed Feb 17, 2025
1 parent d6c33a3 commit 844e2dc
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 28 deletions.
2 changes: 1 addition & 1 deletion compiler/test/suites/basic_functionality.re
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,6 @@ describe("basic functionality", ({test, testSkip}) => {
~config_fn=smallestFileConfig,
"smallest_grain_program",
"",
6503,
6494,
);
});
45 changes: 18 additions & 27 deletions stdlib/runtime/gc.gr
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ from "runtime/unsafe/panic" include Panic
from "runtime/unsafe/wasmi32" include WasmI32
use WasmI32.{ (+), (-), (*), (&), (==), (!=) }

primitive (!) = "@not"
primitive (&&) = "@and"
primitive (||) = "@or"
primitive ignore = "@ignore"
Expand Down Expand Up @@ -75,7 +76,7 @@ provide let incRef = (userPtr: WasmI32) => {
userPtr
}

let rec decRef = (userPtr: WasmI32, parentPtr: WasmI32, ignoreZeros: Bool) => {
let rec decRef = (userPtr: WasmI32, ignoreZeros: Bool) => {
if (WasmI32.eqz(userPtr & Tags._GRAIN_GENERIC_TAG_MASK) && userPtr != 0n) {
let refCount = getRefCount(userPtr)
// if (_DEBUG) {
Expand All @@ -84,9 +85,7 @@ let rec decRef = (userPtr: WasmI32, parentPtr: WasmI32, ignoreZeros: Bool) => {
// }

if (WasmI32.eqz(refCount)) {
if (ignoreZeros) {
parentPtr
} else {
if (!ignoreZeros) {
throwDecRefError()
}
} else {
Expand All @@ -100,58 +99,50 @@ let rec decRef = (userPtr: WasmI32, parentPtr: WasmI32, ignoreZeros: Bool) => {
* empty blocks and does not actually zero out the memory.
*/
free(userPtr)
decRefChildren(userPtr, parentPtr)
} else {
parentPtr
decRefChildren(userPtr)
}
}
} else {
parentPtr
}
}
and decRefChildrenHelp = (
userPtr: WasmI32,
parentPtr: WasmI32,
arityOffset: WasmI32,
offset: WasmI32,
) => {
let arity = WasmI32.load(userPtr, arityOffset)
if (arity != 0n) {
let maxOffset = (arity - 1n) * 4n
for (let mut i = 0n; WasmI32.ltU(i, maxOffset); i += 4n) {
ignore(decRef(WasmI32.load(userPtr + i, offset), parentPtr, false))
decRef(WasmI32.load(userPtr + i, offset), false)
}
decRef(WasmI32.load(userPtr + maxOffset, offset), parentPtr, false)
} else {
parentPtr
decRef(WasmI32.load(userPtr + maxOffset, offset), false)
}
}
and decRefChildren = (userPtr: WasmI32, parentPtr: WasmI32) => {
and decRefChildren = (userPtr: WasmI32) => {
match (WasmI32.load(userPtr, 0n)) {
t when t == Tags._GRAIN_BOXED_NUM_HEAP_TAG => {
let tag = WasmI32.load(userPtr, 4n)
if (userPtr == Tags._GRAIN_RATIONAL_BOXED_NUM_TAG) {
// decRef underlying BigInts
ignore(decRef(WasmI32.load(userPtr, 8n), parentPtr, false))
ignore(decRef(WasmI32.load(userPtr, 12n), parentPtr, false))
decRef(WasmI32.load(userPtr, 8n), false)
decRef(WasmI32.load(userPtr, 12n), false)
}
parentPtr
},
t when t == Tags._GRAIN_ADT_HEAP_TAG => {
decRefChildrenHelp(userPtr, parentPtr, 16n, 20n)
decRefChildrenHelp(userPtr, 16n, 20n)
},
t when t == Tags._GRAIN_RECORD_HEAP_TAG => {
decRefChildrenHelp(userPtr, parentPtr, 12n, 16n)
t when t == Tags._GRAIN_RECORD_HEAP_TAG || t == Tags._GRAIN_LAMBDA_HEAP_TAG => {
decRefChildrenHelp(userPtr, 12n, 16n)
},
t when t == Tags._GRAIN_ARRAY_HEAP_TAG || t == Tags._GRAIN_TUPLE_HEAP_TAG => {
decRefChildrenHelp(userPtr, parentPtr, 4n, 8n)
},
t when t == Tags._GRAIN_LAMBDA_HEAP_TAG => {
decRefChildrenHelp(userPtr, parentPtr, 12n, 16n)
decRefChildrenHelp(userPtr, 4n, 8n)
},
// No travelsal necessary for other tags
_ => parentPtr,
_ => void,
}
}

provide let decRef = userPtr => decRef(userPtr, userPtr, false)
provide let decRef = userPtr => {
decRef(userPtr, false)
userPtr
}

0 comments on commit 844e2dc

Please sign in to comment.