Skip to content

Commit 8c20a2b

Browse files
committed
---
yaml --- r: 10670 b: refs/heads/snap-stage3 c: 588c1eb h: refs/heads/master v: v3
1 parent b99b4bd commit 8c20a2b

File tree

26 files changed

+247
-140
lines changed

26 files changed

+247
-140
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
refs/heads/master: 2898dcc5d97da9427ac367542382b6239d9c0bbf
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 275c1e44383bbacd8d81a9f80df9ad4da99f0168
4+
refs/heads/snap-stage3: 588c1eb41ff88efe3cc971f341d6f866f66dd62c
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/snap-stage3/src/libcore/arc.rs

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,19 @@ type arc_data<T> = {
2424
data: T
2525
};
2626

27-
resource arc_destruct<T>(data: *libc::c_void) {
28-
unsafe {
29-
let data: ~arc_data<T> = unsafe::reinterpret_cast(data);
30-
let new_count = rustrt::rust_atomic_decrement(&mut data.count);
31-
assert new_count >= 0;
32-
if new_count == 0 {
33-
// drop glue takes over.
34-
} else {
35-
unsafe::forget(data);
36-
}
37-
}
27+
class arc_destruct<T> {
28+
let data: *libc::c_void;
29+
new(data: *libc::c_void) { self.data = data; }
30+
drop unsafe {
31+
let data: ~arc_data<T> = unsafe::reinterpret_cast(self.data);
32+
let new_count = rustrt::rust_atomic_decrement(&mut data.count);
33+
assert new_count >= 0;
34+
if new_count == 0 {
35+
// drop glue takes over.
36+
} else {
37+
unsafe::forget(data);
38+
}
39+
}
3840
}
3941

4042
type arc<T: const> = arc_destruct<T>;
@@ -52,7 +54,7 @@ fn arc<T: const>(-data: T) -> arc<T> {
5254
wrapper."]
5355
fn get<T: const>(rc: &a.arc<T>) -> &a.T {
5456
unsafe {
55-
let ptr: ~arc_data<T> = unsafe::reinterpret_cast(**rc);
57+
let ptr: ~arc_data<T> = unsafe::reinterpret_cast((*rc).data);
5658
// Cast us back into the correct region
5759
let r = unsafe::reinterpret_cast(&ptr.data);
5860
unsafe::forget(ptr);
@@ -67,12 +69,12 @@ object. However, one of the `arc` objects can be sent to another task,
6769
allowing them to share the underlying data."]
6870
fn clone<T: const>(rc: &arc<T>) -> arc<T> {
6971
unsafe {
70-
let ptr: ~arc_data<T> = unsafe::reinterpret_cast(**rc);
72+
let ptr: ~arc_data<T> = unsafe::reinterpret_cast((*rc).data);
7173
let new_count = rustrt::rust_atomic_increment(&mut ptr.count);
7274
assert new_count >= 2;
7375
unsafe::forget(ptr);
7476
}
75-
arc_destruct(**rc)
77+
arc_destruct((*rc).data)
7678
}
7779

7880
// An arc over mutable data that is protected by a lock.
@@ -93,17 +95,19 @@ impl methods<T: send> for exclusive<T> {
9395
fn clone() -> exclusive<T> {
9496
unsafe {
9597
// this makes me nervous...
96-
let ptr: ~arc_data<ex_data<T>> = unsafe::reinterpret_cast(*self);
98+
let ptr: ~arc_data<ex_data<T>> =
99+
unsafe::reinterpret_cast(self.data);
97100
let new_count = rustrt::rust_atomic_increment(&mut ptr.count);
98101
assert new_count > 1;
99102
unsafe::forget(ptr);
100103
}
101-
arc_destruct(*self)
104+
arc_destruct(self.data)
102105
}
103106

104107
fn with<U>(f: fn(sys::condition, x: &T) -> U) -> U {
105108
unsafe {
106-
let ptr: ~arc_data<ex_data<T>> = unsafe::reinterpret_cast(*self);
109+
let ptr: ~arc_data<ex_data<T>> =
110+
unsafe::reinterpret_cast(self.data);
107111
let r = {
108112
let rec: &ex_data<T> = &(*ptr).data;
109113
rec.lock.lock_cond() {|c|
@@ -123,8 +127,10 @@ type get_chan<T: const send> = chan<chan<arc<T>>>;
123127
// (terminate, get)
124128
type shared_arc<T: const send> = (shared_arc_res, get_chan<T>);
125129

126-
resource shared_arc_res(c: comm::chan<()>) {
127-
c.send(());
130+
class shared_arc_res {
131+
let c: comm::chan<()>;
132+
new(c: comm::chan<()>) { self.c = c; }
133+
drop { self.c.send(()); }
128134
}
129135

130136
fn shared_arc<T: send const>(-data: T) -> shared_arc<T> {

branches/snap-stage3/src/libcore/io.rs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,11 @@ impl <T: reader, C> of reader for {base: T, cleanup: C} {
224224
fn tell() -> uint { self.base.tell() }
225225
}
226226

227-
resource FILE_res(f: *libc::FILE) { libc::fclose(f); }
227+
class FILE_res {
228+
let f: *libc::FILE;
229+
new(f: *libc::FILE) { self.f = f; }
230+
drop { libc::fclose(self.f); }
231+
}
228232

229233
fn FILE_reader(f: *libc::FILE, cleanup: bool) -> reader {
230234
if cleanup {
@@ -383,7 +387,11 @@ impl of writer for fd_t {
383387
fn flush() -> int { 0 }
384388
}
385389

386-
resource fd_res(fd: fd_t) { libc::close(fd); }
390+
class fd_res {
391+
let fd: fd_t;
392+
new(fd: fd_t) { self.fd = fd; }
393+
drop { libc::close(self.fd); }
394+
}
387395

388396
fn fd_writer(fd: fd_t, cleanup: bool) -> writer {
389397
if cleanup {
@@ -695,13 +703,17 @@ mod fsync {
695703
}
696704

697705

698-
// Resource of artifacts that need to fsync on destruction
699-
resource res<t>(arg: arg<t>) {
700-
alt arg.opt_level {
701-
option::none { }
702-
option::some(level) {
703-
// fail hard if not succesful
704-
assert(arg.fsync_fn(arg.val, level) != -1);
706+
// Artifacts that need to fsync on destruction
707+
class res<t> {
708+
let arg: arg<t>;
709+
new(-arg: arg<t>) { self.arg <- arg; }
710+
drop {
711+
alt self.arg.opt_level {
712+
option::none { }
713+
option::some(level) {
714+
// fail hard if not succesful
715+
assert(self.arg.fsync_fn(self.arg.val, level) != -1);
716+
}
705717
}
706718
}
707719
}
@@ -718,7 +730,7 @@ mod fsync {
718730
fn FILE_res_sync(&&file: FILE_res, opt_level: option<level>,
719731
blk: fn(&&res<*libc::FILE>)) {
720732
blk(res({
721-
val: *file, opt_level: opt_level,
733+
val: file.f, opt_level: opt_level,
722734
fsync_fn: fn@(&&file: *libc::FILE, l: level) -> int {
723735
ret os::fsync_fd(libc::fileno(file), l) as int;
724736
}
@@ -729,7 +741,7 @@ mod fsync {
729741
fn fd_res_sync(&&fd: fd_res, opt_level: option<level>,
730742
blk: fn(&&res<fd_t>)) {
731743
blk(res({
732-
val: *fd, opt_level: opt_level,
744+
val: fd.fd, opt_level: opt_level,
733745
fsync_fn: fn@(&&fd: fd_t, l: level) -> int {
734746
ret os::fsync_fd(fd, l) as int;
735747
}

branches/snap-stage3/src/libcore/option.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,10 @@ fn test_unwrap_str() {
140140

141141
#[test]
142142
fn test_unwrap_resource() {
143-
resource r(i: @mut int) {
144-
*i += 1;
143+
class r {
144+
let i: @mut int;
145+
new(i: @mut int) { self.i = i; }
146+
drop { *(self.i) += 1; }
145147
}
146148
let i = @mut 0;
147149
{

branches/snap-stage3/src/libcore/priv.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,12 @@ unsafe fn weaken_task(f: fn(comm::port<()>)) unsafe {
181181
let _unweaken = unweaken(ch);
182182
f(po);
183183

184-
resource unweaken(ch: comm::chan<()>) unsafe {
185-
rustrt::rust_task_unweaken(unsafe::reinterpret_cast(ch));
184+
class unweaken {
185+
let ch: comm::chan<()>;
186+
new(ch: comm::chan<()>) { self.ch = ch; }
187+
drop unsafe {
188+
rustrt::rust_task_unweaken(unsafe::reinterpret_cast(self.ch));
189+
}
186190
}
187191
}
188192

branches/snap-stage3/src/libcore/rand.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,14 @@ impl extensions for rng {
230230

231231
}
232232

233-
resource rand_res(c: *rctx) { rustrt::rand_free(c); }
233+
class rand_res {
234+
let c: *rctx;
235+
new(c: *rctx) { self.c = c; }
236+
drop { rustrt::rand_free(self.c); }
237+
}
234238

235239
impl of rng for @rand_res {
236-
fn next() -> u32 { ret rustrt::rand_next(**self); }
240+
fn next() -> u32 { ret rustrt::rand_next((*self).c); }
237241
}
238242

239243
#[doc = "Create a new random seed for seeded_rng"]

branches/snap-stage3/src/libcore/run.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,9 @@ fn run_program(prog: str, args: [str]) -> int {
170170
#[doc ="
171171
Spawns a process and returns a program
172172
173-
The returned value is a boxed resource containing a <program> object that can
174-
be used for sending and recieving data over the standard file descriptors.
175-
The resource will ensure that file descriptors are closed properly.
173+
The returned value is a boxed class containing a <program> object that can
174+
be used for sending and receiving data over the standard file descriptors.
175+
The class will ensure that file descriptors are closed properly.
176176
177177
# Arguments
178178
@@ -181,7 +181,7 @@ The resource will ensure that file descriptors are closed properly.
181181
182182
# Return value
183183
184-
A boxed resource of <program>
184+
A class with a <program> field
185185
"]
186186
fn start_program(prog: str, args: [str]) -> program {
187187
let pipe_input = os::pipe();
@@ -221,16 +221,20 @@ fn start_program(prog: str, args: [str]) -> program {
221221
libc::fclose(r.out_file);
222222
libc::fclose(r.err_file);
223223
}
224-
resource prog_res(r: prog_repr) { destroy_repr(r); }
224+
class prog_res {
225+
let r: prog_repr;
226+
new(-r: prog_repr) { self.r = r; }
227+
drop { destroy_repr(self.r); }
228+
}
225229

226230
impl of program for prog_res {
227-
fn get_id() -> pid_t { ret self.pid; }
228-
fn input() -> io::writer { io::fd_writer(self.in_fd, false) }
229-
fn output() -> io::reader { io::FILE_reader(self.out_file, false) }
230-
fn err() -> io::reader { io::FILE_reader(self.err_file, false) }
231-
fn close_input() { close_repr_input(*self); }
232-
fn finish() -> int { finish_repr(*self) }
233-
fn destroy() { destroy_repr(*self); }
231+
fn get_id() -> pid_t { ret self.r.pid; }
232+
fn input() -> io::writer { io::fd_writer(self.r.in_fd, false) }
233+
fn output() -> io::reader { io::FILE_reader(self.r.out_file, false) }
234+
fn err() -> io::reader { io::FILE_reader(self.r.err_file, false) }
235+
fn close_input() { close_repr_input(self.r); }
236+
fn finish() -> int { finish_repr(self.r) }
237+
fn destroy() { destroy_repr(self.r); }
234238
}
235239
let repr = {pid: pid,
236240
mut in_fd: pipe_input.out,

branches/snap-stage3/src/libcore/sys.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,20 @@ pure fn log_str<T>(t: T) -> str {
8585
}
8686
}
8787

88-
resource lock_and_signal(lock: rust_cond_lock) {
89-
rustrt::rust_destroy_cond_lock(lock);
88+
class lock_and_signal {
89+
let lock: rust_cond_lock;
90+
new(lock: rust_cond_lock) { self.lock = lock; }
91+
drop { rustrt::rust_destroy_cond_lock(self.lock); }
9092
}
9193

9294
enum condition {
9395
condition_(rust_cond_lock)
9496
}
9597

96-
resource unlock(lock: rust_cond_lock) {
97-
rustrt::rust_unlock_cond_lock(lock);
98+
class unlock {
99+
let lock: rust_cond_lock;
100+
new(lock: rust_cond_lock) { self.lock = lock; }
101+
drop { rustrt::rust_unlock_cond_lock(self.lock); }
98102
}
99103

100104
fn create_lock() -> lock_and_signal {
@@ -103,15 +107,15 @@ fn create_lock() -> lock_and_signal {
103107

104108
impl methods for lock_and_signal {
105109
fn lock<T>(f: fn() -> T) -> T {
106-
rustrt::rust_lock_cond_lock(*self);
107-
let _r = unlock(*self);
110+
rustrt::rust_lock_cond_lock(self.lock);
111+
let _r = unlock(self.lock);
108112
f()
109113
}
110114

111115
fn lock_cond<T>(f: fn(condition) -> T) -> T {
112-
rustrt::rust_lock_cond_lock(*self);
113-
let _r = unlock(*self);
114-
f(condition_(*self))
116+
rustrt::rust_lock_cond_lock(self.lock);
117+
let _r = unlock(self.lock);
118+
f(condition_(self.lock))
115119
}
116120
}
117121

branches/snap-stage3/src/libcore/task.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,9 +482,12 @@ Temporarily make the task unkillable
482482
483483
"]
484484
unsafe fn unkillable(f: fn()) {
485-
resource allow_failure(_i: ()) {
486-
rustrt::rust_task_allow_kill();
485+
class allow_failure {
486+
let i: (); // since a class must have at least one field
487+
new(_i: ()) { self.i = (); }
488+
drop { rustrt::rust_task_allow_kill(); }
487489
}
490+
488491
let _allow_failure = allow_failure(());
489492
rustrt::rust_task_inhibit_kill();
490493
f();

branches/snap-stage3/src/libstd/c_vec.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,15 @@ enum c_vec<T> {
4141
c_vec_({ base: *mut T, len: uint, rsrc: @dtor_res})
4242
}
4343

44-
resource dtor_res(dtor: option<fn@()>) {
45-
alt dtor {
44+
class dtor_res {
45+
let dtor: option<fn@()>;
46+
new(dtor: option<fn@()>) { self.dtor = dtor; }
47+
drop {
48+
alt self.dtor {
4649
option::none { }
4750
option::some(f) { f(); }
4851
}
52+
}
4953
}
5054

5155
/*

0 commit comments

Comments
 (0)