@@ -32,7 +32,6 @@ import back::link;
32
32
import back:: x86;
33
33
import back:: abi;
34
34
import back:: upcall;
35
- import middle:: ty:: pat_ty;
36
35
import syntax:: visit;
37
36
import visit:: vt;
38
37
import util:: common;
@@ -3370,7 +3369,7 @@ fn move_val_if_temp(@block_ctxt cx, copy_action action, ValueRef dst,
3370
3369
}
3371
3370
}
3372
3371
3373
- fn trans_lit( & @crate_ctxt cx, & ast:: lit lit, ast :: node_id id ) -> ValueRef {
3372
+ fn trans_lit( & @crate_ctxt cx, & ast:: lit lit) -> ValueRef {
3374
3373
alt ( lit. node) {
3375
3374
case ( ast:: lit_int( ?i) ) { ret C_int ( i) ; }
3376
3375
case ( ast:: lit_uint( ?u) ) { ret C_int ( u as int) ; }
@@ -4742,219 +4741,6 @@ fn trans_do_while(&@block_ctxt cx, &ast::block body, &@ast::expr cond) ->
4742
4741
ret rslt( next_cx, body_res. val) ;
4743
4742
}
4744
4743
4745
-
4746
- // Pattern matching translation
4747
- fn trans_pat_match( & @block_ctxt cx, & @ast:: pat pat, ValueRef llval,
4748
- & @block_ctxt next_cx) -> result {
4749
- alt ( pat. node) {
4750
- case ( ast:: pat_wild) { ret rslt( cx, llval) ; }
4751
- case ( ast:: pat_bind( _) ) { ret rslt( cx, llval) ; }
4752
- case ( ast:: pat_lit( ?lt) ) {
4753
- auto lllit = trans_lit( cx. fcx. lcx. ccx, * lt, pat. id) ;
4754
- auto lltype = ty:: node_id_to_type( cx. fcx. lcx. ccx. tcx, pat. id) ;
4755
- auto lleq = trans_compare( cx, ast:: eq, lltype, llval, lllit) ;
4756
- auto matched_cx = new_sub_block_ctxt( lleq. bcx, "matched_cx") ;
4757
- lleq. bcx. build. CondBr ( lleq. val, matched_cx. llbb, next_cx. llbb) ;
4758
- ret rslt( matched_cx, llval) ;
4759
- }
4760
- case ( ast:: pat_tag( ?ident, ?subpats) ) {
4761
- auto vdef;
4762
- alt ( cx. fcx. lcx. ccx. tcx. def_map. find( pat. id) ) {
4763
- case ( some( ?x) ) { vdef = ast:: variant_def_ids( x) ; }
4764
- case ( _) {
4765
- cx. fcx. lcx. ccx. sess. span_fatal( pat. span,
4766
- "trans_pat_match: unbound var") ;
4767
- }
4768
- }
4769
-
4770
- auto variants = ty:: tag_variants( cx. fcx. lcx. ccx. tcx, vdef. _0) ;
4771
- auto matched_cx = new_sub_block_ctxt( cx, "matched_cx") ;
4772
- auto llblobptr = llval;
4773
-
4774
- if ( std:: ivec:: len( variants) == 1 u) {
4775
- cx. build. Br ( matched_cx. llbb) ;
4776
- } else {
4777
- auto lltagptr =
4778
- cx. build. PointerCast ( llval,
4779
- T_opaque_tag_ptr ( cx. fcx. lcx. ccx. tn) ) ;
4780
- auto lldiscrimptr = cx. build. GEP ( lltagptr,
4781
- ~[ C_int ( 0 ) , C_int ( 0 ) ] ) ;
4782
- auto lldiscrim = cx. build. Load ( lldiscrimptr) ;
4783
- auto variant_tag = 0 ;
4784
- auto i = 0 ;
4785
- for ( ty:: variant_info v in variants) {
4786
- auto this_variant_id = v. id;
4787
- if ( vdef. _1. _0 == this_variant_id. _0 &&
4788
- vdef. _1. _1 == this_variant_id. _1) {
4789
- variant_tag = i;
4790
- }
4791
- i += 1 ;
4792
- }
4793
- auto lleq =
4794
- cx. build. ICmp ( lib:: llvm:: LLVMIntEQ , lldiscrim,
4795
- C_int ( variant_tag) ) ;
4796
- cx. build. CondBr ( lleq, matched_cx. llbb, next_cx. llbb) ;
4797
- if ( std:: ivec:: len( subpats) > 0 u) {
4798
- llblobptr =
4799
- matched_cx. build. GEP ( lltagptr, ~[ C_int ( 0 ) , C_int ( 1 ) ] ) ;
4800
- }
4801
- }
4802
-
4803
- auto ty_params = ty:: node_id_to_type_params
4804
- ( cx. fcx. lcx. ccx. tcx, pat. id) ;
4805
- if ( std:: ivec:: len( subpats) > 0 u) {
4806
- auto i = 0 ;
4807
- for ( @ast:: pat subpat in subpats) {
4808
- auto rslt =
4809
- GEP_tag ( matched_cx, llblobptr, vdef. _0, vdef. _1,
4810
- ty_params, i) ;
4811
- auto llsubvalptr = rslt. val;
4812
- matched_cx = rslt. bcx;
4813
- auto llsubval =
4814
- load_if_immediate( matched_cx, llsubvalptr,
4815
- pat_ty( cx. fcx. lcx. ccx. tcx, subpat) ) ;
4816
- auto subpat_res =
4817
- trans_pat_match( matched_cx, subpat, llsubval,
4818
- next_cx) ;
4819
- matched_cx = subpat_res. bcx;
4820
- i += 1 ;
4821
- }
4822
- }
4823
- ret rslt( matched_cx, llval) ;
4824
- }
4825
- case ( ast:: pat_rec( ?field_pats, _) ) {
4826
- auto bcx = cx;
4827
- auto ccx = cx. fcx. lcx. ccx;
4828
- auto rec_ty = pat_ty( ccx. tcx, pat) ;
4829
- auto fields = alt ( ty:: struct ( ccx. tcx, rec_ty) ) {
4830
- ty:: ty_rec( ?fields) { fields }
4831
- } ;
4832
- for ( ast:: field_pat f in field_pats) {
4833
- let uint ix = ty:: field_idx( ccx. sess, f. pat. span,
4834
- f. ident, fields) ;
4835
- auto r = GEP_tup_like ( bcx, rec_ty, llval, ~[ 0 , ix as int] ) ;
4836
- auto v = load_if_immediate( r. bcx, r. val,
4837
- pat_ty( ccx. tcx, f. pat) ) ;
4838
- bcx = trans_pat_match( r. bcx, f. pat, v, next_cx) . bcx;
4839
- }
4840
- ret rslt( bcx, llval) ;
4841
- }
4842
- }
4843
- }
4844
-
4845
- type bind_map = hashmap[ ast:: ident, result] ;
4846
-
4847
- fn trans_pat_binding( & @block_ctxt cx, & @ast:: pat pat, ValueRef llval,
4848
- bool is_mem, & bind_map bound) -> result {
4849
- alt ( pat. node) {
4850
- case ( ast:: pat_wild) { ret rslt( cx, llval) ; }
4851
- case ( ast:: pat_lit( _) ) { ret rslt( cx, llval) ; }
4852
- case ( ast:: pat_bind( ?name) ) {
4853
- auto val = llval;
4854
- if ( !is_mem) {
4855
- val = spill_if_immediate
4856
- ( cx, llval, node_id_type( cx. fcx. lcx. ccx, pat. id) ) ;
4857
- }
4858
- auto r = rslt( cx, val) ;
4859
- bound. insert( name, r) ;
4860
- ret r;
4861
- }
4862
- case ( ast:: pat_tag( _, ?subpats) ) {
4863
- if ( std:: ivec:: len[ @ast:: pat] ( subpats) == 0 u) {
4864
- ret rslt( cx, llval) ;
4865
- }
4866
-
4867
- // Get the appropriate variant for this tag.
4868
- auto vdef;
4869
- alt ( cx. fcx. lcx. ccx. tcx. def_map. find( pat. id) ) {
4870
- case ( some( ?x) ) { vdef = ast:: variant_def_ids( x) ; }
4871
- case ( _) { cx. fcx. lcx. ccx. sess. span_fatal( pat. span,
4872
- "trans_pat_binding: internal error, unbound var") ; }
4873
- }
4874
- auto llblobptr = llval;
4875
- if ( std:: ivec:: len( ty:: tag_variants( cx. fcx. lcx. ccx. tcx, vdef. _0) )
4876
- != 1 u) {
4877
- auto lltagptr = cx. build. PointerCast
4878
- ( llval, T_opaque_tag_ptr ( cx. fcx. lcx. ccx. tn) ) ;
4879
- llblobptr = cx. build. GEP ( lltagptr, ~[ C_int ( 0 ) , C_int ( 1 ) ] ) ;
4880
- }
4881
-
4882
- auto ty_param_substs =
4883
- ty:: node_id_to_type_params( cx. fcx. lcx. ccx. tcx, pat. id) ;
4884
-
4885
- auto this_cx = cx;
4886
- auto i = 0 ;
4887
- for ( @ast:: pat subpat in subpats) {
4888
- auto rslt =
4889
- GEP_tag ( this_cx, llblobptr, vdef. _0, vdef. _1,
4890
- ty_param_substs, i) ;
4891
- this_cx = rslt. bcx;
4892
- auto subpat_res =
4893
- trans_pat_binding( this_cx, subpat, rslt. val, true, bound) ;
4894
- this_cx = subpat_res. bcx;
4895
- i += 1 ;
4896
- }
4897
- ret rslt( this_cx, llval) ;
4898
- }
4899
- case ( ast:: pat_rec( ?field_pats, _) ) {
4900
- auto bcx = cx;
4901
- auto ccx = cx. fcx. lcx. ccx;
4902
- auto rec_ty = pat_ty( ccx. tcx, pat) ;
4903
- auto fields = alt ( ty:: struct ( ccx. tcx, rec_ty) ) {
4904
- ty:: ty_rec( ?fields) { fields }
4905
- } ;
4906
- for ( ast:: field_pat f in field_pats) {
4907
- let uint ix = ty:: field_idx( ccx. sess, f. pat. span,
4908
- f. ident, fields) ;
4909
- auto r = GEP_tup_like ( bcx, rec_ty, llval, ~[ 0 , ix as int] ) ;
4910
- bcx = trans_pat_binding( bcx, f. pat, r. val, true, bound) . bcx;
4911
- }
4912
- ret rslt( bcx, llval) ;
4913
- }
4914
- }
4915
- }
4916
-
4917
- fn trans_alt( & @block_ctxt cx, & @ast:: expr expr, & ast:: arm[ ] arms,
4918
- ast:: node_id id, & out_method output) -> result {
4919
- auto expr_res = trans_expr( cx, expr) ;
4920
- auto this_cx = expr_res. bcx;
4921
- let result[ ] arm_results = ~[ ] ;
4922
- for ( ast:: arm arm in arms) {
4923
- auto bind_maps = ~[ ] ;
4924
- auto block_cx = new_scope_block_ctxt( expr_res. bcx, "case block") ;
4925
- for ( @ast:: pat pat in arm. pats) {
4926
- auto next_cx = new_sub_block_ctxt( expr_res. bcx, "next") ;
4927
- auto match_res =
4928
- trans_pat_match( this_cx, pat, expr_res. val, next_cx) ;
4929
- auto bind_map = new_str_hash[ result] ( ) ;
4930
- auto binding_res = trans_pat_binding
4931
- ( match_res. bcx, pat, expr_res. val, false, bind_map) ;
4932
- bind_maps += ~[ bind_map] ;
4933
- binding_res. bcx. build. Br ( block_cx. llbb) ;
4934
- this_cx = next_cx;
4935
- }
4936
- // Go over the names and node_ids of the bound variables, add a Phi
4937
- // node for each and register the bindings.
4938
- for each ( @tup( ast:: ident, ast:: node_id) item in
4939
- ast:: pat_id_map( arm. pats. ( 0 ) ) . items( ) ) {
4940
- auto vals = ~[ ] ; auto llbbs = ~[ ] ;
4941
- for ( bind_map map in bind_maps) {
4942
- auto rslt = map. get( item. _0) ;
4943
- vals += ~[ rslt. val] ;
4944
- llbbs += ~[ rslt. bcx. llbb] ;
4945
- }
4946
- auto phi = block_cx. build. Phi ( val_ty( vals. ( 0 ) ) , vals, llbbs) ;
4947
- block_cx. fcx. lllocals. insert( item. _1, phi) ;
4948
- }
4949
- auto block_res = trans_block( block_cx, arm. block, output) ;
4950
- arm_results += ~[ block_res] ;
4951
- }
4952
- auto default_cx = this_cx;
4953
- trans_fail( default_cx, some[ span] ( expr. span) ,
4954
- "non-exhaustive match failure") ;
4955
- ret rslt( join_branches( cx, arm_results) , C_nil ( ) ) ;
4956
- }
4957
-
4958
4744
type generic_info =
4959
4745
rec( ty:: t item_type,
4960
4746
( option:: t[ @tydesc_info] ) [ ] static_tis,
@@ -6224,10 +6010,9 @@ fn trans_expr(&@block_ctxt cx, &@ast::expr e) -> result {
6224
6010
fn trans_expr_out( & @block_ctxt cx, & @ast:: expr e, out_method output) ->
6225
6011
result {
6226
6012
// FIXME Fill in cx.sp
6227
-
6228
6013
alt ( e. node) {
6229
6014
case ( ast:: expr_lit( ?lit) ) {
6230
- ret rslt( cx, trans_lit( cx. fcx. lcx. ccx, * lit, e . id ) ) ;
6015
+ ret rslt( cx, trans_lit( cx. fcx. lcx. ccx, * lit) ) ;
6231
6016
}
6232
6017
case ( ast:: expr_unary( ?op, ?x) ) {
6233
6018
if ( op != ast:: deref) { ret trans_unary( cx, op, x, e. id) ; }
@@ -6259,7 +6044,8 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) ->
6259
6044
ret trans_do_while( cx, body, cond) ;
6260
6045
}
6261
6046
case ( ast:: expr_alt( ?expr, ?arms) ) {
6262
- ret with_out_method( bind trans_alt( cx, expr, arms, e. id, _) ,
6047
+ ret with_out_method( bind trans_alt:: trans_alt( cx, expr,
6048
+ arms, e. id, _) ,
6263
6049
cx, e. id, output) ;
6264
6050
}
6265
6051
case ( ast:: expr_fn( ?f) ) {
@@ -8692,7 +8478,7 @@ fn trans_tag_variant(@local_ctxt cx, ast::node_id tag_id,
8692
8478
// that does so later on?
8693
8479
fn trans_const_expr( & @crate_ctxt cx, @ast:: expr e) -> ValueRef {
8694
8480
alt ( e. node) {
8695
- case ( ast:: expr_lit( ?lit) ) { ret trans_lit( cx, * lit, e . id ) ; }
8481
+ case ( ast:: expr_lit( ?lit) ) { ret trans_lit( cx, * lit) ; }
8696
8482
case ( _) {
8697
8483
cx. sess. span_unimpl( e. span, "consts that' s not a plain literal") ;
8698
8484
}
0 commit comments