ref: ac53b78d88d7f460ada21633fb1dc8ee96b53a36
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 } generic fnbdup = {fn, buf var repr : intptr[2] var env repr = (&fn : intptr[2]#)# env = envslice(repr[0]) 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#] }