Skip to content

Commit d8c5424

Browse files
committed
Refactor.
1 parent fcfe22e commit d8c5424

File tree

2 files changed

+45
-38
lines changed

2 files changed

+45
-38
lines changed

monoasm/src/jit_memory.rs

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

monoasm/src/lib.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -295,19 +295,23 @@ impl DestLabel {
295295
/// and (possibly multiple) target positions for each *DestLabel*.
296296
///
297297
#[derive(Clone, PartialEq, Debug)]
298-
struct LabelInfo {
298+
enum LabelInfo {
299299
/// A location of each *DestLabel* in JitMemory.
300300
/// None for not yet determined.
301-
loc: Option<(Page, Pos)>,
301+
Resolved((Page, Pos)),
302302
/// Target informations.
303-
target: Vec<TargetType>,
303+
NotResolved(Vec<TargetType>),
304304
}
305305

306306
impl LabelInfo {
307307
fn new() -> LabelInfo {
308-
LabelInfo {
309-
loc: None,
310-
target: vec![],
308+
LabelInfo::NotResolved(vec![])
309+
}
310+
311+
fn loc(&self) -> (Page, Pos) {
312+
match self {
313+
LabelInfo::Resolved(loc) => *loc,
314+
_ => panic!("The DestLabel has not been resolved"),
311315
}
312316
}
313317
}

0 commit comments

Comments
 (0)