diff --git a/ci.jsonnet b/ci.jsonnet index 02b45a26a0..822552b31a 100644 --- a/ci.jsonnet +++ b/ci.jsonnet @@ -5,7 +5,7 @@ (import "ci/python-gate.libsonnet") + (import "ci/python-bench.libsonnet") + { - overlay: "30def35dbfc43256d57ad3b9b981d92718728e2a", + overlay: "26571215e27b3c415afb8119d38a0418c14b29c9", specVersion: "8", // Until buildbot issues around CI tiers are resolved, we cannot use them // tierConfig: self.tierConfig, diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_bytes.py b/graalpython/com.oracle.graal.python.test/src/tests/test_bytes.py index 7a0b33167c..a379b1c93e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_bytes.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_bytes.py @@ -72,6 +72,22 @@ def test_from_list(): assert list(b) == ints +def test_bytearray_from_none(): + assert_raises(TypeError, bytes, None) + assert_raises(TypeError, bytearray, None) + + +def test_bytes_with_encoding_does_not_call_dunder_bytes(): + class BytesLike: + def __bytes__(self): + return b"bytes" + + assert bytes(BytesLike()) == b"bytes" + assert_raises(TypeError, bytes, BytesLike(), None) + assert_raises(TypeError, bytes, encoding="utf-8") + assert_raises(TypeError, bytes, errors="strict") + + def test_from_ssize(): assert bytes(0) == b'' assert bytes(1) == b'\x00' diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_object.py b/graalpython/com.oracle.graal.python.test/src/tests/test_object.py index 427908ad5e..e4873ee22a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_object.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_object.py @@ -87,6 +87,13 @@ def set_dict_attr(): assert_raises(AttributeError, set_dict_attr) +def test_lookup_single_underscore_attr(): + class MyClass: + pass + + assert_raises(AttributeError, lambda: MyClass()._) + + def test_set_dict_attr(): class MyClass(object): def __init__(self): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_super.py b/graalpython/com.oracle.graal.python.test/src/tests/test_super.py index 7a441031e8..d89c17b70e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_super.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_super.py @@ -49,6 +49,15 @@ def m(self): return ["B"] + self.my_super.m() assert B().m() == ["B", "A"] +def test_super_requires_type_arg(): + try: + super([]) + except TypeError: + pass + else: + assert False + + def test_super_subclass_descr_get_invokes_subclass_type(): class MySuper(super): news = [] diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java index 4a3f2139cf..65f68b64f5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. + * Copyright (c) 2020, 2026, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -164,7 +164,7 @@ protected ArgumentClinicProvider getArgumentClinic() { return ByteArrayBuiltinsClinicProviders.InitNodeClinicProviderGen.INSTANCE; } - @Specialization(guards = "!isNone(source)") + @Specialization static PNone doInit(VirtualFrame frame, PByteArray self, Object source, Object encoding, Object errors, @Bind Node inliningTarget, @Cached BytesNodes.BytesInitNode toBytesNode) { @@ -172,12 +172,6 @@ static PNone doInit(VirtualFrame frame, PByteArray self, Object source, Object e return PNone.NONE; } - @Specialization(guards = "isNone(self)") - static PNone doInit(@SuppressWarnings("unused") PByteArray self, Object source, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors, - @Bind Node inliningTarget) { - throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANNOT_CONVERT_P_OBJ_TO_S, source, "bytearray"); - } - @Specialization(guards = "!isBytes(self)") static PNone doInit(Object self, @SuppressWarnings("unused") Object source, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors, @Bind Node inliningTarget) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java index ceab7c45e4..45e196dc27 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java @@ -131,14 +131,14 @@ protected ArgumentClinicProvider getArgumentClinic() { } @SuppressWarnings("unused") - @Specialization(guards = "isNoValue(source)") + @Specialization(guards = {"isNoValue(source)", "isNoValue(encoding)", "isNoValue(errors)"}) static Object doEmpty(Object cls, PNone source, PNone encoding, PNone errors, @Bind Node inliningTarget, @Exclusive @Cached CreateBytes createBytes) { return createBytes.execute(inliningTarget, cls, PythonUtils.EMPTY_BYTE_ARRAY); } - @Specialization(guards = "!isNoValue(source)") + @Specialization(guards = {"!isNoValue(source)", "isNoValue(encoding)", "isNoValue(errors)"}) static Object doCallBytes(VirtualFrame frame, Object cls, Object source, PNone encoding, PNone errors, @Bind Node inliningTarget, @Cached GetClassNode getClassNode, diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java index e5b3ec6d62..4b8b7233bf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java @@ -629,8 +629,8 @@ public abstract static class BytesInitNode extends PNodeWithContext { public abstract byte[] execute(VirtualFrame frame, Node inliningTarget, Object source, Object encoding, Object errors); - @Specialization - static byte[] none(@SuppressWarnings("unused") PNone source, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors) { + @Specialization(guards = "isNoValue(source)") + static byte[] noValue(@SuppressWarnings("unused") PNone source, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors) { return PythonUtils.EMPTY_BYTE_ARRAY; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java index 9e8fd679a5..f63e4219fc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java @@ -261,6 +261,9 @@ public final Object execute(VirtualFrame frame, Object self, Object[] arguments, PNone init(VirtualFrame frame, SuperObject self, Object cls, Object obj, @Bind Node inliningTarget, @Cached @Exclusive PRaiseNode raiseNode) { + if (!ensureIsTypeNode().executeCached(cls)) { + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.FIRST_ARGUMENT_MUST_BE_A_TYPE_OBJECT_NOT_P, cls); + } if (!(obj instanceof PNone)) { Object type = supercheck(frame, inliningTarget, cls, obj, raiseNode); self.init(cls, type, obj); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java index d5eb259251..40b09f44b2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java @@ -335,7 +335,8 @@ static Object readAttributeQuickly(Object type, TpSlots slots, Object receiver, PythonAbstractClass base = bases[0]; if (base instanceof PythonBuiltinClass && ((PythonBuiltinClass) base).getType() == PythonBuiltinClassType.PythonObject) { - if (!(codePointAtIndexNode.execute(stringName, 0) == '_' && codePointAtIndexNode.execute(stringName, 1) == '_')) { + int length = codePointLengthNode.execute(stringName, TS_ENCODING); + if (!(length >= 2 && codePointAtIndexNode.execute(stringName, 0) == '_' && codePointAtIndexNode.execute(stringName, 1) == '_')) { // not a special name, so this attribute cannot be inherited, and can // only be on the type or the object. If it's on the type, return to // the generic code.