diff options
Diffstat (limited to 'src/rt/rust_cc.cpp')
| -rw-r--r-- | src/rt/rust_cc.cpp | 61 | 
1 files changed, 53 insertions, 8 deletions
diff --git a/src/rt/rust_cc.cpp b/src/rt/rust_cc.cpp index 0b75d856f81..4e3facd0413 100644 --- a/src/rt/rust_cc.cpp +++ b/src/rt/rust_cc.cpp @@ -73,19 +73,37 @@ class irc : public shape::data<irc,shape::ptr> { in_tables, in_data), ircs(in_ircs) {} - void walk_vec2(bool is_pod) { - if (is_pod || shape::get_dp<void *>(dp) == NULL) - return; // There can't be any outbound pointers from this. - std::pair<uint8_t *,uint8_t *> data_range(get_vec_data_range(dp)); + void walk_vec2(bool is_pod, std::pair<uint8_t *,uint8_t *> data_range) { + + // There can't be any outbound pointers from pod. + if (is_pod) + return; + irc sub(*this, data_range.first); shape::ptr data_end = sub.end_dp = data_range.second; while (sub.dp < data_end) { sub.walk_reset(); + // FIXME: shouldn't this be 'sub.align = true;'? align = true; } } + void walk_vec2(bool is_pod) { + if (shape::get_dp<void *>(dp) == NULL) + return; + + walk_vec2(is_pod, get_vec_data_range(dp)); + } + + void walk_slice2(bool is_pod, bool is_str) { + walk_vec2(is_pod, get_slice_data_range(is_str, dp)); + } + + void walk_fixedvec2(uint16_t sz, bool is_pod) { + walk_vec2(is_pod, get_fixedvec_data_range(sz, dp)); + } + void walk_tag2(shape::tag_info &tinfo, uint32_t tag_variant) { shape::data<irc,shape::ptr>::walk_variant1(tinfo, tag_variant); } @@ -102,6 +120,10 @@ class irc : public shape::data<irc,shape::ptr> { shape::data<irc,shape::ptr>::walk_uniq_contents1(); } + void walk_rptr2() { + shape::data<irc,shape::ptr>::walk_rptr_contents1(); + } + void walk_fn2(char code) { switch (code) { case shape::SHAPE_BOX_FN: { @@ -137,6 +159,8 @@ class irc : public shape::data<irc,shape::ptr> { void walk_uniq_contents2(irc &sub) { sub.walk(); } + void walk_rptr_contents2(irc &sub) { sub.walk(); } + void walk_box_contents2(irc &sub) { maybe_record_irc(); @@ -305,11 +329,12 @@ class mark : public shape::data<mark,shape::ptr> { in_tables, in_data), marked(in_marked) {} - void walk_vec2(bool is_pod) { - if (is_pod || shape::get_dp<void *>(dp) == NULL) - return; // There can't be any outbound pointers from this. + void walk_vec2(bool is_pod, std::pair<uint8_t *,uint8_t *> data_range) { + + // There can't be any outbound pointers from pod. + if (is_pod) + return; - std::pair<uint8_t *,uint8_t *> data_range(get_vec_data_range(dp)); if (data_range.second - data_range.first > 100000) abort(); // FIXME: Temporary sanity check. @@ -321,6 +346,20 @@ class mark : public shape::data<mark,shape::ptr> { } } + void walk_vec2(bool is_pod) { + if (shape::get_dp<void *>(dp) == NULL) + return; + walk_vec2(is_pod, get_vec_data_range(dp)); + } + + void walk_slice2(bool is_pod, bool is_str) { + walk_vec2(is_pod, get_slice_data_range(is_str, dp)); + } + + void walk_fixedvec2(uint16_t sz, bool is_pod) { + walk_vec2(is_pod, get_fixedvec_data_range(sz, dp)); + } + void walk_tag2(shape::tag_info &tinfo, uint32_t tag_variant) { shape::data<mark,shape::ptr>::walk_variant1(tinfo, tag_variant); } @@ -337,6 +376,10 @@ class mark : public shape::data<mark,shape::ptr> { shape::data<mark,shape::ptr>::walk_uniq_contents1(); } + void walk_rptr2() { + shape::data<mark,shape::ptr>::walk_rptr_contents1(); + } + void walk_fn2(char code) { switch (code) { case shape::SHAPE_BOX_FN: { @@ -372,6 +415,8 @@ class mark : public shape::data<mark,shape::ptr> { void walk_uniq_contents2(mark &sub) { sub.walk(); } + void walk_rptr_contents2(mark &sub) { sub.walk(); } + void walk_box_contents2(mark &sub) { rust_opaque_box *box_ptr = *(rust_opaque_box **) dp;  | 
