Skip to content

Commit ed96030

Browse files
committed
Fix number conversion for * format specifier
1 parent 827e455 commit ed96030

File tree

1 file changed

+17
-12
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/formatting

1 file changed

+17
-12
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/formatting/FormatProcessor.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INDEX__;
1010
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INT__;
1111
import static com.oracle.graal.python.runtime.exception.PythonErrorType.MemoryError;
12+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError;
1213
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
1314
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
1415

@@ -18,7 +19,6 @@
1819

1920
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
2021
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
21-
import com.oracle.graal.python.builtins.objects.floats.PFloat;
2222
import com.oracle.graal.python.builtins.objects.function.PKeyword;
2323
import com.oracle.graal.python.builtins.objects.ints.PInt;
2424
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
@@ -32,6 +32,7 @@
3232
import com.oracle.graal.python.runtime.PythonCore;
3333
import com.oracle.graal.python.runtime.exception.PException;
3434
import com.oracle.graal.python.runtime.formatting.InternalFormat.Spec;
35+
import com.oracle.graal.python.util.OverflowException;
3536
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
3637

3738
/**
@@ -126,21 +127,25 @@ Object getArg() {
126127
int getNumber() {
127128
char c = pop();
128129
if (c == '*') {
130+
long value;
129131
Object o = getArg();
130-
if (o instanceof Long) {
131-
return ((Long) o).intValue();
132-
} else if (o instanceof Integer) {
132+
if (o instanceof Integer) {
133133
return (int) o;
134+
} else if (o instanceof Long) {
135+
value = (long) o;
134136
} else if (o instanceof PInt) {
135-
return ((PInt) o).intValue();
136-
} else if (o instanceof Double) {
137-
return ((Double) o).intValue();
138-
} else if (o instanceof Boolean) {
139-
return (Boolean) o ? 1 : 0;
140-
} else if (o instanceof PFloat) {
141-
return (int) ((PFloat) o).getValue();
137+
try {
138+
return ((PInt) o).intValueExact();
139+
} catch (OverflowException e) {
140+
value = Long.MAX_VALUE;
141+
}
142+
} else {
143+
throw core.raise(TypeError, ErrorMessages.STAR_WANTS_INT);
144+
}
145+
if (value > Integer.MAX_VALUE) {
146+
throw core.raise(OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "size");
142147
}
143-
throw core.raise(TypeError, ErrorMessages.STAR_WANTS_INT);
148+
return (int) value;
144149
} else {
145150
if (Character.isDigit(c)) {
146151
int numStart = index - 1;

0 commit comments

Comments
 (0)