50
50
import java .util .Arrays ;
51
51
import java .util .List ;
52
52
53
+ import com .oracle .graal .python .PythonLanguage ;
53
54
import com .oracle .graal .python .builtins .PythonBuiltinClassType ;
54
55
import com .oracle .graal .python .builtins .objects .code .CodeNodes ;
55
56
import com .oracle .graal .python .builtins .objects .code .PCode ;
85
86
import com .oracle .truffle .api .dsl .Bind ;
86
87
import com .oracle .truffle .api .dsl .Cached ;
87
88
import com .oracle .truffle .api .dsl .Cached .Exclusive ;
89
+ import com .oracle .truffle .api .dsl .Cached .Shared ;
88
90
import com .oracle .truffle .api .dsl .GenerateCached ;
89
91
import com .oracle .truffle .api .dsl .GenerateInline ;
90
92
import com .oracle .truffle .api .dsl .GenerateUncached ;
93
+ import com .oracle .truffle .api .dsl .Idempotent ;
91
94
import com .oracle .truffle .api .dsl .ImportStatic ;
92
95
import com .oracle .truffle .api .dsl .Specialization ;
93
96
import com .oracle .truffle .api .nodes .ExplodeLoop ;
@@ -701,11 +704,26 @@ private static void storeKeywordsOrRaise(Object callee, Object[] arguments, PKey
701
704
protected abstract static class SearchNamedParameterNode extends Node {
702
705
public abstract int execute (TruffleString [] parameters , TruffleString name );
703
706
704
- @ Specialization (guards = {"cachedLen == parameters.length" , "cachedLen <= 32" })
707
+ @ Idempotent // I think this is true, I would just like the assertion
708
+ protected static boolean nameIsAtIndex (TruffleString [] parameters , TruffleString name , int index ) {
709
+ return uncached (parameters , name , TruffleString .EqualNode .getUncached ()) == index ;
710
+ }
711
+
712
+ @ SuppressWarnings ("unused" )
713
+ @ Specialization (guards = {"name == cachedName" , "parameters == cachedParameters" , "nameIsAtIndex(cachedParameters, cachedName, index)" }, limit = "1" )
714
+ static int cachedSingle (TruffleString [] parameters , TruffleString name ,
715
+ @ Cached ("name" ) TruffleString cachedName ,
716
+ @ Cached (value = "parameters" , dimensions = 0 ) TruffleString [] cachedParameters ,
717
+ @ Shared @ Cached TruffleString .EqualNode equalNode ,
718
+ @ Cached ("uncached(parameters, name, equalNode)" ) int index ) {
719
+ return index ;
720
+ }
721
+
722
+ @ Specialization (guards = {"cachedLen == parameters.length" , "cachedLen <= 32" }, replaces = "cachedSingle" )
705
723
@ ExplodeLoop
706
- int cached (TruffleString [] parameters , TruffleString name ,
724
+ static int cached (TruffleString [] parameters , TruffleString name ,
707
725
@ Cached ("parameters.length" ) int cachedLen ,
708
- @ Cached TruffleString .EqualNode equalNode ) {
726
+ @ Shared @ Cached TruffleString .EqualNode equalNode ) {
709
727
int idx = -1 ;
710
728
for (int i = 0 ; i < cachedLen ; i ++) {
711
729
if (equalNode .execute (parameters [i ], name , TS_ENCODING )) {
@@ -716,8 +734,8 @@ int cached(TruffleString[] parameters, TruffleString name,
716
734
}
717
735
718
736
@ Specialization (replaces = "cached" )
719
- int uncached (TruffleString [] parameters , TruffleString name ,
720
- @ Cached TruffleString .EqualNode equalNode ) {
737
+ static int uncached (TruffleString [] parameters , TruffleString name ,
738
+ @ Shared @ Cached TruffleString .EqualNode equalNode ) {
721
739
for (int i = 0 ; i < parameters .length ; i ++) {
722
740
if (equalNode .execute (parameters [i ], name , TS_ENCODING )) {
723
741
return i ;
@@ -914,11 +932,34 @@ protected abstract static class FindKwDefaultNode extends Node {
914
932
915
933
public abstract PKeyword execute (PKeyword [] kwdefaults , TruffleString kwname );
916
934
917
- @ Specialization (guards = {"kwdefaults.length == cachedLength" , "cachedLength < 32" })
935
+ @ Idempotent
936
+ protected final boolean isSingleContext () {
937
+ return PythonLanguage .get (this ).isSingleContext ();
938
+ }
939
+
940
+ @ Idempotent // I think this is true, I would just like the assertion
941
+ protected static boolean kwIsCorrect (PKeyword [] kwdefaults , TruffleString kwname , PKeyword result ) {
942
+ return doUncached (kwdefaults , kwname , TruffleString .EqualNode .getUncached ()) == result ;
943
+ }
944
+
945
+ protected static TruffleString .EqualNode getUncachedEqualNode () {
946
+ return TruffleString .EqualNode .getUncached ();
947
+ }
948
+
949
+ @ SuppressWarnings ("unused" )
950
+ @ Specialization (guards = {"kwname == cachedKwName" , "kwdefaults == cachedKwdefaults" , "isSingleContext()" , "kwIsCorrect(cachedKwdefaults, cachedKwName, result)" }, limit = "1" )
951
+ PKeyword cachedSingle (PKeyword [] kwdefaults , TruffleString kwname ,
952
+ @ Cached ("kwname" ) TruffleString cachedKwName ,
953
+ @ Cached (value = "kwdefaults" , weak = true , dimensions = 0 ) PKeyword [] cachedKwdefaults ,
954
+ @ Cached (value = "doUncached(kwdefaults, kwname, getUncachedEqualNode())" , weak = true ) PKeyword result ) {
955
+ return result ;
956
+ }
957
+
958
+ @ Specialization (guards = {"kwdefaults.length == cachedLength" , "cachedLength < 32" }, replaces = "cachedSingle" )
918
959
@ ExplodeLoop (kind = LoopExplosionKind .FULL_UNROLL_UNTIL_RETURN )
919
- PKeyword doCached (PKeyword [] kwdefaults , TruffleString kwname ,
960
+ static PKeyword doCached (PKeyword [] kwdefaults , TruffleString kwname ,
920
961
@ Cached ("kwdefaults.length" ) int cachedLength ,
921
- @ Cached TruffleString .EqualNode equalNode ) {
962
+ @ Shared @ Cached TruffleString .EqualNode equalNode ) {
922
963
for (int j = 0 ; j < cachedLength ; j ++) {
923
964
if (equalNode .execute (kwdefaults [j ].getName (), kwname , TS_ENCODING )) {
924
965
return kwdefaults [j ];
@@ -928,8 +969,8 @@ PKeyword doCached(PKeyword[] kwdefaults, TruffleString kwname,
928
969
}
929
970
930
971
@ Specialization (replaces = "doCached" )
931
- PKeyword doUncached (PKeyword [] kwdefaults , TruffleString kwname ,
932
- @ Cached TruffleString .EqualNode equalNode ) {
972
+ static PKeyword doUncached (PKeyword [] kwdefaults , TruffleString kwname ,
973
+ @ Shared @ Cached TruffleString .EqualNode equalNode ) {
933
974
for (int j = 0 ; j < kwdefaults .length ; j ++) {
934
975
if (equalNode .execute (kwdefaults [j ].getName (), kwname , TS_ENCODING )) {
935
976
return kwdefaults [j ];
0 commit comments