samadhiweb

smalltalk programming for the web



« Previous  |  Next »

Smalltalk Interchange File

6 January 2016

The ANSI Smalltalk standard defines SIF, Smalltalk Interchange File, which is a common format for Smalltalk dialects to exchange file-outs. Eric Arseneau implemented SIF for Squeak (some old version), Dolphin (v2!), VisualWorks (v3!) and VisualAge Smalltalk (v4!) back in 2000. The implementation is found here.

15+ years later, the implementation files in cleanly on Squeak v5, Pharo v4 and Dolphin v7. Let's see if I can use this to quicken the port of NBSQLite3 from Pharo to Dolphin. I'll test with moving a single class, NBSQLite3Backup.

First, file out from a Pharo workspace.

SmalltalkInterchangeFileManager newForFileOut
    fileName: 'NBSQLite3Backup.sif';
    addClass: NBSQLite3Backup;
    addPackageNamed: 'NBSQLite3';
    fileOut. 

Then, file in from a Dolphin workspace.

SmalltalkInterchangeFileManager newForFileIn
    fileName: 'NBSQLite3Backup.sif';
    fileIn.

Up pops the Dolphin debugger, with an error signaled by SmalltalkInterchangeDolphin3FileInManager>>fileInClassItem:. Turns out that the offending filed-out source is the following:

a SmalltalkInterchangeFileItem(
    type: #class
    firstToken: 'Class'
    name: 'NBSQLite3Backup'
    superclassName: 'Object'
    instVarType: #'#none'
                 ^^^^^^^^

In particular, the symbol made from the string '#none'. I'm guessing that Dolphin wants the symbol #none, not #'#none'. Looking around SIF's source, the fix is in SmalltalkInterchangeSqueakFileOutManager>>nextSymbolPutString: which looks like this:

nextSymbolPutString: string
    self nextPut: $#.
    ^super nextSymbolPutString: string

Remove the "self nextPut: $#" line, accept the change. File out from Pharo, and try to file into Dolphin again.

Up pops the debugger. But this time the Transcript has something to say:

Error: NBSQLite3Backup>>prepare at line 1: undeclared 'NBExternalResourceManager'

NBExternalResourceManager is a NativeBoost thing and does not exist in Dolphin. To fix, edit the SIF file and remove that line, preserving the chunking.

File in again. Debugger again. This time Dolphin complains that NBSQLite3DatabaseExternalObject is undeclared. In Dolphin all FFI handles are instances of ExternalAddress. Edit the SIF file to that effect.

File in again. Finally, success! This is predicated on my having written the appropriate apiXXX methods in NBSQLite3FFI. And I haven't written/imported enough of the rest of NBSQLite3 to test whether the filed-in code works, so success here only means success in filing code into Dolphin. :-)

NBSQLite3 is a C library wrapper with dialect-specific FFI calls. As such porting it is slightly more involved. I suspect that "pure" Smalltalk code written portably should be much easier to move between Pharo and Dolphin, or between any two modern dialects of Smalltalk.

Blog comments powered by Disqus