]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
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. | |
4 | // | |
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. | |
10 | ||
11 | // NB: this file is include_str!'ed into the compiler, re-parsed | |
12 | // and injected into each crate the compiler builds. Keep it small. | |
13 | ||
14 | pub mod intrinsic { | |
15 | pub use intrinsic::rusti::visit_tydesc; | |
16 | ||
17 | // FIXME (#3727): remove this when the interface has settled and the | |
18 | // version in sys is no longer present. | |
19 | pub fn get_tydesc<T>() -> *TyDesc { | |
20 | unsafe { | |
21 | rusti::get_tydesc::<T>() as *TyDesc | |
22 | } | |
23 | } | |
24 | ||
25 | pub struct TyDesc { | |
26 | size: uint, | |
27 | align: uint | |
28 | // Remaining fields not listed | |
29 | } | |
30 | ||
31 | pub trait TyVisitor { | |
32 | fn visit_bot(&self) -> bool; | |
33 | fn visit_nil(&self) -> bool; | |
34 | fn visit_bool(&self) -> bool; | |
35 | ||
36 | fn visit_int(&self) -> bool; | |
37 | fn visit_i8(&self) -> bool; | |
38 | fn visit_i16(&self) -> bool; | |
39 | fn visit_i32(&self) -> bool; | |
40 | fn visit_i64(&self) -> bool; | |
41 | ||
42 | fn visit_uint(&self) -> bool; | |
43 | fn visit_u8(&self) -> bool; | |
44 | fn visit_u16(&self) -> bool; | |
45 | fn visit_u32(&self) -> bool; | |
46 | fn visit_u64(&self) -> bool; | |
47 | ||
48 | fn visit_float(&self) -> bool; | |
49 | fn visit_f32(&self) -> bool; | |
50 | fn visit_f64(&self) -> bool; | |
51 | ||
52 | fn visit_char(&self) -> bool; | |
53 | fn visit_str(&self) -> bool; | |
54 | ||
55 | fn visit_estr_box(&self) -> bool; | |
56 | fn visit_estr_uniq(&self) -> bool; | |
57 | fn visit_estr_slice(&self) -> bool; | |
58 | fn visit_estr_fixed(&self, n: uint, sz: uint, align: uint) -> bool; | |
59 | ||
60 | fn visit_box(&self, mtbl: uint, inner: *TyDesc) -> bool; | |
61 | fn visit_uniq(&self, mtbl: uint, inner: *TyDesc) -> bool; | |
62 | fn visit_ptr(&self, mtbl: uint, inner: *TyDesc) -> bool; | |
63 | fn visit_rptr(&self, mtbl: uint, inner: *TyDesc) -> bool; | |
64 | ||
65 | fn visit_vec(&self, mtbl: uint, inner: *TyDesc) -> bool; | |
66 | fn visit_unboxed_vec(&self, mtbl: uint, inner: *TyDesc) -> bool; | |
67 | fn visit_evec_box(&self, mtbl: uint, inner: *TyDesc) -> bool; | |
68 | fn visit_evec_uniq(&self, mtbl: uint, inner: *TyDesc) -> bool; | |
69 | fn visit_evec_slice(&self, mtbl: uint, inner: *TyDesc) -> bool; | |
70 | fn visit_evec_fixed(&self, n: uint, sz: uint, align: uint, | |
71 | mtbl: uint, inner: *TyDesc) -> bool; | |
72 | ||
73 | fn visit_enter_rec(&self, n_fields: uint, | |
74 | sz: uint, align: uint) -> bool; | |
75 | fn visit_rec_field(&self, i: uint, name: &str, | |
76 | mtbl: uint, inner: *TyDesc) -> bool; | |
77 | fn visit_leave_rec(&self, n_fields: uint, | |
78 | sz: uint, align: uint) -> bool; | |
79 | ||
80 | fn visit_enter_class(&self, n_fields: uint, | |
81 | sz: uint, align: uint) -> bool; | |
82 | fn visit_class_field(&self, i: uint, name: &str, | |
83 | mtbl: uint, inner: *TyDesc) -> bool; | |
84 | fn visit_leave_class(&self, n_fields: uint, | |
85 | sz: uint, align: uint) -> bool; | |
86 | ||
87 | fn visit_enter_tup(&self, n_fields: uint, | |
88 | sz: uint, align: uint) -> bool; | |
89 | fn visit_tup_field(&self, i: uint, inner: *TyDesc) -> bool; | |
90 | fn visit_leave_tup(&self, n_fields: uint, | |
91 | sz: uint, align: uint) -> bool; | |
92 | ||
93 | fn visit_enter_enum(&self, n_variants: uint, | |
94 | sz: uint, align: uint) -> bool; | |
95 | fn visit_enter_enum_variant(&self, variant: uint, | |
96 | disr_val: int, | |
97 | n_fields: uint, | |
98 | name: &str) -> bool; | |
99 | fn visit_enum_variant_field(&self, i: uint, inner: *TyDesc) -> bool; | |
100 | fn visit_leave_enum_variant(&self, variant: uint, | |
101 | disr_val: int, | |
102 | n_fields: uint, | |
103 | name: &str) -> bool; | |
104 | fn visit_leave_enum(&self, n_variants: uint, | |
105 | sz: uint, align: uint) -> bool; | |
106 | ||
107 | fn visit_enter_fn(&self, purity: uint, proto: uint, | |
108 | n_inputs: uint, retstyle: uint) -> bool; | |
109 | fn visit_fn_input(&self, i: uint, mode: uint, inner: *TyDesc) -> bool; | |
110 | fn visit_fn_output(&self, retstyle: uint, inner: *TyDesc) -> bool; | |
111 | fn visit_leave_fn(&self, purity: uint, proto: uint, | |
112 | n_inputs: uint, retstyle: uint) -> bool; | |
113 | ||
114 | fn visit_trait(&self) -> bool; | |
115 | fn visit_var(&self) -> bool; | |
116 | fn visit_var_integral(&self) -> bool; | |
117 | fn visit_param(&self, i: uint) -> bool; | |
118 | fn visit_self(&self) -> bool; | |
119 | fn visit_type(&self) -> bool; | |
120 | fn visit_opaque_box(&self) -> bool; | |
121 | fn visit_constr(&self, inner: *TyDesc) -> bool; | |
122 | fn visit_closure_ptr(&self, ck: uint) -> bool; | |
123 | } | |
124 | ||
125 | pub mod rusti { | |
126 | use super::{TyDesc, TyVisitor}; | |
127 | ||
128 | #[abi = "rust-intrinsic"] | |
129 | pub extern "rust-intrinsic" { | |
130 | pub fn get_tydesc<T>() -> *(); | |
131 | pub fn visit_tydesc(++td: *TyDesc, &&tv: @TyVisitor); | |
132 | } | |
133 | } | |
134 | } |