The methods GciInterface #remotePerform:selector:args: and #nbRemotePerform:select:args fail when one or more of the arguments are the oop to a non-special object.
In versions 3.1 and 3.1.0.1, #remotePerform:selector:args: has been fixed, but the problem reamins in #nbRemotePerform:selector:args:.
The following method will construct a String and perform that, producing the equivalent results.
! Bug 42002 Work-around: new GciInterface method: ! ! #remotePerform:selector:args:nb: ! ! with additional argument nb: useNonBlocking. ! ! This code constructs an equivalent string and then uses ! #remoteExecute/#nbRemoteExecute to by-pass bug 42002 present ! in calls to #remotePerform:selector:args/#nbRemotePerform:selector:args ! category: 'Primitives' method: GciInterface remotePerform: remoteOop selector: selector args: args nb: useNonBlocking | str | str := String new. str add: '| args | args := Array new. '. 1 to: args size by: 2 do: [:i | (args at: (i + 1)) ifTrue: [ str add: 'args add: (Object _objectForOop: '. str add: ((args at: i) asString). str add: '). ' ] ifFalse: [ str add: 'args add: '. str add: ((args at: i) asString). str add: '. ' ]]. str add: '^ (Object _objectForOop: '. str add: remoteOop asString. str add: ') perform: '. str add: selector printString. str add: ' withArguments: args'. useNonBlocking ifTrue: [ ^ self nbRemoteExecute: str ] ifFalse: [ ^ self remoteExecute: str ] %
Last updated: 11/8/12