Skip to content

Commit add18f6

Browse files
committed
Make sure that created string has correct class
1 parent 8fa92e1 commit add18f6

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_constructor_defaults
3434
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_constructor_keyword_args
3535
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_contains
36+
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_conversion
3637
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_count
3738
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_endswith
3839
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_expandtabs

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,6 +1843,7 @@ public abstract static class StrNode extends PythonBuiltinNode {
18431843

18441844
@CompilationFinal private ConditionProfile isStringProfile;
18451845
@CompilationFinal private ConditionProfile isPStringProfile;
1846+
@CompilationFinal private CastToJavaStringNode castToJavaStringNode;
18461847

18471848
public final Object executeWith(VirtualFrame frame, Object arg) {
18481849
return executeWith(frame, PythonBuiltinClassType.PString, arg, PNone.NO_VALUE, PNone.NO_VALUE);
@@ -1866,8 +1867,17 @@ Object strOneArg(Object strClass, Object obj, @SuppressWarnings("unused") PNone
18661867
return asPString(strClass, (String) result);
18671868
}
18681869

1869-
// PythonObjectLibrary guarantees that the returned object is an instanceof of 'str'
1870-
return result;
1870+
if (isPrimitiveProfile.profileClass(strClass, PythonBuiltinClassType.PString)) {
1871+
// PythonObjectLibrary guarantees that the returned object is an instanceof of 'str'
1872+
return result;
1873+
} else {
1874+
try {
1875+
return asPString(strClass, getCastToJavaStringNode().execute(result));
1876+
} catch (CannotCastException e) {
1877+
CompilerDirectives.transferToInterpreterAndInvalidate();
1878+
throw new IllegalStateException("asPstring result not castable to String");
1879+
}
1880+
}
18711881
}
18721882

18731883
@Specialization(guards = {"!isNativeClass(strClass)", "!isNoValue(encoding) || !isNoValue(errors)"}, limit = "3")
@@ -1947,6 +1957,14 @@ private ConditionProfile getIsPStringProfile() {
19471957
return isPStringProfile;
19481958
}
19491959

1960+
private CastToJavaStringNode getCastToJavaStringNode() {
1961+
if (castToJavaStringNode == null) {
1962+
CompilerDirectives.transferToInterpreterAndInvalidate();
1963+
castToJavaStringNode = insert(CastToJavaStringNode.create());
1964+
}
1965+
return castToJavaStringNode;
1966+
}
1967+
19501968
public static StrNode create() {
19511969
return BuiltinConstructorsFactory.StrNodeFactory.create(null);
19521970
}

0 commit comments

Comments
 (0)