Skip to content

Commit 64905ae

Browse files
committed
Migrate some usages of getDict
1 parent 35c4177 commit 64905ae

File tree

10 files changed

+257
-103
lines changed

10 files changed

+257
-103
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@
234234
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
235235
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
236236
import com.oracle.graal.python.nodes.object.GetClassNode;
237+
import com.oracle.graal.python.nodes.object.GetDictIfExistsNode;
237238
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
238239
import com.oracle.graal.python.nodes.subscript.SliceLiteralNode;
239240
import com.oracle.graal.python.nodes.util.CannotCastException;
@@ -2576,7 +2577,7 @@ private void copyDictSlots(PythonClass pythonClass, PDict namespace, PythonObjec
25762577
pythonClass.setAttribute(key, value);
25772578
} else {
25782579
// DynamicObjectStorage ignores non-string keys
2579-
typeDict = lib.getDict(pythonClass);
2580+
typeDict = GetDictIfExistsNode.getUncached().execute(pythonClass);
25802581
if (typeDict == null) {
25812582
// 1.) create DynamicObjectStorage based dict from pythonClass
25822583
typeDict = PythonObjectFactory.getUncached().createDictFixedStorage(pythonClass);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@
100100
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
101101
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
102102
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
103-
import com.oracle.graal.python.builtins.objects.code.PCode;
104103
import com.oracle.graal.python.builtins.objects.code.CodeNodes;
104+
import com.oracle.graal.python.builtins.objects.code.PCode;
105105
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
106106
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
107107
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
@@ -185,6 +185,7 @@
185185
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
186186
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
187187
import com.oracle.graal.python.nodes.object.GetClassNode;
188+
import com.oracle.graal.python.nodes.object.GetOrCreateDictNode;
188189
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
189190
import com.oracle.graal.python.nodes.subscript.SetItemNode;
190191
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
@@ -553,6 +554,7 @@ public abstract static class EvalNode extends PythonBuiltinNode {
553554
@Child protected CompileNode compileNode;
554555
@Child private GenericInvokeNode invokeNode = GenericInvokeNode.create();
555556
@Child private HasInheritedAttributeNode hasGetItemNode;
557+
@Child private GetOrCreateDictNode getOrCreateDictNode;
556558

557559
private HasInheritedAttributeNode getHasGetItemNode() {
558560
if (hasGetItemNode == null) {
@@ -607,28 +609,19 @@ private static void setCustomLocals(Object[] args, Object locals) {
607609
PArguments.setCustomLocals(args, locals);
608610
}
609611

610-
private void setBuiltinsInGlobals(VirtualFrame frame, PDict globals, HashingCollectionNodes.SetItemNode setBuiltins, PythonModule builtins, PythonObjectLibrary lib) {
612+
private void setBuiltinsInGlobals(VirtualFrame frame, PDict globals, HashingCollectionNodes.SetItemNode setBuiltins, PythonModule builtins) {
611613
if (builtins != null) {
612-
PDict builtinsDict = lib.getDict(builtins);
613-
if (builtinsDict == null) {
614-
builtinsDict = factory().createDictFixedStorage(builtins);
615-
try {
616-
lib.setDict(builtins, builtinsDict);
617-
} catch (UnsupportedMessageException e) {
618-
CompilerDirectives.transferToInterpreterAndInvalidate();
619-
throw new IllegalStateException(e);
620-
}
621-
}
614+
PDict builtinsDict = getOrCreateDictNode(builtins);
622615
setBuiltins.execute(frame, globals, __BUILTINS__, builtinsDict);
623616
} else {
624617
// This happens during context initialization
625618
return;
626619
}
627620
}
628621

629-
private void setCustomGlobals(VirtualFrame frame, PDict globals, HashingCollectionNodes.SetItemNode setBuiltins, Object[] args, PythonObjectLibrary lib) {
622+
private void setCustomGlobals(VirtualFrame frame, PDict globals, HashingCollectionNodes.SetItemNode setBuiltins, Object[] args) {
630623
PythonModule builtins = getContext().getBuiltins();
631-
setBuiltinsInGlobals(frame, globals, setBuiltins, builtins, lib);
624+
setBuiltinsInGlobals(frame, globals, setBuiltins, builtins);
632625
PArguments.setGlobals(args, globals);
633626
}
634627

@@ -648,12 +641,11 @@ Object execInheritGlobalsInheritLocals(VirtualFrame frame, Object source, @Suppr
648641

649642
@Specialization
650643
Object execCustomGlobalsGlobalLocals(VirtualFrame frame, Object source, PDict globals, @SuppressWarnings("unused") PNone locals,
651-
@CachedLibrary(limit = "1") PythonObjectLibrary lib,
652644
@Cached HashingCollectionNodes.SetItemNode setBuiltins,
653645
@Shared("getCt") @Cached CodeNodes.GetCodeCallTargetNode getCt) {
654646
PCode code = createAndCheckCode(frame, source);
655647
Object[] args = PArguments.create();
656-
setCustomGlobals(frame, globals, setBuiltins, args, lib);
648+
setCustomGlobals(frame, globals, setBuiltins, args);
657649
// here, we don't need to set any locals, since the {Write,Read,Delete}NameNodes will
658650
// fall back (like their CPython counterparts) to writing to the globals. We only need
659651
// to ensure that the `locals()` call still gives us the globals dict
@@ -681,12 +673,11 @@ Object execInheritGlobalsCustomLocals(VirtualFrame frame, Object source, @Suppre
681673

682674
@Specialization(guards = {"isMapping(locals)"})
683675
Object execCustomGlobalsCustomLocals(VirtualFrame frame, Object source, PDict globals, Object locals,
684-
@CachedLibrary(limit = "1") PythonObjectLibrary lib,
685676
@Cached HashingCollectionNodes.SetItemNode setBuiltins,
686677
@Shared("getCt") @Cached CodeNodes.GetCodeCallTargetNode getCt) {
687678
PCode code = createAndCheckCode(frame, source);
688679
Object[] args = PArguments.create();
689-
setCustomGlobals(frame, globals, setBuiltins, args, lib);
680+
setCustomGlobals(frame, globals, setBuiltins, args);
690681
setCustomLocals(args, locals);
691682

692683
return invokeNode.execute(frame, getCt.execute(code), args);
@@ -710,6 +701,14 @@ private CompileNode getCompileNode() {
710701
return compileNode;
711702
}
712703

704+
private PDict getOrCreateDictNode(PythonObject object) {
705+
if (getOrCreateDictNode == null) {
706+
CompilerDirectives.transferToInterpreterAndInvalidate();
707+
getOrCreateDictNode = insert(GetOrCreateDictNode.create());
708+
}
709+
return getOrCreateDictNode.execute(object);
710+
}
711+
713712
protected boolean shouldStripLeadingWhitespace() {
714713
return true;
715714
}
@@ -1943,22 +1942,11 @@ public abstract static class GlobalsNode extends PythonBuiltinNode {
19431942

19441943
@Specialization
19451944
public Object globals(VirtualFrame frame,
1946-
@CachedLibrary(limit = "1") PythonObjectLibrary lib) {
1945+
@Cached GetOrCreateDictNode getDict) {
19471946
PFrame callerFrame = readCallerFrameNode.executeWith(frame, 0);
19481947
PythonObject globals = callerFrame.getGlobals();
19491948
if (condProfile.profile(globals instanceof PythonModule)) {
1950-
PDict dict = lib.getDict(globals);
1951-
if (dict == null) {
1952-
CompilerDirectives.transferToInterpreter();
1953-
dict = factory().createDictFixedStorage(globals);
1954-
try {
1955-
lib.setDict(globals, dict);
1956-
} catch (UnsupportedMessageException e) {
1957-
CompilerDirectives.transferToInterpreterAndInvalidate();
1958-
throw new IllegalStateException(e);
1959-
}
1960-
}
1961-
return dict;
1949+
return getDict.execute(globals);
19621950
} else {
19631951
return globals;
19641952
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCArrayTypeBuiltins.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,23 +67,20 @@
6767
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
6868
import com.oracle.graal.python.builtins.objects.dict.PDict;
6969
import com.oracle.graal.python.builtins.objects.function.PKeyword;
70-
import com.oracle.graal.python.builtins.objects.object.PythonObject;
71-
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
7270
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
7371
import com.oracle.graal.python.nodes.SpecialMethodNames;
7472
import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
7573
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7674
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
75+
import com.oracle.graal.python.nodes.object.GetOrCreateDictNode;
7776
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
7877
import com.oracle.graal.python.runtime.exception.PException;
79-
import com.oracle.truffle.api.CompilerDirectives;
8078
import com.oracle.truffle.api.dsl.Cached;
8179
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
8280
import com.oracle.truffle.api.dsl.ImportStatic;
8381
import com.oracle.truffle.api.dsl.NodeFactory;
8482
import com.oracle.truffle.api.dsl.Specialization;
8583
import com.oracle.truffle.api.frame.VirtualFrame;
86-
import com.oracle.truffle.api.interop.UnsupportedMessageException;
8784
import com.oracle.truffle.api.library.CachedLibrary;
8885

8986
@CoreFunctions(extendClasses = PythonBuiltinClassType.PyCArrayType)
@@ -108,7 +105,7 @@ Object PyCArrayType_new(VirtualFrame frame, Object type, Object[] args, PKeyword
108105
@Cached IsBuiltinClassProfile profile,
109106
@Cached PyNumberAsSizeNode asSizeNode,
110107
@Cached TypeNode typeNew,
111-
@CachedLibrary(limit = "1") PythonObjectLibrary lib,
108+
@Cached GetOrCreateDictNode getDict,
112109
@CachedLibrary(limit = "1") HashingStorageLibrary hlib,
113110
@Cached PyTypeStgDictNode pyTypeStgDictNode) {
114111
/*
@@ -181,16 +178,8 @@ Object PyCArrayType_new(VirtualFrame frame, Object type, Object[] args, PKeyword
181178
stgdict.ffi_type_pointer = itemdict.ffi_type_pointer.getAsArray();
182179

183180
/* replace the class dict by our updated spam dict */
184-
PDict resDict = lib.getDict(result);
185-
if (resDict == null) {
186-
resDict = factory().createDictFixedStorage((PythonObject) result);
187-
}
181+
PDict resDict = getDict.execute(result);
188182
stgdict.setDictStorage(hlib.addAllToOther(resDict.getDictStorage(), stgdict.getDictStorage()));
189-
try {
190-
lib.setDict(result, stgdict);
191-
} catch (UnsupportedMessageException e) {
192-
throw CompilerDirectives.shouldNotReachHere(e);
193-
}
194183

195184
/*
196185
* Special case for character arrays. A permanent annoyance: char arrays are also

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrTypeBuiltins.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetInternalObjectArrayNode;
6565
import com.oracle.graal.python.builtins.objects.dict.PDict;
6666
import com.oracle.graal.python.builtins.objects.function.PKeyword;
67-
import com.oracle.graal.python.builtins.objects.object.PythonObject;
6867
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
6968
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
7069
import com.oracle.graal.python.nodes.PGuards;
@@ -73,15 +72,14 @@
7372
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7473
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
7574
import com.oracle.graal.python.nodes.object.GetClassNode;
75+
import com.oracle.graal.python.nodes.object.GetOrCreateDictNode;
7676
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
77-
import com.oracle.truffle.api.CompilerDirectives;
7877
import com.oracle.truffle.api.dsl.Cached;
7978
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
8079
import com.oracle.truffle.api.dsl.ImportStatic;
8180
import com.oracle.truffle.api.dsl.NodeFactory;
8281
import com.oracle.truffle.api.dsl.Specialization;
8382
import com.oracle.truffle.api.frame.VirtualFrame;
84-
import com.oracle.truffle.api.interop.UnsupportedMessageException;
8583
import com.oracle.truffle.api.library.CachedLibrary;
8684

8785
@CoreFunctions(extendClasses = PythonBuiltinClassType.PyCFuncPtrType)
@@ -114,6 +112,7 @@ Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args, PKeywo
114112
@Cached CastToJavaIntExactNode asNumber,
115113
@Cached LookupAttributeInMRONode.Dynamic lookupAttr,
116114
@Cached GetInternalObjectArrayNode getArray,
115+
@Cached GetOrCreateDictNode getDict,
117116
@CachedLibrary(limit = "1") PythonObjectLibrary lib,
118117
@CachedLibrary(limit = "1") HashingStorageLibrary hlib) {
119118
StgDictObject stgdict = factory().createStgDictObject(PythonBuiltinClassType.StgDict);
@@ -132,16 +131,8 @@ Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args, PKeywo
132131
Object result = typeNew.execute(frame, type, args[0], args[1], args[2], kwds);
133132

134133
/* replace the class dict by our updated storage dict */
135-
PDict resDict = lib.getDict(result);
136-
if (resDict == null) {
137-
resDict = factory().createDictFixedStorage((PythonObject) result);
138-
}
134+
PDict resDict = getDict.execute(result);
139135
stgdict.setDictStorage(hlib.addAllToOther(resDict.getDictStorage(), stgdict.getDictStorage()));
140-
try {
141-
lib.setDict(result, stgdict);
142-
} catch (UnsupportedMessageException e) {
143-
throw CompilerDirectives.shouldNotReachHere(e);
144-
}
145136
stgdict.align = FieldDesc.P.pffi_type.alignment;
146137
stgdict.length = 1;
147138
stgdict.size = StgDictObject.VOID_PTR_SIZE;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCPointerTypeBuiltins.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,21 @@
6969
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
7070
import com.oracle.graal.python.builtins.objects.dict.PDict;
7171
import com.oracle.graal.python.builtins.objects.function.PKeyword;
72-
import com.oracle.graal.python.builtins.objects.object.PythonObject;
73-
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
7472
import com.oracle.graal.python.builtins.objects.str.PString;
7573
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode;
7674
import com.oracle.graal.python.nodes.PRaiseNode;
7775
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7876
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
7977
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
78+
import com.oracle.graal.python.nodes.object.GetOrCreateDictNode;
8079
import com.oracle.graal.python.nodes.util.CastToJavaBooleanNode;
8180
import com.oracle.graal.python.runtime.exception.PythonErrorType;
82-
import com.oracle.truffle.api.CompilerDirectives;
8381
import com.oracle.truffle.api.dsl.Cached;
8482
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
8583
import com.oracle.truffle.api.dsl.ImportStatic;
8684
import com.oracle.truffle.api.dsl.NodeFactory;
8785
import com.oracle.truffle.api.dsl.Specialization;
8886
import com.oracle.truffle.api.frame.VirtualFrame;
89-
import com.oracle.truffle.api.interop.UnsupportedMessageException;
9087
import com.oracle.truffle.api.library.CachedLibrary;
9188

9289
@CoreFunctions(extendClasses = PythonBuiltinClassType.PyCPointerType)
@@ -107,8 +104,8 @@ protected abstract static class PyCPointerTypeNewNode extends PythonBuiltinNode
107104

108105
@Specialization
109106
protected Object PyCPointerType_new(VirtualFrame frame, Object type, Object[] args, PKeyword[] kwds,
110-
@CachedLibrary(limit = "1") PythonObjectLibrary lib,
111107
@CachedLibrary(limit = "1") HashingStorageLibrary hlib,
108+
@Cached GetOrCreateDictNode getDict,
112109
@Cached IsTypeNode isTypeNode,
113110
@Cached TypeNode newType,
114111
@Cached PyTypeStgDictNode pyTypeStgDictNode) {
@@ -148,16 +145,8 @@ protected Object PyCPointerType_new(VirtualFrame frame, Object type, Object[] ar
148145
Object /* type */ result = newType.execute(frame, type, args[0], args[1], typedict, kwds);
149146

150147
/* replace the class dict by our updated spam dict */
151-
PDict resDict = lib.getDict(result);
152-
if (resDict == null) {
153-
resDict = factory().createDictFixedStorage((PythonObject) result);
154-
}
148+
PDict resDict = getDict.execute(result);
155149
stgdict.setDictStorage(hlib.addAllToOther(resDict.getDictStorage(), stgdict.getDictStorage()));
156-
try {
157-
lib.setDict(result, stgdict);
158-
} catch (UnsupportedMessageException e) {
159-
throw CompilerDirectives.shouldNotReachHere(e);
160-
}
161150

162151
return result;
163152
}

0 commit comments

Comments
 (0)