Skip to content

Commit 32eff74

Browse files
committed
[GR-23280] Make test_builtin pass.
PullRequest: graalpython/1415
2 parents 18af870 + 85a08dd commit 32eff74

File tree

19 files changed

+228
-81
lines changed

19 files changed

+228
-81
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/parser/ParseWithArgumentsTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void testObjectMethods() throws Exception {
117117
public void testAbsGlobal() throws Exception {
118118
Source source = createSource("abs(arg1)");
119119
CallTarget target = context.getEnv().parsePublic(source, "arg1");
120-
assertEquals(10, target.call(-10));
120+
assertEquals(10, (int) target.call(-10));
121121
}
122122

123123
private static Source createSource(String code) {

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/runtime/PythonModuleTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,6 @@ public void mainModuleTest() {
112112
PythonModule builtins = (PythonModule) main.getAttribute(__BUILTINS__);
113113
PBuiltinMethod abs = (PBuiltinMethod) builtins.getAttribute(BuiltinNames.ABS);
114114
Object returned = callBuiltin(abs, -42);
115-
assertEquals(42, returned);
115+
assertEquals(42, (int) returned);
116116
}
117117
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,3 +625,12 @@ def test_suppress_implicit_chaining(self):
625625
self.assertIsNone(e.__context__.__context__)
626626
self.assertIsNone(e.__cause__)
627627
self.assertTrue(e.__suppress_context__)
628+
629+
def test_encoding_err(self):
630+
errMsg = ""
631+
try:
632+
class A: pass
633+
A.__name__ = '\udcdc'
634+
except UnicodeEncodeError as e:
635+
errMsg = str(e)
636+
assert len(errMsg) > 0

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ def test_uninitialized_slot(self):
5656
obj.world = "world"
5757
self.assertEqual(obj.world, "world")
5858

59+
def test_slots_must_be_identifiers(self):
60+
class C: __slots__ = ['a', '_1', '_', 'a1']
61+
with self.assertRaises(TypeError):
62+
class C: __slots__ = ['']
63+
class C: __slots__ = ['1']
64+
class C: __slots__ = ['1']
65+
class C: __slots__ = ['a$']
66+
67+
5968
def test_dict_and_weakref_are_listed_in_slots(self):
6069
class D: __slots__ = ['__dict__']
6170
self.assertEqual(tuple(D.__slots__), ('__dict__',))

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_abs
12
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_all
23
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_any
34
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_ascii
@@ -29,6 +30,7 @@
2930
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_import
3031
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_isinstance
3132
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_issubclass
33+
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_len
3234
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_map
3335
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_map_pickle
3436
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_max
@@ -37,10 +39,13 @@
3739
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_next
3840
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_oct
3941
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_open_default_encoding
42+
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_ord
4043
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_pow
4144
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_repr
45+
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_round
4246
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_round_large
4347
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_setattr
48+
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_sum
4449
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_type
4550
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_vars
4651
*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip
@@ -63,7 +68,9 @@
6368
*graalpython.lib-python.3.test.test_builtin.TestSorted.test_basic
6469
*graalpython.lib-python.3.test.test_builtin.TestSorted.test_inputtypes
6570
*graalpython.lib-python.3.test.test_builtin.TestType.test_bad_args
71+
*graalpython.lib-python.3.test.test_builtin.TestType.test_bad_slots
6672
*graalpython.lib-python.3.test.test_builtin.TestType.test_new_type
6773
*graalpython.lib-python.3.test.test_builtin.TestType.test_type_doc
74+
*graalpython.lib-python.3.test.test_builtin.TestType.test_type_name
6875
*graalpython.lib-python.3.test.test_builtin.TestType.test_type_nokwargs
6976
*graalpython.lib-python.3.test.test_builtin.TestType.test_type_qualname

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

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@
9898
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
9999

100100
import java.math.BigInteger;
101-
import java.nio.charset.StandardCharsets;
102101
import java.util.Arrays;
103102
import java.util.List;
104103

@@ -107,6 +106,7 @@
107106
import com.oracle.graal.python.builtins.Builtin;
108107
import com.oracle.graal.python.builtins.CoreFunctions;
109108
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
109+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.UnicodeEncodeError;
110110
import com.oracle.graal.python.builtins.PythonBuiltins;
111111
import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins.WarnNode;
112112
import com.oracle.graal.python.builtins.modules.WeakRefModuleBuiltins.GetWeakRefsNode;
@@ -171,6 +171,8 @@
171171
import com.oracle.graal.python.builtins.objects.set.PFrozenSet;
172172
import com.oracle.graal.python.builtins.objects.set.PSet;
173173
import com.oracle.graal.python.builtins.objects.str.PString;
174+
import static com.oracle.graal.python.builtins.objects.str.StringUtils.canEncodeUTF8;
175+
import static com.oracle.graal.python.builtins.objects.str.StringUtils.containsNullCharacter;
174176
import com.oracle.graal.python.builtins.objects.superobject.SuperObject;
175177
import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
176178
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
@@ -259,6 +261,7 @@
259261
import com.oracle.truffle.api.profiles.BranchProfile;
260262
import com.oracle.truffle.api.profiles.ConditionProfile;
261263
import com.oracle.truffle.api.profiles.ValueProfile;
264+
import com.oracle.graal.python.builtins.objects.str.StringBuiltins.IsIdentifierNode;
262265

263266
@CoreFunctions(defineModule = BuiltinNames.BUILTINS)
264267
public final class BuiltinConstructors extends PythonBuiltins {
@@ -2213,6 +2216,7 @@ Object typeNew(VirtualFrame frame, Object cls, Object wName, PTuple bases, PDict
22132216
@Cached GetItemsizeNode getItemSize,
22142217
@Cached WriteAttributeToObjectNode writeItemSize,
22152218
@Cached GetBestBaseClassNode getBestBaseNode,
2219+
@Cached IsIdentifierNode isIdentifier,
22162220
@Cached DictBuiltins.CopyNode copyDict) {
22172221
// Determine the proper metatype to deal with this
22182222
String name = castStr.execute(wName);
@@ -2229,7 +2233,8 @@ Object typeNew(VirtualFrame frame, Object cls, Object wName, PTuple bases, PDict
22292233

22302234
try {
22312235
PDict namespace = (PDict) copyDict.call(frame, namespaceOrig);
2232-
PythonClass newType = typeMetaclass(frame, name, bases, namespace, metaclass, lib, hashingStoragelib, getDictAttrNode, getWeakRefAttrNode, getBestBaseNode, getItemSize, writeItemSize);
2236+
PythonClass newType = typeMetaclass(frame, name, bases, namespace, metaclass, lib, hashingStoragelib, getDictAttrNode, getWeakRefAttrNode, getBestBaseNode, getItemSize, writeItemSize,
2237+
isIdentifier);
22332238

22342239
for (DictEntry entry : hashingStoragelib.entries(namespace.getDictStorage())) {
22352240
Object setName = getSetNameNode.execute(entry.value);
@@ -2325,7 +2330,8 @@ private String getModuleNameFromGlobals(PythonObject globals, HashingStorageLibr
23252330

23262331
private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases, PDict namespace, Object metaclass,
23272332
PythonObjectLibrary lib, HashingStorageLibrary hashingStorageLib, LookupAttributeInMRONode getDictAttrNode,
2328-
LookupAttributeInMRONode getWeakRefAttrNode, GetBestBaseClassNode getBestBaseNode, GetItemsizeNode getItemSize, WriteAttributeToObjectNode writeItemSize) {
2333+
LookupAttributeInMRONode getWeakRefAttrNode, GetBestBaseClassNode getBestBaseNode, GetItemsizeNode getItemSize, WriteAttributeToObjectNode writeItemSize,
2334+
IsIdentifierNode isIdentifier) {
23292335
Object[] array = ensureGetObjectArrayNode().execute(bases);
23302336

23312337
PythonAbstractClass[] basesArray;
@@ -2348,7 +2354,10 @@ private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases,
23482354

23492355
assert metaclass != null;
23502356

2351-
if (name.indexOf('\0') != -1) {
2357+
if (!canEncodeUTF8(name)) {
2358+
throw raise(UnicodeEncodeError, ErrorMessages.CANNOT_ENCODE_CLASSNAME, name);
2359+
}
2360+
if (containsNullCharacter(name)) {
23522361
throw raise(ValueError, ErrorMessages.TYPE_NAME_NO_NULL_CHARS);
23532362
}
23542363

@@ -2421,6 +2430,9 @@ private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases,
24212430
// Check valid slot name
24222431
if (element instanceof String) {
24232432
slotName = (String) element;
2433+
if (!(boolean) isIdentifier.call(frame, slotName)) {
2434+
throw raise(TypeError, ErrorMessages.SLOTS_MUST_BE_IDENTIFIERS);
2435+
}
24242436
} else {
24252437
throw raise(TypeError, ErrorMessages.MUST_BE_STRINGS_NOT_P, "__slots__ items", element);
24262438
}
@@ -2555,8 +2567,8 @@ private void copyDictSlots(PythonClass pythonClass, PDict namespace, PythonObjec
25552567
doc = ((PString) value).getValue();
25562568
}
25572569
if (doc != null) {
2558-
if (!canEncode(doc)) {
2559-
throw raise(PythonBuiltinClassType.UnicodeEncodeError, ErrorMessages.CANNOT_ENCODE_DOCSTR, doc);
2570+
if (!canEncodeUTF8(doc)) {
2571+
throw raise(UnicodeEncodeError, ErrorMessages.CANNOT_ENCODE_DOCSTR, doc);
25602572
}
25612573
}
25622574
pythonClass.setAttribute(key, value);
@@ -2592,11 +2604,6 @@ private void copyDictSlots(PythonClass pythonClass, PDict namespace, PythonObjec
25922604
}
25932605
}
25942606

2595-
@TruffleBoundary
2596-
private static boolean canEncode(String doc) {
2597-
return StandardCharsets.UTF_8.newEncoder().canEncode(doc);
2598-
}
2599-
26002607
@TruffleBoundary
26012608
private PTuple copySlots(String className, SequenceStorage slotList, int slotlen, boolean add_dict, boolean add_weak, PDict namespace, HashingStorageLibrary nslib) {
26022609
SequenceStorage newSlots = new ObjectSequenceStorage(slotlen - PInt.intValue(add_dict) - PInt.intValue(add_weak));
@@ -2637,7 +2644,7 @@ private String mangle(String privateobj, String ident) {
26372644
// Name mangling: __private becomes _classname__private. This is independent from how
26382645
// the name is used.
26392646
int nlen, plen, ipriv;
2640-
if (privateobj == null || ident.charAt(0) != '_' || ident.charAt(1) != '_') {
2647+
if (privateobj == null || ident.equals("_") || ident.charAt(0) != '_' || ident.charAt(1) != '_') {
26412648
return ident;
26422649
}
26432650
nlen = ident.length();

0 commit comments

Comments
 (0)