David said:
Since you are on X86_64, make sure that you are compiling your VM in 32-bit mode (-m32 compiler flag). FFI does not work on 64-bit platforms, details at http://bugs.squeak.org/view.php?id=7237.
FYI, this can definitely be fixed (the patches were done a few years ago), but I would frankly be reluctant to try taking it on right now because it is a complex set of changes that must be coordinated in the platform support code, slang, and images, and there are quite a lot of other things going on with VMs these days, including Eliot's work on a new FFI.
The status of the 64-bit fixes and testing as of May 2008 is in the thread at http://lists.squeakfoundation.org/pipermail/vm-dev/2008-May/001945.html
Dave
Thanks Dave, I will try rebuilding the stock VM tomorrow with the suggested flag and see what happens.
However I will take this opportunity to update everyone on why I finally got fed up with it today. I thought to myself if the test functions were not being included in the plugin(and my cursory inspection suggests the cmake configuration does not include ffi-test.*) then perhaps the simplest thing I could do would be to create a simple interface to rand. So I created a new subclass of ExternalLibrary and tried to add a testRand instance method. However as soon as I finished typing '<cdecl:' I started getting debuggers popping up for every keypress related to parsing, I suspect having to do with Shout. Yet I check the preferences and under Browsing Shout and syntaxHighlightingAsYouType (going from memory) are not enabled. But in fact the syntax is being colored as I type. I can't figure out how to stop it. So I just type away and ignore the debuggers resulting in
testRand "Test rand" <cdecl: int 'rand' ()> ^self externalCallFailed
and I try to accept that but it will not accept it insisting that there should be a return call type in the cdecl line even though I think I've typed one in there. I also tried <cdecl: int 'rand' (void)> as I'm not sure which if either of these is correct, but the same result happens in both cases.
Ken
On Tue, May 24, 2011 at 03:47:40PM -0700, Ken Causey wrote:
However I will take this opportunity to update everyone on why I finally got fed up with it today. I thought to myself if the test functions were not being included in the plugin(and my cursory inspection suggests the cmake configuration does not include ffi-test.*) then perhaps the simplest thing I could do would be to create a simple interface to rand. So I created a new subclass of ExternalLibrary and tried to add a testRand instance method. However as soon as I finished typing '<cdecl:' I started getting debuggers popping up for every keypress related to parsing, I suspect having to do with Shout. Yet I check the preferences and under Browsing Shout and syntaxHighlightingAsYouType (going from memory) are not enabled. But in fact the syntax is being colored as I type. I can't figure out how to stop it. So I just type away and ignore the debuggers resulting in
testRand "Test rand" <cdecl: int 'rand' ()> ^self externalCallFailed
and I try to accept that but it will not accept it insisting that there should be a return call type in the cdecl line even though I think I've typed one in there. I also tried <cdecl: int 'rand' (void)> as I'm not sure which if either of these is correct, but the same result happens in both cases.
Most likely both declarations are incorrect, and that's probably what the parser is trying to tell you.
<OT> Of course everyone knows that writing plugins is "hard". But just in case you run out of patience with doing it the "easy" way, consider writing a small plugin. Commented example attached. Compile the plugin with your VM, then evaluate "RandPlugin next" to exercise the primitive.
primitiveRand "Call the rand() clib function to obtain a positive int in the range 0 through 16r7FFFFFFF. This will be the value of the Integer that we want to return from this primitive. Use #positive32BitIntegerFor: to convert this value into an object reference, which will be either a SmallInteger or a LargePositiveInteger. Pop a value from the stack (representing self), then push the integer value to be returned. Sender of this primitive will receive the integer object as the result of calling the primitive. Note, #code:inSmalltalk: provides a means of implementing the equivalent of rand() in Smalltalk. When running this primitive in Smalltalk (i.e. the interpreter simulator), the Smalltalk block will be executed rather than the rand() clib function." <export: true> | nextRand | nextRand := self cCode: 'rand()' inSmalltalk: [(Random new next * 16r7FFFFFFF) asInteger]. self pop: 1 thenPush: (self positive32BitIntegerFor: nextRand)
</OT>
Dave
On Tue, 24 May 2011, Ken Causey wrote:
snip
testRand instance method. However as soon as I finished typing '<cdecl:' I started getting debuggers popping up for every keypress related to parsing, I suspect having to do with Shout. Yet I check the preferences and under Browsing Shout and syntaxHighlightingAsYouType (going from memory) are not enabled. But in fact the syntax is being colored as I type. I can't figure out how to stop it. So I just type
I fixed this bug in the Trunk a few weeks ago. It was present in Shout since 2004 or so, but probably the error was simply ignored by some other part of the system.
away and ignore the debuggers resulting in
testRand "Test rand" <cdecl: int 'rand' ()> ^self externalCallFailed
and I try to accept that but it will not accept it insisting that there should be a return call type in the cdecl line even though I think I've typed one in there. I also tried <cdecl: int 'rand' (void)> as I'm not sure which if either of these is correct, but the same result happens in both cases.
The error message is correct, you should specify the return type as long. There's no int type in FFI, probably because it's ambiguous (even in C) and unnecessary.
Levente
Ken
vm-dev@lists.squeakfoundation.org