// 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}} }