about summary refs log tree commit diff
path: root/src/librustc/middle/astencode.rs
diff options
context:
space:
mode:
authorMichael Sullivan <sully@msully.net>2013-06-20 09:29:24 -0700
committerMichael Sullivan <sully@msully.net>2013-06-28 16:12:08 -0700
commit817f98085f2332b604f0a2da5127f29c8fabc41f (patch)
treebc9b643a90a6df5d1b13a217605dec1ff3ea19cf /src/librustc/middle/astencode.rs
parenta9e51f5f701d8104be0adfb50f5d409f8bf233ff (diff)
downloadrust-817f98085f2332b604f0a2da5127f29c8fabc41f.tar.gz
rust-817f98085f2332b604f0a2da5127f29c8fabc41f.zip
Make calling methods parameterized on the trait work from default methods.
This is done by adding a new notion of "vtable_self".
We do not yet properly handle super traits.

Closes #7183.
Diffstat (limited to 'src/librustc/middle/astencode.rs')
-rw-r--r--src/librustc/middle/astencode.rs18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs
index 70e94844319..c1d553b0454 100644
--- a/src/librustc/middle/astencode.rs
+++ b/src/librustc/middle/astencode.rs
@@ -632,6 +632,13 @@ fn encode_vtable_origin(ecx: &e::EncodeContext,
                 }
             }
           }
+          typeck::vtable_self(def_id) => {
+            do ebml_w.emit_enum_variant("vtable_self", 2u, 1u) |ebml_w| {
+                do ebml_w.emit_enum_variant_arg(0u) |ebml_w| {
+                    ebml_w.emit_def_id(def_id)
+                }
+            }
+          }
         }
     }
 }
@@ -652,7 +659,9 @@ impl vtable_decoder_helpers for reader::Decoder {
     fn read_vtable_origin(&mut self, xcx: @ExtendedDecodeContext)
         -> typeck::vtable_origin {
         do self.read_enum("vtable_origin") |this| {
-            do this.read_enum_variant(["vtable_static", "vtable_param"])
+            do this.read_enum_variant(["vtable_static",
+                                       "vtable_param",
+                                       "vtable_self"])
                     |this, i| {
                 match i {
                   0 => {
@@ -678,6 +687,13 @@ impl vtable_decoder_helpers for reader::Decoder {
                         }
                     )
                   }
+                  2 => {
+                    typeck::vtable_self(
+                        do this.read_enum_variant_arg(0u) |this| {
+                            this.read_def_id(xcx)
+                        }
+                    )
+                  }
                   // hard to avoid - user input
                   _ => fail!("bad enum variant")
                 }