From b83167cf91bf9996e2cd2ad23e13181cee6618d3 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 9 Aug 2011 12:12:49 -0700 Subject: rt: Make comparison through type vars work --- src/rt/rust_shape.cpp | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) (limited to 'src/rt/rust_shape.cpp') diff --git a/src/rt/rust_shape.cpp b/src/rt/rust_shape.cpp index 16949fddf13..8bbb090d826 100644 --- a/src/rt/rust_shape.cpp +++ b/src/rt/rust_shape.cpp @@ -314,7 +314,6 @@ public: inline T *alloc(size_t count = 1) { // FIXME: align size_t sz = count * sizeof(T); - //DPRINT("size is %lu\n", sz); T *rv = (T *)ptr; ptr += sz; if (ptr > &data[ARENA_SIZE]) { @@ -366,8 +365,6 @@ struct type_param { template void ctxt::walk(bool align) { - fprintf(stderr, "walking %d\n", *sp); - switch (*sp++) { case SHAPE_U8: WALK_NUMBER(uint8_t); break; case SHAPE_U16: WALK_NUMBER(uint16_t); break; @@ -778,7 +775,7 @@ size_of::compute_tag_size(tag_info &tinfo) { const uint8_t *variant_ptr = variant_ptr_and_end.first; const uint8_t *variant_end = variant_ptr_and_end.second; - size_of sub(*this, variant_ptr, params, NULL); + size_of sub(*this, variant_ptr, tinfo.params, NULL); // Compute the size of this variant. size_align variant_sa; @@ -903,7 +900,11 @@ public: } void walk_var(bool align, uint8_t param_index) { - static_cast(this)->walk_var(align, param_index); + const type_param *param = &this->params[param_index]; + T sub(*static_cast(this), param->shape, param->params, + param->tables); + sub.walk(align); + static_cast(this)->walk_subcontext(align, sub); } template @@ -947,7 +948,6 @@ data::get_ivec_data_range(uint8_t *dp) { template std::pair data::get_ivec_data_range(ptr_pair &dp) { - fprintf(stderr, "get_ivec_data_range %p/%p\n", dp.fst, dp.snd); std::pair fst = get_ivec_data_range(dp.fst); std::pair snd = get_ivec_data_range(dp.snd); ptr_pair start(fst.first, snd.first); @@ -1007,12 +1007,19 @@ class copy : public data { // Structural comparison glue. class cmp : public data { + friend class data; + private: template void cmp_number(const data_pair &nums) { result = (nums.fst < nums.snd) ? -1 : (nums.fst == nums.snd) ? 0 : 1; } + void walk_subcontext(bool align, cmp &sub) { + sub.walk(align); + result = sub.result; + } + public: int result; @@ -1058,7 +1065,6 @@ public: template<> void cmp::cmp_number(const data_pair &nums) { - fprintf(stderr, "cmp %d/%d\n", nums.fst, nums.snd); result = (nums.fst < nums.snd) ? -1 : (nums.fst == nums.snd) ? 0 : 1; } @@ -1066,23 +1072,12 @@ void cmp::walk_ivec(bool align, bool is_pod, size_align &elem_sa) { std::pair data_range = get_ivec_data_range(dp); - DPRINT("walk_ivec %p/%p\n", data_range.first.fst, data_range.first.snd); - cmp sub(*this, data_range.first); ptr_pair data_end = data_range.second; while (!result && sub.dp < data_end) { - DPRINT("walk_ivec elem %p/%p %p/%p\n", sub.dp.fst, sub.dp.snd, - data_end.fst, data_end.snd); - DPRINTCX(&sub); - DPRINT("\nend\n"); - sub.walk_reset(align); - DPRINT("result = %d\n", sub.result); result = sub.result; align = true; - - DPRINT("walk_ivec after elem %p/%p %p/%p\n", sub.dp.fst, sub.dp.snd, - data_end.fst, data_end.snd); } if (!result) { @@ -1130,7 +1125,7 @@ void cmp::walk_variant(bool align, tag_info &tinfo, uint32_t variant_id, const std::pair variant_ptr_and_end) { - cmp sub(*this, variant_ptr_and_end.first); + cmp sub(*this, variant_ptr_and_end.first, tinfo.params); const uint8_t *variant_end = variant_ptr_and_end.second; while (!result && sub.sp < variant_end) { @@ -1146,8 +1141,6 @@ extern "C" void upcall_cmp_type(int8_t *result, rust_task *task, type_desc *tydesc, const type_desc **subtydescs, uint8_t *data_0, uint8_t *data_1, uint8_t cmp_type) { - fprintf(stderr, "cmp_type\n"); - shape::arena arena; shape::type_param *params = shape::type_param::make(tydesc, arena); shape::cmp cmp(task, tydesc->shape, params, tydesc->shape_tables, data_0, -- cgit 1.4.1-3-g733a5