about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/comp/middle/trans.rs81
-rw-r--r--src/comp/middle/tstate/pre_post_conditions.rs2
-rw-r--r--src/comp/middle/tstate/states.rs2
-rw-r--r--src/comp/middle/typeck.rs7
-rw-r--r--src/comp/syntax/ast.rs2
-rw-r--r--src/comp/syntax/fold.rs4
-rw-r--r--src/comp/syntax/parse/parser.rs7
-rw-r--r--src/comp/syntax/print/pprust.rs3
-rw-r--r--src/comp/syntax/visit.rs2
-rw-r--r--src/comp/syntax/walk.rs2
10 files changed, 35 insertions, 77 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index fb79b360252..abde1ebc9a8 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -5847,8 +5847,8 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) ->
         case (ast::expr_spawn(?dom, ?name, ?func, ?args)) {
             ret trans_spawn(cx, dom, name, func, args, e.id);
         }
-        case (ast::expr_anon_obj(?anon_obj, ?tps)) {
-            ret trans_anon_obj(cx, e.span, anon_obj, tps, e.id);
+        case (ast::expr_anon_obj(?anon_obj)) {
+            ret trans_anon_obj(cx, e.span, anon_obj, e.id);
         }
         case (_) {
             // The expression is an lvalue. Fall through.
@@ -6222,15 +6222,9 @@ fn trans_be(&@block_ctxt cx, &@ast::expr e) -> result {
 // instead "inlining" the construction of the object and returning the object
 // itself.
 fn trans_anon_obj(@block_ctxt bcx, &span sp, &ast::anon_obj anon_obj,
-                  &ast::ty_param[] ty_params, ast::node_id id) -> result {
+                  ast::node_id id) -> result {
 
-    // Right now, we're assuming that anon objs don't take ty params, even
-    // though the AST supports it.  It's nonsensical to write an expression
-    // like "obj[T](){ ... with ... }", since T is never instantiated;
-    // nevertheless, such an expression will parse.  Idea for the future:
-    // support typarams.
 
-    assert (std::ivec::len(ty_params) == 0u);
     auto ccx = bcx.fcx.lcx.ccx;
 
     // Fields.
@@ -6286,7 +6280,7 @@ fn trans_anon_obj(@block_ctxt bcx, &span sp, &ast::anon_obj anon_obj,
             // is that, since *all* of the methods are "additional", we can
             // get away with acting like none of them are.
             vtbl = create_vtbl(bcx.fcx.lcx, sp, outer_obj_ty,
-                               wrapper_obj, ty_params, none,
+                               wrapper_obj, ~[], none,
                                additional_field_tys);
         }
         case (some(?e)) {
@@ -6304,8 +6298,7 @@ fn trans_anon_obj(@block_ctxt bcx, &span sp, &ast::anon_obj anon_obj,
             // create a forwarding slot.  And, of course, we need to create a
             // normal vtable entry for every method being added.
             vtbl = create_vtbl(bcx.fcx.lcx, sp, outer_obj_ty,
-                               wrapper_obj, ty_params,
-                               some(with_obj_ty),
+                               wrapper_obj, ~[], some(with_obj_ty),
                                additional_field_tys);
         }
     }
@@ -6333,27 +6326,22 @@ fn trans_anon_obj(@block_ctxt bcx, &span sp, &ast::anon_obj anon_obj,
     // typarams, fields, and a pointer to our with_obj.
     let TypeRef llbox_ty = T_ptr(T_empty_struct());
 
-    if (std::ivec::len[ast::ty_param](ty_params) == 0u &&
-        std::ivec::len[ast::anon_obj_field](additional_fields) == 0u &&
+    if (std::ivec::len[ast::anon_obj_field](additional_fields) == 0u &&
         anon_obj.with_obj == none) {
-        // If the object we're translating has no fields or type parameters
-        // and no with_obj, there's not much to do.
+        // If the object we're translating has no fields and no with_obj,
+        // there's not much to do.
         bcx.build.Store(C_null(llbox_ty), pair_box);
     } else {
 
         // Synthesize a tuple type for fields: [field, ...]
         let ty::t fields_ty = ty::mk_imm_tup(ccx.tcx, additional_field_tys);
 
-        // Tydescs are run-time instantiations of typarams.  We're not
-        // actually supporting typarams for anon objs yet, but let's
-        // create space for them in case we ever want them.
+        // Type for tydescs.
         let ty::t tydesc_ty = ty::mk_type(ccx.tcx);
-        let ty::t[] tps = ~[];
-        for (ast::ty_param tp in ty_params) {
-            tps += ~[tydesc_ty];
-        }
-        // Synthesize a tuple type for typarams: [typaram, ...]
-        let ty::t typarams_ty = ty::mk_imm_tup(ccx.tcx, tps);
+
+        // Placeholder for non-existent typarams, since anon objs don't have
+        // them.
+        let ty::t typarams_ty = ty::mk_imm_tup(ccx.tcx, ~[]);
 
         // Tuple type for body:
         // [tydesc_ty, [typaram, ...], [field, ...], with_obj]
@@ -6402,35 +6390,15 @@ fn trans_anon_obj(@block_ctxt bcx, &span sp, &ast::anon_obj anon_obj,
         bcx = body_td.bcx;
         bcx.build.Store(body_td.val, body_tydesc.val);
 
-        // Copy the object's type parameters and fields into the space we
-        // allocated for the object body.  (This is something like saving the
-        // lexical environment of a function in its closure: the "captured
-        // typarams" are any type parameters that are passed to the object
-        // constructor and are then available to the object's methods.
-        // Likewise for the object's fields.)
-
-        // Copy typarams into captured typarams.
-        auto body_typarams =
-            GEP_tup_like(bcx, body_ty, body.val,
-                         ~[0, abi::obj_body_elt_typarams]);
-        bcx = body_typarams.bcx;
-        let int i = 0;
-        for (ast::ty_param tp in ty_params) {
-            auto typaram = bcx.fcx.lltydescs.(i);
-            auto capture =
-                GEP_tup_like(bcx, typarams_ty, body_typarams.val, ~[0, i]);
-            bcx = capture.bcx;
-            bcx = copy_val(bcx, INIT, capture.val, typaram,
-                           tydesc_ty).bcx;
-            i += 1;
-        }
-
-        // Copy additional fields into the object's body.
+        // Copy the object's fields into the space we allocated for the object
+        // body.  (This is something like saving the lexical environment of a
+        // function in its closure: the fields were passed to the object
+        // constructor and are now available to the object's methods.
         auto body_fields =
             GEP_tup_like(bcx, body_ty, body.val,
                          ~[0, abi::obj_body_elt_fields]);
         bcx = body_fields.bcx;
-        i = 0;
+        let int i = 0;
         for (ast::anon_obj_field f in additional_fields) {
             // FIXME (part of issue #538): make this work eventually, when we
             // have additional field exprs in the AST.
@@ -7182,16 +7150,11 @@ fn process_fwding_mthd(@local_ctxt cx, &span sp, @ty::method m,
     // Synthesize a tuple type for fields: [field, ...]
     let ty::t fields_ty = ty::mk_imm_tup(cx.ccx.tcx, additional_field_tys);
 
-    // Tydescs are run-time instantiations of typarams.  We're not
-    // actually supporting typarams for anon objs yet, but let's
-    // create space for them in case we ever want them.
+    // Type for tydescs.
     let ty::t tydesc_ty = ty::mk_type(cx.ccx.tcx);
-    let ty::t[] tps = ~[];
-    for (ast::ty_param tp in ty_params) {
-        tps += ~[tydesc_ty];
-    }
-    // Synthesize a tuple type for typarams: [typaram, ...]
-    let ty::t typarams_ty = ty::mk_imm_tup(cx.ccx.tcx, tps);
+
+    // Placeholder for non-existent typarams, since anon objs don't have them.
+    let ty::t typarams_ty = ty::mk_imm_tup(cx.ccx.tcx, ~[]);
 
     // Tuple type for body:
     // [tydesc_ty, [typaram, ...], [field, ...], with_obj]
diff --git a/src/comp/middle/tstate/pre_post_conditions.rs b/src/comp/middle/tstate/pre_post_conditions.rs
index 8f802db30bd..6065b5fa2b2 100644
--- a/src/comp/middle/tstate/pre_post_conditions.rs
+++ b/src/comp/middle/tstate/pre_post_conditions.rs
@@ -567,7 +567,7 @@ fn find_pre_post_expr(&fn_ctxt fcx, @expr e) {
         case (expr_mac(_)) {
             fcx.ccx.tcx.sess.bug("unexpanded macro");
         }
-        case (expr_anon_obj(?anon_obj, _)) {
+        case (expr_anon_obj(?anon_obj)) {
             alt (anon_obj.with_obj) {
                 case (some(?ex)) {
                     find_pre_post_expr(fcx, ex);
diff --git a/src/comp/middle/tstate/states.rs b/src/comp/middle/tstate/states.rs
index c806493bdea..88b21748a3f 100644
--- a/src/comp/middle/tstate/states.rs
+++ b/src/comp/middle/tstate/states.rs
@@ -564,7 +564,7 @@ fn find_pre_post_state_expr(&fn_ctxt fcx, &prestate pres, @expr e) -> bool {
         case (expr_cont) { ret pure_exp(fcx.ccx, e.id, pres); }
         case (expr_port(_)) { ret pure_exp(fcx.ccx, e.id, pres); }
         case (expr_self_method(_)) { ret pure_exp(fcx.ccx, e.id, pres); }
-        case (expr_anon_obj(?anon_obj, _)) {
+        case (expr_anon_obj(?anon_obj)) {
             alt (anon_obj.with_obj) {
                 case (some(?wt)) {
                     ret find_pre_post_state_sub(fcx, pres, wt, e.id, none);
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index 342266dc719..e76bef2cf0c 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -2395,7 +2395,7 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
                 }
             }
         }
-        case (ast::expr_anon_obj(?ao, ?tps)) {
+        case (ast::expr_anon_obj(?ao)) {
 
             let ast::anon_obj_field[] fields = ~[];
             alt (ao.fields) {
@@ -2432,8 +2432,7 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
 
             fn get_anon_obj_method_types(@fn_ctxt fcx,
                                          &ast::anon_obj ao,
-                                         &ast::anon_obj_field[] fields,
-                                         &ast::ty_param[] tps)
+                                         &ast::anon_obj_field[] fields)
                 -> ty::method[] {
 
                 let ty::method[] methods = ~[];
@@ -2495,7 +2494,7 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
             }
 
             auto method_types = get_anon_obj_method_types(fcx, ao,
-                                                          fields, tps);
+                                                          fields);
             auto ot = ty::mk_obj(fcx.ccx.tcx, ty::sort_methods(method_types));
 
             write::ty_only_fixup(fcx, id, ot);
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs
index e2b2e53df07..e710a8b2b84 100644
--- a/src/comp/syntax/ast.rs
+++ b/src/comp/syntax/ast.rs
@@ -325,7 +325,7 @@ tag expr_ {
     expr_if_check(@expr, block, option::t[@expr]);
     expr_port(option::t[@ty]);
     expr_chan(@expr);
-    expr_anon_obj(anon_obj, ty_param[]);
+    expr_anon_obj(anon_obj);
     expr_mac(mac);
 }
 
diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs
index a12a7da4aef..812542bb114 100644
--- a/src/comp/syntax/fold.rs
+++ b/src/comp/syntax/fold.rs
@@ -458,8 +458,8 @@ fn noop_fold_expr(&expr_ e, ast_fold fld) -> expr_ {
                 })
                 }
         case (expr_chan(?e)) { expr_chan(fld.fold_expr(e)) }
-        case (expr_anon_obj(?ao, ?typms)) {
-            expr_anon_obj(fold_anon_obj(ao), typms)
+        case (expr_anon_obj(?ao)) {
+            expr_anon_obj(fold_anon_obj(ao))
                 }
         case (expr_mac(?mac)) {
             expr_mac(fold_mac(mac))
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 1e33e223d82..a0863319b8d 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -833,9 +833,6 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
     } else if (eat_word(p, "obj")) {
         // Anonymous object
 
-        // FIXME: Can anonymous objects have ty params?
-        auto ty_params = parse_ty_params(p);
-
         // Only make people type () if they're actually adding new fields
         let option::t[ast::anon_obj_field[]] fields = none;
         if (p.peek() == token::LPAREN) {
@@ -864,7 +861,7 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
         // "spanned".
         let ast::anon_obj ob =
             rec(fields=fields, methods=meths, with_obj=with_obj);
-        ex = ast::expr_anon_obj(ob, ty_params);
+        ex = ast::expr_anon_obj(ob);
     } else if (eat_word(p, "rec")) {
         expect(p, token::LPAREN);
         auto fields = ~[parse_field(p)];
@@ -1686,7 +1683,7 @@ fn stmt_ends_with_semi(&ast::stmt stmt) -> bool {
                 case (ast::expr_if_check(_, _, _)) { false }
                 case (ast::expr_port(_)) { true }
                 case (ast::expr_chan(_)) { true }
-                case (ast::expr_anon_obj(_,_)) { false }
+                case (ast::expr_anon_obj(_)) { false }
                 case (ast::expr_assert(_)) { true }
             }
         }
diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs
index 1fbbe7c624d..32ef2e2f471 100644
--- a/src/comp/syntax/print/pprust.rs
+++ b/src/comp/syntax/print/pprust.rs
@@ -986,9 +986,8 @@ fn print_expr(&ps s, &@ast::expr expr) {
             print_expr(s, expr);
             pclose(s);
         }
-        case (ast::expr_anon_obj(?anon_obj, ?tps)) {
+        case (ast::expr_anon_obj(?anon_obj)) {
             head(s, "obj");
-            print_type_params(s, tps);
 
             // Fields
             popen(s);
diff --git a/src/comp/syntax/visit.rs b/src/comp/syntax/visit.rs
index afb965bb496..6893250ac00 100644
--- a/src/comp/syntax/visit.rs
+++ b/src/comp/syntax/visit.rs
@@ -395,7 +395,7 @@ fn visit_expr[E](&@expr ex, &E e, &vt[E] v) {
         case (expr_assert(?x)) { v.visit_expr(x, e, v); }
         case (expr_port(?t)) { visit_ty_opt(t, e, v); }
         case (expr_chan(?x)) { v.visit_expr(x, e, v); }
-        case (expr_anon_obj(?anon_obj, _)) {
+        case (expr_anon_obj(?anon_obj)) {
             alt (anon_obj.fields) {
                 case (none) { }
                 case (some(?fields)) {
diff --git a/src/comp/syntax/walk.rs b/src/comp/syntax/walk.rs
index a99d980ce9e..6f993f960a9 100644
--- a/src/comp/syntax/walk.rs
+++ b/src/comp/syntax/walk.rs
@@ -388,7 +388,7 @@ fn walk_expr(&ast_visitor v, @ast::expr e) {
         case (ast::expr_assert(?x)) { walk_expr(v, x); }
         case (ast::expr_port(_)) { }
         case (ast::expr_chan(?x)) { walk_expr(v, x); }
-        case (ast::expr_anon_obj(?anon_obj, _)) {
+        case (ast::expr_anon_obj(?anon_obj)) {
             // Fields
 
             alt (anon_obj.fields) {