]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] go/types: adjust importer to match compiler importer
authorRob Findley <rfindley@google.com>
Tue, 9 Feb 2021 02:53:29 +0000 (21:53 -0500)
committerRobert Findley <rfindley@google.com>
Tue, 9 Feb 2021 14:15:43 +0000 (14:15 +0000)
This is an exact port of CL 288632 to go/types.

Change-Id: Ie46e13355bdd0713b392e042844bab8491a16504
Reviewed-on: https://go-review.googlesource.com/c/go/+/290629
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/go/internal/gcimporter/iimport.go

index c59dd16533173506db93882e8c14c7f10b9950e4..a3184e7641aa01d793275a4daca78ae59f47eef1 100644 (file)
@@ -15,6 +15,7 @@ import (
        "go/token"
        "go/types"
        "io"
+       "math/big"
        "sort"
 )
 
@@ -320,7 +321,9 @@ func (r *importReader) value() (typ types.Type, val constant.Value) {
                val = constant.MakeString(r.string())
 
        case types.IsInteger:
-               val = r.mpint(b)
+               var x big.Int
+               r.mpint(&x, b)
+               val = constant.Make(&x)
 
        case types.IsFloat:
                val = r.mpfloat(b)
@@ -365,8 +368,8 @@ func intSize(b *types.Basic) (signed bool, maxBytes uint) {
        return
 }
 
-func (r *importReader) mpint(b *types.Basic) constant.Value {
-       signed, maxBytes := intSize(b)
+func (r *importReader) mpint(x *big.Int, typ *types.Basic) {
+       signed, maxBytes := intSize(typ)
 
        maxSmall := 256 - maxBytes
        if signed {
@@ -385,7 +388,8 @@ func (r *importReader) mpint(b *types.Basic) constant.Value {
                                v = ^v
                        }
                }
-               return constant.MakeInt64(v)
+               x.SetInt64(v)
+               return
        }
 
        v := -n
@@ -395,39 +399,23 @@ func (r *importReader) mpint(b *types.Basic) constant.Value {
        if v < 1 || uint(v) > maxBytes {
                errorf("weird decoding: %v, %v => %v", n, signed, v)
        }
-
-       buf := make([]byte, v)
-       io.ReadFull(&r.declReader, buf)
-
-       // convert to little endian
-       // TODO(gri) go/constant should have a more direct conversion function
-       //           (e.g., once it supports a big.Float based implementation)
-       for i, j := 0, len(buf)-1; i < j; i, j = i+1, j-1 {
-               buf[i], buf[j] = buf[j], buf[i]
-       }
-
-       x := constant.MakeFromBytes(buf)
+       b := make([]byte, v)
+       io.ReadFull(&r.declReader, b)
+       x.SetBytes(b)
        if signed && n&1 != 0 {
-               x = constant.UnaryOp(token.SUB, x, 0)
+               x.Neg(x)
        }
-       return x
 }
 
-func (r *importReader) mpfloat(b *types.Basic) constant.Value {
-       x := r.mpint(b)
-       if constant.Sign(x) == 0 {
-               return x
-       }
-
-       exp := r.int64()
-       switch {
-       case exp > 0:
-               x = constant.Shift(x, token.SHL, uint(exp))
-       case exp < 0:
-               d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp))
-               x = constant.BinaryOp(x, token.QUO, d)
+func (r *importReader) mpfloat(typ *types.Basic) constant.Value {
+       var mant big.Int
+       r.mpint(&mant, typ)
+       var f big.Float
+       f.SetInt(&mant)
+       if f.Sign() != 0 {
+               f.SetMantExp(&f, int(r.int64()))
        }
-       return x
+       return constant.Make(&f)
 }
 
 func (r *importReader) ident() string {