118
118
import com .oracle .truffle .api .dsl .GenerateUncached ;
119
119
import com .oracle .truffle .api .dsl .ReportPolymorphism ;
120
120
import com .oracle .truffle .api .dsl .Specialization ;
121
- import com .oracle .truffle .api .frame .VirtualFrame ;
122
121
import com .oracle .truffle .api .interop .ArityException ;
123
122
import com .oracle .truffle .api .interop .InteropLibrary ;
124
123
import com .oracle .truffle .api .interop .InvalidArrayIndexException ;
@@ -727,26 +726,14 @@ public Object asIndexWithState(ThreadState state,
727
726
throw raise .raiseIntegerInterpretationError (this );
728
727
}
729
728
730
- VirtualFrame frameForCall = null ;
731
-
732
729
Object result ;
733
730
if (gotState .profile (state == null )) {
734
731
result = callNode .execute (indexAttr , this );
735
732
} else {
736
- frameForCall = PArguments .frameForCall (state );
737
- result = callNode .execute (frameForCall , indexAttr , this );
738
- }
739
-
740
- boolean isInteger ;
741
- LazyPythonClass resultClass = lib .getLazyPythonClass (result );
742
- if (gotState .profile (state == null )) {
743
- isInteger = isSubtype .execute (resultClass , PythonBuiltinClassType .PInt );
744
- } else {
745
- assert frameForCall != null ;
746
- isInteger = isSubtype .execute (frameForCall , resultClass , PythonBuiltinClassType .PInt );
733
+ result = callNode .execute (PArguments .frameForCall (state ), indexAttr , this );
747
734
}
748
735
749
- if (resultProfile .profile (!isInteger )) {
736
+ if (resultProfile .profile (!isSubtype . execute ( lib . getLazyPythonClass ( result ), PythonBuiltinClassType . PInt ) )) {
750
737
throw raise .raise (PythonBuiltinClassType .TypeError , "__index__ returned non-int (type %p)" , result );
751
738
}
752
739
return result ;
@@ -797,6 +784,17 @@ public final boolean isContextManager(@Exclusive @Cached HasInheritedAttributeNo
797
784
private static final String DATETIME_TYPE = "datetime" ;
798
785
private static final String TIME_TYPE = "time" ;
799
786
private static final String STRUCT_TIME_TYPE = "struct_time" ;
787
+ private static final PythonBuiltinClass fallbackClass = new PythonBuiltinClass (null , null );
788
+
789
+ private static LazyPythonClass readType (ReadAttributeFromObjectNode readTypeNode , Object module , String typename ) {
790
+ Object type = readTypeNode .execute (module , typename );
791
+ if (type instanceof LazyPythonClass ) {
792
+ return (LazyPythonClass ) type ;
793
+ } else {
794
+ // this means someone messed with the builtin modules, we don't know anything and nothing will match this type
795
+ return fallbackClass ;
796
+ }
797
+ }
800
798
801
799
@ ExportMessage
802
800
public boolean isDate (@ Shared ("getClassNode" ) @ Cached GetLazyClassNode getClassNode ,
@@ -808,13 +806,13 @@ public boolean isDate(@Shared("getClassNode") @Cached GetLazyClassNode getClassN
808
806
PDict importedModules = PythonLanguage .getContext ().getImportedModules ();
809
807
Object module = importedModules .getItem (DATETIME_MODULE_NAME );
810
808
if (dateTimeModuleLoaded .profile (module != null )) {
811
- if (isSubtypeNode .execute (objType , readTypeNode . execute ( module , DATETIME_TYPE )) || isSubtypeNode .execute (objType , readTypeNode . execute ( module , DATE_TYPE ))) {
809
+ if (isSubtypeNode .execute (objType , readType ( readTypeNode , module , DATETIME_TYPE )) || isSubtypeNode .execute (objType , readType ( readTypeNode , module , DATE_TYPE ))) {
812
810
return true ;
813
811
}
814
812
}
815
813
module = importedModules .getItem (TIME_MODULE_NAME );
816
814
if (timeModuleLoaded .profile (module != null )) {
817
- if (isSubtypeNode .execute (objType , readTypeNode . execute ( module , STRUCT_TIME_TYPE ))) {
815
+ if (isSubtypeNode .execute (objType , readType ( readTypeNode , module , STRUCT_TIME_TYPE ))) {
818
816
return true ;
819
817
}
820
818
}
@@ -833,7 +831,7 @@ public LocalDate asDate(@Shared("getClassNode") @Cached GetLazyClassNode getClas
833
831
PDict importedModules = PythonLanguage .getContext ().getImportedModules ();
834
832
Object module = importedModules .getItem (DATETIME_MODULE_NAME );
835
833
if (dateTimeModuleLoaded .profile (module != null )) {
836
- if (isSubtypeNode .execute (objType , readTypeNode . execute ( module , DATETIME_TYPE )) || isSubtypeNode .execute (objType , readTypeNode . execute ( module , DATE_TYPE ))) {
834
+ if (isSubtypeNode .execute (objType , readType ( readTypeNode , module , DATETIME_TYPE )) || isSubtypeNode .execute (objType , readType ( readTypeNode , module , DATE_TYPE ))) {
837
835
try {
838
836
int year = castToIntNode .execute (lib .readMember (this , "year" ));
839
837
int month = castToIntNode .execute (lib .readMember (this , "month" ));
@@ -846,7 +844,7 @@ public LocalDate asDate(@Shared("getClassNode") @Cached GetLazyClassNode getClas
846
844
}
847
845
module = importedModules .getItem (TIME_MODULE_NAME );
848
846
if (timeModuleLoaded .profile (module != null )) {
849
- if (isSubtypeNode .execute (objType , readTypeNode . execute ( module , STRUCT_TIME_TYPE ))) {
847
+ if (isSubtypeNode .execute (objType , readType ( readTypeNode , module , STRUCT_TIME_TYPE ))) {
850
848
try {
851
849
int year = castToIntNode .execute (lib .readMember (this , "tm_year" ));
852
850
int month = castToIntNode .execute (lib .readMember (this , "tm_mon" ));
@@ -870,13 +868,13 @@ public boolean isTime(@Shared("getClassNode") @Cached GetLazyClassNode getClassN
870
868
PDict importedModules = PythonLanguage .getContext ().getImportedModules ();
871
869
Object module = importedModules .getItem (DATETIME_MODULE_NAME );
872
870
if (dateTimeModuleLoaded .profile (module != null )) {
873
- if (isSubtype .execute (objType , readTypeNode . execute ( module , DATETIME_TYPE )) || isSubtype .execute (objType , readTypeNode . execute ( module , TIME_TYPE ))) {
871
+ if (isSubtype .execute (objType , readType ( readTypeNode , module , DATETIME_TYPE )) || isSubtype .execute (objType , readType ( readTypeNode , module , TIME_TYPE ))) {
874
872
return true ;
875
873
}
876
874
}
877
875
module = importedModules .getItem (TIME_MODULE_NAME );
878
876
if (timeModuleLoaded .profile (module != null )) {
879
- if (isSubtype .execute (objType , readTypeNode . execute ( module , STRUCT_TIME_TYPE ))) {
877
+ if (isSubtype .execute (objType , readType ( readTypeNode , module , STRUCT_TIME_TYPE ))) {
880
878
return true ;
881
879
}
882
880
}
@@ -895,7 +893,7 @@ public LocalTime asTime(@Shared("getClassNode") @Cached GetLazyClassNode getClas
895
893
PDict importedModules = PythonLanguage .getContext ().getImportedModules ();
896
894
Object module = importedModules .getItem (DATETIME_MODULE_NAME );
897
895
if (dateTimeModuleLoaded .profile (module != null )) {
898
- if (isSubtypeNode .execute (objType , readTypeNode . execute ( module , DATETIME_TYPE )) || isSubtypeNode .execute (objType , readTypeNode . execute ( module , TIME_TYPE ))) {
896
+ if (isSubtypeNode .execute (objType , readType ( readTypeNode , module , DATETIME_TYPE )) || isSubtypeNode .execute (objType , readType ( readTypeNode , module , TIME_TYPE ))) {
899
897
try {
900
898
int hour = castToIntNode .execute (lib .readMember (this , "hour" ));
901
899
int min = castToIntNode .execute (lib .readMember (this , "minute" ));
@@ -909,7 +907,7 @@ public LocalTime asTime(@Shared("getClassNode") @Cached GetLazyClassNode getClas
909
907
}
910
908
module = importedModules .getItem (TIME_MODULE_NAME );
911
909
if (timeModuleLoaded .profile (module != null )) {
912
- if (isSubtypeNode .execute (objType , readTypeNode . execute ( module , STRUCT_TIME_TYPE ))) {
910
+ if (isSubtypeNode .execute (objType , readType ( readTypeNode , module , STRUCT_TIME_TYPE ))) {
913
911
try {
914
912
int hour = castToIntNode .execute (lib .readMember (this , "tm_hour" ));
915
913
int min = castToIntNode .execute (lib .readMember (this , "tm_min" ));
@@ -934,7 +932,7 @@ public boolean isTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCl
934
932
PDict importedModules = PythonLanguage .getContext ().getImportedModules ();
935
933
Object module = importedModules .getItem (DATETIME_MODULE_NAME );
936
934
if (dateTimeModuleLoaded .profile (module != null )) {
937
- if (isSubtype .execute (objType , readTypeNode . execute ( module , DATETIME_TYPE ))) {
935
+ if (isSubtype .execute (objType , readType ( readTypeNode , module , DATETIME_TYPE ))) {
938
936
try {
939
937
Object tzinfo = lib .readMember (this , "tzinfo" );
940
938
if (tzinfo != PNone .NONE ) {
@@ -946,7 +944,7 @@ public boolean isTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCl
946
944
} catch (UnsupportedMessageException | UnknownIdentifierException | ArityException | UnsupportedTypeException ex ) {
947
945
return false ;
948
946
}
949
- } else if (isSubtype .execute (objType , readTypeNode . execute ( module , TIME_TYPE ))) {
947
+ } else if (isSubtype .execute (objType , readType ( readTypeNode , module , TIME_TYPE ))) {
950
948
try {
951
949
Object tzinfo = lib .readMember (this , "tzinfo" );
952
950
if (tzinfo != PNone .NONE ) {
@@ -962,7 +960,7 @@ public boolean isTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCl
962
960
}
963
961
module = importedModules .getItem (TIME_MODULE_NAME );
964
962
if (timeModuleLoaded .profile (module != null )) {
965
- if (isSubtype .execute (objType , readTypeNode . execute ( module , STRUCT_TIME_TYPE ))) {
963
+ if (isSubtype .execute (objType , readType ( readTypeNode , module , STRUCT_TIME_TYPE ))) {
966
964
try {
967
965
Object tm_zone = lib .readMember (this , "tm_zone" );
968
966
if (tm_zone != PNone .NONE ) {
@@ -991,7 +989,7 @@ public ZoneId asTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCla
991
989
PDict importedModules = PythonLanguage .getContext ().getImportedModules ();
992
990
Object module = importedModules .getItem (DATETIME_MODULE_NAME );
993
991
if (dateTimeModuleLoaded .profile (module != null )) {
994
- if (isSubtypeNode .execute (objType , readTypeNode . execute ( module , "datetime" ))) {
992
+ if (isSubtypeNode .execute (objType , readType ( readTypeNode , module , "datetime" ))) {
995
993
try {
996
994
Object tzinfo = lib .readMember (this , "tzinfo" );
997
995
if (tzinfo != PNone .NONE ) {
@@ -1004,7 +1002,7 @@ public ZoneId asTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCla
1004
1002
} catch (UnsupportedMessageException | UnknownIdentifierException | ArityException | UnsupportedTypeException ex ) {
1005
1003
throw UnsupportedMessageException .create ();
1006
1004
}
1007
- } else if (isSubtypeNode .execute (objType , readTypeNode . execute ( module , "time" ))) {
1005
+ } else if (isSubtypeNode .execute (objType , readType ( readTypeNode , module , "time" ))) {
1008
1006
try {
1009
1007
Object tzinfo = lib .readMember (this , "tzinfo" );
1010
1008
if (tzinfo != PNone .NONE ) {
@@ -1021,7 +1019,7 @@ public ZoneId asTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCla
1021
1019
}
1022
1020
module = importedModules .getItem (TIME_MODULE_NAME );
1023
1021
if (timeModuleLoaded .profile (module != null )) {
1024
- if (isSubtypeNode .execute (objType , readTypeNode . execute ( module , "struct_time" ))) {
1022
+ if (isSubtypeNode .execute (objType , readType ( readTypeNode , module , "struct_time" ))) {
1025
1023
try {
1026
1024
Object tm_zone = lib .readMember (this , "tm_zone" );
1027
1025
if (tm_zone != PNone .NONE ) {
0 commit comments