You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
1.0 KiB
35 lines
1.0 KiB
// Always use this implementation, even for Posix-compliant platforms
|
|
// (upstream code uses the implementation in int_posix64.go, but we
|
|
// do not want to depend on golang.olg/x.sys/unix package).
|
|
package starlark
|
|
|
|
// generic Int implementation as a union
|
|
|
|
import "math/big"
|
|
|
|
type intImpl struct {
|
|
// We use only the signed 32-bit range of small to ensure
|
|
// that small+small and small*small do not overflow.
|
|
small_ int64 // minint32 <= small <= maxint32
|
|
big_ *big.Int // big != nil <=> value is not representable as int32
|
|
}
|
|
|
|
// --- low-level accessors ---
|
|
|
|
// get returns the small and big components of the Int.
|
|
// small is defined only if big is nil.
|
|
// small is sign-extended to 64 bits for ease of subsequent arithmetic.
|
|
func (i Int) get() (small int64, big *big.Int) {
|
|
return i.impl.small_, i.impl.big_
|
|
}
|
|
|
|
// Precondition: math.MinInt32 <= x && x <= math.MaxInt32
|
|
func makeSmallInt(x int64) Int {
|
|
return Int{intImpl{small_: x}}
|
|
}
|
|
|
|
// Precondition: x cannot be represented as int32.
|
|
func makeBigInt(x *big.Int) Int {
|
|
return Int{intImpl{big_: x}}
|
|
}
|