<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hi,</p>
<p>
<blockquote type="cite"><span style="font-family: Arial,
Helvetica, sans-serif;font-size: 13px">The type model for
pointer types with arity > 1 is still rudimentary. You can
always go the unsafe way to code against 'void*'. In your
case, the type 'char*[]' gives you an array type with a
'char*' content type. Not sure whether type coercing will work
during the FFI call. You can also use the 'string[]' type for
that matter. Again, if you get a type check error on the call,
you might have to resort to 'void*' instead and pass on that
ExternalAddress your have at hand.</span></blockquote>
Yes, I did it, sorta. I allocated external bytes, copied the
string to them (along with null terminator), put the handle's
bytes into intptr_t type (a := ExternalType intptr_t allocate. a
at: 1 put: h getHandle asInteger), then passed that one to the
call. <br>
</p>
<p>But I thought I could get away with only using in-squeak-memory
objects (i.e. no external memory allocations since it's a bit of a
pain to handle them across the methods).</p>
<p><br>
</p>
<p>I have a suggestion, it may not matter much, after all you're
much more familiar with Squeak internals (and far more experienced
in programming overall). <br>
</p>
<p>Have you considered simplifying FFI interface, where callout (the
primitive) would only handle raw bytes (along with argument
sizes), without type checking? Type checking & marshalling
would then be moved to the Image side, along with some "extras"
for example retrieving memory address of a RawBitsArray instance.
This could, for example, ease implementing n-dim pointers, since
all the neccessary info is easily accessible & no more type
juggling.</p>
<p>Again, just some random stupid thought, please don't take it
seriously :D. <br>
</p>
<p>
<blockquote type="cite"><span style="font-family: Arial,
Helvetica, sans-serif"><span style="font-size: 13px">You have
to do it manually if you really need to pass on object
memory to a call and that callee holds on to the address
after the return. No need to pin objects that are just read
during the call. That is, for example, fill your
RawBitsArray and pass it into the function as is. I think.
Just check via #isPinned. Watch out for segfaults after GC.
Might indicate that you do have to pin that object. :-D</span></span></blockquote>
OK, I pin them all anyway, just in case:). Maybe some support for
auto-pinning objects that are passed to FFI? It's not like sending
#pin is a big deal. Just really easy to forget to insert 10th time
the same method call (and this time it would actually be the one
that is mandatory...).<br>
</p>
<p>Michał<br>
</p>
<div class="moz-cite-prefix">W dniu 2022-04-05 o 11:54, Marcel
Taeumel pisze:<br>
</div>
<blockquote type="cite"
cite="mid:Mailbird-8d14afa3-1430-4665-a796-ae8467925060@hpi.de">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div id="__MailbirdStyleContent" style="font-size:
10pt;font-family: Arial;color: #000000;text-align: left"
dir="ltr"> Hi <span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px">Michał --</span>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px"><br>
</span></div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px">> </span><span
style="font-family: Arial, Helvetica, sans-serif;font-size:
13px">As in the title, what's the way to pass single string
to External</span></div>
<span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px">> Function that expects array
of strings (char**)?</span>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px"><br>
</span></div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px">The type model for pointer types
with arity > 1 is still rudimentary. You can always go
the unsafe way to code against 'void*'. In your case, the
type 'char*[]' gives you an array type with a 'char*'
content type. Not sure whether type coercing will work
during the FFI call. You can also use the 'string[]' type
for that matter. Again, if you get a type check error on the
call, you might have to resort to 'void*' instead and pass
on that ExternalAddress your have at hand.</span></div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px"><br>
</span></div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px">(ExternalType typeNamed:
'char*[]') explore.</span><span style="font-family: Arial,
Helvetica, sans-serif;font-size: 13px"><br>
</span></div>
<div><span style="font-family: Arial, Helvetica, sans-serif"><span
style="font-size: 13px">(ExternalType typeNamed:
'string[]') explore.</span></span><br>
</div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px"><br>
</span></div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px">> </span><span
style="font-family: Arial, Helvetica, sans-serif;font-size:
13px">I assume the new FFI interface will be released along
with Squeak 6.0? :)</span></div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px"><br>
</span></div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px">Well, I will make a tag so that
everybody knows what to load in Squeak 6.0. Yet, active
development will continue after that release against Trunk
(e.g. 6.1alpha).</span></div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px"><br>
</span></div>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px">> </span><span
style="font-family: Arial, Helvetica, sans-serif;font-size:
13px">are objects passed to FFI (the ones allocated</span></div>
<span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px">> on the Squeak heap)
auto-pinned or do I need pin them manually?</span>
<div><span style="font-family: Arial, Helvetica,
sans-serif;font-size: 13px"><br>
</span></div>
<div><span style="font-family: Arial, Helvetica, sans-serif"><span
style="font-size: 13px">You have to do it manually if you
really need to pass on object memory to a call and that
callee holds on to the address after the return. No need
to pin objects that are just read during the call. That
is, for example, fill your RawBitsArray and pass it into
the function as is. I think. Just check via #isPinned.
Watch out for segfaults after GC. Might indicate that you
do have to pin that object. :-D</span></span></div>
<div><span style="font-family: Arial, Helvetica, sans-serif"><span
style="font-size: 13px"><br>
</span></span></div>
<div><span style="font-family: Arial, Helvetica, sans-serif"><span
style="font-size: 13px">Best,<br>
Marcel</span></span></div>
<blockquote class="history_container" type="cite"
style="border-left-style: solid;border-width: 1px;margin-top:
20px;margin-left: 0px;padding-left: 10px;min-width: 500px">
<p style="color: #AAAAAA; margin-top: 10px;">Am 02.04.2022
03:34:38 schrieb Michał Olszewski
<a class="moz-txt-link-rfc2396E" href="mailto:m.olszewski@nexat.pl"><m.olszewski@nexat.pl></a>:</p>
<div style="font-family:Arial,Helvetica,sans-serif">Hello,<br>
<br>
As in the title, what's the way to pass single string to
External <br>
Function that expects array of strings (char**)? I know that
the way to <br>
do that in plain C would be something like this:
&myString but I have <br>
not idea how to manipulate Squeak objects such that I can
pass their <br>
addresses manually to FFI. I guess I have to somehow wrap
stuff into <br>
ExternalData but how?<br>
<br>
The image used is: Squeak 6.0 alpha 21520.<br>
<br>
I assume the new FFI interface will be released along with
Squeak 6.0? :)<br>
<br>
At last, quick question: are objects passed to FFI (the ones
allocated <br>
on the Squeak heap) auto-pinned or do I need pin them
manually?<br>
<br>
Michał<br>
<br>
<br>
</div>
</blockquote>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">
</pre>
</blockquote>
</body>
</html>