From: Illya Yalovyy Date: Sun, 26 May 2019 03:44:13 +0000 (-0700) Subject: math/big: fast path for Cmp if same X-Git-Tag: go1.14beta1~1311 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=be452cea422114160e192625ac11e83c0fd2b9e3;p=gostls13.git math/big: fast path for Cmp if same math/big.Int Cmp method does not have a fast path for the case if x and y are the same. Fixes #30856 Change-Id: Ia9a5b5f72db9d73af1b13ed6ac39ecff87d10393 Reviewed-on: https://go-review.googlesource.com/c/go/+/178957 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- diff --git a/src/math/big/int.go b/src/math/big/int.go index 8e52f0ab27..23221c083d 100644 --- a/src/math/big/int.go +++ b/src/math/big/int.go @@ -323,6 +323,8 @@ func (x *Int) Cmp(y *Int) (r int) { // (-x) cmp y == y // (-x) cmp (-y) == -(x cmp y) switch { + case x == y: + // nothing to do case x.neg == y.neg: r = x.abs.cmp(y.abs) if x.neg { diff --git a/src/math/big/int_test.go b/src/math/big/int_test.go index ade973b207..da12a4b001 100644 --- a/src/math/big/int_test.go +++ b/src/math/big/int_test.go @@ -1071,6 +1071,20 @@ func TestCmpAbs(t *testing.T) { } } +func TestIntCmpSelf(t *testing.T) { + for _, s := range cmpAbsTests { + x, ok := new(Int).SetString(s, 0) + if !ok { + t.Fatalf("SetString(%s, 0) failed", s) + } + got := x.Cmp(x) + want := 0 + if got != want { + t.Errorf("x = %s: x.Cmp(x): got %d; want %d", x, got, want) + } + } +} + var int64Tests = []string{ // int64 "0",