@@ -126,36 +126,28 @@ proc genNifWrapper(nifName: NimNode, fn: NimNode): NimNode {.compileTime.} =
126
126
let rbody = newTree (nnkStmtList, fn)
127
127
let rcall = newCall (fn.name, ident (" env" ))
128
128
129
+ template tNifFn (n, rbody) {.dirty .} =
130
+ func n (env: ptr ErlNifEnv ; argc: cint ; argv: ErlNifArgs ): ErlNifTerm =
131
+ rbody
132
+ template tReturnTerm (v) =
133
+ return toTerm (env, v)
134
+ template tFromTerm (a, b, c) =
135
+ let a = fromTerm (env, argv[b], c)
136
+ template tCheckTerm (p) =
137
+ if unlikely (isNone (p)):
138
+ return enif_make_badarg (env)
139
+ template tGetFromTerm (p) =
140
+ unsafeGet (p)
141
+
129
142
for i in 2 ..< len (fn.params):
130
143
let p = fn.params[i]
131
- let arg = newTree (nnkBracketExpr, ident (" argv" ), newLit (i- 2 ))
132
- rbody.add (newTree (nnkLetSection, newTree (nnkIdentDefs,
133
- p[0 ],
134
- newNimNode (nnkEmpty),
135
- newCall (" fromTerm" , ident (" env" ), arg, p[1 ]))))
136
- rbody.add (newTree (nnkIfStmt, newTree (nnkElifBranch,
137
- newCall (" unlikely" , newCall (" isNone" , p[0 ])),
138
- newTree (nnkReturnStmt, newCall (" enif_make_badarg" , ident (" env" ))))))
139
- rcall.add (newCall (" unsafeGet" , p[0 ]))
140
-
141
- rbody.add (newTree (nnkReturnStmt, newCall (" toTerm" , ident (" env" ), rcall)))
142
-
143
- let rfn = newProc (rname, [], rbody, fn.kind)
144
- rfn.params = newTree (nnkFormalParams,
145
- ident (" ErlTerm" ),
146
- newTree (nnkIdentDefs,
147
- ident (" env" ),
148
- newNimNode (nnkPtrTy).add (ident (" ErlNifEnv" )),
149
- newNimNode (nnkEmpty)),
150
- newTree (nnkIdentDefs,
151
- ident (" argc" ),
152
- ident (" cint" ),
153
- newNimNode (nnkEmpty)),
154
- newTree (nnkIdentDefs,
155
- ident (" argv" ),
156
- ident (" ErlNifArgs" ),
157
- newNimNode (nnkEmpty)))
144
+ rbody.add (getAst (tFromTerm (p[0 ], newLit (i- 2 ), p[1 ])))
145
+ rbody.add (getAst (tCheckTerm (p[0 ])))
146
+ rcall.add (getAst (tGetFromTerm (p[0 ])))
147
+
148
+ rbody.add (getAst (tReturnTerm (rcall)))
158
149
150
+ let rfn = getAst (tNifFn (rname, rbody))
159
151
rfn.pragma = copyPragmaWithout (fn.pragma, " raises" )
160
152
rfn.pragma.add (ident (" nif" ))
161
153
rfn.pragma.add (newTree (nnkExprColonExpr,
0 commit comments