]> Cypherpunks repositories - gostls13.git/commitdiff
exp/locale/collate: avoid double building in maketables.go. Also added check.
authorMarcel van Lohuizen <mpvl@golang.org>
Wed, 30 May 2012 15:47:56 +0000 (17:47 +0200)
committerMarcel van Lohuizen <mpvl@golang.org>
Wed, 30 May 2012 15:47:56 +0000 (17:47 +0200)
R=r
CC=golang-dev
https://golang.org/cl/6202063

src/pkg/exp/locale/collate/build/builder.go

index dfde8ac261e0f69af78d1675231a7a5d37b12287..4451361e4d97a9d47f87b67376ec3a2ba6200552 100644 (file)
@@ -22,6 +22,7 @@ import (
 // - trie valueBlocks are currently 100K. There are a lot of sparse blocks
 //   and many consecutive values with the same stride. This can be further
 //   compacted.
+// - compress secondary weights into 8 bits.
 
 // entry is used to keep track of a single entry in the collation element table
 // during building. Examples of entries can be found in the Default Unicode
@@ -69,6 +70,7 @@ type Builder struct {
        entry    []*entry
        t        *table
        err      error
+       built    bool
 }
 
 // NewBuilder returns a new Builder.
@@ -178,14 +180,16 @@ func (b *Builder) error(e error) {
 }
 
 func (b *Builder) build() (*table, error) {
-       b.t = &table{}
-
-       b.contractCJK()
-       b.simplify()            // requires contractCJK
-       b.processExpansions()   // requires simplify
-       b.processContractions() // requires simplify
-       b.buildTrie()           // requires process*
-
+       if !b.built {
+               b.built = true
+               b.t = &table{}
+
+               b.contractCJK()
+               b.simplify()            // requires contractCJK
+               b.processExpansions()   // requires simplify
+               b.processContractions() // requires simplify
+               b.buildTrie()           // requires process*
+       }
        if b.err != nil {
                return nil, b.err
        }
@@ -334,6 +338,9 @@ func convertLargeWeights(elems [][]int) (res [][]int, err error) {
                if p < firstLargePrimary {
                        continue
                }
+               if p > 0xFFFF {
+                       return elems, fmt.Errorf("found primary weight %X; should be <= 0xFFFF", p)
+               }
                if p >= illegalPrimary {
                        ce[0] = illegalOffset + p - illegalPrimary
                } else {