@@ -8,6 +8,7 @@ pub fn resolve_builtin_fn(
88 match name. as_ref ( )
99 {
1010 "assert" => Some ( eval_builtin_assert) ,
11+ "sizeof" => Some ( eval_builtin_sizeof) ,
1112 "le" => Some ( eval_builtin_le) ,
1213 "ascii" => Some ( eval_builtin_ascii) ,
1314 "utf8" => Some ( eval_builtin_utf8) ,
@@ -30,6 +31,7 @@ pub fn get_static_size_builtin_fn(
3031 let get_static_size_fn = {
3132 match name. as_ref ( )
3233 {
34+ "sizeof" => get_static_size_builtin_sizeof,
3335 "le" => get_static_size_builtin_le,
3436 _ => return None ,
3537 }
@@ -49,6 +51,7 @@ pub fn get_statically_known_value_builtin_fn(
4951 match name. as_ref ( )
5052 {
5153 "assert" => false ,
54+ "sizeof" => true ,
5255 "le" => true ,
5356 "ascii" => true ,
5457 "utf8" => true ,
@@ -118,6 +121,20 @@ pub fn eval_builtin_assert(
118121}
119122
120123
124+ pub fn eval_builtin_sizeof (
125+ query : & mut expr:: EvalFunctionQuery )
126+ -> Result < expr:: Value , ( ) >
127+ {
128+ query. ensure_arg_number ( 1 ) ?;
129+
130+ let ( _bigint, size) = query. args [ 0 ] . value . expect_sized_integerlike (
131+ query. report ,
132+ query. args [ 0 ] . span ) ?;
133+
134+ Ok ( expr:: Value :: make_integer ( size) )
135+ }
136+
137+
121138pub fn eval_builtin_le (
122139 query : & mut expr:: EvalFunctionQuery )
123140 -> Result < expr:: Value , ( ) >
@@ -147,6 +164,22 @@ pub fn eval_builtin_le(
147164}
148165
149166
167+ pub fn get_static_size_builtin_sizeof (
168+ provider : & expr:: StaticallyKnownProvider ,
169+ args : & Vec < expr:: Expr > )
170+ -> Option < usize >
171+ {
172+ if args. len ( ) == 1
173+ {
174+ args[ 0 ] . get_static_size ( provider)
175+ }
176+ else
177+ {
178+ None
179+ }
180+ }
181+
182+
150183pub fn get_static_size_builtin_le (
151184 provider : & expr:: StaticallyKnownProvider ,
152185 args : & Vec < expr:: Expr > )
0 commit comments