Bug 49537

GemBuilder for Smalltalk/VW

8.5, 8.4

8.6

Errors on inspecting an object with dynamic instance variables containing unreplicateable objects

GBS inspectors use evaluate instead of execute when displaying server objects that included dynamnic instance variables. If the value of the dynamic instance variable has unreplicateable objects, then this resulted in an error "Block replication failed"

Workaround

Replace the methods GbxBasicInspector>>dynamicInstVarFields and GbsSession >> unsynchronizedExecuteBlock:withArguments:context: with the following:

GbxBasicInspector >> dynamicInstVarFields
    GbxServerVersion current atLeast64v3 ifFalse: [^Array new].
    [| dynamicInstVars |
    dynamicInstVars := OrderedCollection new.
    self object delegate session
        sessionCritical:
            [(self object delegate
                unsynchronizedPerformOnGsServer: #dynamicInstanceVariables) do:
                        [:varName |
                        | attr instVarDelegate |
                        attr := GbxDynamicInstVarAttribute
                                    label: #varName << #gbs >> (‘dynamic: ’ , varName asString)
                                    value: (instVarDelegate := self object delegate session
                                                    unsynchronizedExecuteBlock: ‘[:obj :var | obj dynamicInstVarAt: var]'
                                                    withArguments: (Array with: self object delegate with: varName)
                                                    context: nil)
                                    printString: (self remotePrintStringFor: instVarDelegate)
                                    object: self object.
                        dynamicInstVars add: attr]]
        unlessBlocked: [^OrderedCollection new]
        retryFor: 500.
    ^dynamicInstVars asArray]
            on: Core.MessageNotUnderstood
            do: [:ex | ^Core.Array with: ‘error getting dynamic inst vars’] 


GbsSession >> unsynchronizedExecuteBlock: sourceString withArguments: args context: contextDelegate
	"Private to GBS.  Does not synchronize server and client object spaces, so safe
	only in specific internal GBS operations.
	Immune from debugger stepping and asynchronous events."

	| evaluation |
	self gbsMessenger
		statusTag: #unsynchronizedEvaluateBlock
		message: '(s%1) GbsSession&gt;&gt;unsynchronizedExecuteBlock: %2 withArguments: %3 context: %4'
		with: self sessionId
		with: sourceString
		with: args
		with: contextDelegate.
	evaluation := self newServerEvaluation.
	^evaluation
		arguments: args;
		sourceCode: sourceString;
		contextDelegate: (self delegateForUnsynchronizedContext: contextDelegate);
		isBlock: true;
		shouldSynchronize: false;
		shouldReplicateResult: false;
		replicationScheme: GbxNullReplicationScheme new;
		stopForBreakpoints: false;
		execute

Last updated: 5/20/21