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;