ref: 1f99d2dc0f2e8afe604bfe777063b4f2e277e185
dir: /lib/std/fndup.myr/
use "alloc"
use "die"
use "sldup"
use "slcp"
use "types"
pkg std =
generic fnenvsz : (fn : @fn::function -> size)
generic fndup : (fn : @fn::function -> @fn::function)
generic fnbdup : (fn : @fn::function, buf : byte[:] -> @fn::function)
generic fnfree : (fn : @fn::function -> void)
;;
generic fndup = {fn
var sl
sl = std.slalloc(fnenvsz(fn))
-> fnbdup(fn, sl)
}
generic fnenvsz = {fn
var repr : intptr[2]
repr = (&fn : intptr[2]#)#
-> envslice(repr[0]).len
}
extern const put : (fmt : byte[:], args : ... -> int64)
generic fnbdup = {fn, buf
var repr : intptr[2]
var env
repr = (&fn : intptr[2]#)#
env = envslice(repr[0])
std.put("repr: {}\n", repr)
slcp(buf[:env.len], env)
repr[0] = (buf : intptr)
-> (&repr : @fn::function#)#
}
generic fnfree = {fn
var repr : intptr[2]
repr = (&fn : intptr[2]#)#
std.slfree(envslice(repr[0]))
}
const envslice = {ep : intptr
var env : byte#
var szp : intptr#
if ep == 0
-> [][:]
;;
env = (ep : byte#)
szp = (env : intptr#)
-> env[:szp#]
}