Skip to content

Commit cb82feb

Browse files
committed
Add helpers to check if double or long fits in float or int
1 parent ede25fc commit cb82feb

File tree

4 files changed

+29
-19
lines changed

4 files changed

+29
-19
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
import com.oracle.graal.python.builtins.objects.cext.structs.CStructs;
9292
import com.oracle.graal.python.builtins.objects.floats.PFloat;
9393
import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorDeleteMarker;
94+
import com.oracle.graal.python.builtins.objects.ints.PInt;
9495
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
9596
import com.oracle.graal.python.builtins.objects.object.PythonObject;
9697
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
@@ -920,15 +921,12 @@ public static long stubToPointer(long stubPointer) {
920921
return stubPointer | HANDLE_TAG_BIT;
921922
}
922923

923-
public static long intToPointer(long value) {
924-
assert value == (int) value;
925-
return (value << 3) & _35BIT_MASK | HANDLE_TAG_BIT | INTEGER_TAG_BIT;
924+
public static long intToPointer(int value) {
925+
return ((long) value << 3) & _35BIT_MASK | HANDLE_TAG_BIT | INTEGER_TAG_BIT;
926926
}
927927

928-
public static long floatToPointer(double value) {
929-
float f = (float) value;
930-
assert !Double.isFinite(value) || f == value;
931-
long rawFloatBits = Float.floatToRawIntBits(f);
928+
public static long floatToPointer(float value) {
929+
long rawFloatBits = Float.floatToRawIntBits(value);
932930
return (rawFloatBits << 3) & _35BIT_MASK | HANDLE_TAG_BIT | FLOAT_TAG_BIT;
933931
}
934932

@@ -977,15 +975,15 @@ static long doPrimitiveNativeWrapper(Node inliningTarget, PrimitiveNativeWrapper
977975
} else if (wrapper.isInt()) {
978976
return HandlePointerConverter.intToPointer(wrapper.getInt());
979977
} else if (wrapper.isLong()) {
980-
if ((int) wrapper.getLong() == wrapper.getLong()) {
981-
return HandlePointerConverter.intToPointer((int) wrapper.getLong());
978+
long value = wrapper.getLong();
979+
if (PInt.fitsInInt(value)) {
980+
return HandlePointerConverter.intToPointer((int) value);
982981
}
983982
type = PythonBuiltinClassType.PInt;
984983
} else if (isFloat) {
985984
double d = wrapper.getDouble();
986-
float f = (float) d;
987-
if (!Double.isFinite(d) || f == d) {
988-
return HandlePointerConverter.floatToPointer(wrapper.getDouble());
985+
if (PFloat.fitsInFloat(d)) {
986+
return HandlePointerConverter.floatToPointer((float) d);
989987
}
990988
type = PythonBuiltinClassType.PFloat;
991989
} else {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/GetNativeWrapperNode.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
5252
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper;
5353
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.HandlePointerConverter;
54+
import com.oracle.graal.python.builtins.objects.floats.PFloat;
5455
import com.oracle.graal.python.builtins.objects.cext.capi.PythonObjectNativeWrapper;
5556
import com.oracle.graal.python.builtins.objects.cext.capi.TruffleObjectNativeWrapper;
5657
import com.oracle.graal.python.builtins.objects.ints.PInt;
@@ -110,23 +111,22 @@ static PythonAbstractObjectNativeWrapper doBoolean(boolean b,
110111
}
111112

112113
@Specialization
113-
static Object doInt(int l) {
114-
return HandlePointerConverter.intToPointer(l);
114+
static Object doInt(int i) {
115+
return HandlePointerConverter.intToPointer(i);
115116
}
116117

117118
@Specialization
118119
static Object doLong(long l) {
119-
if (l == (int) l) {
120-
return HandlePointerConverter.intToPointer(l);
120+
if (PInt.fitsInInt(l)) {
121+
return HandlePointerConverter.intToPointer((int) l);
121122
}
122123
return PrimitiveNativeWrapper.createLong(l);
123124
}
124125

125126
@Specialization
126127
static Object doDouble(double d) {
127-
float f = (float) d;
128-
if (!Double.isFinite(d) || f == d) {
129-
return HandlePointerConverter.floatToPointer(d);
128+
if (PFloat.fitsInFloat(d)) {
129+
return HandlePointerConverter.floatToPointer((float) d);
130130
}
131131
return PrimitiveNativeWrapper.createDouble(d);
132132
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/PFloat.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,10 @@ boolean fitsInLong(@CachedLibrary("this.value") InteropLibrary interop) {
162162
long asLong(@CachedLibrary("this.value") InteropLibrary interop) throws UnsupportedMessageException {
163163
return interop.asLong(value);
164164
}
165+
166+
@Ignore
167+
public static boolean fitsInFloat(double d) {
168+
float f = (float) d;
169+
return !Double.isFinite(d) || f == d;
170+
}
165171
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/PInt.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,4 +703,10 @@ public static Object createPythonIntFromUnsignedLong(Node inliningTarget, Python
703703
private static BigInteger longToUnsignedBigInt(long l) {
704704
return BigInteger.valueOf(l >>> 32).shiftLeft(32).add(BigInteger.valueOf(l & 0xFFFFFFFFL));
705705
}
706+
707+
@Ignore
708+
public static boolean fitsInInt(long l) {
709+
int i = (int) l;
710+
return l == i;
711+
}
706712
}

0 commit comments

Comments
 (0)