[Pharo-project] Questions of understanding

Friedrich Dominicus frido at q-software-solutions.de
Mon May 23 19:04:24 CEST 2011


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



More information about the Pharo-project mailing list