Dear Pharoisten,
I have a couple of questions about my understanding about Pharo, the VM
and COG.

the COG VM is the "normal virtual machine as I understand"
At least my Pharo give me:
'Croquet Closure Cog VM [CoInterpreter VMMaker-oscog.35]'

It is my understanding that the Cog sources do not contain the actual
SerialPlugin stuff from SergeStinckwicj-
At least I can not find anything like OpenPortByname or writeToNamed
port or the like.

So I fetched the Squeak sources and the Cog sources and indeed they are
different.
The Cog version defines:
#ifdef SQUEAK_BUILTIN_PLUGIN

void* SerialPlugin_exports[][3] = {
        {"SerialPlugin", "getModuleName", (void*)getModuleName},
        {"SerialPlugin", "initialiseModule", (void*)initialiseModule},
        {"SerialPlugin", "primitiveSerialPortClose", 
(void*)primitiveSerialPortClose},
        {"SerialPlugin", "primitiveSerialPortOpen", 
(void*)primitiveSerialPortOpen},
        {"SerialPlugin", "primitiveSerialPortRead", 
(void*)primitiveSerialPortRead},
        {"SerialPlugin", "primitiveSerialPortWrite", 
(void*)primitiveSerialPortWrite},
        {"SerialPlugin", "setInterpreter", (void*)setInterpreter},
        {"SerialPlugin", "shutdownModule", (void*)shutdownModule},
        {NULL, NULL, NULL}
};

#endif /* ifdef SQ_BUILTIN_PLUGIN */


Whereas the Squeal-vm version contains e.g:
#ifdef SQUEAK_BUILTIN_PLUGIN

void* SerialPlugin_exports[][3] = {
        {"SerialPlugin", "primitiveSerialPortWrite", 
(void*)primitiveSerialPortWrite},
        {"SerialPlugin", "primitiveSerialPortClose", 
(void*)primitiveSerialPortClose},
        {"SerialPlugin", "primitiveSerialPortOpenByName", 
(void*)primitiveSerialPortOpenByName},
        {"SerialPlugin", "primitiveSerialPortWriteByName", 
(void*)primitiveSerialPortWriteByName},
        {"SerialPlugin", "primitiveSerialPortReadByName", 
(void*)primitiveSerialPortReadByName},
        {"SerialPlugin", "shutdownModule", (void*)shutdownModule},
        {"SerialPlugin", "primitiveSerialPortOpen", 
(void*)primitiveSerialPortOpen},
        {"SerialPlugin", "initialiseModule", (void*)initialiseModule},
        {"SerialPlugin", "setInterpreter", (void*)setInterpreter},
        {"SerialPlugin", "getModuleName", (void*)getModuleName},
        {"SerialPlugin", "primitiveSerialPortCloseByName", 
(void*)primitiveSerialPortCloseByName},
        {"SerialPlugin", "primitiveSerialPortRead", 
(void*)primitiveSerialPortRead},
        {NULL, NULL, NULL}
};

#endif

So now it seems the Cog version is for building an internal plugin. (I
may be mistaken of course)

but the code for primitiveSerialPortOpen looks like this:
EXPORT(sqInt)
primitiveSerialPortOpen(void)
{
        sqInt baudRate;
        sqInt dataBits;
        sqInt inFlowControl;
        sqInt outFlowControl;
        sqInt parityType;
        sqInt portNum;
        sqInt stopBitsType;
        sqInt xOffChar;
        sqInt xOnChar;

        portNum = interpreterProxy->stackIntegerValue(8);
        baudRate = interpreterProxy->stackIntegerValue(7);
        stopBitsType = interpreterProxy->stackIntegerValue(6);
        parityType = interpreterProxy->stackIntegerValue(5);
        dataBits = interpreterProxy->stackIntegerValue(4);
        inFlowControl = interpreterProxy->stackIntegerValue(3);
        outFlowControl = interpreterProxy->stackIntegerValue(2);
        xOnChar = interpreterProxy->stackIntegerValue(1);
        xOffChar = interpreterProxy->stackIntegerValue(0);
        if (interpreterProxy->failed()) {


whereas the Squeak sources looks like this:

int serialPortOpen(int portNum, int dataRate, int stopBitsType, int parityType, 
int dataBits,
                   int inFlowCtrl, int outFlowCtrl, int xOnChar, int xOffChar)
{       
  char serialPortName[PORT_NAME_SIZE];
  make_portname_from_portnum(serialPortName, portNum);
      
  return serialPortOpenByName(serialPortName, dataRate, stopBitsType, 
parityType, dataBits,
                              inFlowCtrl, outFlowCtrl, xOnChar, xOffChar);
}


So I assume one has to make the changes as in the cog examples to make
this plugin workable in Cog. Is that a correct impression.

Well then it comes to the questions of how to properly write a plugin
for the COG  vm. Are there any tutorials about it, or is the best I can
hope for the sources for Cog itself?

My understanding is that stackIntegerValue, picks out a parameter from
a Cogs primitive. Is that a correct impression?

It seems that at least the following things have to be exported from a
plugin:
getModuleName
setInterpreter
and maybe
initializeModule
shutdownModule

The latter are probably for cleaning up....

But maybe I'm on the complete wrong track. Because at the beginning I
can read:
/* Automatically generated by
        SmartSyntaxPluginCodeGenerator VMMaker-oscog.40 uuid: 
637db40c-33c6-4263-816e-1b8cc19e3c99
   from
        SerialPlugin VMMaker-oscog.40 uuid: 637db40c-33c6-4263-816e-1b8cc19e3c99
 */

So is this code not written in C but maybe somewhere else?

As you can see I'm more than less clueless. 

So what is the "supposed" way to migrat that kind of code?


Regards
Friedrich

-- 
Q-Software Solutions GmbH; Sitz: Bruchsal; Registergericht: Mannheim 
Registriernummer: HRB232138; Geschaeftsfuehrer: Friedrich Dominicus

Reply via email to