[squeak-dev] Re: Advice from Plugin gurus
nicolas cellier
ncellier at ifrance.com
Mon Sep 22 17:55:21 UTC 2008
Eliot Miranda a écrit :
>
>
> On Mon, Sep 22, 2008 at 6:19 AM, Igor Stasenko <siguctua at gmail.com
> <mailto:siguctua at gmail.com>> wrote:
>
> 2008/9/22 Gerardo Richarte <gera at corest.com <mailto:gera at corest.com>>:
> > Igor Stasenko wrote:
> >> 2008/9/22 Gerardo Richarte <gera at corest.com
> <mailto:gera at corest.com>>:
> >>
> >>> There's a native function I need to call (I called it
> 'aPrintf' in
> >>> the code below) with a specific calling convention:
> >>>
> >> I wondering , why you prefer using string formatting in C, while in
> >> smalltalk you have own? You can easily format strings in smalltalk,
> >> and print only the resulting string w/o need in inventing safe
> schemes
> >> or conversion.
> >>
> > Hi Igor, nice to see you again!
> >
> > I knew this was going to happen :)
> >
> > It was just an example, I'm not using string formatting. The actual
> > function I'm calling is the callout interface for OpenFirmware,
> through
> > which OpenFirmware provides services to the booted operating
> > system. Pretty much like BIOS' INT mechanism, but much more
> > powerful.
> >
>
> Okay. Then i don't see any problems with this primitive, except
> maybe one thing:
>
> a primitive should never change the contents of any argument(s). As in
> general smalltalk methods, a primitive should be allowed to change the
> contents only of receiver object, otherwise its breaking a smalltalk
> encapsulation rules.
> I would advice you to allocate separate byte array and fill it with
> values, then pass to C routine. Since its a byte array you don't need
> to care about it contents, and don't need a cleanup (GC will collect
> it as garbage eventually).
>
>
> No need to use a Smalltalk object to hold the copy. Just use alloca
> (stack allocating version of malloc).
>
> But this is the kind of thing an FFI does during marshalling anyway.
> Gerardo, why can't you use the FFI?
>
He said arguments type was not fixed, but would depend on service
requested in first argument as I understand it.
So the same function has different interfaces.
Would you suggest the solution is as simple as declaring the same
function with several interfaces?
like:
withFormat: aString printInteger: anInteger
<cdecl: void 'myprintf'( char * long )>
^self externalCallFailed
withFormat: aString printDouble: aDouble
<cdecl: void 'myprintf'( char * double )>
^self externalCallFailed
printInteger: anInteger
^self withFormat: '%d' print: anInteger
printDouble: aDouble
^self withFormat: '%f' print: anInteger
Nicolas
More information about the Squeak-dev
mailing list
|