about summary refs log tree commit diff
path: root/src/rt/rust_shape.cpp
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-08-09 12:12:49 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-08-09 12:19:40 -0700
commitb83167cf91bf9996e2cd2ad23e13181cee6618d3 (patch)
tree584b0d67c27228965138ef7be750770283e01af2 /src/rt/rust_shape.cpp
parentf9363f01a1c2f00c6ef1cd9cd1882279419434a7 (diff)
downloadrust-b83167cf91bf9996e2cd2ad23e13181cee6618d3.tar.gz
rust-b83167cf91bf9996e2cd2ad23e13181cee6618d3.zip
rt: Make comparison through type vars work
Diffstat (limited to 'src/rt/rust_shape.cpp')
-rw-r--r--src/rt/rust_shape.cpp35
1 files changed, 14 insertions, 21 deletions
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<typename T>
 void
 ctxt<T>::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<T *>(this)->walk_var(align, param_index);
+        const type_param *param = &this->params[param_index];
+        T sub(*static_cast<T *>(this), param->shape, param->params,
+              param->tables);
+        sub.walk(align);
+        static_cast<T *>(this)->walk_subcontext(align, sub);
     }
 
     template<typename W>
@@ -947,7 +948,6 @@ data<T,U>::get_ivec_data_range(uint8_t *dp) {
 template<typename T,typename U>
 std::pair<ptr_pair,ptr_pair>
 data<T,U>::get_ivec_data_range(ptr_pair &dp) {
-    fprintf(stderr, "get_ivec_data_range %p/%p\n", dp.fst, dp.snd);
     std::pair<uint8_t *,uint8_t *> fst = get_ivec_data_range(dp.fst);
     std::pair<uint8_t *,uint8_t *> snd = get_ivec_data_range(dp.snd);
     ptr_pair start(fst.first, snd.first);
@@ -1007,12 +1007,19 @@ class copy : public data<copy,uint8_t *> {
 // Structural comparison glue.
 
 class cmp : public data<cmp,ptr_pair> {
+    friend class data<cmp,ptr_pair>;
+
 private:
     template<typename T>
     void cmp_number(const data_pair<T> &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<int32_t>(const data_pair<int32_t> &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<ptr_pair,ptr_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<const uint8_t *,const uint8_t *>
                   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,