Skip to content

Commit 4017577

Browse files
committed
Use ReferenceLibrary and cleanup IsSameTypeNode implementation.
1 parent 3e069f9 commit 4017577

File tree

8 files changed

+51
-128
lines changed

8 files changed

+51
-128
lines changed

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

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@
145145
import com.oracle.truffle.api.profiles.BranchProfile;
146146
import com.oracle.truffle.api.profiles.ConditionProfile;
147147
import com.oracle.truffle.api.profiles.ValueProfile;
148+
import com.oracle.truffle.llvm.spi.ReferenceLibrary;
148149

149150
public abstract class CExtNodes {
150151

@@ -1748,14 +1749,14 @@ public abstract static class GetTypeMemberNode extends CExtBaseNode {
17481749
* native context, so we can be sure that the "nativeClassStableAssumption" (which is
17491750
* per-context) is from the context in which this native object was created.
17501751
*/
1751-
@Specialization(guards = {"isSameNativeObjectNode.execute(cachedObj, obj)", "memberName == cachedMemberName"}, //
1752+
@Specialization(guards = {"referenceLibrary.isSame(cachedObj, obj)", "memberName == cachedMemberName"}, //
17521753
limit = "1", //
17531754
assumptions = {"getNativeClassStableAssumption(cachedObj)", "singleContextAssumption()"})
17541755
public Object doCachedObj(@SuppressWarnings("unused") PythonAbstractNativeObject obj, @SuppressWarnings("unused") String memberName,
1755-
@SuppressWarnings("unused") @Cached IsSameNativeObjectFastNode isSameNativeObjectNode,
1756-
@SuppressWarnings("unused") @Cached("memberName") String cachedMemberName,
1757-
@SuppressWarnings("unused") @Cached("getterFuncName(memberName)") String getterFuncName,
17581756
@Cached("obj") @SuppressWarnings("unused") PythonAbstractNativeObject cachedObj,
1757+
@CachedLibrary("cachedObj") @SuppressWarnings("unused") ReferenceLibrary referenceLibrary,
1758+
@Cached("memberName") @SuppressWarnings("unused") String cachedMemberName,
1759+
@Cached("getterFuncName(memberName)") @SuppressWarnings("unused") String getterFuncName,
17591760
@Cached("doSlowPath(obj, getterFuncName)") Object result) {
17601761
return result;
17611762
}
@@ -1836,44 +1837,6 @@ static Object getNativeNullWithoutModule(@SuppressWarnings("unused") Object modu
18361837

18371838
}
18381839

1839-
public abstract static class IsSameNativeObjectNode extends CExtBaseNode {
1840-
1841-
public abstract boolean execute(PythonAbstractNativeObject left, PythonAbstractNativeObject right);
1842-
1843-
protected static boolean doNativeFast(PythonAbstractNativeObject left, PythonAbstractNativeObject right, ValueProfile profile) {
1844-
// This check is a bit dangerous since we cannot be sure about the code that is running.
1845-
// Currently, we assume that the pointer object is a Sulong pointer and for this it's
1846-
// fine.
1847-
return left.equalsProfiled(right, profile);
1848-
}
1849-
1850-
}
1851-
1852-
@GenerateUncached
1853-
public abstract static class IsSameNativeObjectFastNode extends IsSameNativeObjectNode {
1854-
1855-
@Specialization
1856-
boolean doSingleContext(PythonAbstractNativeObject left, PythonAbstractNativeObject right,
1857-
@Cached("createClassProfile()") ValueProfile foreignTypeProfile) {
1858-
return IsSameNativeObjectNode.doNativeFast(left, right, foreignTypeProfile);
1859-
}
1860-
}
1861-
1862-
@GenerateUncached
1863-
public abstract static class IsSameNativeObjectSlowNode extends IsSameNativeObjectNode {
1864-
1865-
@Specialization
1866-
boolean doSingleContext(PythonAbstractNativeObject left, PythonAbstractNativeObject right,
1867-
@Cached("createBinaryProfile()") ConditionProfile isEqualProfile,
1868-
@Cached("createClassProfile()") ValueProfile foreignTypeProfile,
1869-
@Cached PointerCompareNode pointerCompareNode) {
1870-
if (isEqualProfile.profile(IsSameNativeObjectNode.doNativeFast(left, right, foreignTypeProfile))) {
1871-
return true;
1872-
}
1873-
return pointerCompareNode.execute(SpecialMethodNames.__EQ__, left, right);
1874-
}
1875-
}
1876-
18771840
/**
18781841
* Use this node to lookup a native type member like {@code tp_alloc}.<br>
18791842
* <p>

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ToJavaNode;
5555
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ToSulongNode;
5656
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
57+
import com.oracle.graal.python.builtins.objects.frame.PFrame.Reference;
5758
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
5859
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
5960
import com.oracle.graal.python.nodes.PRaiseNode;
@@ -63,6 +64,7 @@
6364
import com.oracle.truffle.api.dsl.Cached;
6465
import com.oracle.truffle.api.dsl.Cached.Exclusive;
6566
import com.oracle.truffle.api.dsl.Cached.Shared;
67+
import com.oracle.truffle.api.dsl.Fallback;
6668
import com.oracle.truffle.api.dsl.GenerateUncached;
6769
import com.oracle.truffle.api.dsl.Specialization;
6870
import com.oracle.truffle.api.interop.ArityException;
@@ -75,9 +77,11 @@
7577
import com.oracle.truffle.api.library.ExportMessage;
7678
import com.oracle.truffle.api.object.Shape;
7779
import com.oracle.truffle.api.profiles.ValueProfile;
80+
import com.oracle.truffle.llvm.spi.ReferenceLibrary;
7881

7982
@ExportLibrary(PythonObjectLibrary.class)
80-
public class PythonAbstractNativeObject extends PythonAbstractObject implements PythonNativeObject, PythonNativeClass {
83+
@ExportLibrary(ReferenceLibrary.class)
84+
public final class PythonAbstractNativeObject extends PythonAbstractObject implements PythonNativeObject, PythonNativeClass {
8185

8286
public final TruffleObject object;
8387

@@ -199,11 +203,12 @@ public static PythonAbstractClass getNativeClassCachedIdentity(PythonAbstractNat
199203
return cachedClass;
200204
}
201205

202-
@Specialization(guards = "cachedObject.equals(object)", limit = "1", assumptions = "singleContextAssumption")
206+
@Specialization(guards = "referenceLibrary.isSame(cachedObject.object, object.object)", limit = "1", assumptions = "singleContextAssumption")
203207
public static PythonAbstractClass getNativeClassCached(PythonAbstractNativeObject object,
204208
@Shared("assumption") @Cached(value = "getSingleContextAssumption()") Assumption singleContextAssumption,
205209
@Exclusive @Cached("object") PythonAbstractNativeObject cachedObject,
206-
@Exclusive @Cached("getNativeClassUncached(cachedObject)") PythonAbstractClass cachedClass) {
210+
@Exclusive @Cached("getNativeClassUncached(cachedObject)") PythonAbstractClass cachedClass,
211+
@CachedLibrary("object.object") @SuppressWarnings("unused") ReferenceLibrary referenceLibrary) {
207212
// TODO same as for 'getNativeClassCachedIdentity'
208213
return cachedClass;
209214
}
@@ -223,4 +228,20 @@ public static PythonAbstractClass getNativeClassUncached(PythonAbstractNativeObj
223228
return getNativeClass(object, PCallCapiFunction.getUncached(), ToJavaNode.getUncached());
224229
}
225230
}
231+
232+
@ExportMessage
233+
static class IsSame {
234+
235+
@Specialization
236+
static boolean doNativeObject(PythonAbstractNativeObject receiver, PythonAbstractNativeObject other,
237+
@CachedLibrary("receiver.object") ReferenceLibrary referenceLibrary) {
238+
return referenceLibrary.isSame(receiver.object, other.object);
239+
}
240+
241+
@Fallback
242+
@SuppressWarnings("unused")
243+
static boolean doOther(PythonAbstractNativeObject receiver, Object other) {
244+
return false;
245+
}
246+
}
226247
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptorTypeBuiltins.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,12 @@
5353
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5454
import com.oracle.graal.python.builtins.PythonBuiltins;
5555
import com.oracle.graal.python.builtins.objects.PNone;
56-
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
5756
import com.oracle.graal.python.builtins.objects.type.LazyPythonClass;
57+
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
5858
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroNode;
5959
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
6060
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode;
61+
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsSameTypeNodeGen;
6162
import com.oracle.graal.python.nodes.PGuards;
6263
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
6364
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
@@ -150,7 +151,7 @@ protected Object getTypeName(LazyPythonClass descrType) {
150151
private boolean isSameType(Object left, Object right) {
151152
if (isSameTypeNode == null) {
152153
CompilerDirectives.transferToInterpreterAndInvalidate();
153-
isSameTypeNode = insert(IsSameTypeNode.create());
154+
isSameTypeNode = insert(IsSameTypeNodeGen.create());
154155
}
155156
return isSameTypeNode.execute(left, right);
156157
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
6767
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroNode;
6868
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode;
69+
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsSameTypeNodeGen;
6970
import com.oracle.graal.python.nodes.SpecialAttributeNames;
7071
import com.oracle.graal.python.nodes.SpecialMethodNames;
7172
import com.oracle.graal.python.nodes.argument.ReadIndexedArgumentNode;
@@ -499,7 +500,7 @@ public Object get(VirtualFrame frame, SuperObject self, Object attr) {
499500
private boolean isSameType(Object execute, PythonAbstractClass abstractPythonClass) {
500501
if (isSameTypeNode == null) {
501502
CompilerDirectives.transferToInterpreterAndInvalidate();
502-
isSameTypeNode = insert(IsSameTypeNode.create());
503+
isSameTypeNode = insert(IsSameTypeNodeGen.create());
503504
}
504505
return isSameTypeNode.execute(execute, abstractPythonClass);
505506
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeBuiltins.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import com.oracle.graal.python.builtins.objects.type.TypeBuiltinsFactory.CallNodeFactory;
8080
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroNode;
8181
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesNode;
82+
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsSameTypeNodeGen;
8283
import com.oracle.graal.python.nodes.BuiltinNames;
8384
import com.oracle.graal.python.nodes.PGuards;
8485
import com.oracle.graal.python.nodes.SpecialAttributeNames;
@@ -342,7 +343,7 @@ private Object op(VirtualFrame frame, LazyPythonClass self, Object[] arguments,
342343
private boolean isSameType(LazyPythonClass left, LazyPythonClass right) {
343344
if (isSameTypeNode == null) {
344345
CompilerDirectives.transferToInterpreterAndInvalidate();
345-
isSameTypeNode = insert(TypeNodes.IsSameTypeNode.create());
346+
isSameTypeNode = insert(IsSameTypeNodeGen.create());
346347
}
347348
return isSameTypeNode.execute(left, right);
348349
}
@@ -611,7 +612,7 @@ boolean isInstance(VirtualFrame frame, Object cls, Object instance) {
611612
@GenerateNodeFactory
612613
abstract static class SubclassCheckNode extends PythonBinaryBuiltinNode {
613614
@Child private IsSubtypeNode isSubtypeNode = IsSubtypeNode.create();
614-
@Child private TypeNodes.IsSameTypeNode isSameTypeNode = TypeNodes.IsSameTypeNode.create();
615+
@Child private TypeNodes.IsSameTypeNode isSameTypeNode = IsSameTypeNodeGen.create();
615616
@Child private GetFixedAttributeNode getBasesAttrNode;
616617
@Child private GetLazyClassNode getClassNode;
617618

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java

Lines changed: 6 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,8 @@
5454
import com.oracle.graal.python.builtins.objects.PNone;
5555
import com.oracle.graal.python.builtins.objects.cext.CExtNodes;
5656
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.GetTypeMemberNode;
57-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.IsSameNativeObjectNode;
5857
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.PCallCapiFunction;
5958
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ToSulongNode;
60-
import com.oracle.graal.python.builtins.objects.cext.CExtNodesFactory.IsSameNativeObjectFastNodeGen;
61-
import com.oracle.graal.python.builtins.objects.cext.CExtNodesFactory.IsSameNativeObjectSlowNodeGen;
6259
import com.oracle.graal.python.builtins.objects.cext.NativeCAPISymbols;
6360
import com.oracle.graal.python.builtins.objects.cext.NativeMemberNames;
6461
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
@@ -79,8 +76,6 @@
7976
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetSulongTypeNodeGen;
8077
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetSuperClassNodeGen;
8178
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetTypeFlagsNodeFactory.GetTypeFlagsCachedNodeGen;
82-
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsSameTypeFastNodeGen;
83-
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsSameTypeSlowNodeGen;
8479
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsTypeNodeGen;
8580
import com.oracle.graal.python.nodes.PGuards;
8681
import com.oracle.graal.python.nodes.PNodeWithContext;
@@ -102,10 +97,12 @@
10297
import com.oracle.truffle.api.dsl.ImportStatic;
10398
import com.oracle.truffle.api.dsl.Specialization;
10499
import com.oracle.truffle.api.dsl.TypeSystemReference;
100+
import com.oracle.truffle.api.library.CachedLibrary;
105101
import com.oracle.truffle.api.nodes.Node;
106102
import com.oracle.truffle.api.object.Shape;
107103
import com.oracle.truffle.api.profiles.ConditionProfile;
108104
import com.oracle.truffle.api.profiles.ValueProfile;
105+
import com.oracle.truffle.llvm.spi.ReferenceLibrary;
109106

110107
public abstract class TypeNodes {
111108

@@ -611,6 +608,7 @@ public static GetBaseClassNode create() {
611608
}
612609
}
613610

611+
@GenerateUncached
614612
@ImportStatic(SpecialMethodNames.class)
615613
public abstract static class IsSameTypeNode extends PNodeWithContext {
616614

@@ -636,80 +634,16 @@ boolean doManaged(PythonBuiltinClass left, PythonBuiltinClassType right) {
636634
return left.getType() == right;
637635
}
638636

639-
@Specialization
637+
@Specialization(limit = "3")
640638
boolean doNativeSingleContext(PythonAbstractNativeObject left, PythonAbstractNativeObject right,
641-
@Cached(value = "createNativeEquals()", uncached = "getUncachedNativeEquals()") IsSameNativeObjectNode isSameNativeObjectNode) {
642-
return isSameNativeObjectNode.execute(left, right);
639+
@CachedLibrary("left") ReferenceLibrary referenceLibrary) {
640+
return referenceLibrary.isSame(left, right);
643641
}
644642

645643
@Fallback
646644
boolean doOther(@SuppressWarnings("unused") Object left, @SuppressWarnings("unused") Object right) {
647645
return false;
648646
}
649-
650-
protected IsSameNativeObjectNode createNativeEquals() {
651-
throw new IllegalStateException();
652-
}
653-
654-
protected IsSameNativeObjectNode getUncachedNativeEquals() {
655-
throw new IllegalStateException();
656-
}
657-
658-
@TruffleBoundary
659-
public static boolean doSlowPath(Object left, Object right) {
660-
if (left instanceof PythonManagedClass && right instanceof PythonManagedClass) {
661-
return left == right;
662-
} else if (left instanceof PythonAbstractNativeObject && right instanceof PythonAbstractNativeObject) {
663-
return IsSameNativeObjectFastNodeGen.getUncached().execute((PythonAbstractNativeObject) left, (PythonAbstractNativeObject) right);
664-
}
665-
return false;
666-
}
667-
668-
public static IsSameTypeNode create() {
669-
return IsSameTypeFastNodeGen.create();
670-
}
671-
672-
public static IsSameTypeNode getUncached() {
673-
return IsSameTypeSlowNodeGen.create();
674-
}
675-
676-
public static IsSameTypeNode createFast() {
677-
return IsSameTypeSlowNodeGen.create();
678-
}
679-
680-
public static IsSameTypeNode getUncachedFast() {
681-
return IsSameTypeFastNodeGen.create();
682-
}
683-
}
684-
685-
@GenerateUncached
686-
abstract static class IsSameTypeFastNode extends IsSameTypeNode {
687-
688-
@Override
689-
protected IsSameNativeObjectNode createNativeEquals() {
690-
return IsSameNativeObjectFastNodeGen.create();
691-
}
692-
693-
@Override
694-
protected IsSameNativeObjectNode getUncachedNativeEquals() {
695-
return IsSameNativeObjectFastNodeGen.getUncached();
696-
}
697-
698-
}
699-
700-
@GenerateUncached
701-
abstract static class IsSameTypeSlowNode extends IsSameTypeNode {
702-
703-
@Override
704-
protected IsSameNativeObjectNode createNativeEquals() {
705-
return IsSameNativeObjectSlowNodeGen.create();
706-
}
707-
708-
@Override
709-
protected IsSameNativeObjectNode getUncachedNativeEquals() {
710-
return IsSameNativeObjectSlowNodeGen.getUncached();
711-
}
712-
713647
}
714648

715649
/** accesses the Sulong type of a class; does no recursive resolving */

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
4848
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
4949
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroStorageNode;
50+
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsSameTypeNodeGen;
5051
import com.oracle.graal.python.nodes.PNodeWithContext;
5152
import com.oracle.graal.python.runtime.PythonContext;
5253
import com.oracle.graal.python.runtime.PythonCore;
@@ -130,7 +131,7 @@ public Object execute(LazyPythonClass klass, Object key) {
130131

131132
protected final String key;
132133
@CompilationFinal private ContextReference<PythonContext> contextRef;
133-
@Child private TypeNodes.IsSameTypeNode isSameTypeNode = TypeNodes.IsSameTypeNode.createFast();
134+
@Child private TypeNodes.IsSameTypeNode isSameTypeNode = IsSameTypeNodeGen.create();
134135
@Child private GetMroStorageNode getMroNode;
135136

136137
protected PythonCore getCore() {

0 commit comments

Comments
 (0)