From e590869c8ff07a0b022369e700dc506f425dddf2 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Mon, 17 Oct 2011 21:15:50 -0700 Subject: [PATCH] update vec libs to use c-stack-cdecl calling convention --- src/lib/sys.rs | 9 +++++++++ src/lib/vec.rs | 20 ++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/lib/sys.rs b/src/lib/sys.rs index 40209f9e54e..979b29fee9a 100644 --- a/src/lib/sys.rs +++ b/src/lib/sys.rs @@ -2,6 +2,10 @@ //export rustrt; //export size_of; +tag type_desc { + type_desc(@type_desc); +} + native "rust" mod rustrt { // Explicitly re-export native stuff we want to be made // available outside this crate. Otherwise it's @@ -12,6 +16,11 @@ native "rust" mod rustrt { fn refcount(t: @T) -> uint; fn do_gc(); fn unsupervise(); + fn get_type_desc() -> *type_desc; +} + +fn get_type_desc() -> *type_desc { + ret rustrt::get_type_desc::(); } fn last_os_error() -> str { diff --git a/src/lib/vec.rs b/src/lib/vec.rs index af3e31fafed..d98f4376d16 100644 --- a/src/lib/vec.rs +++ b/src/lib/vec.rs @@ -2,20 +2,27 @@ import option::{some, none}; import uint::next_power_of_two; -import ptr::addr_of; +import ptr::{addr_of, null}; native "rust-intrinsic" mod rusti { fn vec_len(&&v: [mutable? T]) -> uint; } -native "rust" mod rustrt { - fn vec_reserve_shared(&v: [mutable? T], n: uint); - fn vec_from_buf_shared(ptr: *T, count: uint) -> [T]; +native "c-stack-cdecl" mod rustrt { + fn vec_reserve_shared(dummy: *util::void, + t: *sys::type_desc, + &v: [mutable? T], + n: uint); + fn vec_from_buf_shared(dummy: *util::void, + t: *sys::type_desc, + ptr: *T, + count: uint) -> [T]; } /// Reserves space for `n` elements in the given vector. fn reserve<@T>(&v: [mutable? T], n: uint) { - rustrt::vec_reserve_shared(v, n); + log_err("reserve: v=", ptr::addr_of(v), " n=", n); + rustrt::vec_reserve_shared(null(), sys::get_type_desc::(), v, n); } pure fn len(v: [mutable? T]) -> uint { unchecked { rusti::vec_len(v) } } @@ -352,7 +359,8 @@ mod unsafe { type vec_repr = {mutable fill: uint, mutable alloc: uint, data: u8}; unsafe fn from_buf<@T>(ptr: *T, elts: uint) -> [T] { - ret rustrt::vec_from_buf_shared(ptr, elts); + ret rustrt::vec_from_buf_shared(null(), sys::get_type_desc::(), + ptr, elts); } unsafe fn set_len<@T>(&v: [T], new_len: uint) {