Skip to content

Commit 8567611

Browse files
committed
Merge commit 'd89ff7eef969aee6b493bc846b64d68358fafbcd' into remove-str-trailing-nulls
2 parents fb9b279 + d89ff7e commit 8567611

29 files changed

+428
-786
lines changed

mk/platform.mk

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ CFG_RUN_TARG_i686-apple-darwin=$(call CFG_RUN_i686-apple-darwin,,$(2))
241241
# arm-linux-androideabi configuration
242242
CC_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc
243243
CXX_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-g++
244-
CPP_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc
244+
CPP_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc -E
245245
AR_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-ar
246246
CFG_LIB_NAME_arm-linux-androideabi=lib$(1).so
247247
CFG_LIB_GLOB_arm-linux-androideabi=lib$(1)-*.so
@@ -272,7 +272,7 @@ AR_arm-unknown-linux-gnueabihf=arm-linux-gnueabihf-ar
272272
CFG_LIB_NAME_arm-unknown-linux-gnueabihf=lib$(1).so
273273
CFG_LIB_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.so
274274
CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.dylib.dSYM
275-
CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabihf := -Wall -g -fPIC
275+
CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabihf := -Wall -g -fPIC -D__arm__
276276
CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabihf := -fno-rtti
277277
CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabihf := -shared -fPIC -g
278278
CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabihf := -Wl,--export-dynamic,--dynamic-list=
@@ -290,6 +290,32 @@ CFG_RUN_arm-unknown-linux-gnueabihf=
290290
CFG_RUN_TARG_arm-unknown-linux-gnueabihf=
291291
RUSTC_FLAGS_arm-unknown-linux-gnueabihf := --linker=$(CC_arm-unknown-linux-gnueabihf)
292292

293+
# arm-unknown-linux-gnueabi configuration
294+
CC_arm-unknown-linux-gnueabi=arm-linux-gnueabi-gcc
295+
CXX_arm-unknown-linux-gnueabi=arm-linux-gnueabi-g++
296+
CPP_arm-unknown-linux-gnueabi=arm-linux-gnueabi-gcc -E
297+
AR_arm-unknown-linux-gnueabi=arm-linux-gnueabi-ar
298+
CFG_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).so
299+
CFG_LIB_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.so
300+
CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.dylib.dSYM
301+
CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -D__arm__
302+
CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabi := -fno-rtti
303+
CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabi := -shared -fPIC -g
304+
CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabi := -Wl,--export-dynamic,--dynamic-list=
305+
CFG_GCCISH_PRE_LIB_FLAGS_arm-unknown-linux-gnueabi := -Wl,-whole-archive
306+
CFG_GCCISH_POST_LIB_FLAGS_arm-unknown-linux-gnueabi := -Wl,-no-whole-archive
307+
CFG_DEF_SUFFIX_arm-unknown-linux-gnueabi := .linux.def
308+
CFG_INSTALL_NAME_ar,-unknown-linux-gnueabi =
309+
CFG_LIBUV_LINK_FLAGS_arm-unknown-linux-gnueabi =
310+
CFG_EXE_SUFFIX_arm-unknown-linux-gnueabi :=
311+
CFG_WINDOWSY_arm-unknown-linux-gnueabi :=
312+
CFG_UNIXY_arm-unknown-linux-gnueabi := 1
313+
CFG_PATH_MUNGE_arm-unknown-linux-gnueabi := true
314+
CFG_LDPATH_arm-unknown-linux-gnueabi :=
315+
CFG_RUN_arm-unknown-linux-gnueabi=
316+
CFG_RUN_TARG_arm-unknown-linux-gnueabi=
317+
RUSTC_FLAGS_arm-unknown-linux-gnueabi := --linker=$(CC_arm-unknown-linux-gnueabi)
318+
293319
# mips-unknown-linux-gnu configuration
294320
CC_mips-unknown-linux-gnu=mips-linux-gnu-gcc
295321
CXX_mips-unknown-linux-gnu=mips-linux-gnu-g++
@@ -450,7 +476,7 @@ define CFG_MAKE_TOOLCHAIN
450476
$$(CFG_GCCISH_DEF_FLAG_$(1))$$(3) $$(2) \
451477
$$(call CFG_INSTALL_NAME_$(1),$$(4))
452478

453-
ifneq ($(1),arm-linux-androideabi)
479+
ifneq ($(HOST_$(1)),arm)
454480

455481
# We're using llvm-mc as our assembler because it supports
456482
# .cfi pseudo-ops on mac
@@ -462,9 +488,9 @@ define CFG_MAKE_TOOLCHAIN
462488
-o=$$(1)
463489
else
464490

465-
# For the Android cross, use the Android assembler
491+
# For the ARM crosses, use the toolchain assembler
466492
# XXX: We should be able to use the LLVM assembler
467-
CFG_ASSEMBLE_$(1)=$$(CPP_$(1)) $$(CFG_DEPEND_FLAGS) $$(2) -c -o $$(1)
493+
CFG_ASSEMBLE_$(1)=$$(CC_$(1)) $$(CFG_DEPEND_FLAGS) $$(2) -c -o $$(1)
468494

469495
endif
470496

src/libextra/arena.rs

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,16 @@ pub struct Arena {
6767
priv chunks: @mut MutList<Chunk>,
6868
}
6969

70-
#[unsafe_destructor]
71-
impl Drop for Arena {
72-
fn drop(&self) {
73-
unsafe {
74-
destroy_chunk(&self.head);
75-
do self.chunks.each |chunk| {
76-
if !chunk.is_pod {
77-
destroy_chunk(chunk);
78-
}
79-
true
80-
};
70+
impl Arena {
71+
pub fn new() -> Arena {
72+
Arena::new_with_size(32u)
73+
}
74+
75+
pub fn new_with_size(initial_size: uint) -> Arena {
76+
Arena {
77+
head: chunk(initial_size, false),
78+
pod_head: chunk(initial_size, true),
79+
chunks: @mut MutNil,
8180
}
8281
}
8382
}
@@ -92,18 +91,21 @@ fn chunk(size: uint, is_pod: bool) -> Chunk {
9291
}
9392
}
9493

95-
pub fn arena_with_size(initial_size: uint) -> Arena {
96-
Arena {
97-
head: chunk(initial_size, false),
98-
pod_head: chunk(initial_size, true),
99-
chunks: @mut MutNil,
94+
#[unsafe_destructor]
95+
impl Drop for Arena {
96+
fn drop(&self) {
97+
unsafe {
98+
destroy_chunk(&self.head);
99+
do self.chunks.each |chunk| {
100+
if !chunk.is_pod {
101+
destroy_chunk(chunk);
102+
}
103+
true
104+
};
105+
}
100106
}
101107
}
102108

103-
pub fn Arena() -> Arena {
104-
arena_with_size(32u)
105-
}
106-
107109
#[inline]
108110
fn round_up_to(base: uint, align: uint) -> uint {
109111
(base + (align - 1)) & !(align - 1)
@@ -276,7 +278,7 @@ impl Arena {
276278

277279
#[test]
278280
fn test_arena_destructors() {
279-
let arena = Arena();
281+
let arena = Arena::new();
280282
for i in range(0u, 10) {
281283
// Arena allocate something with drop glue to make sure it
282284
// doesn't leak.
@@ -291,7 +293,7 @@ fn test_arena_destructors() {
291293
#[should_fail]
292294
#[ignore(cfg(windows))]
293295
fn test_arena_destructors_fail() {
294-
let arena = Arena();
296+
let arena = Arena::new();
295297
// Put some stuff in the arena.
296298
for i in range(0u, 10) {
297299
// Arena allocate something with drop glue to make sure it

src/libextra/comm.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ Higher level communication abstractions.
1818

1919

2020
use std::comm::{GenericChan, GenericSmartChan, GenericPort};
21-
use std::comm::{Chan, Port, Selectable, Peekable};
21+
use std::comm::{Chan, Port, Peekable};
2222
use std::comm;
23-
use std::pipes;
2423

2524
/// An extension of `pipes::stream` that allows both sending and receiving.
2625
pub struct DuplexStream<T, U> {
@@ -75,12 +74,6 @@ impl<T:Send,U:Send> Peekable<U> for DuplexStream<T, U> {
7574
}
7675
}
7776

78-
impl<T:Send,U:Send> Selectable for DuplexStream<T, U> {
79-
fn header(&mut self) -> *mut pipes::PacketHeader {
80-
self.port.header()
81-
}
82-
}
83-
8477
/// Creates a bidirectional stream.
8578
pub fn DuplexStream<T:Send,U:Send>()
8679
-> (DuplexStream<T, U>, DuplexStream<U, T>)

src/libextra/dlist.rs

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ impl<T> Rawlink<T> {
9292
Some(unsafe { cast::transmute(self.p) })
9393
}
9494
}
95+
96+
/// Return the `Rawlink` and replace with `Rawlink::none()`
97+
fn take(&mut self) -> Rawlink<T> {
98+
util::replace(self, Rawlink::none())
99+
}
95100
}
96101

97102
impl<T> Clone for Rawlink<T> {
@@ -280,13 +285,16 @@ impl<T> DList<T> {
280285
/// Add all elements from `other` to the end of the list
281286
///
282287
/// O(1)
283-
pub fn append(&mut self, other: DList<T>) {
288+
pub fn append(&mut self, mut other: DList<T>) {
284289
match self.list_tail.resolve() {
285290
None => *self = other,
286291
Some(tail) => {
287-
match other {
288-
DList{list_head: None, _} => return,
289-
DList{list_head: Some(node), list_tail: o_tail, length: o_length} => {
292+
// Carefully empty `other`.
293+
let o_tail = other.list_tail.take();
294+
let o_length = other.length;
295+
match other.list_head.take() {
296+
None => return,
297+
Some(node) => {
290298
tail.next = link_with_prev(node, self.list_tail);
291299
self.list_tail = o_tail;
292300
self.length += o_length;
@@ -404,6 +412,32 @@ impl<T: Ord> DList<T> {
404412
}
405413
}
406414

415+
#[unsafe_destructor]
416+
impl<T> Drop for DList<T> {
417+
fn drop(&self) {
418+
let mut_self = unsafe {
419+
cast::transmute_mut(self)
420+
};
421+
// Dissolve the dlist in backwards direction
422+
// Just dropping the list_head can lead to stack exhaustion
423+
// when length is >> 1_000_000
424+
let mut tail = mut_self.list_tail;
425+
loop {
426+
match tail.resolve() {
427+
None => break,
428+
Some(prev) => {
429+
prev.next.take(); // release ~Node<T>
430+
tail = prev.prev;
431+
}
432+
}
433+
}
434+
mut_self.length = 0;
435+
mut_self.list_head = None;
436+
mut_self.list_tail = Rawlink::none();
437+
}
438+
}
439+
440+
407441
impl<'self, A> Iterator<&'self A> for DListIterator<'self, A> {
408442
#[inline]
409443
fn next(&mut self) -> Option<&'self A> {

0 commit comments

Comments
 (0)