@@ -225,6 +225,7 @@ use util::ppaux::{Repr, vec_map_to_str};
225225
226226use collections:: HashMap ;
227227use std:: cell:: Cell ;
228+ use std:: rc:: Rc ;
228229use syntax:: ast;
229230use syntax:: ast:: Ident ;
230231use syntax:: ast_util:: path_to_ident;
@@ -250,7 +251,7 @@ pub enum VecLenOpt {
250251// range)
251252enum Opt {
252253 lit( Lit ) ,
253- var( ty:: Disr , @ adt:: Repr ) ,
254+ var( ty:: Disr , Rc < adt:: Repr > ) ,
254255 range( @ast:: Expr , @ast:: Expr ) ,
255256 vec_len( /* length */ uint , VecLenOpt , /*range of matches*/ ( uint , uint ) )
256257}
@@ -351,8 +352,8 @@ fn trans_opt<'a>(bcx: &'a Block<'a>, o: &Opt) -> opt_result<'a> {
351352 let ( llval, _) = consts:: get_const_val ( bcx. ccx ( ) , lit_id) ;
352353 return single_result ( rslt ( bcx, llval) ) ;
353354 }
354- var( disr_val, repr) => {
355- return adt:: trans_case ( bcx, repr, disr_val) ;
355+ var( disr_val, ref repr) => {
356+ return adt:: trans_case ( bcx, & * * repr, disr_val) ;
356357 }
357358 range( l1, l2) => {
358359 let ( l1, _) = consts:: const_expr ( ccx, l1, true ) ;
@@ -1561,7 +1562,7 @@ fn compile_submatch_continue<'a, 'b>(
15611562 expr:: with_field_tys ( tcx, pat_ty, Some ( pat_id) , |discr, field_tys| {
15621563 let rec_vals = rec_fields. iter ( ) . map ( |field_name| {
15631564 let ix = ty:: field_idx_strict ( tcx, field_name. name , field_tys) ;
1564- adt:: trans_field_ptr ( bcx, pat_repr, val, discr, ix)
1565+ adt:: trans_field_ptr ( bcx, & * pat_repr, val, discr, ix)
15651566 } ) . collect :: < Vec < _ > > ( ) ;
15661567 compile_submatch (
15671568 bcx,
@@ -1587,7 +1588,7 @@ fn compile_submatch_continue<'a, 'b>(
15871588 _ => ccx. sess ( ) . bug ( "non-tuple type in tuple pattern" )
15881589 } ;
15891590 let tup_vals = Vec :: from_fn ( n_tup_elts, |i| {
1590- adt:: trans_field_ptr ( bcx, tup_repr, val, 0 , i)
1591+ adt:: trans_field_ptr ( bcx, & * tup_repr, val, 0 , i)
15911592 } ) ;
15921593 compile_submatch ( bcx,
15931594 enter_tup ( bcx,
@@ -1616,7 +1617,7 @@ fn compile_submatch_continue<'a, 'b>(
16161617
16171618 let struct_repr = adt:: represent_type ( bcx. ccx ( ) , struct_ty) ;
16181619 let llstructvals = Vec :: from_fn ( struct_element_count, |i| {
1619- adt:: trans_field_ptr ( bcx, struct_repr, val, 0 , i)
1620+ adt:: trans_field_ptr ( bcx, & * struct_repr, val, 0 , i)
16201621 } ) ;
16211622 compile_submatch ( bcx,
16221623 enter_tuple_struct ( bcx, dm, m, col, val,
@@ -1652,8 +1653,8 @@ fn compile_submatch_continue<'a, 'b>(
16521653 debug ! ( "test_val={}" , bcx. val_to_str( test_val) ) ;
16531654 if opts. len ( ) > 0 u {
16541655 match * opts. get ( 0 ) {
1655- var( _, repr) => {
1656- let ( the_kind, val_opt) = adt:: trans_switch ( bcx, repr, val) ;
1656+ var( _, ref repr) => {
1657+ let ( the_kind, val_opt) = adt:: trans_switch ( bcx, & * * repr, val) ;
16571658 kind = the_kind;
16581659 for & tval in val_opt. iter ( ) { test_val = tval; }
16591660 }
@@ -1799,9 +1800,9 @@ fn compile_submatch_continue<'a, 'b>(
17991800 let mut size = 0 u;
18001801 let mut unpacked = Vec :: new ( ) ;
18011802 match * opt {
1802- var( disr_val, repr) => {
1803+ var( disr_val, ref repr) => {
18031804 let ExtractedBlock { vals : argvals, bcx : new_bcx} =
1804- extract_variant_args ( opt_cx, repr, disr_val, val) ;
1805+ extract_variant_args ( opt_cx, & * * repr, disr_val, val) ;
18051806 size = argvals. len ( ) ;
18061807 unpacked = argvals;
18071808 opt_cx = new_bcx;
@@ -2219,7 +2220,7 @@ fn bind_irrefutable_pat<'a>(
22192220 enum_id,
22202221 var_id) ;
22212222 let args = extract_variant_args ( bcx,
2222- repr,
2223+ & * repr,
22232224 vinfo. disr_val ,
22242225 val) ;
22252226 for sub_pat in sub_pats. iter ( ) {
@@ -2240,7 +2241,7 @@ fn bind_irrefutable_pat<'a>(
22402241 // This is the tuple struct case.
22412242 let repr = adt:: represent_node ( bcx, pat. id ) ;
22422243 for ( i, elem) in elems. iter ( ) . enumerate ( ) {
2243- let fldptr = adt:: trans_field_ptr ( bcx, repr,
2244+ let fldptr = adt:: trans_field_ptr ( bcx, & * repr,
22442245 val, 0 , i) ;
22452246 bcx = bind_irrefutable_pat ( bcx, * elem,
22462247 fldptr, binding_mode,
@@ -2263,7 +2264,7 @@ fn bind_irrefutable_pat<'a>(
22632264 expr:: with_field_tys ( tcx, pat_ty, Some ( pat. id ) , |discr, field_tys| {
22642265 for f in fields. iter ( ) {
22652266 let ix = ty:: field_idx_strict ( tcx, f. ident . name , field_tys) ;
2266- let fldptr = adt:: trans_field_ptr ( bcx, pat_repr, val,
2267+ let fldptr = adt:: trans_field_ptr ( bcx, & * pat_repr, val,
22672268 discr, ix) ;
22682269 bcx = bind_irrefutable_pat ( bcx, f. pat , fldptr,
22692270 binding_mode, cleanup_scope) ;
@@ -2273,7 +2274,7 @@ fn bind_irrefutable_pat<'a>(
22732274 ast:: PatTup ( ref elems) => {
22742275 let repr = adt:: represent_node ( bcx, pat. id ) ;
22752276 for ( i, elem) in elems. iter ( ) . enumerate ( ) {
2276- let fldptr = adt:: trans_field_ptr ( bcx, repr, val, 0 , i) ;
2277+ let fldptr = adt:: trans_field_ptr ( bcx, & * repr, val, 0 , i) ;
22772278 bcx = bind_irrefutable_pat ( bcx, * elem, fldptr,
22782279 binding_mode, cleanup_scope) ;
22792280 }
0 commit comments