Skip to content

Commit 0faad33

Browse files
committed
Use assumption in 'IS_POINTER' MR.
1 parent d74aeac commit 0faad33

File tree

5 files changed

+77
-14
lines changed

5 files changed

+77
-14
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
import com.oracle.graal.python.builtins.objects.cext.CArrayWrappers.CByteArrayWrapper;
4646
import com.oracle.graal.python.builtins.objects.cext.CArrayWrappers.CStringWrapper;
4747
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.CExtBaseNode;
48+
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMR.InvalidateNativeObjectsAllManagedNode;
49+
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMR.PIsPointerNode;
4850
import com.oracle.graal.python.builtins.objects.ints.PInt;
4951
import com.oracle.graal.python.nodes.SpecialMethodNames;
5052
import com.oracle.truffle.api.CompilerDirectives;
@@ -159,8 +161,10 @@ int access(CByteArrayWrapper obj) {
159161

160162
@Resolve(message = "IS_POINTER")
161163
abstract static class IsPointerNode extends Node {
164+
@Child private PIsPointerNode pIsPointerNode = PIsPointerNode.create();
165+
162166
boolean access(CArrayWrapper obj) {
163-
return obj.isNative();
167+
return pIsPointerNode.execute(obj);
164168
}
165169
}
166170

@@ -190,8 +194,10 @@ long access(CArrayWrapper obj) {
190194
@Resolve(message = "TO_NATIVE")
191195
abstract static class ToNativeNode extends Node {
192196
@Child private CExtNodes.AsCharPointer asCharPointerNode;
197+
@Child private InvalidateNativeObjectsAllManagedNode invalidateNode = InvalidateNativeObjectsAllManagedNode.create();
193198

194199
Object access(CArrayWrapper obj) {
200+
invalidateNode.execute();
195201
if (!obj.isNative()) {
196202
if (asCharPointerNode == null) {
197203
CompilerDirectives.transferToInterpreterAndInvalidate();

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
import com.oracle.graal.python.builtins.objects.cext.PySequenceArrayWrapperMRFactory.WriteArrayItemNodeGen;
5656
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
5757
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetSequenceStorageNode;
58+
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMR.InvalidateNativeObjectsAllManagedNode;
59+
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMR.PIsPointerNode;
5860
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
5961
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode;
6062
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.NormalizeIndexNode;
@@ -340,8 +342,10 @@ public static WriteArrayItemNode create() {
340342
@Resolve(message = "TO_NATIVE")
341343
abstract static class ToNativeNode extends Node {
342344
@Child private ToNativeArrayNode toPyObjectNode = ToNativeArrayNode.create();
345+
@Child private InvalidateNativeObjectsAllManagedNode invalidateNode = InvalidateNativeObjectsAllManagedNode.create();
343346

344347
Object access(PySequenceArrayWrapper obj) {
348+
invalidateNode.execute();
345349
if (!obj.isNative()) {
346350
obj.setNativePointer(toPyObjectNode.execute(obj));
347351
}
@@ -409,8 +413,10 @@ public static ToNativeArrayNode create() {
409413

410414
@Resolve(message = "IS_POINTER")
411415
abstract static class IsPointerNode extends Node {
416+
@Child private PIsPointerNode pIsPointerNode = PIsPointerNode.create();
417+
412418
boolean access(PySequenceArrayWrapper obj) {
413-
return obj.isNative();
419+
return pIsPointerNode.execute(obj);
414420
}
415421
}
416422

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@
4949
import com.oracle.graal.python.builtins.objects.cext.NativeWrappers.PyUnicodeState;
5050
import com.oracle.graal.python.builtins.objects.cext.NativeWrappers.PyUnicodeWrapper;
5151
import com.oracle.graal.python.builtins.objects.cext.PyUnicodeWrapperMRFactory.PyUnicodeToNativeNodeGen;
52+
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMR.InvalidateNativeObjectsAllManagedNode;
5253
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMR.PAsPointerNode;
54+
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMR.PIsPointerNode;
5355
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMR.ToPyObjectNode;
5456
import com.oracle.graal.python.builtins.objects.cext.UnicodeObjectNodes.UnicodeAsWideCharNode;
5557
import com.oracle.graal.python.builtins.objects.str.PString;
5658
import com.oracle.truffle.api.CompilerDirectives;
5759
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
5860
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
5961
import com.oracle.truffle.api.dsl.Specialization;
60-
import com.oracle.truffle.api.interop.ForeignAccess;
61-
import com.oracle.truffle.api.interop.Message;
6262
import com.oracle.truffle.api.interop.MessageResolution;
6363
import com.oracle.truffle.api.interop.Resolve;
6464
import com.oracle.truffle.api.interop.TruffleObject;
@@ -145,8 +145,10 @@ private static boolean doCheck(String value, CharsetEncoder asciiEncoder) {
145145
@Resolve(message = "TO_NATIVE")
146146
abstract static class ToNativeNode extends Node {
147147
@Child private ToPyObjectNode toPyObjectNode = ToPyObjectNode.create();
148+
@Child private InvalidateNativeObjectsAllManagedNode invalidateNode = InvalidateNativeObjectsAllManagedNode.create();
148149

149150
Object access(PyUnicodeWrapper obj) {
151+
invalidateNode.execute();
150152
if (!obj.isNative()) {
151153
obj.setNativePointer(toPyObjectNode.execute(obj));
152154
}
@@ -156,18 +158,10 @@ Object access(PyUnicodeWrapper obj) {
156158

157159
@Resolve(message = "IS_POINTER")
158160
abstract static class IsPointerNode extends Node {
159-
@Child private Node isPointerNode;
161+
@Child private PIsPointerNode pIsPointerNode = PIsPointerNode.create();
160162

161163
boolean access(PyUnicodeWrapper obj) {
162-
return obj.isNative() && (!(obj.getNativePointer() instanceof TruffleObject) || ForeignAccess.sendIsPointer(getIsPointerNode(), (TruffleObject) obj.getNativePointer()));
163-
}
164-
165-
private Node getIsPointerNode() {
166-
if (isPointerNode == null) {
167-
CompilerDirectives.transferToInterpreterAndInvalidate();
168-
isPointerNode = insert(Message.IS_POINTER.createNode());
169-
}
170-
return isPointerNode;
164+
return pIsPointerNode.execute(obj);
171165
}
172166
}
173167

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import com.oracle.graal.python.builtins.objects.cext.NativeWrappers.PythonObjectNativeWrapper;
6565
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.GetSulongTypeNodeGen;
6666
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.PAsPointerNodeGen;
67+
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.PIsPointerNodeGen;
6768
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.ReadNativeMemberNodeGen;
6869
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.ToPyObjectNodeGen;
6970
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.WriteNativeMemberNodeGen;
@@ -107,6 +108,7 @@
107108
import com.oracle.graal.python.runtime.exception.PException;
108109
import com.oracle.graal.python.runtime.interop.PythonMessageResolution;
109110
import com.oracle.graal.python.runtime.sequence.PSequence;
111+
import com.oracle.truffle.api.Assumption;
110112
import com.oracle.truffle.api.CompilerDirectives;
111113
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
112114
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -896,8 +898,10 @@ public Object access(Object object) {
896898
@Resolve(message = "TO_NATIVE")
897899
abstract static class ToNativeNode extends Node {
898900
@Child private ToPyObjectNode toPyObjectNode;
901+
@Child private InvalidateNativeObjectsAllManagedNode invalidateNode = InvalidateNativeObjectsAllManagedNode.create();
899902

900903
Object access(PythonClassInitNativeWrapper obj) {
904+
invalidateNode.execute();
901905
if (!obj.isNative()) {
902906
obj.setNativePointer(getToPyObjectNode().execute(obj));
903907
}
@@ -906,6 +910,7 @@ Object access(PythonClassInitNativeWrapper obj) {
906910

907911
Object access(PythonNativeWrapper obj) {
908912
assert !(obj instanceof PythonClassInitNativeWrapper);
913+
invalidateNode.execute();
909914
if (!obj.isNative()) {
910915
obj.setNativePointer(getToPyObjectNode().execute(obj));
911916
}
@@ -923,9 +928,56 @@ private ToPyObjectNode getToPyObjectNode() {
923928

924929
@Resolve(message = "IS_POINTER")
925930
abstract static class IsPointerNode extends Node {
931+
@Child private PIsPointerNode pIsPointerNode = PIsPointerNode.create();
932+
926933
boolean access(PythonNativeWrapper obj) {
934+
return pIsPointerNode.execute(obj);
935+
}
936+
}
937+
938+
abstract static class PIsPointerNode extends PNodeWithContext {
939+
940+
public abstract boolean execute(PythonNativeWrapper obj);
941+
942+
@Specialization(assumptions = {"singleContextAssumption()", "nativeObjectsAllManagedAssumption()"})
943+
boolean doFalse(@SuppressWarnings("unused") PythonNativeWrapper obj) {
944+
return false;
945+
}
946+
947+
@Specialization
948+
boolean doGeneric(PythonNativeWrapper obj) {
927949
return obj.isNative();
928950
}
951+
952+
protected Assumption nativeObjectsAllManagedAssumption() {
953+
return getContext().getNativeObjectsAllManagedAssumption();
954+
}
955+
956+
public static PIsPointerNode create() {
957+
return PIsPointerNodeGen.create();
958+
}
959+
}
960+
961+
abstract static class InvalidateNativeObjectsAllManagedNode extends PNodeWithContext {
962+
963+
public abstract void execute();
964+
965+
@Specialization(assumptions = {"singleContextAssumption()", "nativeObjectsAllManagedAssumption()"})
966+
void doValid() {
967+
nativeObjectsAllManagedAssumption().invalidate();
968+
}
969+
970+
@Specialization
971+
void doInvalid() {
972+
}
973+
974+
protected Assumption nativeObjectsAllManagedAssumption() {
975+
return getContext().getNativeObjectsAllManagedAssumption();
976+
}
977+
978+
public static InvalidateNativeObjectsAllManagedNode create() {
979+
return InvalidateNativeObjectsAllManagedNode.create();
980+
}
929981
}
930982

931983
@Resolve(message = "AS_POINTER")

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public final class PythonContext {
6767

6868
// if set to 0 the VM will set it to whatever it likes
6969
private final AtomicLong pythonThreadStackSize = new AtomicLong(0);
70+
private final Assumption nativeObjectsAllManagedAssumption = Truffle.getRuntime().createAssumption("all C API objects are managed");
7071

7172
@CompilationFinal private TruffleLanguage.Env env;
7273

@@ -286,6 +287,10 @@ public static Assumption getSingleThreadedAssumption() {
286287
return singleThreaded;
287288
}
288289

290+
public Assumption getNativeObjectsAllManagedAssumption() {
291+
return nativeObjectsAllManagedAssumption;
292+
}
293+
289294
public boolean isExecutableAccessAllowed() {
290295
return getEnv().isHostLookupAllowed() || getEnv().isNativeAccessAllowed();
291296
}

0 commit comments

Comments
 (0)