class: CharacterEncoder
authorClaus Gittinger <cg@exept.de>
Wed, 29 Apr 2015 13:21:18 +0200
changeset 18305 6f48f7030f47
parent 18303 3168be747a94
child 18306 efb1f01b24e2
class: CharacterEncoder added: #encoderClassesByName #initializeEncoderClassesByName changed: #encoderFor:ifAbsent: #encoderToEncodeFrom:into: #initialize lazy initialize EncoderClassesByName (move as much as possible out of class initialization, to speed up startup)
CharacterEncoder.st
--- a/CharacterEncoder.st	Tue Apr 28 23:22:13 2015 +0200
+++ b/CharacterEncoder.st	Wed Apr 29 13:21:18 2015 +0200
@@ -289,7 +289,7 @@
         ].
 
         AccessLock critical:[
-            unicodeEncoderClasses := EncoderClassesByName at:#unicode.
+            unicodeEncoderClasses := self encoderClassesByName at:#unicode.
         ].
         unicodeEncoderClasses notNil ifTrue:[
             unicodeEncoderClasses keysAndValuesDo:[:eachEncodingAlias :eachEncoderClassOrName |
@@ -317,9 +317,9 @@
     ].
     enc isNil ifTrue:[
         AccessLock critical:[
-            unicodeEncoderClasses := EncoderClassesByName at:#unicode ifAbsent:nil.
+            unicodeEncoderClasses := self encoderClassesByName at:#unicode ifAbsent:nil.
             unicodeEncoderClasses isNil ifTrue:[
-                EncoderClassesByName at:#unicode put:(unicodeEncoderClasses := Dictionary new).
+                self encoderClassesByName at:#unicode put:(unicodeEncoderClasses := Dictionary new).
             ].
             clsName := unicodeEncoderClasses at:name ifAbsent:nil.
         ].
@@ -345,13 +345,13 @@
     "/ no direct encoder from unicode->name
     "/ search for unicode->any and: any->name
     AccessLock critical:[
-        unicodeEncoderClasses := EncoderClassesByName at:#unicode ifAbsent:nil.
+        unicodeEncoderClasses := self encoderClassesByName at:#unicode ifAbsent:nil.
     ].
     unicodeEncoderClasses keysAndValuesDo:[:eachEncodingAlias :eachEncoderClass |
         |dict2 enc1 enc2|
 
         AccessLock critical:[
-            dict2 := EncoderClassesByName at:eachEncodingAlias ifAbsent:nil.
+            dict2 := self encoderClassesByName at:eachEncodingAlias ifAbsent:nil.
         ].
         dict2 notNil ifTrue:[
             clsName := dict2 at:name ifAbsent:nil.
@@ -376,13 +376,13 @@
         ].
     ].
 
-    EncoderClassesByName keysAndValuesDo:[:encoding1 :dict1 |
+    self encoderClassesByName keysAndValuesDo:[:encoding1 :dict1 |
         dict1 keysAndValuesDo:[:encoding2 :clsName1|
             |clsName2 cls1 cls2 dict2 enc1 enc2|
 
             encoding2 = encodingNameSymbol ifTrue:[
                 AccessLock critical:[
-                    dict2 := EncoderClassesByName at:#unicode.
+                    dict2 := self encoderClassesByName at:#unicode.
                 ].
                 clsName2 := dict2 at:encoding1 ifAbsent:nil.
                 clsName2 notNil ifTrue:[
@@ -471,9 +471,9 @@
         ].
         encoder := encoders at:newEncodingArg ifAbsent:nil.
         encoder isNil ifTrue:[
-            encoderClasses := EncoderClassesByName at:oldEncoding ifAbsent:nil.
+            encoderClasses := self encoderClassesByName at:oldEncoding ifAbsent:nil.
             encoderClasses isNil ifTrue:[
-                EncoderClassesByName at:oldEncoding put:(encoderClasses := Dictionary new).
+                self encoderClassesByName at:oldEncoding put:(encoderClasses := Dictionary new).
             ].
             clsName := encoderClasses at:newEncoding ifAbsent:nil.
             clsName notNil ifTrue:[
@@ -549,17 +549,46 @@
 
 !CharacterEncoder class methodsFor:'class initialization'!
 
+encoderClassesByName
+    EncoderClassesByName isNil ifTrue:[
+        self initializeEncoderClassesByName
+    ].
+    ^ EncoderClassesByName    
+!
+
 initialize
-    |ud|
-
     AccessLock notNil ifTrue:[^ self].  "/ already initialized
 
     AccessLock := RecursionLock new name:'CharacterEncoder'.
     NullEncoderInstance := NullEncoder new.
 
     EncodersByName := Dictionary new.
+    CachedEncoders := Dictionary new.
+
+    self initializeEncoderClassesByName.
+
+    OperatingSystem isUNIXlike ifTrue:[
+        "/Initialize OS system encoder
+        OperatingSystem getCodesetEncoder.
+    ].
+
+    "
+     self initialize
+    "
+
+    "Modified: / 01-04-2011 / 14:30:06 / cg"
+    "Modified (format): / 23-01-2013 / 09:56:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+initializeEncoderClassesByName
+    "initialize the dictionary which maps commonly used names
+     to encoder classes. 
+     This is done, because some encodings come along
+     with different names"
+
+    |ud|
+
     EncoderClassesByName := Dictionary new.
-    CachedEncoders := Dictionary new.
 
     EncoderClassesByName at:#'unicode' put:(ud := Dictionary new).
     ud at:#'fontspecific' put:NullEncoder.    
@@ -717,11 +746,6 @@
         ].
     ].
 
-    OperatingSystem isUNIXlike ifTrue:[
-        "/Initialize OS system encoder
-        OperatingSystem getCodesetEncoder.
-    ].
-
     "
      self initialize
     "
@@ -1715,11 +1739,11 @@
 !CharacterEncoder class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.138 2015-03-26 16:21:01 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.139 2015-04-29 11:21:18 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.138 2015-03-26 16:21:01 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.139 2015-04-29 11:21:18 cg Exp $'
 ! !