@@ -4,8 +4,6 @@ use std::{
4
4
sync:: OnceLock ,
5
5
} ;
6
6
7
- use ouroboros:: self_referencing;
8
-
9
7
use crate :: {
10
8
helpers:: {
11
9
get_generated_source_info, stream_chunks_of_raw_source, OnChunk , OnName ,
@@ -364,59 +362,57 @@ impl StreamChunks for RawStringSource {
364
362
/// assert_eq!(s.map(&MapOptions::default()), None);
365
363
/// assert_eq!(s.size(), 16);
366
364
/// ```
367
- #[ self_referencing]
368
365
pub struct RawBufferSource {
369
366
value : Vec < u8 > ,
370
- #[ borrows( value) ]
371
- #[ not_covariant]
372
- value_as_string : OnceLock < Cow < ' this , str > > ,
367
+ value_as_string : OnceLock < Option < String > > ,
373
368
}
374
369
375
370
impl RawBufferSource {
371
+ #[ allow( unsafe_code) ]
376
372
fn get_or_init_value_as_string ( & self ) -> & str {
377
- self . with ( |fields| {
378
- fields
379
- . value_as_string
380
- . get_or_init ( || String :: from_utf8_lossy ( fields. value ) )
381
- } )
373
+ self
374
+ . value_as_string
375
+ . get_or_init ( || match String :: from_utf8_lossy ( & self . value ) {
376
+ Cow :: Owned ( s) => Some ( s) ,
377
+ Cow :: Borrowed ( _) => None ,
378
+ } )
379
+ . as_deref ( )
380
+ . unwrap_or_else ( || unsafe { std:: str:: from_utf8_unchecked ( & self . value ) } )
382
381
}
383
382
}
384
383
385
384
impl Clone for RawBufferSource {
386
385
fn clone ( & self ) -> Self {
387
- RawBufferSourceBuilder {
388
- value : self . borrow_value ( ) . clone ( ) ,
389
- value_as_string_builder : |_ : & Vec < u8 > | Default :: default ( ) ,
386
+ Self {
387
+ value : self . value . clone ( ) ,
388
+ value_as_string : Default :: default ( ) ,
390
389
}
391
- . build ( )
392
390
}
393
391
}
394
392
395
393
impl PartialEq for RawBufferSource {
396
394
fn eq ( & self , other : & Self ) -> bool {
397
- self . borrow_value ( ) == other. borrow_value ( )
395
+ self . value == other. value
398
396
}
399
397
}
400
398
401
399
impl Eq for RawBufferSource { }
402
400
403
401
impl From < Vec < u8 > > for RawBufferSource {
404
402
fn from ( value : Vec < u8 > ) -> Self {
405
- RawBufferSourceBuilder {
403
+ Self {
406
404
value,
407
- value_as_string_builder : |_ : & Vec < u8 > | Default :: default ( ) ,
405
+ value_as_string : Default :: default ( ) ,
408
406
}
409
- . build ( )
410
407
}
411
408
}
412
409
413
410
impl From < & [ u8 ] > for RawBufferSource {
414
411
fn from ( value : & [ u8 ] ) -> Self {
415
- RawBufferSourceBuilder {
412
+ Self {
416
413
value : value. to_vec ( ) ,
417
- value_as_string_builder : |_ : & Vec < u8 > | Default :: default ( ) ,
414
+ value_as_string : Default :: default ( ) ,
418
415
}
419
- . build ( )
420
416
}
421
417
}
422
418
@@ -430,19 +426,19 @@ impl Source for RawBufferSource {
430
426
}
431
427
432
428
fn buffer ( & self ) -> Cow < [ u8 ] > {
433
- Cow :: Borrowed ( self . borrow_value ( ) )
429
+ Cow :: Borrowed ( & self . value )
434
430
}
435
431
436
432
fn size ( & self ) -> usize {
437
- self . borrow_value ( ) . len ( )
433
+ self . value . len ( )
438
434
}
439
435
440
436
fn map ( & self , _: & MapOptions ) -> Option < SourceMap > {
441
437
None
442
438
}
443
439
444
440
fn to_writer ( & self , writer : & mut dyn std:: io:: Write ) -> std:: io:: Result < ( ) > {
445
- writer. write_all ( self . borrow_value ( ) )
441
+ writer. write_all ( & self . value )
446
442
}
447
443
}
448
444
@@ -456,7 +452,7 @@ impl std::fmt::Debug for RawBufferSource {
456
452
write ! (
457
453
f,
458
454
"{indent_str}RawBufferSource::from({:?}).boxed()" ,
459
- self . borrow_value ( )
455
+ & self . value
460
456
)
461
457
}
462
458
}
@@ -499,7 +495,7 @@ mod tests {
499
495
// Fix https://github.com/web-infra-dev/rspack/issues/6793
500
496
#[ test]
501
497
fn fix_rspack_issue_6793 ( ) {
502
- let source1 = RawSource :: from ( "hello\n \n " . to_string ( ) ) ;
498
+ let source1 = RawStringSource :: from_static ( "hello\n \n " ) ;
503
499
let source1 = ReplaceSource :: new ( source1) ;
504
500
let source2 = OriginalSource :: new ( "world" . to_string ( ) , "world.txt" ) ;
505
501
let concat = ConcatSource :: new ( [ source1. boxed ( ) , source2. boxed ( ) ] ) ;
0 commit comments