Skip to content

Commit 568927b

Browse files
committed
[GR-33232] Intrinsify libgraalpython/_codecs.
PullRequest: graalpython/1936
2 parents 3e78b95 + 1c4afc6 commit 568927b

File tree

9 files changed

+715
-353
lines changed

9 files changed

+715
-353
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_codecs.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,16 @@ def test_errors(self):
268268
self.assertRaises(ValueError, decode, br"[\x0]")
269269
self.assertEqual(decode(br"[\x0]\x0", "ignore"), (b"[]", 8))
270270
self.assertEqual(decode(br"[\x0]\x0", "replace"), (b"[?]?", 8))
271+
272+
class LookupTest(unittest.TestCase):
273+
def test_lookup(self):
274+
self.assertEqual(codecs.lookup('UTF-8').name, "utf-8")
275+
276+
def test_lookup_error(self):
277+
def errhandler():
278+
pass
279+
self.assertRaises(TypeError, codecs.register_error, 1)
280+
self.assertRaises(TypeError, codecs.register_error, 'a', 1)
281+
self.assertRaises(LookupError, codecs.lookup_error, 'a')
282+
codecs.register_error('testhandler', errhandler)
283+
self.assertEqual(codecs.lookup_error('testhandler'), errhandler)

graalpython/com.oracle.graal.python.test/src/tests/test_tagged_unittests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def run_serialize_out(cmd):
108108
if append_out:
109109
message += LINE + "\n"
110110
message += "output:\n"
111-
message += result.stdout.decode('ascii')
111+
message += result.stdout.decode('utf-8')
112112
message += LINE + "\n"
113113
print(message)
114114
if result.returncode:

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@
1414
*graalpython.lib-python.3.test.test_locale.TestCDelocalizeTest.test_delocalize
1515
*graalpython.lib-python.3.test.test_locale.TestCNumberFormatting.test_grouping
1616
*graalpython.lib-python.3.test.test_locale.TestCNumberFormatting.test_grouping_and_padding
17-
*graalpython.lib-python.3.test.test_locale.TestEnUSCollation.test_strcoll
18-
*graalpython.lib-python.3.test.test_locale.TestEnUSCollation.test_strcoll_with_diacritic
19-
*graalpython.lib-python.3.test.test_locale.TestEnUSCollation.test_strxfrm
20-
*graalpython.lib-python.3.test.test_locale.TestEnUSCollation.test_strxfrm_with_diacritic
2117
*graalpython.lib-python.3.test.test_locale.TestEnUSDelocalize.test_atof
2218
*graalpython.lib-python.3.test.test_locale.TestEnUSDelocalize.test_atoi
2319
*graalpython.lib-python.3.test.test_locale.TestEnUSDelocalize.test_delocalize

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,10 @@
243243
import com.oracle.graal.python.builtins.objects.type.TypeBuiltins;
244244
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
245245
import com.oracle.graal.python.builtins.objects.zipimporter.ZipImporterBuiltins;
246+
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
246247
import com.oracle.graal.python.nodes.BuiltinNames;
247248
import com.oracle.graal.python.nodes.call.GenericInvokeNode;
249+
import com.oracle.graal.python.nodes.statement.AbstractImportNode;
248250
import com.oracle.graal.python.runtime.PythonCodeSerializer;
249251
import com.oracle.graal.python.runtime.PythonContext;
250252
import com.oracle.graal.python.runtime.PythonOptions;
@@ -301,7 +303,9 @@ private static String[] initializeCoreFiles() {
301303
"base_exception",
302304
PythonCextBuiltins.PYTHON_CEXT,
303305
"_collections",
304-
"_codecs",
306+
// TODO: see the encodings initialization before _codecs_truffle.py is
307+
// loaded in initializePython3Core;
308+
// once _codecs_truffle.py is gone, it should not be necessary
305309
"_codecs_truffle",
306310
"bytes",
307311
"bytearray",
@@ -654,11 +658,26 @@ private void initializeJavaCore() {
654658
private void initializePython3Core(String coreHome) {
655659
loadFile(BuiltinNames.BUILTINS, coreHome);
656660
for (String s : coreFiles) {
661+
// TODO: once _codecs_truffle.py is gone, this should not be necessary
662+
if (s.equals("_codecs_truffle")) {
663+
importEncoding();
664+
}
657665
loadFile(s, coreHome);
658666
}
659667
initialized = true;
660668
}
661669

670+
private void importEncoding() {
671+
PythonModule sys = lookupBuiltinModule("sys");
672+
Object sysPath = sys.getAttribute("path");
673+
PyObjectCallMethodObjArgs.getUncached().execute(null, sysPath, "insert", 0, getContext().getStdlibHome());
674+
try {
675+
AbstractImportNode.importModule("encodings");
676+
} finally {
677+
PyObjectCallMethodObjArgs.getUncached().execute(null, sysPath, "pop");
678+
}
679+
}
680+
662681
/**
663682
* Run post-initialization code that needs a fully working Python environment. This will be run
664683
* eagerly when the context is initialized on the JVM or a new context is created on SVM, but is

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

Lines changed: 659 additions & 2 deletions
Large diffs are not rendered by default.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/BuiltinNames.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public abstract class BuiltinNames {
140140
public static final String SET = "set";
141141
public static final String BUILTINS = "builtins";
142142
public static final String __GRAALPYTHON__ = "__graalpython__";
143+
public static final String _CODECS = "_codecs";
143144
public static final String GETSET_DESCRIPTOR = "getset_descriptor";
144145
public static final String MEMBER_DESCRIPTOR = "member_descriptor";
145146
public static final String SIMPLE_QUEUE = "SimpleQueue";

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public abstract class ErrorMessages {
5757
public static final String ARG_MUST_BE_S_NOT_P = "%s argument must be a %s, not %p";
5858
public static final String S_BRACKETS_ARG_MUST_BE_S_NOT_P = "%s() argument must be a %s, not %p";
5959
public static final String S_BRACKETS_ARG_MUST_BE_READ_WRITE_BYTES_LIKE_NOT_P = "%s() argument must be read-write bytes-like object, not %p";
60+
public static final String ARG_MUST_BE_CALLABLE = "argument must be callable";
6061
public static final String ARG_MUST_BE_STRING_OR_BYTELIKE_OR_NUMBER = "%s argument must be a string, a bytes-like object or a number, not %p";
6162
public static final String ARG_MUST_BE_STRING_OR_NUMBER = "%s argument must be a string or a number, not '%p'";
6263
public static final String ARG_MUST_NOT_BE_ZERO = "%s arg %d must not be zero";
@@ -187,6 +188,7 @@ public abstract class ErrorMessages {
187188
public static final String MUST_BE_SET_TO_S_NOT_P = "%s must be set to a %s, not a '%p'";
188189
public static final String CLASSPATH_ARG_MUST_BE_STRING = "classpath argument %d must be string, not %p";
189190
public static final String CODE_OBJ_NO_FREE_VARIABLES = "code object passed to %s may not contain free variables";
191+
public static final String CODEC_SEARCH_MUST_RETURN_4 = "codec search functions must return 4-tuples";
190192
public static final String COMPILE_MUST_BE = "compile() mode must be 'exec', 'eval' or 'single'";
191193
public static final String COMPLEX_ARG_IS_MALFORMED_STR = "complex() arg is a malformed string";
192194
public static final String COMPLEX_CANT_TAKE_ARG = "complex() can't take second arg if first is a string";
@@ -277,6 +279,7 @@ public abstract class ErrorMessages {
277279
public static final String GOT_MULTIPLE_VALUES_FOR_ARG = "%s() got multiple values for keyword argument '%s'";
278280
public static final String GOT_SOME_POS_ONLY_ARGS_PASSED_AS_KEYWORD = "%s() got some positional-only arguments passed as keyword arguments: '%s'";
279281
public static final String GOT_UNEXPECTED_KEYWORD_ARG = "%s() got an unexpected keyword argument '%s'";
282+
public static final String HANDLER_MUST_BE_CALLABLE = "handler must be callable";
280283
public static final String HAS_NO_ATTR = "%s has no attribute %s";
281284
public static final String HASH_SHOULD_RETURN_INTEGER = "__hash__ method should return an integer";
282285
public static final String HEX_VALUE_TOO_LARGE_AS_FLOAT = "hexadecimal value too large to represent as a float";
@@ -422,6 +425,7 @@ public abstract class ErrorMessages {
422425
public static final String MUST_BE_STRINGS_NOT_P = "%s must be strings, not %p";
423426
public static final String MUST_BE_TUPLE_OF_CLASSES_NOT_P = "%s.%s must be tuple of classes, not '%p'";
424427
public static final String MUST_RETURN_2TUPLE = "%p.__divmod__() must return a 2-tuple, not %p";
428+
public static final String S_MUST_RETURN_TUPLE = "%s must return a tuple (object, integer)";
425429
public static final String MUST_S_ITER_RETURN_2TUPLE = "%s iterator must return 2-tuples";
426430
public static final String S_MUST_RETURN_S_NOT_P = "%s must return a %s, not %p";
427431
public static final String S_MUST_RETURN_S_OR_S = "%s must return a %s or %s";

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import java.util.concurrent.atomic.AtomicLong;
5858
import java.util.concurrent.locks.ReentrantLock;
5959
import java.util.logging.Level;
60+
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
6061

6162
import org.graalvm.nativeimage.ImageInfo;
6263
import org.graalvm.options.OptionKey;
@@ -495,6 +496,22 @@ public Thread getOwner() {
495496
private final ChildContextData childContextData;
496497
private final SharedMultiprocessingData sharedMultiprocessingData;
497498

499+
private final List<Object> codecSearchPath = new ArrayList<>();
500+
private final Map<String, PTuple> codecSearchCache = new HashMap<>();
501+
private final Map<String, Object> codecErrorRegistry = new HashMap<>();
502+
503+
public List<Object> getCodecSearchPath() {
504+
return codecSearchPath;
505+
}
506+
507+
public Map<String, PTuple> getCodecSearchCache() {
508+
return codecSearchCache;
509+
}
510+
511+
public Map<String, Object> getCodecErrorRegistry() {
512+
return codecErrorRegistry;
513+
}
514+
498515
public static final class ChildContextData {
499516
private int exitCode = 0;
500517
private boolean signaled;

0 commit comments

Comments
 (0)