@@ -87,8 +87,8 @@ proc isHandleType(typ: NimNode): bool =
8787 typ.kind == nnkIdent and isFFIHandleTypeName ($ typ)
8888
8989proc storageType (typ: NimNode ): NimNode =
90- # # In-Req-struct storage type. `cstring` rides as `string`; an {.ffiHandle.}
91- # # type rides as its `uint64` id; everything else as-is.
90+ # # In-Req-struct storage type. `cstring` stores as `string`; an {.ffiHandle.}
91+ # # type stores as its `uint64` id; everything else as-is.
9292 if typ.kind == nnkIdent and $ typ == " cstring" :
9393 return ident (" string" )
9494 if isHandleType (typ):
@@ -631,26 +631,27 @@ macro ffiRaw*(prc: untyped): untyped =
631631 echo stmts.repr
632632 return stmts
633633
634- macro ffiHandle * (prc : untyped ): untyped =
634+ macro ffiHandle * (node : untyped ): untyped =
635635 # # Marks a `ref object` as an opaque FFI handle. Its wire form is a `uint64`
636636 # # id; the live object stays in the per-ctx handle registry and never crosses.
637637 # #
638638 # # type Kernel {.ffiHandle.} = ref object
639639 # # ...
640- if prc .kind != nnkTypeDef:
640+ if node .kind != nnkTypeDef:
641641 error (" `.ffiHandle.` must be applied to a type definition" )
642642
643- var clean = prc.copyNimTree ()
644- if clean[0 ].kind == nnkPragmaExpr:
645- clean[0 ] = clean[0 ][0 ]
643+ # Strip the `{.ffiHandle.}` pragma off the type name before re-emitting.
644+ let typeDef = node.copyNimTree ()
645+ if typeDef[0 ].kind == nnkPragmaExpr:
646+ typeDef[0 ] = typeDef[0 ][0 ]
646647
647648 let typeName =
648- if clean [0 ].kind == nnkPostfix:
649- clean [0 ][1 ]
649+ if typeDef [0 ].kind == nnkPostfix:
650+ typeDef [0 ][1 ]
650651 else :
651- clean [0 ]
652+ typeDef [0 ]
652653
653- let refTy = clean [2 ]
654+ let refTy = typeDef [2 ]
654655 if refTy.kind != nnkRefTy or refTy[0 ].kind != nnkObjectTy:
655656 error (" `.ffiHandle.` type " & $ typeName & " must be a `ref object`" )
656657 let objTy = refTy[0 ]
@@ -662,8 +663,8 @@ macro ffiHandle*(prc: untyped): untyped =
662663 ffiHandleTypeNames.add ($ typeName)
663664
664665 when defined (ffiDumpMacros):
665- echo clean .repr
666- return clean
666+ echo typeDef .repr
667+ return typeDef
667668
668669macro ffi * (prc: untyped ): untyped =
669670 # # Simplified FFI macro — applies to procs or types.
@@ -687,10 +688,11 @@ macro ffi*(prc: untyped): untyped =
687688 # # return ok("done")
688689
689690 if prc.kind == nnkTypeDef:
690- var cleanTypeDef = prc.copyNimTree ()
691- if cleanTypeDef[0 ].kind == nnkPragmaExpr:
692- cleanTypeDef[0 ] = cleanTypeDef[0 ][0 ]
693- return registerFFITypeInfo (cleanTypeDef)
691+ # Strip the `{.ffi.}` pragma off the type name before registering it.
692+ let typeDef = prc.copyNimTree ()
693+ if typeDef[0 ].kind == nnkPragmaExpr:
694+ typeDef[0 ] = typeDef[0 ][0 ]
695+ return registerFFITypeInfo (typeDef)
694696
695697 let procName = prc[0 ]
696698 let formalParams = prc[3 ]
@@ -735,7 +737,7 @@ macro ffi*(prc: untyped): untyped =
735737 let resultRetType = resultInner[1 ]
736738 rejectRawPtrType (resultRetType, " `.ffi.` proc " & $ procName & " return type" )
737739
738- # A handle receiver rides the wire; a value-type lib receiver binds to ctx.myLib.
740+ # A handle receiver crosses the wire; a value-type lib receiver binds to ctx.myLib.
739741 var extraParamNames: seq [string ] = @ []
740742 var extraParamTypes: seq [NimNode ] = @ []
741743 let wireStart = if firstIsHandle: 1 else : 2
0 commit comments