Skip to content

Commit e0ed0e9

Browse files
committed
[GR-33127] Various small fixes
PullRequest: graalpython/1946
2 parents 64749de + 7202c64 commit e0ed0e9

File tree

14 files changed

+164
-65
lines changed

14 files changed

+164
-65
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_faulthandler.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_register_fd
1616
*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_register_file
1717
*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_register_threads
18-
*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_sigbus
19-
*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_sigill
2018
*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_stack_overflow
2119
*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_sys_xoptions
2220
*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_unregister

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,19 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules;
4242

43+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.NotImplementedError;
4344
import static com.oracle.graal.python.builtins.objects.bytes.BytesUtils.HEXDIGITS;
4445
import static com.oracle.graal.python.builtins.objects.bytes.BytesUtils.digitValue;
4546
import static com.oracle.graal.python.nodes.BuiltinNames._CODECS;
47+
import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_BE_CALLABLE;
4648
import static com.oracle.graal.python.nodes.ErrorMessages.BYTESLIKE_OBJ_REQUIRED;
49+
import static com.oracle.graal.python.nodes.ErrorMessages.CODEC_SEARCH_MUST_RETURN_4;
4750
import static com.oracle.graal.python.nodes.ErrorMessages.ENCODING_ERROR_WITH_CODE;
4851
import static com.oracle.graal.python.nodes.ErrorMessages.HANDLER_MUST_BE_CALLABLE;
4952
import static com.oracle.graal.python.nodes.ErrorMessages.INVALID_ESCAPE_AT;
53+
import static com.oracle.graal.python.nodes.ErrorMessages.S_MUST_RETURN_TUPLE;
54+
import static com.oracle.graal.python.nodes.ErrorMessages.UNKNOWN_ENCODING;
55+
import static com.oracle.graal.python.nodes.ErrorMessages.UNKNOWN_ERROR_HANDLER;
5056
import static com.oracle.graal.python.runtime.exception.PythonErrorType.LookupError;
5157
import static com.oracle.graal.python.runtime.exception.PythonErrorType.MemoryError;
5258
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
@@ -66,7 +72,6 @@
6672
import com.oracle.graal.python.annotations.ArgumentClinic;
6773
import com.oracle.graal.python.builtins.Builtin;
6874
import com.oracle.graal.python.builtins.CoreFunctions;
69-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.NotImplementedError;
7075
import com.oracle.graal.python.builtins.PythonBuiltins;
7176
import com.oracle.graal.python.builtins.objects.PNone;
7277
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
@@ -86,11 +91,7 @@
8691
import com.oracle.graal.python.lib.PyCallableCheckNode;
8792
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
8893
import com.oracle.graal.python.nodes.ErrorMessages;
89-
import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_BE_CALLABLE;
90-
import static com.oracle.graal.python.nodes.ErrorMessages.CODEC_SEARCH_MUST_RETURN_4;
91-
import static com.oracle.graal.python.nodes.ErrorMessages.S_MUST_RETURN_TUPLE;
92-
import static com.oracle.graal.python.nodes.ErrorMessages.UNKNOWN_ENCODING;
93-
import static com.oracle.graal.python.nodes.ErrorMessages.UNKNOWN_ERROR_HANDLER;
94+
import com.oracle.graal.python.nodes.PNodeWithRaise;
9495
import com.oracle.graal.python.nodes.PRaiseNode;
9596
import com.oracle.graal.python.nodes.call.CallNode;
9697
import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode;
@@ -477,21 +478,11 @@ public static HandleDecodingErrorNode create() {
477478
}
478479
}
479480

480-
// _codecs.encode(obj, encoding='utf-8', errors='strict')
481-
@Builtin(name = "__truffle_encode__", minNumOfPositionalArgs = 1, parameterNames = {"obj", "encoding", "errors"})
482-
@ArgumentClinic(name = "encoding", conversion = ArgumentClinic.ClinicConversion.String, defaultValue = "\"utf-8\"", useDefaultForNone = true)
483-
@ArgumentClinic(name = "errors", conversion = ArgumentClinic.ClinicConversion.String, defaultValue = "\"strict\"", useDefaultForNone = true)
484-
@GenerateNodeFactory
485-
public abstract static class CodecsEncodeNode extends PythonTernaryClinicBuiltinNode {
486-
public abstract Object execute(Object str, Object encoding, Object errors);
487-
488-
@Override
489-
protected ArgumentClinicProvider getArgumentClinic() {
490-
return CodecsModuleBuiltinsClinicProviders.CodecsEncodeNodeClinicProviderGen.INSTANCE;
491-
}
481+
public abstract static class CodecsEncodeToJavaBytesNode extends PNodeWithRaise {
482+
public abstract byte[] execute(Object self, String encoding, String errors);
492483

493-
@Specialization(guards = {"isString(self)"})
494-
Object encode(Object self, String encoding, String errors,
484+
@Specialization
485+
byte[] encode(Object self, String encoding, String errors,
495486
@Cached CastToJavaStringNode castStr,
496487
@Cached HandleEncodingErrorNode errorHandler) {
497488
String input = castStr.execute(self);
@@ -510,7 +501,29 @@ Object encode(Object self, String encoding, String errors,
510501
CompilerDirectives.transferToInterpreterAndInvalidate();
511502
throw raise(MemoryError);
512503
}
513-
PBytes bytes = factory().createBytes(encoder.getBytes());
504+
return encoder.getBytes();
505+
}
506+
}
507+
508+
// _codecs.encode(obj, encoding='utf-8', errors='strict')
509+
@Builtin(name = "__truffle_encode__", minNumOfPositionalArgs = 1, parameterNames = {"obj", "encoding", "errors"})
510+
@ArgumentClinic(name = "encoding", conversion = ArgumentClinic.ClinicConversion.String, defaultValue = "\"utf-8\"", useDefaultForNone = true)
511+
@ArgumentClinic(name = "errors", conversion = ArgumentClinic.ClinicConversion.String, defaultValue = "\"strict\"", useDefaultForNone = true)
512+
@GenerateNodeFactory
513+
public abstract static class CodecsEncodeNode extends PythonTernaryClinicBuiltinNode {
514+
public abstract Object execute(Object str, Object encoding, Object errors);
515+
516+
@Override
517+
protected ArgumentClinicProvider getArgumentClinic() {
518+
return CodecsModuleBuiltinsClinicProviders.CodecsEncodeNodeClinicProviderGen.INSTANCE;
519+
}
520+
521+
@Specialization(guards = {"isString(self)"})
522+
Object encode(Object self, String encoding, String errors,
523+
@Cached CastToJavaStringNode castStr,
524+
@Cached CodecsEncodeToJavaBytesNode encode) {
525+
String input = castStr.execute(self);
526+
PBytes bytes = factory().createBytes(encode.execute(self, encoding, errors));
514527
return factory().createTuple(new Object[]{bytes, input.length()});
515528
}
516529

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,17 @@
4141

4242
package com.oracle.graal.python.builtins.modules;
4343

44+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
45+
4446
import java.math.BigInteger;
4547
import java.util.List;
4648

4749
import com.oracle.graal.python.builtins.Builtin;
4850
import com.oracle.graal.python.builtins.CoreFunctions;
4951
import com.oracle.graal.python.builtins.PythonBuiltins;
5052
import com.oracle.graal.python.builtins.objects.PNone;
53+
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
54+
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
5155
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
5256
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
5357
import com.oracle.graal.python.builtins.objects.dict.PDict;
@@ -60,6 +64,8 @@
6064
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
6165
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6266
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
67+
import com.oracle.graal.python.nodes.util.CannotCastException;
68+
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
6369
import com.oracle.graal.python.runtime.sequence.PSequence;
6470
import com.oracle.truffle.api.CompilerDirectives;
6571
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -70,6 +76,7 @@
7076
import com.oracle.truffle.api.dsl.Specialization;
7177
import com.oracle.truffle.api.dsl.TypeSystemReference;
7278
import com.oracle.truffle.api.frame.VirtualFrame;
79+
import com.oracle.truffle.api.library.CachedLibrary;
7380

7481
@CoreFunctions(defineModule = OperatorModuleBuiltins.MODULE_NAME)
7582
public class OperatorModuleBuiltins extends PythonBuiltins {
@@ -174,10 +181,60 @@ public Object doObject(VirtualFrame frame, Object value, Object index,
174181
public abstract static class CompareDigestNode extends PythonBinaryBuiltinNode {
175182

176183
@Specialization
177-
public boolean doString(String arg1, String arg2) {
178-
return arg1.equals(arg2);
184+
public boolean compare(Object left, Object right,
185+
@Cached CastToJavaStringNode cast,
186+
@CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferAcquireLib,
187+
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib) {
188+
try {
189+
String leftString = cast.execute(left);
190+
String rightString = cast.execute(right);
191+
return tscmp(leftString, rightString);
192+
} catch (CannotCastException e) {
193+
if (!bufferAcquireLib.hasBuffer(left) || !bufferAcquireLib.hasBuffer(right)) {
194+
throw raise(TypeError, "unsupported operand types(s) or combination of types: '%p' and '%p'", left, right);
195+
}
196+
Object leftBuffer = bufferAcquireLib.acquireReadonly(left);
197+
try {
198+
Object rightBuffer = bufferAcquireLib.acquireReadonly(right);
199+
try {
200+
return tscmp(bufferLib.getCopiedByteArray(leftBuffer), bufferLib.getCopiedByteArray(rightBuffer));
201+
} finally {
202+
bufferLib.release(rightBuffer);
203+
}
204+
} finally {
205+
bufferLib.release(leftBuffer);
206+
}
207+
}
179208
}
180209

210+
// Comparison that's safe against timing attacks
211+
@TruffleBoundary
212+
private static boolean tscmp(String leftIn, String right) {
213+
String left = leftIn;
214+
int result = 0;
215+
if (left.length() != right.length()) {
216+
left = right;
217+
result = 1;
218+
}
219+
for (int i = 0; i < left.length(); i++) {
220+
result |= left.charAt(i) ^ right.charAt(i);
221+
}
222+
return result == 0;
223+
}
224+
225+
@TruffleBoundary
226+
private static boolean tscmp(byte[] leftIn, byte[] right) {
227+
byte[] left = leftIn;
228+
int result = 0;
229+
if (left.length != right.length) {
230+
left = right;
231+
result = 1;
232+
}
233+
for (int i = 0; i < left.length; i++) {
234+
result |= left[i] ^ right[i];
235+
}
236+
return result == 0;
237+
}
181238
}
182239

183240
@Builtin(name = "index", minNumOfPositionalArgs = 1)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.oracle.graal.python.annotations.ArgumentClinic;
4949
import com.oracle.graal.python.builtins.Builtin;
5050
import com.oracle.graal.python.builtins.CoreFunctions;
51+
import com.oracle.graal.python.builtins.Python3Core;
5152
import com.oracle.graal.python.builtins.PythonBuiltins;
5253
import com.oracle.graal.python.builtins.objects.PNone;
5354
import com.oracle.graal.python.builtins.objects.ints.PInt;
@@ -64,7 +65,6 @@
6465
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
6566
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
6667
import com.oracle.graal.python.runtime.AsyncHandler;
67-
import com.oracle.graal.python.builtins.Python3Core;
6868
import com.oracle.graal.python.runtime.exception.PythonErrorType;
6969
import com.oracle.graal.python.util.OverflowException;
7070
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -345,7 +345,9 @@ final class Signals {
345345
static final String[] signalNames = new String[SIGMAX + 1];
346346

347347
static {
348-
for (String signal : new String[]{"HUP", "INT", "QUIT", "TRAP", "ABRT", "KILL", "ALRM", "TERM", "USR1", "USR2", "TTIN", "TTOUT", "VTALRM", "WINCH", "PWR", "LOST", "INFO", "TSTP"}) {
348+
for (String signal : new String[]{"ABRT", "ALRM", "BUS", "FPE", "HUP", "ILL", "INFO", "INT", "KILL", "LOST",
349+
"PIPE", "PWR", "QUIT", "SEGV", "SYS", "TERM", "TRAP", "TSTP", "TTIN", "TTOUT", "USR1", "USR2",
350+
"VTALRM", "WINCH"}) {
349351
try {
350352
int number = new sun.misc.Signal(signal).getNumber();
351353
if (number > SIGMAX) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,4 +668,12 @@ boolean doGeneric() {
668668
}
669669
}
670670

671+
@Builtin(name = "gettrace")
672+
@GenerateNodeFactory
673+
abstract static class GetTrace extends PythonBuiltinNode {
674+
@Specialization
675+
static Object gettrace() {
676+
return PNone.NONE;
677+
}
678+
}
671679
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@
107107
import com.oracle.graal.python.builtins.CoreFunctions;
108108
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
109109
import com.oracle.graal.python.builtins.PythonBuiltins;
110+
import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins;
110111
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins;
111112
import com.oracle.graal.python.builtins.modules.SysModuleBuiltins;
112113
import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins;
113114
import com.oracle.graal.python.builtins.objects.PNone;
114115
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
115-
import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltins;
116116
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
117117
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
118118
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
@@ -687,12 +687,13 @@ Object write(VirtualFrame frame, PFileIO self, Object data,
687687

688688
@Specialization(guards = {"!self.isClosed()", "self.isWritable()", "self.isUTF8Write()"})
689689
Object utf8write(VirtualFrame frame, PFileIO self, Object data,
690+
@Cached CodecsModuleBuiltins.CodecsEncodeToJavaBytesNode encode,
690691
@Shared("p") @Cached PosixModuleBuiltins.WriteNode posixWrite,
691692
@Cached CastToJavaStringNode castStr,
692693
@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib,
693694
@Shared("e") @Cached BranchProfile errorProfile,
694695
@Shared("g") @Cached GilNode gil) {
695-
byte[] bytes = BytesBuiltins.stringToByte(castStr.execute(data), "utf-8", STRICT, getRaiseNode());
696+
byte[] bytes = encode.execute(castStr.execute(data), "utf-8", STRICT);
696697
try {
697698
return posixWrite.write(self.getFD(), bytes, bytes.length, posixLib, errorProfile, gil);
698699
} catch (PosixSupportLibrary.PosixException e) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMUL__;
5555
import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError;
5656
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
57-
import static com.oracle.graal.python.runtime.exception.PythonErrorType.UnicodeEncodeError;
5857
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
5958

6059
import java.nio.ByteBuffer;
@@ -195,17 +194,6 @@ public static CodingErrorAction toCodingErrorAction(String errors, PythonBuiltin
195194
throw n.raise(PythonErrorType.LookupError, ErrorMessages.UNKNOWN_ERROR_HANDLER, errors);
196195
}
197196

198-
@CompilerDirectives.TruffleBoundary
199-
public static byte[] stringToByte(String source, String encoding, String error, PRaiseNode raiseNode) {
200-
String encodingName = encoding.equals("latin-1") ? "ISO-8859-1" : encoding;
201-
CodingErrorAction action = toCodingErrorAction(error, raiseNode);
202-
try {
203-
return doEncode(Charset.forName(encodingName), source, action);
204-
} catch (CharacterCodingException e) {
205-
throw raiseNode.raise(UnicodeEncodeError, "%m", e);
206-
}
207-
}
208-
209197
@CompilerDirectives.TruffleBoundary
210198
public static byte[] doEncode(Charset charset, String string, CodingErrorAction action) throws CharacterCodingException {
211199
CharsetEncoder encoder = charset.newEncoder();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.oracle.graal.python.annotations.ClinicConverterFactory;
5555
import com.oracle.graal.python.annotations.ClinicConverterFactory.ArgumentIndex;
5656
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
57+
import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins;
5758
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins;
5859
import com.oracle.graal.python.builtins.modules.SysModuleBuiltins;
5960
import com.oracle.graal.python.builtins.objects.PNone;
@@ -655,10 +656,17 @@ byte[] fromObject(VirtualFrame frame, Object source, @SuppressWarnings("unused")
655656
}
656657

657658
@Specialization(guards = {"isString(source)", "isString(encoding)"})
659+
byte[] fromString(Object source, Object encoding, @SuppressWarnings("unused") PNone errors,
660+
@Cached CastToJavaStringNode castStr,
661+
@Cached CodecsModuleBuiltins.CodecsEncodeToJavaBytesNode encodeNode) {
662+
return encodeNode.execute(source, castStr.execute(encoding), "strict");
663+
}
664+
665+
@Specialization(guards = {"isString(source)", "isString(encoding)", "isString(errors)"})
658666
byte[] fromString(Object source, Object encoding, Object errors,
659-
@Cached CastToJavaStringNode castStr) {
660-
String e = errors instanceof String ? (String) errors : "strict";
661-
return BytesBuiltins.stringToByte(castStr.execute(source), castStr.execute(encoding), e, getRaiseNode());
667+
@Cached CastToJavaStringNode castStr,
668+
@Cached CodecsModuleBuiltins.CodecsEncodeToJavaBytesNode encodeNode) {
669+
return encodeNode.execute(source, castStr.execute(encoding), castStr.execute(errors));
662670
}
663671

664672
@Specialization(guards = "isString(source)")

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import static com.oracle.graal.python.nodes.SpecialMethodNames.__MUL__;
4646
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NE__;
4747
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
48+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REVERSED__;
4849
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMUL__;
4950
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SETITEM__;
5051
import static com.oracle.graal.python.runtime.exception.PythonErrorType.MemoryError;
@@ -1005,7 +1006,6 @@ boolean doPList(VirtualFrame frame, PList left, PList right,
10051006
/**
10061007
* This is a fix for the bpo-38588 bug. See
10071008
* {@code test_list.py: ListTest.test_equal_operator_modifying_operand}
1008-
*
10091009
*/
10101010
@Specialization(guards = "isObjectStorage(left, right)")
10111011
boolean doPListObjectStorage(VirtualFrame frame, PList left, PList right,
@@ -1161,4 +1161,16 @@ static Object doGeneric(@SuppressWarnings("unused") Object self) {
11611161
return PNone.NONE;
11621162
}
11631163
}
1164+
1165+
@Builtin(name = __REVERSED__, minNumOfPositionalArgs = 1)
1166+
@GenerateNodeFactory
1167+
abstract static class ReverseNode extends PythonUnaryBuiltinNode {
1168+
@Specialization
1169+
Object reverse(PList self,
1170+
@Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode,
1171+
@Cached SequenceStorageNodes.LenNode lenNode) {
1172+
int len = lenNode.execute(getSequenceStorageNode.execute(self));
1173+
return factory().createSequenceReverseIterator(PythonBuiltinClassType.PReverseIterator, self, len);
1174+
}
1175+
}
11641176
}

0 commit comments

Comments
 (0)