From 4c733301e6d13b6b13aef4549f262d05007ffc9f Mon Sep 17 00:00:00 2001
From: Clifford Wolf <clifford@clifford.at>
Date: Thu, 11 Jun 2015 13:39:49 +0200
Subject: Fixed cstr_buf for std::string with small string optimization

---
 kernel/log.cc   |  2 +-
 kernel/rtlil.cc |  2 +-
 kernel/yosys.h  | 11 +++++++++++
 3 files changed, 13 insertions(+), 2 deletions(-)

(limited to 'kernel')

diff --git a/kernel/log.cc b/kernel/log.cc
index dbc94ce8c..91d857723 100644
--- a/kernel/log.cc
+++ b/kernel/log.cc
@@ -52,7 +52,7 @@ string log_last_error;
 
 vector<int> header_count;
 pool<RTLIL::IdString> log_id_cache;
-vector<string> string_buf;
+vector<shared_str> string_buf;
 int string_buf_index = -1;
 
 static struct timeval initial_tv = { 0, 0 };
diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc
index 373a3a5e6..5deef8507 100644
--- a/kernel/rtlil.cc
+++ b/kernel/rtlil.cc
@@ -147,7 +147,7 @@ RTLIL::Const RTLIL::Const::from_string(std::string str)
 std::string RTLIL::Const::decode_string() const
 {
 	std::string string;
-	std::vector <char> string_chars;
+	std::vector<char> string_chars;
 	for (int i = 0; i < int (bits.size()); i += 8) {
 		char ch = 0;
 		for (int j = 0; j < 8 && i + j < int (bits.size()); j++)
diff --git a/kernel/yosys.h b/kernel/yosys.h
index db8161c5d..14277ade8 100644
--- a/kernel/yosys.h
+++ b/kernel/yosys.h
@@ -140,6 +140,17 @@ using std::vector;
 using std::string;
 using std::pair;
 
+// A primitive shared string implementation that does not
+// move its .c_str() when the object is copied or moved.
+struct shared_str {
+	std::shared_ptr<string> content;
+	shared_str() { }
+	shared_str(string s) { content = std::shared_ptr<string>(new string(s)); }
+	shared_str(const char *s) { content = std::shared_ptr<string>(new string(s)); }
+	const char *c_str() { return content->c_str(); }
+	const string &str() { return *content; }
+};
+
 using hashlib::mkhash;
 using hashlib::mkhash_init;
 using hashlib::mkhash_add;
-- 
cgit v1.2.3