]> git.lizzy.rs Git - rust.git/commitdiff
Make mutability no longer a type constructor
authorPatrick Walton <pcwalton@mimiga.net>
Thu, 15 Jul 2010 22:20:04 +0000 (15:20 -0700)
committerPatrick Walton <pcwalton@mimiga.net>
Thu, 15 Jul 2010 22:20:04 +0000 (15:20 -0700)
src/boot/fe/ast.ml
src/boot/fe/pexp.ml
src/boot/llvm/lltrans.ml
src/boot/me/alias.ml
src/boot/me/semant.ml
src/boot/me/trans.ml
src/boot/me/type.ml
src/boot/me/typestate.ml
src/boot/me/walk.ml
src/test/run-pass/exterior.rs
src/test/run-pass/writealias.rs

index 31138a519628e10540d6e8d84cff27f852f227b8..0f61eec4e6f2e03c024f2f853fd6391ab54081ed 100644 (file)
@@ -35,6 +35,11 @@ type effect =
   | UNSAFE
 ;;
 
+type mutability =
+    MUT_mutable
+  | MUT_immutable
+;;
+
 type name_base =
     BASE_ident of ident
   | BASE_temp of temp_id
@@ -187,9 +192,9 @@ and ty_obj = (effect * ((ident,ty_fn) Hashtbl.t))
 
 and check_calls = (lval * (atom array)) array
 
-and rec_input = (ident * atom)
+and rec_input = (ident * mutability * atom)
 
-and tup_input = atom
+and tup_input = (mutability * atom)
 
 and stmt' =
 
@@ -197,11 +202,11 @@ and stmt' =
     STMT_spawn of (lval * domain * lval * (atom array))
   | STMT_init_rec of (lval * (rec_input array) * lval option)
   | STMT_init_tup of (lval * (tup_input array))
-  | STMT_init_vec of (lval * atom array)
+  | STMT_init_vec of (lval * mutability * atom array)
   | STMT_init_str of (lval * string)
   | STMT_init_port of lval
   | STMT_init_chan of (lval * (lval option))
-  | STMT_init_box of (lval * atom)
+  | STMT_init_box of (lval * mutability * atom)
   | STMT_copy of (lval * expr)
   | STMT_copy_binop of (lval * binop * atom)
   | STMT_call of (lval * lval * (atom array))
@@ -1018,7 +1023,8 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit =
           do
             if i != 0
             then fmt ff ", ";
-            let (ident, atom) = entries.(i) in
+            let (ident, mutability, atom) = entries.(i) in
+              if mutability = MUT_mutable then fmt ff "mutable ";
               fmt_ident ff ident;
               fmt ff " = ";
               fmt_atom ff atom;
@@ -1032,9 +1038,11 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit =
           end;
           fmt ff ");"
 
-      | STMT_init_vec (dst, atoms) ->
+      | STMT_init_vec (dst, mutability, atoms) ->
           fmt_lval ff dst;
-          fmt ff " = vec(";
+          fmt ff " = vec";
+          if mutability = MUT_mutable then fmt ff "[mutable]";
+          fmt ff "(";
           for i = 0 to (Array.length atoms) - 1
           do
             if i != 0
@@ -1050,7 +1058,9 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit =
           do
             if i != 0
             then fmt ff ", ";
-            fmt_atom ff entries.(i);
+            let (mutability, atom) = entries.(i) in
+            if mutability = MUT_mutable then fmt ff "mutable ";
+            fmt_atom ff atom;
           done;
           fmt ff ");";
 
@@ -1166,9 +1176,10 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit =
           fmt_lval ff t;
           fmt ff ";"
 
-      | STMT_init_box (lv, at) ->
+      | STMT_init_box (lv, mutability, at) ->
           fmt_lval ff lv;
           fmt ff " = @@";
+          if mutability = MUT_mutable then fmt ff " mutable ";
           fmt_atom ff at;
           fmt ff ";"
 
index 14065466fb8de642537db0e59c033b6fb49b2187..27ec881077e5247b0215d2654dc30ffed258c6c4 100644 (file)
@@ -20,9 +20,9 @@ type pexp' =
     PEXP_call of (pexp * pexp array)
   | PEXP_spawn of (Ast.domain * pexp)
   | PEXP_bind of (pexp * pexp option array)
-  | PEXP_rec of ((Ast.ident * pexp) array * pexp option)
-  | PEXP_tup of (pexp array)
-  | PEXP_vec of (pexp array)
+  | PEXP_rec of ((Ast.ident * Ast.mutability * pexp) array * pexp option)
+  | PEXP_tup of ((Ast.mutability * pexp) array)
+  | PEXP_vec of Ast.mutability * (pexp array)
   | PEXP_port
   | PEXP_chan of (pexp option)
   | PEXP_binop of (Ast.binop * pexp * pexp)
@@ -32,8 +32,7 @@ type pexp' =
   | PEXP_lval of plval
   | PEXP_lit of Ast.lit
   | PEXP_str of string
-  | PEXP_mutable of pexp
-  | PEXP_box of pexp
+  | PEXP_box of Ast.mutability * pexp
   | PEXP_custom of Ast.name * (pexp array) * (string option)
 
 and plval =
@@ -177,6 +176,11 @@ and parse_effect (ps:pstate) : Ast.effect =
     | UNSAFE -> bump ps; Ast.UNSAFE
     | _ -> Ast.PURE
 
+and parse_mutability (ps:pstate) : Ast.mutability =
+  match peek ps with
+      MUTABLE -> bump ps; Ast.MUT_mutable
+    | _ -> Ast.MUT_immutable
+
 and parse_ty_fn
     (effect:Ast.effect)
     (ps:pstate)
@@ -421,13 +425,14 @@ and parse_ty (ps:pstate) : Ast.ty =
   parse_constrained_ty ps
 
 
-and parse_rec_input (ps:pstate) : (Ast.ident * pexp) =
+and parse_rec_input (ps:pstate) : (Ast.ident * Ast.mutability * pexp) =
+  let mutability = parse_mutability ps in
   let lab = (ctxt "rec input: label" parse_ident ps) in
     match peek ps with
         EQ ->
           bump ps;
           let pexp = ctxt "rec input: expr" parse_pexp ps in
-            (lab, pexp)
+            (lab, mutability, pexp)
       | _ -> raise (unexpected ps)
 
 
@@ -439,7 +444,7 @@ and parse_rec_body (ps:pstate) : pexp' = (*((Ast.ident * pexp) array) =*)
       | WITH -> raise (err "empty record extension" ps)
       | _ ->
           let inputs = one_or_more COMMA parse_rec_input ps in
-          let labels = Array.map (fun (l, _) -> l) inputs in
+          let labels = Array.map (fun (l, _, _) -> l) inputs in
             begin
               check_dup_rec_labels ps labels;
               match peek ps with
@@ -472,21 +477,18 @@ and parse_bottom_pexp (ps:pstate) : pexp =
   let apos = lexpos ps in
   match peek ps with
 
-      MUTABLE ->
-        bump ps;
-        let inner = parse_pexp ps in
-        let bpos = lexpos ps in
-          span ps apos bpos (PEXP_mutable inner)
-
-    | AT ->
+      AT ->
         bump ps;
+        let mutability = parse_mutability ps in
         let inner = parse_pexp ps in
         let bpos = lexpos ps in
-          span ps apos bpos (PEXP_box inner)
+          span ps apos bpos (PEXP_box (mutability, inner))
 
     | TUP ->
         bump ps;
-        let pexps = ctxt "paren pexps(s)" (rstr false parse_pexp_list) ps in
+        let pexps =
+          ctxt "paren pexps(s)" (rstr false parse_mutable_and_pexp_list) ps
+        in
         let bpos = lexpos ps in
           span ps apos bpos (PEXP_tup pexps)
 
@@ -498,11 +500,18 @@ and parse_bottom_pexp (ps:pstate) : pexp =
 
     | VEC ->
         bump ps;
-        begin
-          let pexps = ctxt "vec pexp: exprs" parse_pexp_list ps in
-          let bpos = lexpos ps in
-            span ps apos bpos (PEXP_vec pexps)
-        end
+        let mutability =
+          match peek ps with
+              LBRACKET ->
+                bump ps;
+                expect ps MUTABLE;
+                expect ps RBRACKET;
+                Ast.MUT_mutable
+            | _ -> Ast.MUT_immutable
+        in
+        let pexps = ctxt "vec pexp: exprs" parse_pexp_list ps in
+        let bpos = lexpos ps in
+          span ps apos bpos (PEXP_vec (mutability, pexps))
 
 
     | LIT_STR s ->
@@ -947,6 +956,9 @@ and parse_as_pexp (ps:pstate) : pexp =
 and parse_pexp (ps:pstate) : pexp =
   parse_as_pexp ps
 
+and parse_mutable_and_pexp (ps:pstate) : (Ast.mutability * pexp) =
+  let mutability = parse_mutability ps in
+  (mutability, parse_as_pexp ps)
 
 and parse_pexp_list (ps:pstate) : pexp array =
   match peek ps with
@@ -955,6 +967,13 @@ and parse_pexp_list (ps:pstate) : pexp array =
           (ctxt "pexp list" parse_pexp) ps
     | _ -> raise (unexpected ps)
 
+and parse_mutable_and_pexp_list (ps:pstate) : (Ast.mutability * pexp) array =
+  match peek ps with
+      LPAREN ->
+        bracketed_zero_or_more LPAREN RPAREN (Some COMMA)
+          (ctxt "mutable-and-pexp list" parse_mutable_and_pexp) ps
+    | _ -> raise (unexpected ps)
+
 ;;
 
 (* 
@@ -1099,8 +1118,7 @@ and desugar_expr_atom
       | PEXP_bind _
       | PEXP_spawn _
       | PEXP_custom _
-      | PEXP_box _
-      | PEXP_mutable _ ->
+      | PEXP_box _ ->
           let (_, tmp, decl_stmt) = build_tmp ps slot_auto apos bpos in
           let stmts = desugar_expr_init ps tmp pexp in
             (Array.append [| decl_stmt |] stmts,
@@ -1233,11 +1251,11 @@ and desugar_expr_init
               begin
                 Array.map
                   begin
-                    fun (ident, pexp) ->
+                    fun (ident, mutability, pexp) ->
                       let (stmts, atom) =
                         desugar_expr_atom ps pexp
                       in
-                        (stmts, (ident, atom))
+                        (stmts, (ident, mutability, atom))
                   end
                   args
               end
@@ -1259,19 +1277,24 @@ and desugar_expr_init
             end
 
       | PEXP_tup args ->
+          let muts = Array.to_list (Array.map fst args) in
           let (arg_stmts, arg_atoms) =
-            desugar_expr_atoms ps args
+            desugar_expr_atoms ps (Array.map snd args)
           in
-          let stmt = ss (Ast.STMT_init_tup (dst_lval, arg_atoms)) in
+          let arg_atoms = Array.to_list arg_atoms in
+          let tup_args = Array.of_list (List.combine muts arg_atoms) in
+          let stmt = ss (Ast.STMT_init_tup (dst_lval, tup_args)) in
             aa arg_stmts [| stmt |]
 
       | PEXP_str s ->
           let stmt = ss (Ast.STMT_init_str (dst_lval, s)) in
             [| stmt |]
 
-      | PEXP_vec args ->
+      | PEXP_vec (mutability, args) ->
           let (arg_stmts, arg_atoms) = desugar_expr_atoms ps args in
-          let stmt = ss (Ast.STMT_init_vec (dst_lval, arg_atoms)) in
+          let stmt =
+            ss (Ast.STMT_init_vec (dst_lval, mutability, arg_atoms))
+          in
             aa arg_stmts [| stmt |]
 
       | PEXP_port ->
@@ -1296,20 +1319,15 @@ and desugar_expr_init
           in
             aa port_stmts [| chan_stmt |]
 
-      | PEXP_box arg ->
+      | PEXP_box (mutability, arg) ->
           let (arg_stmts, arg_mode_atom) =
             desugar_expr_atom ps arg
           in
-          let stmt = ss (Ast.STMT_init_box (dst_lval, arg_mode_atom)) in
+          let stmt =
+            ss (Ast.STMT_init_box (dst_lval, mutability, arg_mode_atom))
+          in
             aa arg_stmts [| stmt |]
 
-      | PEXP_mutable arg ->
-          (* Initializing a local from a "mutable" atom is the same as
-           * initializing it from an immutable one; all locals are mutable
-           * anyways. So this is just a fall-through.
-           *)
-          desugar_expr_init ps dst_lval arg
-
       | PEXP_custom (n, a, b) ->
           let (arg_stmts, args) = desugar_expr_atoms ps a in
           let stmts =
index a7daa371314ec9889f1502c4bb732a7d7178eaec..1f268fa1d9a4db232e7cad9e2b0349add89e29d2 100644 (file)
@@ -761,10 +761,10 @@ let trans_crate
             let trans_tail () = trans_tail_with_builder llbuilder in
 
             match head.node with
-                Ast.STMT_init_tup (dest, atoms) ->
+                Ast.STMT_init_tup (dest, elems) ->
                   let zero = const_i32 0 in
                   let lldest = trans_lval dest in
-                  let trans_tup_atom idx atom =
+                  let trans_tup_elem idx (_, atom) =
                     let indices = [| zero; const_i32 idx |] in
                     let gep_id = anon_llid "init_tup_gep" in
                     let ptr =
@@ -772,7 +772,7 @@ let trans_crate
                     in
                     ignore (Llvm.build_store (trans_atom atom) ptr llbuilder)
                   in
-                  Array.iteri trans_tup_atom atoms;
+                  Array.iteri trans_tup_elem elems;
                   trans_tail ()
 
               | Ast.STMT_copy (dest, src) ->
index f8b82c122b4e0a3f1ec11d114d1d0116fdfad36b..148f12497f30aa4185c5e41b0baa432c171df9a6 100644 (file)
@@ -67,7 +67,7 @@ let alias_analysis_visitor
           | Ast.STMT_recv (dst, _) -> alias dst
           | Ast.STMT_init_port (dst) -> alias dst
           | Ast.STMT_init_chan (dst, _) -> alias dst
-          | Ast.STMT_init_vec (dst, _) -> alias dst
+          | Ast.STMT_init_vec (dst, _, _) -> alias dst
           | Ast.STMT_init_str (dst, _) -> alias dst
           | Ast.STMT_for_each sfe ->
               let (slot, _) = sfe.Ast.for_each_slot in
index 7b18a5bc402c11ce296f1580db704456af36b99e..434fb025c01913e77458c7a1b516212ca1c276d1 100644 (file)
@@ -583,13 +583,13 @@ let atoms_slots (cx:ctxt) (az:Ast.atom array) : node_id array =
 ;;
 
 let tup_inputs_slots (cx:ctxt) (az:Ast.tup_input array) : node_id array =
-  Array.concat (List.map (atom_slots cx) (Array.to_list az))
+  Array.concat (List.map (atom_slots cx) (Array.to_list (Array.map snd az)))
 ;;
 
 let rec_inputs_slots (cx:ctxt)
     (inputs:Ast.rec_input array) : node_id array =
   Array.concat (List.map
-                  (fun (_, atom) -> atom_slots cx atom)
+                  (fun (_, _, atom) -> atom_slots cx atom)
                   (Array.to_list inputs))
 ;;
 
index 6d5678d3ad370c850260904f3a1d767e5feeb61d..46329a1082e34dc322428d3f142e2b8898b4e153 100644 (file)
@@ -3244,13 +3244,13 @@ let trans_visitor
       (dst:Il.cell)
       (dst_tys:Ast.ty array)
       (trec:Ast.ty_rec)
-      (atab:(Ast.ident * Ast.atom) array)
+      (atab:(Ast.ident * Ast.mutability * Ast.atom) array)
       (base:Ast.lval)
       : unit =
     Array.iteri
       begin
         fun i (fml_ident, _) ->
-          let fml_entry _ (act_ident, atom) =
+          let fml_entry _ (act_ident, _, atom) =
             if act_ident = fml_ident then Some atom else None
           in
           let dst_ty = dst_tys.(i) in
@@ -4315,7 +4315,7 @@ let trans_visitor
             begin
               match base with
                   None ->
-                    let atoms = Array.map snd atab in
+                    let atoms = Array.map (fun (_, _, atom) -> atom) atab in
                       trans_init_structural_from_atoms
                         dst_cell dst_tys atoms
                 | Some base_lval ->
@@ -4323,7 +4323,7 @@ let trans_visitor
                       dst_cell dst_tys trec atab base_lval
             end
 
-      | Ast.STMT_init_tup (dst, atoms) ->
+      | Ast.STMT_init_tup (dst, elems) ->
           let (slot_cell, ty) = trans_lval_init dst in
           let dst_tys =
             match ty with
@@ -4332,6 +4332,7 @@ let trans_visitor
                   bugi cx stmt.id
                     "non-tup destination type in stmt_init_tup"
           in
+          let atoms = Array.map snd elems in
           let (dst_cell, _) = deref_ty DEREF_none true slot_cell ty in
             trans_init_structural_from_atoms dst_cell dst_tys atoms
 
@@ -4339,7 +4340,7 @@ let trans_visitor
       | Ast.STMT_init_str (dst, s) ->
           trans_init_str dst s
 
-      | Ast.STMT_init_vec (dst, atoms) ->
+      | Ast.STMT_init_vec (dst, _, atoms) ->
           trans_init_vec dst atoms
 
       | Ast.STMT_init_port dst ->
@@ -4357,7 +4358,7 @@ let trans_visitor
                   trans_init_chan dst p
           end
 
-      | Ast.STMT_init_box (dst, src) ->
+      | Ast.STMT_init_box (dst, _, src) ->
           trans_init_box dst src
 
       | Ast.STMT_block block ->
index 9110743bf8b6c5e0f54d516c57c65d56b9fd228e..4557070808f11a9117eb387d823ad900c86818ad 100644 (file)
@@ -1144,7 +1144,7 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
         | Ast.STMT_init_rec (dst, fields, Some base) ->
             let dct = Hashtbl.create 10 in
             let tvrec = ref (TYSPEC_record dct) in
-            let add_field (ident, atom) =
+            let add_field (ident, _, atom) =
               let tv = any() in
                 unify_atom arg_pass_ctx atom tv;
                 Hashtbl.add dct ident tv
@@ -1157,7 +1157,7 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
 
         | Ast.STMT_init_rec (dst, fields, None) ->
             let dct = Hashtbl.create 10 in
-            let add_field (ident, atom) =
+            let add_field (ident, _, atom) =
               let tv = any() in
                 unify_atom arg_pass_ctx atom tv;
                 Hashtbl.add dct ident tv
@@ -1166,7 +1166,7 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
               unify_lval init_ctx dst (ref (TYSPEC_record dct))
 
         | Ast.STMT_init_tup (dst, members) ->
-            let member_to_tv atom =
+            let member_to_tv (_, atom) =
               let tv = any() in
                 unify_atom arg_pass_ctx atom tv;
                 tv
@@ -1174,7 +1174,7 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
             let member_tvs = Array.map member_to_tv members in
               unify_lval init_ctx dst (ref (TYSPEC_tuple member_tvs))
 
-        | Ast.STMT_init_vec (dst, atoms) ->
+        | Ast.STMT_init_vec (dst, _, atoms) ->
             let tv = any() in
             let unify_with_tv atom = unify_atom arg_pass_ctx atom tv in
               Array.iter unify_with_tv atoms;
@@ -1304,7 +1304,7 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
         | Ast.STMT_join lval ->
             unify_lval rval_ctx lval (ty Ast.TY_task);
 
-        | Ast.STMT_init_box (dst, v) ->
+        | Ast.STMT_init_box (dst, _, v) ->
             let in_tv = any() in
             let tv = ref (TYSPEC_mutable (ref (TYSPEC_box in_tv))) in
               unify_lval strict_ctx dst tv;
index b935864f6f1894c50085ce9dbf780fdb851a9a49..cca548b8bf18e840e30fe98ebc0a08b0f067e4bf 100644 (file)
@@ -434,7 +434,7 @@ let condition_assigning_visitor
               raise_pre_post_cond s.id precond;
               raise_postcondition s.id postcond
 
-        | Ast.STMT_init_vec (dst, atoms) ->
+        | Ast.STMT_init_vec (dst, _, atoms) ->
             let precond = slot_inits (atoms_slots cx atoms) in
             let postcond = slot_inits (lval_slots cx dst) in
               raise_pre_post_cond s.id precond;
@@ -454,7 +454,7 @@ let condition_assigning_visitor
               raise_pre_post_cond s.id precond;
               raise_postcondition s.id postcond
 
-        | Ast.STMT_init_box (dst, src) ->
+        | Ast.STMT_init_box (dst, _, src) ->
             let precond = slot_inits (atom_slots cx src) in
             let postcond = slot_inits (lval_slots cx dst) in
               raise_pre_post_cond s.id precond;
@@ -1106,11 +1106,11 @@ let lifecycle_visitor
 
           | Ast.STMT_init_rec (lv_dst, _, _)
           | Ast.STMT_init_tup (lv_dst, _)
-          | Ast.STMT_init_vec (lv_dst, _)
+          | Ast.STMT_init_vec (lv_dst, _, _)
           | Ast.STMT_init_str (lv_dst, _)
           | Ast.STMT_init_port lv_dst
           | Ast.STMT_init_chan (lv_dst, _)
-          | Ast.STMT_init_box (lv_dst, _) ->
+          | Ast.STMT_init_box (lv_dst, _, _) ->
               init_lval lv_dst
 
           | Ast.STMT_for f ->
index bb774c018d8da711e23f313bd2c83f721e80cac3..fac44170d703ee124d9d6375b38a38d4341f7094 100644 (file)
@@ -386,16 +386,16 @@ and walk_stmt
 
       | Ast.STMT_init_rec (lv, atab, base) ->
           walk_lval v lv;
-          Array.iter (fun (_, a) -> walk_atom v a) atab;
+          Array.iter (fun (_, _, a) -> walk_atom v a) atab;
           walk_option (walk_lval v) base;
 
-      | Ast.STMT_init_vec (lv, atoms) ->
+      | Ast.STMT_init_vec (lv, _, atoms) ->
           walk_lval v lv;
           Array.iter (walk_atom v) atoms
 
       | Ast.STMT_init_tup (lv, mut_atoms) ->
           walk_lval v lv;
-          Array.iter (walk_atom v) mut_atoms
+          Array.iter (fun (_, atom) -> walk_atom v atom) mut_atoms
 
       | Ast.STMT_init_str (lv, _) ->
           walk_lval v lv
@@ -407,7 +407,7 @@ and walk_stmt
           walk_option (walk_lval v) port;
           walk_lval v chan;
 
-      | Ast.STMT_init_box (dst, src) ->
+      | Ast.STMT_init_box (dst, _, src) ->
           walk_lval v dst;
           walk_atom v src
 
index 0e93e25a7901dcfeca544cee99edd2979142b988..f09ee8234e35dc235453871881756758ba7a243d 100644 (file)
@@ -9,7 +9,7 @@ fn f(@point p) {
 }
 
 fn main() {
-  let point a = rec(x=10, y=11, z=mutable 12);
+  let point a = rec(x=10, y=11, mutable z=12);
   let @point b = @a;
   check (b.z == 12);
   f(b);
index 061b1b5779af57dd0af7cd84d97eeca4430a34d4..8bf8140f315805566e42599cbe3c3a4f3960d9df 100644 (file)
@@ -7,7 +7,7 @@ fn f(& mutable point p) {
 }
 
 fn main() {
-  let point x = rec(x=10, y=11, z=mutable 12);
+  let point x = rec(x=10, y=11, mutable z=12);
   f(x);
   check (x.z == 13);
 }