summary refs log tree commit diff
path: root/src/libstd/ebml.rs
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-09-11 21:25:01 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-09-11 21:25:01 -0700
commit8a8f200d102294cf1bd90cdacad995abccda7934 (patch)
tree31e99a460697349c403fc5cf4809427303e14804 /src/libstd/ebml.rs
parent02b41097e42082a306ca6dbbd79ee9a1d7d35348 (diff)
downloadrust-8a8f200d102294cf1bd90cdacad995abccda7934.tar.gz
rust-8a8f200d102294cf1bd90cdacad995abccda7934.zip
Introduce auto adjustment table to subsume autoderef/autoref/borrowings.
Fixes #3261
Fixes #3443
Diffstat (limited to 'src/libstd/ebml.rs')
-rw-r--r--src/libstd/ebml.rs20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/libstd/ebml.rs b/src/libstd/ebml.rs
index 1d70bfaf00a..d6b8c2f4908 100644
--- a/src/libstd/ebml.rs
+++ b/src/libstd/ebml.rs
@@ -314,6 +314,8 @@ enum EbmlSerializerTag {
     EsEnum, EsEnumVid, EsEnumBody,
     EsVec, EsVecLen, EsVecElt,
 
+    EsOpaque,
+
     EsLabel // Used only when debugging
 }
 
@@ -340,6 +342,14 @@ impl ebml::Writer: SerializerPriv {
     }
 }
 
+impl ebml::Writer {
+    fn emit_opaque(f: fn()) {
+        do self.wr_tag(EsOpaque as uint) {
+            f()
+        }
+    }
+}
+
 impl ebml::Writer: serialization::Serializer {
     fn emit_nil() {}
 
@@ -397,7 +407,7 @@ impl ebml::Writer: serialization::Serializer {
 }
 
 type EbmlDeserializer_ = {mut parent: ebml::Doc,
-                           mut pos: uint};
+                          mut pos: uint};
 
 enum EbmlDeserializer {
     EbmlDeserializer_(EbmlDeserializer_)
@@ -462,6 +472,14 @@ priv impl EbmlDeserializer {
     }
 }
 
+impl EbmlDeserializer {
+    fn read_opaque<R>(op: fn(ebml::Doc) -> R) -> R {
+        do self.push_doc(self.next_doc(EsOpaque)) {
+            op(copy self.parent)
+        }
+    }
+}
+
 impl EbmlDeserializer: serialization::Deserializer {
     fn read_nil() -> () { () }