@@ -382,17 +382,20 @@ impl JitMemory {
382382
383383 pub fn bind_label_with_page ( & mut self , src_page : Page , label : DestLabel ) {
384384 let src_pos = self [ src_page] . counter ;
385- for target in std:: mem:: take ( & mut self . labels [ label] . target ) {
386- self . write_reloc ( src_page, src_pos, target) ;
385+ match & mut self . labels [ label] {
386+ LabelInfo :: Resolved ( _) => { } //panic!("The DestLabel has already been resolved."),
387+ LabelInfo :: NotResolved ( targets) => {
388+ for target in std:: mem:: take ( targets) {
389+ self . write_reloc ( src_page, src_pos, target) ;
390+ }
391+ }
387392 }
388- self . labels [ label] . loc = Some ( ( src_page, src_pos) ) ;
393+ self . labels [ label] = LabelInfo :: Resolved ( ( src_page, src_pos) ) ;
389394 }
390395
391396 /// Bind the current location to `label`.
392397 fn get_label_pos ( & self , label : DestLabel ) -> ( Page , Pos ) {
393- self . labels [ label]
394- . loc
395- . expect ( "The DestLabel has no position binding." )
398+ self . labels [ label] . loc ( )
396399 }
397400
398401 pub fn get_current_address ( & self ) -> CodePtr {
@@ -412,10 +415,13 @@ impl JitMemory {
412415 let pos = self . counter ;
413416 let target = TargetType :: Rel { page, offset, pos } ;
414417 self . emitl ( 0 ) ;
415- if let Some ( ( src_page, src_pos) ) = self . labels [ dest] . loc {
416- self . write_reloc ( src_page, src_pos, target) ;
417- } else {
418- self . labels [ dest] . target . push ( target) ;
418+ match self . labels [ dest] {
419+ LabelInfo :: Resolved ( ( src_page, src_pos) ) => {
420+ self . write_reloc ( src_page, src_pos, target) ;
421+ }
422+ LabelInfo :: NotResolved ( ref mut targets) => {
423+ targets. push ( target) ;
424+ }
419425 }
420426 }
421427
@@ -424,10 +430,13 @@ impl JitMemory {
424430 let pos = self [ page] . counter ;
425431 let target = TargetType :: Abs { page, pos } ;
426432 self [ page] . emitq ( 0 ) ;
427- if let Some ( ( src_page, src_pos) ) = self . labels [ dest] . loc {
428- self . write_reloc ( src_page, src_pos, target) ;
429- } else {
430- self . labels [ dest] . target . push ( target) ;
433+ match self . labels [ dest] {
434+ LabelInfo :: Resolved ( ( src_page, src_pos) ) => {
435+ self . write_reloc ( src_page, src_pos, target) ;
436+ }
437+ LabelInfo :: NotResolved ( ref mut targets) => {
438+ targets. push ( target) ;
439+ }
431440 }
432441 }
433442
@@ -453,15 +462,15 @@ impl JitMemory {
453462
454463 /// Resolve and fill all relocations.
455464 fn fill_relocs ( & mut self ) {
456- let mut reloc = std:: mem:: take ( & mut self . labels ) ;
457- for rel in reloc. iter_mut ( ) {
458- if let Some ( ( src_page, src_pos) ) = rel. loc {
459- for target in std:: mem:: take ( & mut rel. target ) {
460- self . write_reloc ( src_page, src_pos, target) ;
461- }
462- }
463- }
464- self . labels = reloc;
465+ // let mut reloc = std::mem::take(&mut self.labels);
466+ // for rel in reloc.iter_mut() {
467+ // if let LabelInfo::Resolved ((src_page, src_pos)) = rel {
468+ // for target in std::mem::take(&mut rel.target) {
469+ // self.write_reloc(src_page, src_pos, target);
470+ // }
471+ // }
472+ // }
473+ // self.labels = reloc;
465474 }
466475
467476 /// Resolve labels for constant data, and emit them to `contents`.
@@ -539,25 +548,19 @@ impl JitMemory {
539548 }
540549
541550 pub fn get_label_addr < T , U > ( & mut self , label : DestLabel ) -> extern "C" fn ( T ) -> U {
542- let ( page, counter) = self . labels [ label]
543- . loc
544- . expect ( "The DestLabel has no position binding." ) ;
551+ let ( page, counter) = self . labels [ label] . loc ( ) ;
545552 let adr = self [ page] . contents ( ) ;
546553 unsafe { mem:: transmute ( adr. add ( counter. 0 ) ) }
547554 }
548555
549556 pub fn get_label_addr2 < S , T , U > ( & mut self , label : DestLabel ) -> extern "C" fn ( S , T ) -> U {
550- let ( page, counter) = self . labels [ label]
551- . loc
552- . expect ( "The DestLabel has no position binding." ) ;
557+ let ( page, counter) = self . labels [ label] . loc ( ) ;
553558 let adr = self [ page] . contents ( ) ;
554559 unsafe { mem:: transmute ( adr. add ( counter. 0 ) ) }
555560 }
556561
557562 pub fn get_label_u64 ( & mut self , label : DestLabel ) -> u64 {
558- let ( page, counter) = self . labels [ label]
559- . loc
560- . expect ( "The DestLabel has no position binding." ) ;
563+ let ( page, counter) = self . labels [ label] . loc ( ) ;
561564 let adr = self [ page] . contents ( ) ;
562565 unsafe { adr. add ( counter. 0 ) as u64 }
563566 }
0 commit comments