109109import com .oracle .graal .python .builtins .objects .method .PMethod ;
110110import com .oracle .graal .python .builtins .objects .module .PythonModule ;
111111import com .oracle .graal .python .builtins .objects .object .PythonObject ;
112+ import com .oracle .graal .python .builtins .objects .object .PythonObjectLibrary ;
112113import com .oracle .graal .python .builtins .objects .set .PFrozenSet ;
113114import com .oracle .graal .python .builtins .objects .str .PString ;
114115import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
188189import com .oracle .truffle .api .frame .FrameDescriptor ;
189190import com .oracle .truffle .api .frame .FrameSlot ;
190191import com .oracle .truffle .api .frame .VirtualFrame ;
192+ import com .oracle .truffle .api .interop .UnsupportedMessageException ;
193+ import com .oracle .truffle .api .library .CachedLibrary ;
191194import com .oracle .truffle .api .nodes .ExplodeLoop ;
192195import com .oracle .truffle .api .nodes .Node ;
193196import com .oracle .truffle .api .nodes .NodeUtil ;
@@ -652,12 +655,17 @@ private static void setCustomLocals(Object[] args, Object locals) {
652655 PArguments .setCustomLocals (args , locals );
653656 }
654657
655- private void setBuiltinsInGlobals (VirtualFrame frame , PDict globals , HashingCollectionNodes .SetItemNode setBuiltins , PythonModule builtins ) {
658+ private void setBuiltinsInGlobals (VirtualFrame frame , PDict globals , HashingCollectionNodes .SetItemNode setBuiltins , PythonModule builtins , PythonObjectLibrary lib ) {
656659 if (builtins != null ) {
657- PHashingCollection builtinsDict = builtins .getDict ();
660+ PHashingCollection builtinsDict = lib .getDict (builtins );
658661 if (builtinsDict == null ) {
659662 builtinsDict = factory ().createDictFixedStorage (builtins );
660- builtins .setDict (builtinsDict );
663+ try {
664+ lib .setDict (builtins , builtinsDict );
665+ } catch (UnsupportedMessageException e ) {
666+ CompilerDirectives .transferToInterpreter ();
667+ throw new IllegalStateException (e );
668+ }
661669 }
662670 setBuiltins .execute (frame , globals , BuiltinNames .__BUILTINS__ , builtinsDict );
663671 } else {
@@ -666,9 +674,9 @@ private void setBuiltinsInGlobals(VirtualFrame frame, PDict globals, HashingColl
666674 }
667675 }
668676
669- private void setCustomGlobals (VirtualFrame frame , PDict globals , HashingCollectionNodes .SetItemNode setBuiltins , Object [] args ) {
677+ private void setCustomGlobals (VirtualFrame frame , PDict globals , HashingCollectionNodes .SetItemNode setBuiltins , Object [] args , PythonObjectLibrary lib ) {
670678 PythonModule builtins = getContext ().getBuiltins ();
671- setBuiltinsInGlobals (frame , globals , setBuiltins , builtins );
679+ setBuiltinsInGlobals (frame , globals , setBuiltins , builtins , lib );
672680 PArguments .setGlobals (args , globals );
673681 }
674682
@@ -687,10 +695,11 @@ Object execInheritGlobalsInheritLocals(VirtualFrame frame, Object source, @Suppr
687695
688696 @ Specialization
689697 Object execCustomGlobalsGlobalLocals (VirtualFrame frame , Object source , PDict globals , @ SuppressWarnings ("unused" ) PNone locals ,
698+ @ CachedLibrary (limit = "1" ) PythonObjectLibrary lib ,
690699 @ Cached ("create()" ) HashingCollectionNodes .SetItemNode setBuiltins ) {
691700 PCode code = createAndCheckCode (frame , source );
692701 Object [] args = PArguments .create ();
693- setCustomGlobals (frame , globals , setBuiltins , args );
702+ setCustomGlobals (frame , globals , setBuiltins , args , lib );
694703 // here, we don't need to set any locals, since the {Write,Read,Delete}NameNodes will
695704 // fall back (like their CPython counterparts) to writing to the globals. We only need
696705 // to ensure that the `locals()` call still gives us the globals dict
@@ -717,10 +726,11 @@ Object execInheritGlobalsCustomLocals(VirtualFrame frame, Object source, @Suppre
717726
718727 @ Specialization (guards = {"isMapping(locals)" })
719728 Object execCustomGlobalsCustomLocals (VirtualFrame frame , Object source , PDict globals , Object locals ,
729+ @ CachedLibrary (limit = "1" ) PythonObjectLibrary lib ,
720730 @ Cached ("create()" ) HashingCollectionNodes .SetItemNode setBuiltins ) {
721731 PCode code = createAndCheckCode (frame , source );
722732 Object [] args = PArguments .create ();
723- setCustomGlobals (frame , globals , setBuiltins , args );
733+ setCustomGlobals (frame , globals , setBuiltins , args , lib );
724734 setCustomLocals (args , locals );
725735
726736 return invokeNode .execute (frame , code .getRootCallTarget (), args );
@@ -1927,14 +1937,21 @@ abstract static class GlobalsNode extends PythonBuiltinNode {
19271937 private final ConditionProfile condProfile = ConditionProfile .createBinaryProfile ();
19281938
19291939 @ Specialization
1930- public Object globals (VirtualFrame frame ) {
1940+ public Object globals (VirtualFrame frame ,
1941+ @ CachedLibrary (limit = "1" ) PythonObjectLibrary lib ) {
19311942 PFrame callerFrame = readCallerFrameNode .executeWith (frame , 0 );
19321943 PythonObject globals = callerFrame .getGlobals ();
19331944 if (condProfile .profile (globals instanceof PythonModule )) {
1934- PHashingCollection dict = globals .getDict ();
1945+ PHashingCollection dict = lib .getDict (globals );
19351946 if (dict == null ) {
19361947 CompilerDirectives .transferToInterpreter ();
1937- globals .setDict (dict = factory ().createDictFixedStorage (globals ));
1948+ dict = factory ().createDictFixedStorage (globals );
1949+ try {
1950+ lib .setDict (globals , dict );
1951+ } catch (UnsupportedMessageException e ) {
1952+ CompilerDirectives .transferToInterpreter ();
1953+ throw new IllegalStateException (e );
1954+ }
19381955 }
19391956 return dict ;
19401957 } else {
0 commit comments