125125import com .oracle .graal .python .runtime .sequence .storage .EmptySequenceStorage ;
126126import com .oracle .graal .python .runtime .sequence .storage .SequenceStorage ;
127127import com .oracle .truffle .api .CompilerDirectives ;
128- import com .oracle .truffle .api .CompilerDirectives .CompilationFinal ;
129128import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
130129import com .oracle .truffle .api .TruffleFile ;
131130import com .oracle .truffle .api .TruffleLanguage .Env ;
@@ -196,6 +195,18 @@ public void postInitialize(Python3Core core) {
196195 AbstractImportNode .importModule (T_INTERNAL_POLYGLOT_MODULE );
197196 }
198197
198+ abstract static class InteropBuiltinBaseNode extends PythonBuiltinNode {
199+ @ Child InteropLibrary interop ;
200+
201+ public InteropLibrary getInterop () {
202+ if (interop == null ) {
203+ CompilerDirectives .transferToInterpreterAndInvalidate ();
204+ interop = insert (InteropLibrary .getFactory ().createDispatched (1 ));
205+ }
206+ return interop ;
207+ }
208+ }
209+
199210 @ Builtin (name = "import_value" , minNumOfPositionalArgs = 1 , parameterNames = {"name" })
200211 @ GenerateNodeFactory
201212 public abstract static class ImportNode extends PythonBuiltinNode {
@@ -386,16 +397,6 @@ private static void export(Node raisingNode, String name, Object obj) {
386397 }
387398 }
388399
389- @ CompilationFinal static InteropLibrary UNCACHED_INTEROP ;
390-
391- static InteropLibrary getInterop () {
392- if (UNCACHED_INTEROP == null ) {
393- CompilerDirectives .transferToInterpreterAndInvalidate ();
394- UNCACHED_INTEROP = InteropLibrary .getFactory ().getUncached ();
395- }
396- return UNCACHED_INTEROP ;
397- }
398-
399400 abstract static class FitsInNumberNode extends PythonUnaryBuiltinNode {
400401 static boolean isSupportedNumber (Object number ) {
401402 return number instanceof Number || number instanceof PInt ;
@@ -933,7 +934,7 @@ public static void clearInteropTypeRegistryCache(PythonContext pythonContext) {
933934
934935 @ Builtin (name = "__read__" , minNumOfPositionalArgs = 2 )
935936 @ GenerateNodeFactory
936- public abstract static class ReadNode extends PythonBuiltinNode {
937+ public abstract static class ReadNode extends InteropBuiltinBaseNode {
937938 @ Specialization
938939 @ TruffleBoundary
939940 Object read (Object receiver , Object key ) {
@@ -955,7 +956,7 @@ Object read(Object receiver, Object key) {
955956
956957 @ Builtin (name = "__write__" , minNumOfPositionalArgs = 3 )
957958 @ GenerateNodeFactory
958- public abstract static class WriteNode extends PythonBuiltinNode {
959+ public abstract static class WriteNode extends InteropBuiltinBaseNode {
959960 @ Specialization
960961 @ TruffleBoundary
961962 Object write (Object receiver , Object key , Object value ) {
@@ -978,7 +979,7 @@ Object write(Object receiver, Object key, Object value) {
978979
979980 @ Builtin (name = "__remove__" , minNumOfPositionalArgs = 2 )
980981 @ GenerateNodeFactory
981- public abstract static class removeNode extends PythonBuiltinNode {
982+ public abstract static class removeNode extends InteropBuiltinBaseNode {
982983 @ Specialization
983984 @ TruffleBoundary
984985 Object remove (Object receiver , Object key ) {
@@ -1001,9 +1002,9 @@ Object remove(Object receiver, Object key) {
10011002
10021003 @ Builtin (name = "__execute__" , minNumOfPositionalArgs = 1 , takesVarArgs = true )
10031004 @ GenerateNodeFactory
1004- public abstract static class executeNode extends PythonBuiltinNode {
1005+ public abstract static class executeNode extends InteropBuiltinBaseNode {
10051006 @ Specialization
1006- static Object exec (Object receiver , Object [] arguments ,
1007+ Object exec (Object receiver , Object [] arguments ,
10071008 @ Bind Node inliningTarget ,
10081009 @ Cached PRaiseNode raiseNode ) {
10091010 try {
@@ -1016,9 +1017,9 @@ static Object exec(Object receiver, Object[] arguments,
10161017
10171018 @ Builtin (name = "__new__" , minNumOfPositionalArgs = 1 , takesVarArgs = true )
10181019 @ GenerateNodeFactory
1019- public abstract static class newNode extends PythonBuiltinNode {
1020+ public abstract static class newNode extends InteropBuiltinBaseNode {
10201021 @ Specialization
1021- static Object instantiate (Object receiver , Object [] arguments ,
1022+ Object instantiate (Object receiver , Object [] arguments ,
10221023 @ Bind Node inliningTarget ,
10231024 @ Cached PRaiseNode raiseNode ) {
10241025 try {
@@ -1031,9 +1032,9 @@ static Object instantiate(Object receiver, Object[] arguments,
10311032
10321033 @ Builtin (name = "__invoke__" , minNumOfPositionalArgs = 2 , takesVarArgs = true )
10331034 @ GenerateNodeFactory
1034- public abstract static class invokeNode extends PythonBuiltinNode {
1035+ public abstract static class invokeNode extends InteropBuiltinBaseNode {
10351036 @ Specialization
1036- static Object invoke (Object receiver , TruffleString key , Object [] arguments ,
1037+ Object invoke (Object receiver , TruffleString key , Object [] arguments ,
10371038 @ Bind Node inliningTarget ,
10381039 @ Cached TruffleString .ToJavaStringNode toJavaStringNode ,
10391040 @ Cached PRaiseNode raiseNode ) {
@@ -1047,27 +1048,27 @@ static Object invoke(Object receiver, TruffleString key, Object[] arguments,
10471048
10481049 @ Builtin (name = "__is_null__" , minNumOfPositionalArgs = 1 )
10491050 @ GenerateNodeFactory
1050- public abstract static class IsNullNode extends PythonBuiltinNode {
1051+ public abstract static class IsNullNode extends InteropBuiltinBaseNode {
10511052 @ Specialization
1052- static boolean isNull (Object receiver ) {
1053+ boolean isNull (Object receiver ) {
10531054 return getInterop ().isNull (receiver );
10541055 }
10551056 }
10561057
10571058 @ Builtin (name = "__has_size__" , minNumOfPositionalArgs = 1 )
10581059 @ GenerateNodeFactory
1059- public abstract static class HasSizeNode extends PythonBuiltinNode {
1060+ public abstract static class HasSizeNode extends InteropBuiltinBaseNode {
10601061 @ Specialization
1061- static boolean hasSize (Object receiver ) {
1062+ boolean hasSize (Object receiver ) {
10621063 return getInterop ().hasArrayElements (receiver );
10631064 }
10641065 }
10651066
10661067 @ Builtin (name = "__get_size__" , minNumOfPositionalArgs = 1 )
10671068 @ GenerateNodeFactory
1068- public abstract static class GetSizeNode extends PythonBuiltinNode {
1069+ public abstract static class GetSizeNode extends InteropBuiltinBaseNode {
10691070 @ Specialization
1070- static Object getSize (Object receiver ,
1071+ Object getSize (Object receiver ,
10711072 @ Bind Node inliningTarget ,
10721073 @ Cached PRaiseNode raiseNode ) {
10731074 try {
@@ -1080,27 +1081,27 @@ static Object getSize(Object receiver,
10801081
10811082 @ Builtin (name = "__is_boxed__" , minNumOfPositionalArgs = 1 )
10821083 @ GenerateNodeFactory
1083- public abstract static class IsBoxedNode extends PythonBuiltinNode {
1084+ public abstract static class IsBoxedNode extends InteropBuiltinBaseNode {
10841085 @ Specialization
1085- static boolean isBoxed (Object receiver ) {
1086+ boolean isBoxed (Object receiver ) {
10861087 return getInterop ().isString (receiver ) || getInterop ().fitsInDouble (receiver ) || getInterop ().fitsInLong (receiver );
10871088 }
10881089 }
10891090
10901091 @ Builtin (name = "__has_keys__" , minNumOfPositionalArgs = 1 )
10911092 @ GenerateNodeFactory
1092- public abstract static class HasKeysNode extends PythonBuiltinNode {
1093+ public abstract static class HasKeysNode extends InteropBuiltinBaseNode {
10931094 @ Specialization
1094- static boolean hasKeys (Object receiver ) {
1095+ boolean hasKeys (Object receiver ) {
10951096 return getInterop ().hasMembers (receiver );
10961097 }
10971098 }
10981099
10991100 @ Builtin (name = "__key_info__" , minNumOfPositionalArgs = 3 )
11001101 @ GenerateNodeFactory
1101- public abstract static class KeyInfoNode extends PythonBuiltinNode {
1102+ public abstract static class KeyInfoNode extends InteropBuiltinBaseNode {
11021103 @ Specialization
1103- static boolean keyInfo (Object receiver , TruffleString tmember , TruffleString info ,
1104+ boolean keyInfo (Object receiver , TruffleString tmember , TruffleString info ,
11041105 @ Cached TruffleString .ToJavaStringNode toJavaStringNode ,
11051106 @ Cached TruffleString .EqualNode equalNode ) {
11061107 String member = toJavaStringNode .execute (tmember );
@@ -1132,9 +1133,9 @@ static boolean keyInfo(Object receiver, TruffleString tmember, TruffleString inf
11321133
11331134 @ Builtin (name = "__keys__" , minNumOfPositionalArgs = 1 )
11341135 @ GenerateNodeFactory
1135- public abstract static class KeysNode extends PythonBuiltinNode {
1136+ public abstract static class KeysNode extends InteropBuiltinBaseNode {
11361137 @ Specialization
1137- static Object remove (Object receiver ,
1138+ Object remove (Object receiver ,
11381139 @ Bind Node inliningTarget ,
11391140 @ Cached PRaiseNode raiseNode ) {
11401141 try {
@@ -1148,9 +1149,9 @@ static Object remove(Object receiver,
11481149 @ Builtin (name = "__element_info__" , minNumOfPositionalArgs = 3 )
11491150 @ GenerateNodeFactory
11501151 @ TypeSystemReference (PythonIntegerTypes .class )
1151- public abstract static class ArrayElementInfoNode extends PythonBuiltinNode {
1152+ public abstract static class ArrayElementInfoNode extends InteropBuiltinBaseNode {
11521153 @ Specialization
1153- static boolean keyInfo (Object receiver , long member , TruffleString info ,
1154+ boolean keyInfo (Object receiver , long member , TruffleString info ,
11541155 @ Cached TruffleString .EqualNode equalNode ) {
11551156 if (equalNode .execute (info , T_EXISTS , TS_ENCODING )) {
11561157 return getInterop ().isArrayElementExisting (receiver , member );
0 commit comments