[Cuis-dev] Using OSProcess package

David T. Lewis lewis at mail.msen.com
Fri Dec 9 14:48:16 PST 2022


Juan,

Thank you for the explanation, it makes sense to me now :-)

Dave

On Fri, Dec 09, 2022 at 03:37:25PM -0300, Juan Vuletich via Cuis-dev wrote:
> Hi Dave,
> 
> On 12/9/2022 2:33 PM, David T. Lewis via Cuis-dev wrote:
> >
> >Hi Juan,
> >
> >I have not had time to look in detail, but something is badly broken. I see
> >"Bad file descriptor" errors in the console, and 
> >UnixProcessAccessorTestCase
> >crashes the VM.
> >
> >I'll try to look at it this weekend and give a better answer.
> >
> >Dave
> 
> The problem is that what used to be instances of String, that can be 
> sent directly to the C world, only needing a zero byte at the end, are 
> now instances of UnicodeString. UnicodeString is a regular class (with 
> instance variables) and it can't be sent to the C world in the same way. 
> Something like UnicodeString that uses encapsulation to protect its 
> encoding is much better for the Smalltalk world. But unfortunately it 
> breaks the assumptions of code that deals with the external world. 
> Apologies for that.
> 
> I did some experiments:
> 
> If I add #asByteString to these methods like this:
> 
> AttachableFileStream >> name: aSymbolOrString attachTo: anIOHandle 
> writable: readWriteFlag
>     "Attach to an existing file handle, assumed to have been previously 
> opened by the underlying operating system."
>     name _ aSymbolOrString asByteString.
>     fileID _ anIOHandle.
>     readWriteFlag ifTrue: [self readWrite] ifFalse: [self readOnly].
>     self ascii.
>     self register.
> 
> UnixProcess >> forkJob: executableFile arguments: arrayOfStrings 
> environment: stringDictionary descriptors: arrayOf3Streams
>     "Call Unix vfork() and execve() to create a child process, and 
> answer the child process.
>     Delegate this to the singleton OSProcess>>thisOSProcess."
>     ^ self forkAndExec: executableFile asByteString
>         arguments: (arrayOfStrings collect: [ :s | s asByteString ])
>         environment: stringDictionary
>         descriptors: arrayOf3Streams
> 
> and then evaluate:
> OSProcessAccessor initialize
> AttachableFileStream initialize
> OSProcess initialize
> ThisOSProcess initialize
> 
> then this appears to work on my Mac
> OSProcess command: 'ls -l /etc'
> 
> However I think it would be much better to send the #bytes of the 
> UnicodeString. This is a ByteArray that holds the UTF-8 bytes of the 
> Unicode String. Still, it looks like the Plugin needs stuff to be actual 
> instances of String, so perhaps a hacked string that actually holds 
> UTF-8 bytes would be best. I think that's what the Clipboard gives us, 
> and we need to convert to a proper UnicodeString in the image.
> 
> I would suggest an adaptor message like #asZeroTerminatedBytes or 
> similar, that builds and answers what the plugin needs (avoiding the 
> explicit concatenation of `Character numericValue: 0`).
> 
> I didn't move beyond that experiment, because this is your code, and it 
> is also for other Smalltalk dialects, and you know better.
> 
> Thank you!
> 
> -- 
> Juan Vuletich
> cuis.st
> github.com/jvuletich
> researchgate.net/profile/Juan-Vuletich
> independent.academia.edu/JuanVuletich
> patents.justia.com/inventor/juan-manuel-vuletich
> linkedin.com/in/juan-vuletich-75611b3
> twitter.com/JuanVuletich
> 
> -- 
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev


More information about the Cuis-dev mailing list