about summary refs log tree commit diff
path: root/src/librustc/front/intrinsic.rs
blob: 9a9229ebaef1240a98a4bf08a919fba56b37779c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// NB: this file is include_str!'ed into the compiler, re-parsed
// and injected into each crate the compiler builds. Keep it small.

mod intrinsic {
    #[legacy_exports];

    pub use rusti::visit_tydesc;

    // FIXME (#3727): remove this when the interface has settled and the
    // version in sys is no longer present.
    pub fn get_tydesc<T>() -> *TyDesc {
        rusti::get_tydesc::<T>() as *TyDesc
    }

    pub enum TyDesc = {
        size: uint,
        align: uint
        // Remaining fields not listed
    };

    trait TyVisitor {
        fn visit_bot() -> bool;
        fn visit_nil() -> bool;
        fn visit_bool() -> bool;

        fn visit_int() -> bool;
        fn visit_i8() -> bool;
        fn visit_i16() -> bool;
        fn visit_i32() -> bool;
        fn visit_i64() -> bool;

        fn visit_uint() -> bool;
        fn visit_u8() -> bool;
        fn visit_u16() -> bool;
        fn visit_u32() -> bool;
        fn visit_u64() -> bool;

        fn visit_float() -> bool;
        fn visit_f32() -> bool;
        fn visit_f64() -> bool;

        fn visit_char() -> bool;
        fn visit_str() -> bool;

        fn visit_estr_box() -> bool;
        fn visit_estr_uniq() -> bool;
        fn visit_estr_slice() -> bool;
        fn visit_estr_fixed(n: uint, sz: uint, align: uint) -> bool;

        fn visit_box(mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_uniq(mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_ptr(mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_rptr(mtbl: uint, inner: *TyDesc) -> bool;

        fn visit_vec(mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_unboxed_vec(mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_evec_box(mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_evec_uniq(mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_evec_slice(mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_evec_fixed(n: uint, sz: uint, align: uint,
                            mtbl: uint, inner: *TyDesc) -> bool;

        fn visit_enter_rec(n_fields: uint,
                           sz: uint, align: uint) -> bool;
        fn visit_rec_field(i: uint, name: &str,
                           mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_leave_rec(n_fields: uint,
                           sz: uint, align: uint) -> bool;

        fn visit_enter_class(n_fields: uint,
                             sz: uint, align: uint) -> bool;
        fn visit_class_field(i: uint, name: &str,
                             mtbl: uint, inner: *TyDesc) -> bool;
        fn visit_leave_class(n_fields: uint,
                             sz: uint, align: uint) -> bool;

        fn visit_enter_tup(n_fields: uint,
                           sz: uint, align: uint) -> bool;
        fn visit_tup_field(i: uint, inner: *TyDesc) -> bool;
        fn visit_leave_tup(n_fields: uint,
                           sz: uint, align: uint) -> bool;

        fn visit_enter_enum(n_variants: uint,
                            sz: uint, align: uint) -> bool;
        fn visit_enter_enum_variant(variant: uint,
                                    disr_val: int,
                                    n_fields: uint,
                                    name: &str) -> bool;
        fn visit_enum_variant_field(i: uint, inner: *TyDesc) -> bool;
        fn visit_leave_enum_variant(variant: uint,
                                    disr_val: int,
                                    n_fields: uint,
                                    name: &str) -> bool;
        fn visit_leave_enum(n_variants: uint,
                            sz: uint, align: uint) -> bool;

        fn visit_enter_fn(purity: uint, proto: uint,
                          n_inputs: uint, retstyle: uint) -> bool;
        fn visit_fn_input(i: uint, mode: uint, inner: *TyDesc) -> bool;
        fn visit_fn_output(retstyle: uint, inner: *TyDesc) -> bool;
        fn visit_leave_fn(purity: uint, proto: uint,
                          n_inputs: uint, retstyle: uint) -> bool;

        fn visit_trait() -> bool;
        fn visit_var() -> bool;
        fn visit_var_integral() -> bool;
        fn visit_param(i: uint) -> bool;
        fn visit_self() -> bool;
        fn visit_type() -> bool;
        fn visit_opaque_box() -> bool;
        fn visit_constr(inner: *TyDesc) -> bool;
        fn visit_closure_ptr(ck: uint) -> bool;
    }

    #[abi = "rust-intrinsic"]
    extern mod rusti {
        #[legacy_exports];
        fn get_tydesc<T>() -> *();
        fn visit_tydesc(++td: *TyDesc, &&tv: TyVisitor);
    }
}