@@ -767,15 +767,23 @@ abstract static class NativeBuiltin extends PythonBuiltinNode {
767
767
@ Child private GetByteArrayNode getByteArrayNode ;
768
768
769
769
protected void transformToNative (PException p ) {
770
+ NativeBuiltin .transformToNative (getContext (), p );
771
+ }
772
+
773
+ protected static void transformToNative (PythonContext context , PException p ) {
770
774
p .getExceptionObject ().reifyException ();
771
- getContext () .setCurrentException (p );
775
+ context .setCurrentException (p );
772
776
}
773
777
774
778
protected <T > T raiseNative (T defaultValue , PythonBuiltinClassType errType , String fmt , Object ... args ) {
779
+ return NativeBuiltin .raiseNative (this , defaultValue , errType , fmt , args );
780
+ }
781
+
782
+ protected static <T > T raiseNative (PNodeWithContext n , T defaultValue , PythonBuiltinClassType errType , String fmt , Object ... args ) {
775
783
try {
776
- throw raise (errType , fmt , args );
784
+ throw n . raise (errType , fmt , args );
777
785
} catch (PException p ) {
778
- transformToNative (p );
786
+ NativeBuiltin . transformToNative (n . getContext (), p );
779
787
return defaultValue ;
780
788
}
781
789
}
@@ -881,23 +889,23 @@ protected static String getUTF32Name(int byteorder) {
881
889
}
882
890
}
883
891
884
- @ Builtin (name = "TrufflePInt_AsPrimitive" , fixedNumOfPositionalArgs = 4 )
892
+ @ Builtin (name = "TrufflePInt_AsPrimitive" , fixedNumOfPositionalArgs = 3 )
885
893
@ GenerateNodeFactory
886
- abstract static class TrufflePInt_AsPrimitive extends NativeBuiltin {
894
+ abstract static class TrufflePInt_AsPrimitive extends PythonTernaryBuiltinNode {
887
895
888
- public abstract Object executeWith (Object o , int signed , long targetTypeSize , String targetTypeName );
896
+ public abstract Object executeWith (Object o , int signed , long targetTypeSize );
889
897
890
- public abstract long executeLong (Object o , int signed , long targetTypeSize , String targetTypeName );
898
+ public abstract long executeLong (Object o , int signed , long targetTypeSize );
891
899
892
- public abstract int executeInt (Object o , int signed , long targetTypeSize , String targetTypeName );
900
+ public abstract int executeInt (Object o , int signed , long targetTypeSize );
893
901
894
902
@ Specialization (guards = "targetTypeSize == 4" )
895
- int doInt4 (int obj , @ SuppressWarnings ("unused" ) int signed , @ SuppressWarnings ("unused" ) long targetTypeSize , @ SuppressWarnings ( "unused" ) String targetTypeName ) {
903
+ int doInt4 (int obj , @ SuppressWarnings ("unused" ) int signed , @ SuppressWarnings ("unused" ) long targetTypeSize ) {
896
904
return obj ;
897
905
}
898
906
899
907
@ Specialization (guards = "targetTypeSize == 8" )
900
- long doInt8 (int obj , int signed , @ SuppressWarnings ("unused" ) long targetTypeSize , @ SuppressWarnings ( "unused" ) String targetTypeName ) {
908
+ long doInt8 (int obj , int signed , @ SuppressWarnings ("unused" ) long targetTypeSize ) {
901
909
if (signed != 0 ) {
902
910
return obj ;
903
911
} else {
@@ -906,32 +914,32 @@ long doInt8(int obj, int signed, @SuppressWarnings("unused") long targetTypeSize
906
914
}
907
915
908
916
@ Specialization (guards = {"targetTypeSize != 4" , "targetTypeSize != 8" })
909
- int doIntOther (@ SuppressWarnings ("unused" ) int obj , @ SuppressWarnings ("unused" ) int signed , long targetTypeSize , @ SuppressWarnings ( "unused" ) String targetTypeName ) {
910
- return raiseNative (- 1 , PythonErrorType . SystemError , "Unsupported target size: %d" , targetTypeSize );
917
+ int doIntOther (@ SuppressWarnings ("unused" ) int obj , @ SuppressWarnings ("unused" ) int signed , long targetTypeSize ) {
918
+ return raiseUnsupportedSize ( targetTypeSize );
911
919
}
912
920
913
921
@ Specialization (guards = "targetTypeSize == 4" )
914
- int doLong4 (@ SuppressWarnings ("unused" ) long obj , @ SuppressWarnings ("unused" ) int signed , @ SuppressWarnings ("unused" ) long targetTypeSize , String targetTypeName ) {
915
- return raiseNative (- 1 , PythonErrorType . OverflowError , "Python int too large to convert to C %s" , targetTypeName );
922
+ int doLong4 (@ SuppressWarnings ("unused" ) long obj , @ SuppressWarnings ("unused" ) int signed , @ SuppressWarnings ("unused" ) long targetTypeSize ) {
923
+ return raiseTooLarge ( targetTypeSize );
916
924
}
917
925
918
926
@ Specialization (guards = "targetTypeSize == 8" )
919
- long doLong8 (long obj , @ SuppressWarnings ("unused" ) int signed , @ SuppressWarnings ("unused" ) int targetTypeSize , @ SuppressWarnings ( "unused" ) String targetTypeName ) {
927
+ long doLong8 (long obj , @ SuppressWarnings ("unused" ) int signed , @ SuppressWarnings ("unused" ) int targetTypeSize ) {
920
928
return obj ;
921
929
}
922
930
923
931
@ Specialization (guards = "targetTypeSize == 8" )
924
- long doLong8 (long obj , @ SuppressWarnings ("unused" ) int signed , @ SuppressWarnings ("unused" ) long targetTypeSize , @ SuppressWarnings ( "unused" ) String targetTypeName ) {
932
+ long doLong8 (long obj , @ SuppressWarnings ("unused" ) int signed , @ SuppressWarnings ("unused" ) long targetTypeSize ) {
925
933
return obj ;
926
934
}
927
935
928
936
@ Specialization (guards = {"targetTypeSize != 4" , "targetTypeSize != 8" })
929
- int doPInt (@ SuppressWarnings ("unused" ) long obj , @ SuppressWarnings ("unused" ) int signed , long targetTypeSize , @ SuppressWarnings ( "unused" ) String targetTypeName ) {
930
- return raiseNative (- 1 , PythonErrorType . SystemError , "Unsupported target size: %d" , targetTypeSize );
937
+ int doPInt (@ SuppressWarnings ("unused" ) long obj , @ SuppressWarnings ("unused" ) int signed , long targetTypeSize ) {
938
+ return raiseUnsupportedSize ( targetTypeSize );
931
939
}
932
940
933
941
@ Specialization (guards = "targetTypeSize == 4" )
934
- int doPInt4 (PInt obj , int signed , @ SuppressWarnings ("unused" ) long targetTypeSize , String targetTypeName ) {
942
+ int doPInt4 (PInt obj , int signed , @ SuppressWarnings ("unused" ) long targetTypeSize ) {
935
943
try {
936
944
if (signed != 0 ) {
937
945
return obj .intValueExact ();
@@ -941,12 +949,12 @@ int doPInt4(PInt obj, int signed, @SuppressWarnings("unused") long targetTypeSiz
941
949
throw new ArithmeticException ();
942
950
}
943
951
} catch (ArithmeticException e ) {
944
- return raiseNative (- 1 , PythonErrorType . OverflowError , "Python int too large to convert to C %s" , targetTypeName );
952
+ return raiseTooLarge ( targetTypeSize );
945
953
}
946
954
}
947
955
948
956
@ Specialization (guards = "targetTypeSize == 8" )
949
- long doPInt8 (PInt obj , int signed , @ SuppressWarnings ("unused" ) long targetTypeSize , String targetTypeName ) {
957
+ long doPInt8 (PInt obj , int signed , @ SuppressWarnings ("unused" ) long targetTypeSize ) {
950
958
try {
951
959
if (signed != 0 ) {
952
960
return obj .longValueExact ();
@@ -956,20 +964,32 @@ long doPInt8(PInt obj, int signed, @SuppressWarnings("unused") long targetTypeSi
956
964
throw new ArithmeticException ();
957
965
}
958
966
} catch (ArithmeticException e ) {
959
- return raiseNative (- 1 , PythonErrorType . OverflowError , "Python int too large to convert to C %s" , targetTypeName );
967
+ return raiseTooLarge ( targetTypeSize );
960
968
}
961
969
}
962
970
963
971
@ Specialization (guards = {"targetTypeSize != 4" , "targetTypeSize != 8" })
964
- int doPInt (@ SuppressWarnings ("unused" ) PInt obj , @ SuppressWarnings ("unused" ) int signed , long targetTypeSize , @ SuppressWarnings ( "unused" ) String targetTypeName ) {
965
- return raiseNative (- 1 , PythonErrorType . SystemError , "Unsupported target size: %d" , targetTypeSize );
972
+ int doPInt (@ SuppressWarnings ("unused" ) PInt obj , @ SuppressWarnings ("unused" ) int signed , long targetTypeSize ) {
973
+ return raiseUnsupportedSize ( targetTypeSize );
966
974
}
967
975
968
976
@ Specialization (guards = {"!isInteger(obj)" , "!isPInt(obj)" })
969
977
@ SuppressWarnings ("unused" )
970
- int doGeneric (Object obj , boolean signed , int targetTypeSize , String targetTypeName ) {
978
+ int doGeneric (Object obj , boolean signed , int targetTypeSize ) {
971
979
return raiseNative (-1 , PythonErrorType .TypeError , "an integer is required" , obj );
972
980
}
981
+
982
+ private int raiseTooLarge (long targetTypeSize ) {
983
+ return raiseNative (-1 , PythonErrorType .OverflowError , "Python int too large to convert to %s-byte C type" , targetTypeSize );
984
+ }
985
+
986
+ private Integer raiseUnsupportedSize (long targetTypeSize ) {
987
+ return raiseNative (-1 , PythonErrorType .SystemError , "Unsupported target size: %d" , targetTypeSize );
988
+ }
989
+
990
+ private <T > T raiseNative (T defaultValue , PythonBuiltinClassType errType , String fmt , Object ... args ) {
991
+ return NativeBuiltin .raiseNative (this , defaultValue , errType , fmt , args );
992
+ }
973
993
}
974
994
975
995
@ Builtin (name = "PyTruffle_Unicode_FromWchar" , fixedNumOfPositionalArgs = 3 )
@@ -1998,9 +2018,9 @@ TruffleObject doPointer(PythonNativeVoidPtr n) {
1998
2018
long doGeneric (Object n ) {
1999
2019
if (asPrimitiveNode == null ) {
2000
2020
CompilerDirectives .transferToInterpreterAndInvalidate ();
2001
- asPrimitiveNode = insert (TrufflePInt_AsPrimitiveFactory .create (null ));
2021
+ asPrimitiveNode = insert (TrufflePInt_AsPrimitiveFactory .create ());
2002
2022
}
2003
- return asPrimitiveNode .executeLong (n , 0 , Long .BYTES , "void*" );
2023
+ return asPrimitiveNode .executeLong (n , 0 , Long .BYTES );
2004
2024
}
2005
2025
}
2006
2026
}
0 commit comments