@@ -392,6 +392,18 @@ fn register_block(registers: &[Register], defs: &Defaults) -> Result<Tokens> {
392
392
)
393
393
}
394
394
395
+ fn unsafety ( write_constraint : Option < & WriteConstraint > , width : u32 ) -> Option < Ident > {
396
+ match write_constraint {
397
+ Some ( & WriteConstraint :: Range ( ref range) )
398
+ if range. min as u64 == 0 && range. max as u64 == ( 1u64 << width) - 1 => {
399
+ // the SVD has acknowledged that it's safe to write
400
+ // any value that can fit in the field
401
+ None
402
+ }
403
+ _ => Some ( Ident :: new ( "unsafe" ) )
404
+ }
405
+ }
406
+
395
407
pub fn register (
396
408
register : & Register ,
397
409
all_registers : & [ Register ] ,
@@ -403,15 +415,17 @@ pub fn register(
403
415
let name = util:: name_of ( register) ;
404
416
let name_pc = Ident :: new ( & * name. to_sanitized_pascal_case ( ) ) ;
405
417
let name_sc = Ident :: new ( & * name. to_sanitized_snake_case ( ) ) ;
406
- let rty = register. size
418
+ let rsize = register. size
407
419
. or ( defs. size )
408
420
. ok_or_else ( || {
409
421
format ! ( "Register {} has no `size` field" ,
410
422
register. name)
411
- } ) ?
412
- . to_ty ( ) ?;
423
+ } ) ?;
424
+ let rty = rsize . to_ty ( ) ?;
413
425
let description = util:: respace ( & register. description ) ;
414
426
427
+ let unsafety = unsafety ( register. write_constraint . as_ref ( ) , rsize) ;
428
+
415
429
let mut mod_items = vec ! [ ] ;
416
430
let mut reg_impl_items = vec ! [ ] ;
417
431
let mut r_impl_items = vec ! [ ] ;
@@ -510,7 +524,7 @@ pub fn register(
510
524
511
525
/// Writes raw bits to the register
512
526
#[ inline( always) ]
513
- pub unsafe fn bits( & mut self , bits: #rty) -> & mut Self {
527
+ pub #unsafety fn bits( & mut self , bits: #rty) -> & mut Self {
514
528
self . bits = bits;
515
529
self
516
530
}
@@ -944,19 +958,7 @@ pub fn fields(
944
958
945
959
let mut proxy_items = vec ! [ ] ;
946
960
947
- let mut safety = Some ( Ident :: new ( "unsafe" ) ) ;
948
- if let Some ( write_constraint) = f. write_constraint {
949
- match * write_constraint {
950
- WriteConstraint :: Range ( ref range) => {
951
- if range. min as u64 == 0 && range. max as u64 == ( 1u64 << f. width ) - 1 {
952
- // the SVD has acknowledged that it's safe to write
953
- // any value that can fit in the bitfield
954
- safety = None ;
955
- }
956
- }
957
- _ => { }
958
- }
959
- }
961
+ let mut unsafety = unsafety ( f. write_constraint , f. width ) ;
960
962
let fty = & f. ty ;
961
963
let offset = & f. offset ;
962
964
let mask = & f. mask ;
@@ -1044,7 +1046,7 @@ pub fn fields(
1044
1046
. collect :: < Result < Vec < _ > > > ( ) ?;
1045
1047
1046
1048
if variants. len ( ) == 1 << f. width {
1047
- safety = None ;
1049
+ unsafety = None ;
1048
1050
}
1049
1051
1050
1052
if base. is_none ( ) {
@@ -1095,7 +1097,7 @@ pub fn fields(
1095
1097
/// Writes `variant` to the field
1096
1098
#[ inline( always) ]
1097
1099
pub fn variant( self , variant: #pc_w) -> & ' a mut W {
1098
- #safety {
1100
+ #unsafety {
1099
1101
self . bits( variant. _bits( ) )
1100
1102
}
1101
1103
}
@@ -1135,7 +1137,7 @@ pub fn fields(
1135
1137
quote ! {
1136
1138
/// Writes raw bits to the field
1137
1139
#[ inline( always) ]
1138
- pub #safety fn bits( self , bits: #fty) -> & ' a mut W {
1140
+ pub #unsafety fn bits( self , bits: #fty) -> & ' a mut W {
1139
1141
const MASK : #fty = #mask;
1140
1142
const OFFSET : u8 = #offset;
1141
1143
0 commit comments