]> git.proxmox.com Git - rustc.git/blame - src/librustc/front/intrinsic.rs
Imported Upstream version 0.6
[rustc.git] / src / librustc / front / intrinsic.rs
CommitLineData
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
14pub 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}