@@ -39,20 +39,6 @@ macro_rules! get {
39
39
} } ;
40
40
}
41
41
42
- #[ cfg( feature = "safe" ) ]
43
- macro_rules! get_mut {
44
- ( $a: expr, $i: expr) => {
45
- & mut $a[ $i]
46
- } ;
47
- }
48
-
49
- #[ cfg( not( feature = "safe" ) ) ]
50
- macro_rules! get_mut {
51
- ( $a: expr, $i: expr) => { {
52
- unsafe { $a. get_unchecked_mut( $i) }
53
- } } ;
54
- }
55
-
56
42
#[ cfg_attr( not( feature = "no-inline" ) , inline( always) ) ]
57
43
#[ allow( clippy:: cast_ptr_alignment, unused_unsafe) ]
58
44
pub fn is_valid_false_atom ( loc : & [ u8 ] ) -> bool {
@@ -126,10 +112,6 @@ impl<'de> Deserializer<'de> {
126
112
// a invalid json might exceed this `[[[[[[` and we need to protect against that.
127
113
let mut res: Vec < Node < ' de > > = Vec :: with_capacity ( structural_indexes. len ( ) ) ;
128
114
let mut stack = Vec :: with_capacity ( structural_indexes. len ( ) ) ;
129
- unsafe {
130
- stack. set_len ( structural_indexes. len ( ) ) ;
131
- res. set_len ( structural_indexes. len ( ) ) ;
132
- }
133
115
134
116
let mut depth: usize = 0 ;
135
117
let mut last_start = 1 ;
@@ -166,7 +148,7 @@ impl<'de> Deserializer<'de> {
166
148
macro_rules! insert_res {
167
149
( $t: expr) => {
168
150
unsafe {
169
- std :: ptr :: write ( get_mut! ( res , r_i) , $t) ;
151
+ res . as_mut_ptr ( ) . add ( r_i) . write ( $t) ;
170
152
r_i += 1 ;
171
153
}
172
154
} ;
@@ -175,8 +157,8 @@ impl<'de> Deserializer<'de> {
175
157
( ) => {
176
158
unsafe {
177
159
res. set_len( r_i) ;
178
- return Ok ( res) ;
179
160
}
161
+ return Ok ( res) ;
180
162
} ;
181
163
}
182
164
macro_rules! update_char {
@@ -308,7 +290,10 @@ impl<'de> Deserializer<'de> {
308
290
update_char ! ( ) ;
309
291
match c {
310
292
b'{' => {
311
- * get_mut ! ( stack, depth) = ( StackState :: Start , last_start, cnt) ;
293
+ unsafe {
294
+ let s: * mut ( StackState , usize , usize ) = stack. as_mut_ptr ( ) ;
295
+ s. add ( depth) . write ( ( StackState :: Start , last_start, cnt) ) ;
296
+ }
312
297
313
298
last_start = r_i;
314
299
insert_res ! ( Node :: Object ( 0 , 0 ) ) ;
@@ -332,7 +317,10 @@ impl<'de> Deserializer<'de> {
332
317
}
333
318
}
334
319
b'[' => {
335
- * get_mut ! ( stack, depth) = ( StackState :: Start , last_start, cnt) ;
320
+ unsafe {
321
+ let s: * mut ( StackState , usize , usize ) = stack. as_mut_ptr ( ) ;
322
+ s. add ( depth) . write ( ( StackState :: Start , last_start, cnt) ) ;
323
+ }
336
324
337
325
last_start = r_i;
338
326
insert_res ! ( Node :: Array ( 0 , 0 ) ) ;
@@ -474,8 +462,8 @@ impl<'de> Deserializer<'de> {
474
462
}
475
463
b'{' => {
476
464
unsafe {
477
- * stack . get_unchecked_mut ( depth ) =
478
- ( StackState :: Object , last_start, cnt) ;
465
+ let s : * mut ( StackState , usize , usize ) = stack . as_mut_ptr ( ) ;
466
+ s . add ( depth ) . write ( ( StackState :: Object , last_start, cnt) ) ;
479
467
}
480
468
last_start = r_i;
481
469
insert_res ! ( Node :: Object ( 0 , 0 ) ) ;
@@ -485,8 +473,8 @@ impl<'de> Deserializer<'de> {
485
473
}
486
474
b'[' => {
487
475
unsafe {
488
- * stack . get_unchecked_mut ( depth ) =
489
- ( StackState :: Object , last_start, cnt) ;
476
+ let s : * mut ( StackState , usize , usize ) = stack . as_mut_ptr ( ) ;
477
+ s . add ( depth ) . write ( ( StackState :: Object , last_start, cnt) ) ;
490
478
}
491
479
last_start = r_i;
492
480
insert_res ! ( Node :: Array ( 0 , 0 ) ) ;
@@ -506,7 +494,7 @@ impl<'de> Deserializer<'de> {
506
494
}
507
495
depth -= 1 ;
508
496
unsafe {
509
- match res. get_unchecked_mut ( last_start) {
497
+ match * res. as_mut_ptr ( ) . add ( last_start) {
510
498
Node :: Array ( ref mut len, ref mut end)
511
499
| Node :: Object ( ref mut len, ref mut end) => {
512
500
* len = cnt;
@@ -515,24 +503,23 @@ impl<'de> Deserializer<'de> {
515
503
_ => unreachable ! ( ) ,
516
504
} ;
517
505
}
518
-
519
- let ( a_state , a_last_start , a_cnt ) = unsafe { stack. get_unchecked ( depth) } ;
520
- // let (a_state, a_last_start, a_cnt) = unsafe { };
521
- //s2try!(stack.pop().ok_or_else(|| Error::generic(ErrorType::Syntax))) ;
522
-
523
- last_start = * a_last_start ;
524
- cnt = * a_cnt ;
525
-
526
- match & a_state {
527
- StackState :: Object => object_continue ! ( ) ,
528
- StackState :: Array => array_continue ! ( ) ,
529
- StackState :: Start => {
530
- if i == structural_indexes . len ( ) {
531
- success ! ( ) ;
506
+ unsafe {
507
+ let a = stack. as_ptr ( ) . add ( depth) ;
508
+
509
+ last_start = ( * a ) . 1 ;
510
+ cnt = ( * a ) . 2 ;
511
+
512
+ match ( * a ) . 0 {
513
+ StackState :: Object => object_continue ! ( ) ,
514
+ StackState :: Array => array_continue ! ( ) ,
515
+ StackState :: Start => {
516
+ if i == structural_indexes . len ( ) {
517
+ success ! ( ) ;
518
+ }
519
+ fail ! ( ) ;
532
520
}
533
- fail ! ( ) ;
534
- }
535
- } ;
521
+ } ;
522
+ }
536
523
}
537
524
538
525
////////////////////////////// ARRAY STATES /////////////////////////////
@@ -583,8 +570,8 @@ impl<'de> Deserializer<'de> {
583
570
}
584
571
b'{' => {
585
572
unsafe {
586
- * stack . get_unchecked_mut ( depth ) =
587
- ( StackState :: Array , last_start, cnt) ;
573
+ let s : * mut ( StackState , usize , usize ) = stack . as_mut_ptr ( ) ;
574
+ s . add ( depth ) . write ( ( StackState :: Array , last_start, cnt) ) ;
588
575
}
589
576
last_start = r_i;
590
577
insert_res ! ( Node :: Object ( 0 , 0 ) ) ;
@@ -594,8 +581,8 @@ impl<'de> Deserializer<'de> {
594
581
}
595
582
b'[' => {
596
583
unsafe {
597
- * stack . get_unchecked_mut ( depth ) =
598
- ( StackState :: Array , last_start, cnt) ;
584
+ let s : * mut ( StackState , usize , usize ) = stack . as_mut_ptr ( ) ;
585
+ s . add ( depth ) . write ( ( StackState :: Array , last_start, cnt) ) ;
599
586
}
600
587
last_start = r_i;
601
588
insert_res ! ( Node :: Array ( 0 , 0 ) ) ;
0 commit comments