@@ -3,13 +3,14 @@ use cairo_lang_sierra::{
33 core:: { CoreLibfunc , CoreType , CoreTypeConcrete } ,
44 utils:: Range ,
55 } ,
6+ ids:: ConcreteTypeId ,
67 program_registry:: ProgramRegistry ,
78} ;
89use num_bigint:: BigInt ;
910use num_traits:: { Bounded , One , ToPrimitive } ;
1011use starknet_types_core:: felt:: CAIRO_PRIME_BIGINT ;
1112
12- use crate :: Value ;
13+ use crate :: { debug :: type_to_name , Value } ;
1314
1415/// Receives a vector of values, filters any which is non numeric and returns a `Vec<BigInt>`
1516/// Useful when a binary operation takes generic values (like with bounded ints).
@@ -29,21 +30,20 @@ pub fn get_numeric_args_as_bigints(args: &[Value]) -> Vec<BigInt> {
2930 Value :: U128 ( value) => BigInt :: from ( * value) ,
3031 Value :: Felt ( value) => value. to_bigint ( ) ,
3132 Value :: Bytes31 ( value) => value. to_bigint ( ) ,
32- value => panic ! ( "argument should be an integer: {:?}" , value) ,
33+ value => panic ! ( "Argument should be an integer: {:?}" , value) ,
3334 } )
3435 . collect ( )
3536}
3637
3738pub fn get_value_from_integer (
3839 registry : & ProgramRegistry < CoreType , CoreLibfunc > ,
39- ty : & CoreTypeConcrete ,
40+ ty_id : & ConcreteTypeId ,
4041 value : BigInt ,
4142) -> Value {
43+ let ty = registry. get_type ( ty_id) . unwrap ( ) ;
44+
4245 match ty {
43- CoreTypeConcrete :: NonZero ( info) => {
44- let ty = registry. get_type ( & info. ty ) . unwrap ( ) ;
45- get_value_from_integer ( registry, ty, value)
46- }
46+ CoreTypeConcrete :: NonZero ( info) => get_value_from_integer ( registry, & info. ty , value) ,
4747 CoreTypeConcrete :: Sint8 ( _) => Value :: I8 ( value. to_i8 ( ) . unwrap ( ) ) ,
4848 CoreTypeConcrete :: Sint16 ( _) => Value :: I16 ( value. to_i16 ( ) . unwrap ( ) ) ,
4949 CoreTypeConcrete :: Sint32 ( _) => Value :: I32 ( value. to_i32 ( ) . unwrap ( ) ) ,
@@ -62,12 +62,15 @@ pub fn get_value_from_integer(
6262 }
6363 }
6464 CoreTypeConcrete :: Felt252 ( _) => Value :: Felt ( value. into ( ) ) ,
65- _ => panic ! ( "cannot get integer value for a non-integer type" ) ,
65+ _ => panic ! (
66+ "Cannot get integer value for a non-integer type: {}" ,
67+ type_to_name( ty_id, registry)
68+ ) ,
6669 }
6770}
6871
6972pub fn integer_range (
70- ty : & CoreTypeConcrete ,
73+ ty_id : & ConcreteTypeId ,
7174 registry : & ProgramRegistry < CoreType , CoreLibfunc > ,
7275) -> Range {
7376 fn range_of < T > ( ) -> Range
@@ -80,6 +83,8 @@ pub fn integer_range(
8083 }
8184 }
8285
86+ let ty = registry. get_type ( ty_id) . unwrap ( ) ;
87+
8388 match ty {
8489 CoreTypeConcrete :: Uint8 ( _) => range_of :: < u8 > ( ) ,
8590 CoreTypeConcrete :: Uint16 ( _) => range_of :: < u16 > ( ) ,
@@ -100,14 +105,11 @@ pub fn integer_range(
100105 lower : BigInt :: ZERO ,
101106 upper : BigInt :: one ( ) << 248 ,
102107 } ,
103- CoreTypeConcrete :: Const ( info) => {
104- let ty = registry. get_type ( & info. inner_ty ) . unwrap ( ) ;
105- integer_range ( ty, registry)
106- }
107- CoreTypeConcrete :: NonZero ( info) => {
108- let ty = registry. get_type ( & info. ty ) . unwrap ( ) ;
109- integer_range ( ty, registry)
110- }
111- _ => panic ! ( "cannot get integer range value for a non-integer type" ) ,
108+ CoreTypeConcrete :: Const ( info) => integer_range ( & info. inner_ty , registry) ,
109+ CoreTypeConcrete :: NonZero ( info) => integer_range ( & info. ty , registry) ,
110+ _ => panic ! (
111+ "Cannot get integer range value for a non-integer type {}" ,
112+ type_to_name( ty_id, registry)
113+ ) ,
112114 }
113115}
0 commit comments