forked from servo/cocoa-rs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
base.rs
107 lines (95 loc) · 3.26 KB
/
base.rs
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
// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
pub type id = libc::intptr_t;
pub type Class = libc::intptr_t;
pub type IMP = *u8;
pub type SEL = libc::intptr_t;
pub type Ivar = libc::intptr_t;
pub static nil : id = 0 as id;
pub extern mod objc {
fn class_addMethod(cls : Class,
name : SEL,
imp : IMP,
types : *libc::c_char) -> bool;
fn class_addIvar(cls : Class,
name : *libc::c_char,
size : libc::size_t,
alignment: u8,
types: *libc::c_char) -> bool;
fn object_setInstanceVariable(obj : id,
name : *libc::c_char,
value : *libc::c_void);
fn object_getInstanceVariable(obj : id,
name : *libc::c_char,
outValue : **libc::c_void);
fn objc_allocateClassPair(superclass : Class,
name : *libc::c_char,
extraBytes : libc::size_t) -> Class;
fn objc_getClass(name : *libc::c_char) -> id;
fn objc_msgSend(theReceiver : id, theSelector : SEL) -> id;
fn objc_registerClassPair(cls : Class);
fn sel_registerName(name : *libc::c_char) -> SEL;
}
#[test]
pub fn test_nsapp() {
let klass = str::as_c_str(~"NSApplication", |s|
unsafe {
objc::objc_getClass(s)
}
);
let sel = str::as_c_str(~"sharedApplication", |s|
unsafe {
objc::sel_registerName(s)
}
);
unsafe {
let nsapp = objc::objc_msgSend(klass, sel);
io::println(fmt!("nsapp: %d", (nsapp as int)));
}
}
#[test]
pub fn test_custom_obj() {
extern fn MyObject_doSomething(this : id, _sel : SEL) -> id {
io::println(~"doSomething");
return this;
}
let NSObject = str::as_c_str(~"NSObject", |s|
unsafe {
objc::objc_getClass(s)
}
);
let MyObject = str::as_c_str(~"MyObject", |s|
unsafe {
objc::objc_allocateClassPair(NSObject, s, 0 as libc::size_t)
}
);
let doSomething = str::as_c_str(~"doSomething", |s|
unsafe {
objc::sel_registerName(s)
}
);
let _ = str::as_c_str(~"@@:", |types|
unsafe {
objc::class_addMethod(MyObject,
doSomething,
MyObject_doSomething,
types)
}
);
unsafe {
objc::objc_registerClassPair(MyObject);
}
let alloc = str::as_c_str(~"alloc", |s| unsafe { objc::sel_registerName(s) });
let init = str::as_c_str(~"init", |s| unsafe { objc::sel_registerName(s) });
unsafe {
let mut obj = objc::objc_msgSend(MyObject, alloc);
obj = objc::objc_msgSend(obj, init);
objc::objc_msgSend(obj, doSomething);
}
}