Skip to content

Commit 388e872

Browse files
committed
Use full codec encode in bytes constructor
1 parent 0e6eea3 commit 388e872

File tree

4 files changed

+48
-38
lines changed

4 files changed

+48
-38
lines changed

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/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)")

0 commit comments

Comments
 (0)