1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 #[feature(managed_boxes)];
13 use std::intrinsics::{TyDesc, get_tydesc, visit_tydesc, TyVisitor, Disr, Opaque};
19 impl TyVisitor for MyVisitor {
20 fn visit_bot(&mut self) -> bool {
21 self.types.push(~"bot");
22 println!("visited bot type");
25 fn visit_nil(&mut self) -> bool {
26 self.types.push(~"nil");
27 println!("visited nil type");
30 fn visit_bool(&mut self) -> bool {
31 self.types.push(~"bool");
32 println!("visited bool type");
35 fn visit_int(&mut self) -> bool {
36 self.types.push(~"int");
37 println!("visited int type");
40 fn visit_i8(&mut self) -> bool {
41 self.types.push(~"i8");
42 println!("visited i8 type");
45 fn visit_i16(&mut self) -> bool {
46 self.types.push(~"i16");
47 println!("visited i16 type");
50 fn visit_i32(&mut self) -> bool { true }
51 fn visit_i64(&mut self) -> bool { true }
53 fn visit_uint(&mut self) -> bool { true }
54 fn visit_u8(&mut self) -> bool { true }
55 fn visit_u16(&mut self) -> bool { true }
56 fn visit_u32(&mut self) -> bool { true }
57 fn visit_u64(&mut self) -> bool { true }
59 fn visit_f32(&mut self) -> bool { true }
60 fn visit_f64(&mut self) -> bool { true }
62 fn visit_char(&mut self) -> bool { true }
64 fn visit_estr_box(&mut self) -> bool { true }
65 fn visit_estr_uniq(&mut self) -> bool { true }
66 fn visit_estr_slice(&mut self) -> bool { true }
67 fn visit_estr_fixed(&mut self,
68 _sz: uint, _sz2: uint,
69 _align: uint) -> bool { true }
71 fn visit_box(&mut self, _mtbl: uint, _inner: *TyDesc) -> bool { true }
72 fn visit_uniq(&mut self, _mtbl: uint, _inner: *TyDesc) -> bool { true }
73 fn visit_ptr(&mut self, _mtbl: uint, _inner: *TyDesc) -> bool { true }
74 fn visit_rptr(&mut self, _mtbl: uint, _inner: *TyDesc) -> bool { true }
76 fn visit_vec(&mut self, _mtbl: uint, _inner: *TyDesc) -> bool { true }
77 fn visit_unboxed_vec(&mut self, _mtbl: uint, _inner: *TyDesc) -> bool { true }
78 fn visit_evec_box(&mut self, _mtbl: uint, _inner: *TyDesc) -> bool { true }
79 fn visit_evec_uniq(&mut self, _mtbl: uint, inner: *TyDesc) -> bool {
80 self.types.push(~"[");
81 unsafe { visit_tydesc(inner, &mut *self as &mut TyVisitor); }
82 self.types.push(~"]");
85 fn visit_evec_slice(&mut self, _mtbl: uint, _inner: *TyDesc) -> bool { true }
86 fn visit_evec_fixed(&mut self, _n: uint, _sz: uint, _align: uint,
87 _mtbl: uint, _inner: *TyDesc) -> bool { true }
89 fn visit_enter_rec(&mut self, _n_fields: uint,
90 _sz: uint, _align: uint) -> bool { true }
91 fn visit_rec_field(&mut self, _i: uint, _name: &str,
92 _mtbl: uint, _inner: *TyDesc) -> bool { true }
93 fn visit_leave_rec(&mut self, _n_fields: uint,
94 _sz: uint, _align: uint) -> bool { true }
96 fn visit_enter_class(&mut self, _name: &str, _named_fields: bool, _n_fields: uint,
97 _sz: uint, _align: uint) -> bool { true }
98 fn visit_class_field(&mut self, _i: uint, _name: &str, _named: bool,
99 _mtbl: uint, _inner: *TyDesc) -> bool { true }
100 fn visit_leave_class(&mut self, _name: &str, _named_fields: bool, _n_fields: uint,
101 _sz: uint, _align: uint) -> bool { true }
103 fn visit_enter_tup(&mut self, _n_fields: uint,
104 _sz: uint, _align: uint) -> bool { true }
105 fn visit_tup_field(&mut self, _i: uint, _inner: *TyDesc) -> bool { true }
106 fn visit_leave_tup(&mut self, _n_fields: uint,
107 _sz: uint, _align: uint) -> bool { true }
109 fn visit_enter_enum(&mut self, _n_variants: uint,
110 _get_disr: extern unsafe fn(ptr: *Opaque) -> Disr,
111 _sz: uint, _align: uint) -> bool { true }
112 fn visit_enter_enum_variant(&mut self,
116 _name: &str) -> bool { true }
117 fn visit_enum_variant_field(&mut self, _i: uint, _offset: uint, _inner: *TyDesc)
119 fn visit_leave_enum_variant(&mut self,
123 _name: &str) -> bool { true }
124 fn visit_leave_enum(&mut self,
126 _get_disr: extern unsafe fn(ptr: *Opaque) -> Disr,
127 _sz: uint, _align: uint) -> bool { true }
129 fn visit_enter_fn(&mut self, _purity: uint, _proto: uint,
130 _n_inputs: uint, _retstyle: uint) -> bool { true }
131 fn visit_fn_input(&mut self, _i: uint, _mode: uint, _inner: *TyDesc) -> bool { true }
132 fn visit_fn_output(&mut self, _retstyle: uint, _variadic: bool, _inner: *TyDesc)
134 fn visit_leave_fn(&mut self, _purity: uint, _proto: uint,
135 _n_inputs: uint, _retstyle: uint) -> bool { true }
138 fn visit_trait(&mut self, _name: &str) -> bool { true }
139 fn visit_param(&mut self, _i: uint) -> bool { true }
140 fn visit_self(&mut self) -> bool { true }
143 fn visit_ty<T>(v: &mut MyVisitor) {
144 unsafe { visit_tydesc(get_tydesc::<T>(), v as &mut TyVisitor) }
148 let mut v = MyVisitor {types: Vec::new()};
150 visit_ty::<bool>(&mut v);
151 visit_ty::<int>(&mut v);
152 visit_ty::<i8>(&mut v);
153 visit_ty::<i16>(&mut v);
154 visit_ty::<Vec<int> >(&mut v);
156 for s in v.types.iter() {
157 println!("type: {}", (*s).clone());
159 assert_eq!(v.types.clone(), vec!(~"bool", ~"int", ~"i8", ~"i16", ~"[", ~"int", ~"]"));