Skip to content

Commit 2842740

Browse files
committed
Fix argument validation in sys.intern
1 parent c84c799 commit 2842740

File tree

4 files changed

+24
-6
lines changed

4 files changed

+24
-6
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,4 @@
4646
*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_original_unraisablehook
4747
*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_original_unraisablehook_err
4848
*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_original_unraisablehook_wrong_type
49+
*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_intern

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
4444
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
45+
import static com.oracle.graal.python.nodes.PGuards.cannotBeOverridden;
4546
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SIZEOF__;
4647

4748
import java.io.IOException;
@@ -69,6 +70,7 @@
6970
import com.oracle.graal.python.builtins.objects.module.PythonModule;
7071
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
7172
import com.oracle.graal.python.builtins.objects.str.PString;
73+
import com.oracle.graal.python.builtins.objects.str.StringNodes.StringMaterializeNode;
7274
import com.oracle.graal.python.builtins.objects.traceback.GetTracebackNode;
7375
import com.oracle.graal.python.builtins.objects.traceback.LazyTraceback;
7476
import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
@@ -97,6 +99,7 @@
9799
import com.oracle.truffle.api.TruffleLanguage.Env;
98100
import com.oracle.truffle.api.dsl.Cached;
99101
import com.oracle.truffle.api.dsl.Cached.Shared;
102+
import com.oracle.truffle.api.dsl.Fallback;
100103
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
101104
import com.oracle.truffle.api.dsl.NodeFactory;
102105
import com.oracle.truffle.api.dsl.Specialization;
@@ -415,15 +418,24 @@ protected String getFileSystemEncoding() {
415418
abstract static class InternNode extends PythonBuiltinNode {
416419
@Specialization
417420
@TruffleBoundary
418-
String doBytes(String s) {
421+
String doString(String s) {
419422
return s.intern();
420423
}
421424

422-
@Specialization
423-
@TruffleBoundary
424-
PString doBytes(PString ps) {
425-
String s = ps.getValue();
426-
return factory().createString(s.intern());
425+
@Specialization(limit = "1")
426+
String doPString(PString ps,
427+
@CachedLibrary("ps") PythonObjectLibrary lib,
428+
@Cached StringMaterializeNode materializeNode) {
429+
if (cannotBeOverridden(lib.getLazyPythonClass(ps))) {
430+
return doString(materializeNode.execute(ps));
431+
} else {
432+
throw raise(TypeError, ErrorMessages.CANNOT_INTERN_P, ps);
433+
}
434+
}
435+
436+
@Fallback
437+
String doOthers(Object obj) {
438+
throw raise(TypeError, ErrorMessages.ARG_MUST_BE_S_NOT_P, "intern()", "str", obj);
427439
}
428440
}
429441

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,4 +576,5 @@ public abstract class ErrorMessages {
576576
public static final String KEYS_IN_TRANSLATE_TABLE_MUST_BE_STRINGS_OR_INTEGERS = "keys in translate table must be strings or integers";
577577
public static final String EXPECTED_BYTES_P_FOUND = "expected bytes, %p found";
578578
public static final String EMBEDDED_NULL_BYTE = "embedded null byte";
579+
public static final String CANNOT_INTERN_P = "can't intern %p";
579580
}

graalpython/lib-python/3/test/test_sys.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,10 @@ def test_intern(self):
533533
INTERN_NUMRUNS += 1
534534
self.assertRaises(TypeError, sys.intern)
535535
s = "never interned before" + str(INTERN_NUMRUNS)
536+
# GraalPython patch: added the following line
537+
# The docs does not seem to indicate that 'sys.intern(s) is s'
538+
# should hold in general unless 's' was already an interned string
539+
s = sys.intern(s)
536540
self.assertTrue(sys.intern(s) is s)
537541
s2 = s.swapcase().swapcase()
538542
self.assertTrue(sys.intern(s2) is s)

0 commit comments

Comments
 (0)