Skip to content

Commit 22c129c

Browse files
committed
Use generic allocation for heap types
1 parent 4874ad2 commit 22c129c

File tree

1 file changed

+31
-8
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi

1 file changed

+31
-8
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CExtNodes.java

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,9 @@
137137
import com.oracle.graal.python.builtins.objects.str.StringNodes.StringMaterializeNode;
138138
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
139139
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
140+
import com.oracle.graal.python.builtins.objects.type.PythonClass;
140141
import com.oracle.graal.python.builtins.objects.type.PythonManagedClass;
142+
import com.oracle.graal.python.builtins.objects.type.TypeBuiltins;
141143
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
142144
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroStorageNode;
143145
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
@@ -210,6 +212,7 @@
210212
import com.oracle.truffle.api.nodes.EncapsulatingNodeReference;
211213
import com.oracle.truffle.api.nodes.ExplodeLoop;
212214
import com.oracle.truffle.api.nodes.Node;
215+
import com.oracle.truffle.api.object.HiddenKey;
213216
import com.oracle.truffle.api.profiles.BranchProfile;
214217
import com.oracle.truffle.api.profiles.ConditionProfile;
215218
import com.oracle.truffle.api.source.Source;
@@ -1737,20 +1740,25 @@ public static GetTypeMemberNode getUncached() {
17371740
@GenerateUncached
17381741
public abstract static class LookupNativeMemberInMRONode extends Node {
17391742

1740-
public abstract Object execute(Object cls, NativeMember nativeMemberName, Object managedMemberName);
1743+
public abstract Object execute(Object cls, NativeMember nativeMemberName, HiddenKey managedMemberName);
17411744

1742-
@Specialization
1743-
static Object doSingleContext(Object cls, NativeMember nativeMemberName, Object managedMemberName,
1744-
@Cached GetMroStorageNode getMroNode,
1745-
@Cached SequenceStorageNodes.GetItemDynamicNode getItemNode,
1746-
@Cached("createForceType()") ReadAttributeFromObjectNode readAttrNode,
1747-
@Cached GetTypeMemberNode getTypeMemberNode) {
1745+
static boolean isTpAlloc(Object cls, HiddenKey key) {
1746+
return cls instanceof PythonClass && key == TypeBuiltins.TYPE_ALLOC;
1747+
}
1748+
1749+
@Specialization(guards = "!isTpAlloc(cls, managedMemberName)")
1750+
static Object doSingleContext(Object cls, NativeMember nativeMemberName, HiddenKey managedMemberName,
1751+
@Cached GetMroStorageNode getMroNode,
1752+
@Cached SequenceStorageNodes.GetItemDynamicNode getItemNode,
1753+
@Cached("createForceType()") ReadAttributeFromObjectNode readAttrNode,
1754+
@Cached GetTypeMemberNode getTypeMemberNode) {
17481755

17491756
MroSequenceStorage mroStorage = getMroNode.execute(cls);
17501757
int n = mroStorage.length();
17511758

17521759
for (int i = 0; i < n; i++) {
17531760
PythonAbstractClass mroCls = (PythonAbstractClass) getItemNode.execute(mroStorage, i);
1761+
17541762
Object result;
17551763
if (PGuards.isManagedClass(mroCls)) {
17561764
result = readAttrNode.execute(mroCls, managedMemberName);
@@ -1763,7 +1771,22 @@ static Object doSingleContext(Object cls, NativeMember nativeMemberName, Object
17631771
}
17641772
}
17651773

1766-
return PNone.NO_VALUE;
1774+
return readAttrNode.execute(PythonContext.get(readAttrNode).lookupType(PythonBuiltinClassType.PythonObject), managedMemberName);
1775+
}
1776+
1777+
@Specialization(guards = "isTpAlloc(cls, managedMemberName)")
1778+
static Object doToAllocManaged(Object cls, @SuppressWarnings("unused") NativeMember nativeMemberName, HiddenKey managedMemberName,
1779+
@Cached("createForceType()") ReadAttributeFromObjectNode readAttrNode,
1780+
@Cached WriteAttributeToObjectNode writeAttrNode) {
1781+
1782+
Object alloc = readAttrNode.execute(cls, managedMemberName);
1783+
if (alloc == PNone.NO_VALUE) {
1784+
PythonObject object = PythonContext.get(readAttrNode).lookupType(PythonBuiltinClassType.PythonObject);
1785+
Object pyTypeGenericAlloc = readAttrNode.execute(object, managedMemberName);
1786+
writeAttrNode.execute(cls, managedMemberName, pyTypeGenericAlloc);
1787+
alloc = pyTypeGenericAlloc;
1788+
}
1789+
return alloc;
17671790
}
17681791
}
17691792

0 commit comments

Comments
 (0)