reworking seq holder

This commit is contained in:
Jaremy Creechley 2024-02-15 16:28:32 -07:00
parent c994ead5a5
commit 5ad38d5f44

View File

@ -81,10 +81,10 @@ template checkJobArgs*[T](exp: seq[T], fut: untyped): OpenArrayHolder[T] =
# echo "checkJobArgs::SEQ: ", $typeof(exp) # echo "checkJobArgs::SEQ: ", $typeof(exp)
let rval = SeqHolder[T](data: exp) let rval = SeqHolder[T](data: exp)
let expPtr = OpenArrayHolder[T](data: cast[ptr UncheckedArray[T]](unsafeAddr(rval.data[0])), size: rval.data.len()) let expPtr = OpenArrayHolder[T](data: cast[ptr UncheckedArray[T]](unsafeAddr(rval.data[0])), size: rval.data.len())
fut.addCallback proc(data: pointer) = # fut.addCallback proc(data: pointer) =
## keep the rval GC object alive for duration of the job # ## keep the rval GC object alive for duration of the job
discard rval.data.len() # discard rval.data.len()
echo "FREE RVaL: ", rval.data.len() # echo "FREE RVaL: ", rval.data.len()
## TODO: how to handle cancellations? ## TODO: how to handle cancellations?
expPtr expPtr
@ -103,14 +103,29 @@ macro submitMacro(tp: untyped, jobs: untyped, exp: untyped): untyped =
let futName = ident("fut") let futName = ident("fut")
let nm = newLit(repr(exp)) let nm = newLit(repr(exp))
var argids = newSeq[NimNode]()
var letargs = nnkLetSection.newTree()
for i, p in exp[1..^1]:
echo "CHECK ARGS: ", p.treeRepr
let id = ident "arg" & $i
argids.add(id)
let pn = nnkCall.newTree(ident"checkJobArgs", p, nil)
letargs.add nnkIdentDefs.newTree( id, newEmptyNode(), pn)
# fncall.add(nnkCall.newTree(ident"checkJobArgs", p, `futName`))
echo "\nSUBMIT: ARGS: LET:\n", letargs.repr
echo ""
var fncall = nnkCall.newTree(exp[0]) var fncall = nnkCall.newTree(exp[0])
fncall.add(jobRes) fncall.add(jobRes)
for p in exp[1..^1]: for p in argids:
echo "CHECK ARGS: ", p.treeRepr fncall.add(p)
fncall.add(nnkCall.newTree(ident"checkJobArgs", p, `futName`)) # for p in exp[1..^1]:
# echo "CHECK ARGS: ", p.treeRepr
# fncall.add(nnkCall.newTree(ident"checkJobArgs", p, `futName`))
result = quote do: result = quote do:
block: block:
`letargs`
let (`jobRes`, `futName`) = createFuture(`jobs`, `nm`) let (`jobRes`, `futName`) = createFuture(`jobs`, `nm`)
when typeof(`fncall`) isnot void: when typeof(`fncall`) isnot void:
{.error: "Apatheia jobs cannot return values. The given proc returns type: " & $(typeof(`fncall`)) & {.error: "Apatheia jobs cannot return values. The given proc returns type: " & $(typeof(`fncall`)) &