gforth
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Precisions on the forth SWIG architecture: return by value structs


From: Bernd Paysan
Subject: Re: Precisions on the forth SWIG architecture: return by value structs
Date: Tue, 13 Jun 2023 00:17:14 +0200

Am Montag, 12. Juni 2023, 10:50:46 CEST schrieb Francois Gallois:
> Hello there,
> I've been taking a look at the gforth bindings for Raylib at
> https://github.com/ArnautDaniel/gforth-raylib in order to update them to the
> latest version. One of the biggest problems the original authors has been
> facing was converting the structures passed by value by raylib into
> pointers to allow their use, such as :
> 
> ```
> \c Vector2 * iGetWindowScaleDPI(Vector2 * p){
> \c Vector2 v = GetWindowScaleDPI();
> \c *p = v; return p; }
> c-function iGetWindowScaleDPI iGetWindowScaleDPI a -- a ( emptyVector2 --
> Vector2 ) ```
> 
> It seems that the "default behavior" for SWIG is to convert structures
> returned by value into pointers
> (https://www.swig.org/Doc3.0/SWIGDocumentation.pdf#__WKANCHOR_58) (this is
> the link to the docs of the relevant version of SWIG for
> https://github.com/GeraldWodni/swig, which I've been using according to the
> manual).

Gerald does not use the wrapper-generating part of Swig, because that's what 
libcc.fs does.

> Has anyone played around enough with forth-SWIG to explain in more detail
> how the current implementation behaves? I'd like to make that kind of fixes
> automatic.

Me, too.  There should be enough information in the way Gerald uses Swig to 
tell that something is a struct, either as parameter or return value, and in 
that case emit struct{*(type*)} instead of a/n/r…, or whatever one-letter name 
we could come up with for convenience (t for tuple?).  It's not difficult to 
add 
struct-support in libcc.fs, i.e. a struct in Forth is always passed as 
pointer, and if a function returns a struct, it's taking the next item from 
the stack as address to store the result.  So the stack code really is ( 
return-pointer arg-pointer -- ).

Structs as arguments are already dealt with by a{*(type*)} (the argument-
generating code would be then identical for a, but with struct as name).  
There, the cast includes the pointer-accessing *, it's just structs as return 
are not yet supported by libcc.fs.

-- 
Bernd Paysan
"If you want it done right, you have to do it yourself"
net2o id: kQusJzA;7*?t=uy@X}1GWr!+0qqp_Cn176t4(dQ*
https://net2o.de/

Attachment: signature.asc
Description: This is a digitally signed message part.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]