[Cuis-dev] FFI example

lewis at mail.msen.com lewis at mail.msen.com
Mon Sep 30 12:58:03 PDT 2024


There is a presentation on "_How to write a simple VM plugin in Cuis_"  
on the https://cuis.st/community page, with link to the meeting video at 
https://youtu.be/XcgPTewqutQ

Dave

On 2024-09-30 18:54, Vanessa Freudenberg via Cuis-dev wrote:

> For one, there's no reason to subclass ExternalLibrary.
> 
> But otherwise, it works for me:
> 
> That said, if you actually want to use C functions in your application, 
> the better way is to build a VM plugin. It's a little bit more overhead 
> to learn but fits the Smalltalk philosophy much better, where the VM 
> provides the environment for the image to live in, rather than the 
> image talking to the outside world directly. The job of the VM is to 
> provide a safe world so Smalltalk developers don't have to worry about 
> the harsh reality. FFI breaks that illusion.
> 
> Vanessa
> 
> On Mon, Sep 30, 2024 at 8:10 AM Mark Volkmann via Cuis-dev 
> <cuis-dev at lists.cuis.st> wrote:
> Vanessa's getenv example works for me. Now I want to learn how to 
> invoke my own C functions.
> I created the file "mylib.c" containing this:
> 
> char* greet() {
> return "Hello, World!";
> }
> 
> Then I created a shared library for macOS with this:
> 
> clang -dynamiclib -o libmylib.dylib mylib.c
> 
> Then I created this Smalltalk class:
> 
> ExternalLibrary subclass: #FFIDemo
> instanceVariableNames: ''
> classVariableNames: ''
> poolDictionaries: ''
> category: 'Volkmann'
> 
> Then I added this class method:
> 
> greet
> <cdecl: char* 'greet' () module: 
> '/Users/volkmannm/Documents/dev/lang/smalltalk/Cuis-Smalltalk-Volkmann/libmylib.dylib'>
> ^self externalCallFailed
> 
> Side note: I need to learn where this looks by default for shared 
> libraries so I don't have to specify an absolute path.
> 
> Then I entered this in a Workspace and did a "Print it".
> 
> FFIDemo greet
> 
> That opens a Debug window with the message "Error: Unable to find 
> function address".
> 
> Can anyone spot where I'm going wrong?
> 
> On Sun, Sep 29, 2024 at 10:10 PM Andres Valloud via Cuis-dev 
> <cuis-dev at lists.cuis.st> wrote: Except of course getenv() is ruled by 
> POSIX so doing that is at the very
> least not portable, if not outright wrong.
> 
> On 9/29/24 6:29 PM, Vanessa Freudenberg via Cuis-dev wrote:
>> And, defining a method myself works fine:
>> 
>> getenv: var
>> <cdecl: char* 'getenv' (char*) module: 'libSystem.dylib'>
>> ^self externalCallFailed
>> 
>> And then
>> 
>> MyClass getenv: 'HOME'
>> 
>> 
>> returns
>> 
>> '/Users/vanessa' .
>> 
>> 
>> There really isn't much more to it.
>> 
>> Vanessa
>> 
>> On Sun, Sep 29, 2024 at 6:26 PM Vanessa Freudenberg
>> <vanessa at codefrau.net <mailto:vanessa at codefrau.net>> wrote:
>> 
>> I just loaded the "Tests-FFI" package and it works.
>> 
>> And you can e.g. run
>> 
>> FFITestLibrary new ffiTestFloats: 3 with: 4
>> 
>> which returns 7.0 because the plugin happens to implement
>> "ffiTestFloats()" as returning the sum of its two arguments.
>> 
>> Vanessa
>> 
>> 
> 
> --
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev
> --
> 
> R. Mark Volkmann
> Object Computing, Inc. --
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20240930/28c3c97c/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 50559 bytes
Desc: not available
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20240930/28c3c97c/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 173898 bytes
Desc: not available
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20240930/28c3c97c/attachment-0003.png>


More information about the Cuis-dev mailing list