summary refs log tree commit diff
path: root/src/comp/metadata
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-11-16 12:32:38 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2011-11-18 12:49:00 +0100
commit4e0311214160ea0dc7d1ff7347db6c6550c79de2 (patch)
treec4024b2ab58c93b1441e887e0f3e93936d2dc530 /src/comp/metadata
parent6297fc979ee715c276b5303decf2220e70629917 (diff)
downloadrust-4e0311214160ea0dc7d1ff7347db6c6550c79de2.tar.gz
rust-4e0311214160ea0dc7d1ff7347db6c6550c79de2.zip
Add a pass-by-copy parameter passing convention
This is intended to solve the problem of how to pass arguments to
constructor functions -- you want to move in rvalues, but not have to
explicitly copy stuff that is not an rvalue. The by-copy passing
convention will ensure the callee gets its own copy of the value. For
rvalues, it'll just pass off the value. For lvalues, it'll make a
copy.

Issue #1177
Diffstat (limited to 'src/comp/metadata')
-rw-r--r--src/comp/metadata/tydecode.rs3
-rw-r--r--src/comp/metadata/tyencode.rs3
2 files changed, 4 insertions, 2 deletions
diff --git a/src/comp/metadata/tydecode.rs b/src/comp/metadata/tydecode.rs
index 5239e70a5a8..8e71ff86f56 100644
--- a/src/comp/metadata/tydecode.rs
+++ b/src/comp/metadata/tydecode.rs
@@ -379,8 +379,9 @@ fn parse_ty_fn(st: @pstate, sd: str_def) ->
         let mode = alt peek(st) as char {
           '&' { ast::by_mut_ref }
           '-' { ast::by_move }
+          '+' { ast::by_copy }
           '=' { ast::by_ref }
-          '+' { ast::by_val }
+          '#' { ast::by_val }
         };
         st.pos += 1u;
         inputs += [{mode: mode, ty: parse_ty(st, sd)}];
diff --git a/src/comp/metadata/tyencode.rs b/src/comp/metadata/tyencode.rs
index 89a1f3e05ff..b5bba9d723c 100644
--- a/src/comp/metadata/tyencode.rs
+++ b/src/comp/metadata/tyencode.rs
@@ -202,8 +202,9 @@ fn enc_ty_fn(w: io::writer, cx: @ctxt, args: [ty::arg], out: ty::t,
         alt arg.mode {
           by_mut_ref. { w.write_char('&'); }
           by_move. { w.write_char('-'); }
+          by_copy. { w.write_char('+'); }
           by_ref. { w.write_char('='); }
-          by_val. { w.write_char('+'); }
+          by_val. { w.write_char('#'); }
         }
         enc_ty(w, cx, arg.ty);
     }