Bug 44727

GemStone/S 64 Bit

3.2.2, 3.2.1, 3.2

3.2.3

Sessions may encounter unexpected errors in Unicode comparison mode

In Unicode comparison mode, comparison methods are installed into each session using transient method dictionaries. These were subject to in-memory GC. If this occurred, the legacy comparison code was used, with unexpected results.

Workaround

The following method fixes the problem:

classmethod: Unicode16
_useUnicodeComparePrimitives: aBoolean

 "enter protected mode"
| prot prev |
prot := System _protectedMode .
[ prev := self _lookupsUsingUnicodeCompares .
  prev == aBoolean ifFalse:[ | list tmd classes |
    list := self _unicodeCompareMapping .
    (classes := Array new) _setNoStubbing.
    1 to: list size by: 2 do:[:j | | aClass |
      aClass := list at: j .
      tmd := aBoolean ifTrue:[ self _unicodeCompareTmdForClass: aClass
                                  selectors: (list at: j + 1) ]
                     ifFalse:[ nil ] .
      aClass transientMethodDictForEnv: 0 put: tmd .
      classes add: aClass .
    ].
    SessionTemps current at: #UnicodeCompare_classes put: classes ."keep classes in memory"
    self _clearLookupCaches: 0 .
  ].
  self _cacheUsingUnicodeCompares .
] ensure:[
  prot _leaveProtectedMode
].
^ prev
%


Last updated: 11/26/14