Skip to content

Commit

Permalink
[GR-42260] Fixes for robotframework #2
Browse files Browse the repository at this point in the history
PullRequest: graalpython/2567
  • Loading branch information
msimacek committed Dec 16, 2022
2 parents 95ee765 + 47dc7cc commit b49935b
Show file tree
Hide file tree
Showing 13 changed files with 163 additions and 126 deletions.
Expand Up @@ -62,6 +62,7 @@
#define CYTHON_FAST_THREAD_STATE 0
#define CYTHON_PROFILE 0
#define CYTHON_TRACE 0
#define CYTHON_UPDATE_DESCRIPTOR_DOC 0
// This s a workaround for a Cython bug that it uses a macro that CPython already removed
#define _Py_DEC_REFTOTAL

Expand Down
6 changes: 5 additions & 1 deletion graalpython/com.oracle.graal.python.cext/src/capi.c
Expand Up @@ -139,7 +139,7 @@ void initialize_type_structure(PyTypeObject* structure, PyTypeObject* ptype, pol
PyBufferProcs* as_buffer = structure->tp_as_buffer;
PyTypeObject* type_handle = truffle_assign_managed(structure, ptype);
// write flags as specified in the dummy to the PythonClass object
type_handle->tp_flags = original_flags | Py_TPFLAGS_READY;
type_handle->tp_flags = original_flags | Py_TPFLAGS_READY | Py_TPFLAGS_IMMUTABLETYPE;
type_handle->tp_basicsize = basicsize;
type_handle->tp_itemsize = itemsize;
if (alloc_fun) {
Expand Down Expand Up @@ -923,3 +923,7 @@ int tuffle_check_basesize_for_getstate(PyTypeObject* type, int slot_num) {
basicsize += sizeof(PyObject *) * PyList_GET_SIZE(slot_num);
return type->tp_basicsize > basicsize;
}

void truffle_set_tp_flags(PyTypeObject* type, unsigned long flags) {
type->tp_flags = flags;
}
5 changes: 5 additions & 0 deletions graalpython/com.oracle.graal.python.cext/src/typeobject.c
Expand Up @@ -465,6 +465,11 @@ int PyType_Ready(PyTypeObject* cls) {
Py_ssize_t n;
Py_ssize_t i;

/* Historically, all static types were immutable. See bpo-43908 */
if (!(cls->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
cls->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
}

// https://docs.python.org/3/c-api/typeobj.html#Py_TPFLAGS_READY
if ((cls->tp_flags & Py_TPFLAGS_READY) || (cls->tp_flags & Py_TPFLAGS_READYING)) {
return 0;
Expand Down
Expand Up @@ -38,7 +38,6 @@
*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_cfunction
*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_classes
*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_constructor_kwargs
*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_equality
*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_hashing
*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_init
*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_multiple_callbacks
Expand Down
Expand Up @@ -40,6 +40,12 @@
*/
package com.oracle.graal.python.builtins.modules;

import static com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TYPE_FLAGS;
import static com.oracle.graal.python.builtins.objects.type.TypeFlags.COLLECTION_FLAGS;
import static com.oracle.graal.python.builtins.objects.type.TypeFlags.IMMUTABLETYPE;
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached;

import java.util.List;
import java.util.Set;

Expand All @@ -66,11 +72,6 @@
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.strings.TruffleString;

import static com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TYPE_FLAGS;
import static com.oracle.graal.python.builtins.objects.type.TypeFlags.COLLECTION_FLAGS;
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached;

@CoreFunctions(defineModule = "_abc")
public class AbcModuleBuiltins extends PythonBuiltins {

Expand Down Expand Up @@ -123,23 +124,26 @@ static Object register(Object self, Object subclass) {
long tpFlags = getFlagsNode.execute(self);
long collectionFlag = tpFlags & COLLECTION_FLAGS;
if (collectionFlag > 0) {
setCollectionFlagRecursive(subclass, collectionFlag, getFlagsNode, WriteAttributeToObjectNode.getUncached(), TypeNodes.GetSubclassesNode.getUncached(), isTypeNode);
setCollectionFlagRecursive(subclass, collectionFlag, getFlagsNode, TypeNodes.SetTypeFlagsNode.getUncached(), TypeNodes.GetSubclassesNode.getUncached(), isTypeNode);
}
}
return PNone.NONE;
}

private static void setCollectionFlagRecursive(Object child, long flag, TypeNodes.GetTypeFlagsNode getFlags, WriteAttributeToObjectNode writeHiddenFlagsNode,
private static void setCollectionFlagRecursive(Object child, long flag, TypeNodes.GetTypeFlagsNode getFlags, TypeNodes.SetTypeFlagsNode setTypeFlagsNode,
TypeNodes.GetSubclassesNode getSubclassesNode, TypeNodes.IsTypeNode isTypeNode) {
assert flag == TypeFlags.SEQUENCE || flag == TypeFlags.MAPPING : flag;
long tpFlags = getFlags.execute(child);
tpFlags &= ~COLLECTION_FLAGS;
long origTpFlags = getFlags.execute(child);
long tpFlags = origTpFlags & ~COLLECTION_FLAGS;
tpFlags |= flag;
writeHiddenFlagsNode.execute(child, TYPE_FLAGS, tpFlags);
if (tpFlags == origTpFlags || (origTpFlags & IMMUTABLETYPE) != 0) {
return;
}
setTypeFlagsNode.execute(child, tpFlags);
Set<PythonAbstractClass> grandchildren = getSubclassesNode.execute(child);
for (PythonAbstractClass c : grandchildren) {
if (isTypeNode.execute(c)) {
setCollectionFlagRecursive(c, flag, getFlags, writeHiddenFlagsNode, getSubclassesNode, isTypeNode);
setCollectionFlagRecursive(c, flag, getFlags, setTypeFlagsNode, getSubclassesNode, isTypeNode);
}
}
}
Expand Down
Expand Up @@ -161,6 +161,8 @@
import com.oracle.graal.python.builtins.objects.type.PythonManagedClass;
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
import com.oracle.graal.python.builtins.objects.type.TypeBuiltins;
import com.oracle.graal.python.builtins.objects.type.TypeFlags;
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroStorageNode;
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesNode;
Expand Down Expand Up @@ -1375,21 +1377,24 @@ static void doTpName(PythonManagedClass object, @SuppressWarnings("unused") Pyth

@Specialization(guards = "eq(TP_FLAGS, key)")
static void doTpFlags(PythonManagedClass object, @SuppressWarnings("unused") PythonNativeWrapper nativeWrapper, @SuppressWarnings("unused") String key, long flags,
@Cached GetTypeFlagsNode getTypeFlagsNode,
@Cached WriteAttributeToObjectNode writeAttributeToObjectNode) {
@Cached TypeNodes.SetTypeFlagsNode setTypeFlagsNode) {
if (object instanceof PythonBuiltinClass) {
// just assert that we try to set the same flags; if there is a difference, this
// means we did not properly maintain our flag definition in
// TypeNodes.GetTypeFlagsNode.
assert getTypeFlagsNode.execute(object) == flags : flagsErrorMessage(object, getTypeFlagsNode.execute(object), flags);
} else {
writeAttributeToObjectNode.execute(object, SpecialAttributeNames.T___FLAGS__, flags);
/*
* Assert that we try to set the same flags, except the abc flags for sequence
* and mapping. If there is a difference, this means we did not properly
* maintain our flag definition in TypeNodes.GetTypeFlagsNode.
*/
assert assertFlagsInSync(object, flags);
}
setTypeFlagsNode.execute(object, flags);
}

@TruffleBoundary
private static String flagsErrorMessage(PythonManagedClass object, long expected, long actual) {
return "type flags of " + object.getName() + " definitions are out of sync: expected " + expected + " vs. actual " + actual;
private static boolean assertFlagsInSync(PythonManagedClass object, long newFlags) {
long expected = GetTypeFlagsNode.getUncached().execute(object) & ~TypeFlags.COLLECTION_FLAGS;
long actual = newFlags & ~TypeFlags.COLLECTION_FLAGS;
assert expected == actual : "type flags of " + object.getName() + " definitions are out of sync: expected " + expected + " vs. actual " + actual;
return true;
}

@Specialization(guards = {"isPythonClass(object)", "eq(TP_BASICSIZE, key)"})
Expand Down
Expand Up @@ -223,6 +223,7 @@ public enum NativeCAPISymbol implements NativeCExtSymbol {
FUN_MEMCPY_BYTES("truffle_memcpy_bytes"),
FUN_UNICODE_SUBTYPE_NEW("unicode_subtype_new"),
FUN_CHECK_BASESIZE_FOR_GETSTATE("tuffle_check_basesize_for_getstate"),
FUN_TRUFFLE_SET_TP_FLAGS("truffle_set_tp_flags"),

/* PyDateTime_CAPI */

Expand Down
Expand Up @@ -49,6 +49,7 @@ public abstract class TypeFlags {
public static final long SEQUENCE = (1L << 5);
public static final long MAPPING = (1L << 6);
public static final long HEAPTYPE = (1L << 9);
public static final long IMMUTABLETYPE = (1L << 8);
public static final long BASETYPE = (1L << 10);
public static final long HAVE_VECTORCALL = (1L << 11);
public static final long READY = (1L << 12);
Expand All @@ -72,4 +73,5 @@ public abstract class TypeFlags {
public static final long HAVE_FINALIZE = 1L;

public static final long COLLECTION_FLAGS = SEQUENCE | MAPPING;
public static final long SUBCLASS_FLAGS = LONG_SUBCLASS | LIST_SUBCLASS | TUPLE_SUBCLASS | BYTES_SUBCLASS | UNICODE_SUBCLASS | DICT_SUBCLASS | BASE_EXC_SUBCLASS | TYPE_SUBCLASS;
}

0 comments on commit b49935b

Please sign in to comment.