109
109
import com .oracle .graal .python .builtins .objects .method .PMethod ;
110
110
import com .oracle .graal .python .builtins .objects .module .PythonModule ;
111
111
import com .oracle .graal .python .builtins .objects .object .PythonObject ;
112
+ import com .oracle .graal .python .builtins .objects .object .PythonObjectLibrary ;
112
113
import com .oracle .graal .python .builtins .objects .set .PFrozenSet ;
113
114
import com .oracle .graal .python .builtins .objects .str .PString ;
114
115
import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
188
189
import com .oracle .truffle .api .frame .FrameDescriptor ;
189
190
import com .oracle .truffle .api .frame .FrameSlot ;
190
191
import com .oracle .truffle .api .frame .VirtualFrame ;
192
+ import com .oracle .truffle .api .interop .UnsupportedMessageException ;
193
+ import com .oracle .truffle .api .library .CachedLibrary ;
191
194
import com .oracle .truffle .api .nodes .ExplodeLoop ;
192
195
import com .oracle .truffle .api .nodes .Node ;
193
196
import com .oracle .truffle .api .nodes .NodeUtil ;
@@ -652,12 +655,17 @@ private static void setCustomLocals(Object[] args, Object locals) {
652
655
PArguments .setCustomLocals (args , locals );
653
656
}
654
657
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 ) {
656
659
if (builtins != null ) {
657
- PHashingCollection builtinsDict = builtins .getDict ();
660
+ PHashingCollection builtinsDict = lib .getDict (builtins );
658
661
if (builtinsDict == null ) {
659
662
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
+ }
661
669
}
662
670
setBuiltins .execute (frame , globals , BuiltinNames .__BUILTINS__ , builtinsDict );
663
671
} else {
@@ -666,9 +674,9 @@ private void setBuiltinsInGlobals(VirtualFrame frame, PDict globals, HashingColl
666
674
}
667
675
}
668
676
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 ) {
670
678
PythonModule builtins = getContext ().getBuiltins ();
671
- setBuiltinsInGlobals (frame , globals , setBuiltins , builtins );
679
+ setBuiltinsInGlobals (frame , globals , setBuiltins , builtins , lib );
672
680
PArguments .setGlobals (args , globals );
673
681
}
674
682
@@ -687,10 +695,11 @@ Object execInheritGlobalsInheritLocals(VirtualFrame frame, Object source, @Suppr
687
695
688
696
@ Specialization
689
697
Object execCustomGlobalsGlobalLocals (VirtualFrame frame , Object source , PDict globals , @ SuppressWarnings ("unused" ) PNone locals ,
698
+ @ CachedLibrary (limit = "1" ) PythonObjectLibrary lib ,
690
699
@ Cached ("create()" ) HashingCollectionNodes .SetItemNode setBuiltins ) {
691
700
PCode code = createAndCheckCode (frame , source );
692
701
Object [] args = PArguments .create ();
693
- setCustomGlobals (frame , globals , setBuiltins , args );
702
+ setCustomGlobals (frame , globals , setBuiltins , args , lib );
694
703
// here, we don't need to set any locals, since the {Write,Read,Delete}NameNodes will
695
704
// fall back (like their CPython counterparts) to writing to the globals. We only need
696
705
// to ensure that the `locals()` call still gives us the globals dict
@@ -717,10 +726,11 @@ Object execInheritGlobalsCustomLocals(VirtualFrame frame, Object source, @Suppre
717
726
718
727
@ Specialization (guards = {"isMapping(locals)" })
719
728
Object execCustomGlobalsCustomLocals (VirtualFrame frame , Object source , PDict globals , Object locals ,
729
+ @ CachedLibrary (limit = "1" ) PythonObjectLibrary lib ,
720
730
@ Cached ("create()" ) HashingCollectionNodes .SetItemNode setBuiltins ) {
721
731
PCode code = createAndCheckCode (frame , source );
722
732
Object [] args = PArguments .create ();
723
- setCustomGlobals (frame , globals , setBuiltins , args );
733
+ setCustomGlobals (frame , globals , setBuiltins , args , lib );
724
734
setCustomLocals (args , locals );
725
735
726
736
return invokeNode .execute (frame , code .getRootCallTarget (), args );
@@ -1927,14 +1937,21 @@ abstract static class GlobalsNode extends PythonBuiltinNode {
1927
1937
private final ConditionProfile condProfile = ConditionProfile .createBinaryProfile ();
1928
1938
1929
1939
@ Specialization
1930
- public Object globals (VirtualFrame frame ) {
1940
+ public Object globals (VirtualFrame frame ,
1941
+ @ CachedLibrary (limit = "1" ) PythonObjectLibrary lib ) {
1931
1942
PFrame callerFrame = readCallerFrameNode .executeWith (frame , 0 );
1932
1943
PythonObject globals = callerFrame .getGlobals ();
1933
1944
if (condProfile .profile (globals instanceof PythonModule )) {
1934
- PHashingCollection dict = globals .getDict ();
1945
+ PHashingCollection dict = lib .getDict (globals );
1935
1946
if (dict == null ) {
1936
1947
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
+ }
1938
1955
}
1939
1956
return dict ;
1940
1957
} else {
0 commit comments