From 4e136d1fd9bd5536d441c062d41e7b71b375a942 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Fri, 26 Aug 2011 12:22:33 -0700 Subject: [PATCH] Add rustc::middle::cstrcache for getting c string bufs safely We continue to leak string buffers in trans so this creates a way to get c string buffers from strings while guaranteeing that they are not freed before use. Hopefully this can be made efficient in the istr regime. --- src/comp/middle/cstrcache.rs | 29 +++++++++++++++++++++++++++++ src/comp/rustc.rc | 1 + 2 files changed, 30 insertions(+) create mode 100644 src/comp/middle/cstrcache.rs diff --git a/src/comp/middle/cstrcache.rs b/src/comp/middle/cstrcache.rs new file mode 100644 index 000000000000..0b0cd320578e --- /dev/null +++ b/src/comp/middle/cstrcache.rs @@ -0,0 +1,29 @@ +// Provides a safe way to get C pointers to strings, because in many +// places LLVM wants a string but doesn't take a copy. + +import std::str; + +export t; +export mk; +export get_cstr; + +type t_ = @{ + // This string is boxed so that I remember that it has to be boxed + // after the ivec conversion. + mutable cache: [@str] +}; + +tag t { + private(t_); +} + +fn mk() -> t { + ret private(@{mutable cache: []}); +} + +fn get_cstr(t: &t, s: &str) -> str::rustrt::sbuf { + let boxed = @s; + let buf = str::buf(*boxed); + (*t).cache += [boxed]; + ret buf; +} \ No newline at end of file diff --git a/src/comp/rustc.rc b/src/comp/rustc.rc index c9f0d2f067b9..0dd9f004ad8f 100644 --- a/src/comp/rustc.rc +++ b/src/comp/rustc.rc @@ -30,6 +30,7 @@ mod middle { mod freevars; mod shape; mod gc; + mod cstrcache; mod tstate { mod ck;