From: levill_r <levill_r@4aad255d-cdde-0310-9447-f3009e2ae8c0>
* src/function_loader.cc: Wrap long lines.
Clean up whitespace.
(dyn::function_loader_t::gen_cxx): Remove a useless Ruby stream.
* test/test_containers.cc,
* test/test_damien.cc,
* test/test_function_loader.cc,
* test/test_methods.cc,
* test/test_var_and_val.cc:
Remove useless `return 0' statements at end of `main'.
git-svn-id:
https://svn.lrde.epita.fr/svn/oln/trunk@4670
4aad255d-cdde-0310-9447-f3009e2ae8c0
---
dynamic-use-of-static-c++/ChangeLog | 14 +
dynamic-use-of-static-c++/src/function_loader.cc | 268 ++++++++++----------
dynamic-use-of-static-c++/test/test_containers.cc | 1 -
dynamic-use-of-static-c++/test/test_damien.cc | 1 -
.../test/test_function_loader.cc | 1 -
dynamic-use-of-static-c++/test/test_methods.cc | 1 -
dynamic-use-of-static-c++/test/test_var_and_val.cc | 1 -
7 files changed, 154 insertions(+), 133 deletions(-)
diff --git a/dynamic-use-of-static-c++/ChangeLog b/dynamic-use-of-static-c++/ChangeLog
index 9a6d4bc..35e52ee 100644
--- a/dynamic-use-of-static-c++/ChangeLog
+++ b/dynamic-use-of-static-c++/ChangeLog
@@ -1,5 +1,19 @@
2009-10-26 Roland Levillain <roland(a)lrde.epita.fr>
+ Aesthetic changes.
+
+ * src/function_loader.cc: Wrap long lines.
+ Clean up whitespace.
+ (dyn::function_loader_t::gen_cxx): Remove a useless Ruby stream.
+ * test/test_containers.cc,
+ * test/test_damien.cc,
+ * test/test_function_loader.cc,
+ * test/test_methods.cc,
+ * test/test_var_and_val.cc:
+ Remove useless `return 0' statements at end of `main'.
+
+2009-10-26 Roland Levillain <roland(a)lrde.epita.fr>
+
Fix the caching system.
* src/function_loader.cc (dyn::function_loader_t::cache_type): Use
diff --git a/dynamic-use-of-static-c++/src/function_loader.cc
b/dynamic-use-of-static-c++/src/function_loader.cc
index e1b0329..62efcbc 100644
--- a/dynamic-use-of-static-c++/src/function_loader.cc
+++ b/dynamic-use-of-static-c++/src/function_loader.cc
@@ -2,12 +2,13 @@
# define DYN_FUNCTION_LOADER_CC
# include <cstdlib>
-# include <ltdl.h>
-# include <map>
+# include <map>
// FIXME: Use and improve the logger to avoid use of std::cerr.
# include <iostream>
+# include <ltdl.h>
+
# include <boost/filesystem.hpp>
# include <boost/filesystem/fstream.hpp>
# include <boost/algorithm/string/replace.hpp>
@@ -31,7 +32,8 @@ namespace ba = boost::algorithm;
template <typename InputIterator, typename T, typename OStream>
-OStream& join(const InputIterator& begin, const InputIterator& end, const
T& elt, OStream& ostr)
+OStream& join(const InputIterator& begin, const InputIterator& end,
+ const T& elt, OStream& ostr)
{
InputIterator it = begin;
@@ -57,17 +59,17 @@ namespace dyn {
{
std::list<std::string>::const_iterator it;
unsigned last = 0, pos;
- while (42)
+ while (true)
{
pos = header_paths.find(":", last);
std::string sub = header_paths.substr(last, pos - last);
if (sub == "*")
{
- for (it = includes_.begin(); it != includes_.end(); ++it)
- fun(*it);
+ for (it = includes_.begin(); it != includes_.end(); ++it)
+ fun(*it);
}
else if (sub != "")
- fun(sub);
+ fun(sub);
if (pos >= std::string::npos) break;
last = pos + 1;
}
@@ -80,13 +82,14 @@ namespace dyn {
void operator() (const std::string& path)
{
ostr << "#include ";
- if (path.find("<") == std::string::npos ||
path.find("\"") == std::string::npos)
- if (path.find(".hh") == path.length() - 3)
- ostr << "\"" << path << "\"";
- else
- ostr << "<" << path << ">";
+ if (path.find("<") == std::string::npos
+ || path.find("\"") == std::string::npos)
+ if (path.find(".hh") == path.length() - 3)
+ ostr << "\"" << path << "\"";
+ else
+ ostr << "<" << path << ">";
else
- ostr << path;
+ ostr << path;
ostr << '\n';
}
OStream& ostr;
@@ -100,11 +103,11 @@ namespace dyn {
{
if (first)
{
- first = false;
- ostr << path;
+ first = false;
+ ostr << path;
}
else
- ostr << ':' << path;
+ ostr << ':' << path;
}
bool first;
OStream& ostr;
@@ -133,15 +136,14 @@ namespace dyn {
template <typename OStream>
void
gen_cxx(const std::string& identifier,
- const std::string& name,
- const std::list<std::string>& args,
- fun_kind kind,
- const std::string paths,
- OStream& ostr)
+ const std::string& name,
+ const std::list<std::string>& args,
+ fun_kind kind,
+ const std::string paths,
+ OStream& ostr)
{
- ruby::stream r;
- typedef std::string str;
- typedef std::list<str> str_list;
+ typedef std::string str;
+ typedef std::list<str> str_list;
str_list call_args;
std::ostringstream body, call;
str nl("\n ");
@@ -154,45 +156,48 @@ namespace dyn {
foreach_path_in_paths(paths, fun);
ostr << "extern \"C\" {\n"
- << " namespace dyn {\n"
- << " namespace generated {\n"
- << " data\n"
- << " dyn_" << identifier << "(";
+ << " namespace dyn {\n"
+ << " namespace generated {\n"
+ << " data\n"
+ << " dyn_" << identifier << "(";
int i = 0;
for (it = args.begin(); it != args.end(); ++it, ++i)
{
- std::ostringstream oarg;
- oarg << "arg" << i;
- str arg(oarg.str());
-
- str type(*it);
- // remove references cause they are forbidden on lhs
- while (*type.rbegin() == '&') type.erase(--type.end());
-
- if ( kind == METH and i == 0 )
- {
- // check if the first type is a pointer to choose the good op (. or ->)
- str stripped_type(type);
- unsigned pos;
- while ((pos = stripped_type.find(" ")) != str::npos)
stripped_type.erase(pos, 1);
- unsigned len = stripped_type.length();
- first_type_is_ptr = ((stripped_type.compare(len - 7, 7, "*const>")
== 0)
- || (stripped_type.compare(len - 2, 2, "*>") ==
0));
- }
-
- if (it != args.begin()) ostr << ", ";
- ostr << "const data& " << arg;
- call_args.push_back(arg + "_reinterpret_cast_ptr->obj()");
- body << type << "* " << arg <<
"_reinterpret_cast_ptr = "
- << "reinterpret_cast<" << type << "*
>(" << arg << ".proxy());"
- << nl << "assert(" << arg <<
"_reinterpret_cast_ptr);" << nl;
+ std::ostringstream oarg;
+ oarg << "arg" << i;
+ str arg(oarg.str());
+
+ str type(*it);
+ // Remove references cause they are forbidden on lhs.
+ while (*type.rbegin() == '&') type.erase(--type.end());
+
+ if (kind == METH and i == 0)
+ {
+ // Check if the first type is a pointer to choose the good
+ // operator (`.' or `->').
+ str stripped_type(type);
+ unsigned pos;
+ while ((pos = stripped_type.find(" ")) != str::npos)
+ stripped_type.erase(pos, 1);
+ unsigned len = stripped_type.length();
+ first_type_is_ptr =
+ ((stripped_type.compare(len - 7, 7, "*const>") == 0)
+ || (stripped_type.compare(len - 2, 2, "*>") == 0));
+ }
+
+ if (it != args.begin()) ostr << ", ";
+ ostr << "const data& " << arg;
+ call_args.push_back(arg + "_reinterpret_cast_ptr->obj()");
+ body << type << "* " << arg <<
"_reinterpret_cast_ptr = "
+ << "reinterpret_cast<" << type << "*
>(" << arg << ".proxy());"
+ << nl << "assert(" << arg <<
"_reinterpret_cast_ptr);" << nl;
}
- if ( kind == METH)
- {
- call << call_args.front() << ((first_type_is_ptr)? "->"
: ".");
- call_args.pop_front();
+ if (kind == METH)
+ {
+ call << call_args.front() << ((first_type_is_ptr)? "->" :
".");
+ call_args.pop_front();
}
call << name << "(";
@@ -203,51 +208,52 @@ namespace dyn {
switch (kind)
{
- case OP:
- if ( op.compare(0, 8, "operator") == 0 )
- op.erase(0, 8);
- call.str(std::string());
- switch (call_args.size())
- {
- case 1:
- call << op << "(" << *call_args.begin()
<< ")";
- break;
- case 2:
- it = call_args.begin();
- call << "(" << *it++ << ") ";
- call << op
- << " (" << *it << ")";
- break;
- default: assert(0);
- }
- // no break here
- case METH:
- case FUN:
- body << "policy::receiver<select_dyn_policy((" <<
call.str() << "))> receiver;" << nl
- << "(receiver(), " << call.str() <<
");" << nl
- << "data ret(receiver.proxy(), (proxy_tag*)0);" <<
nl
- << "return ret;\n";
- break;
- case CTOR:
- body << "typedef " << name << " T;"
<< nl
- << "T* ptr = new T(";
- join(call_args.begin(), call_args.end(), ", ", body);
- body << ");" << nl
- << "abstract_data* proxy = new
data_proxy_by_ptr<T>(ptr);" << nl
- << "data ret(proxy, (proxy_tag*)0);" << nl
- << "return ret;\n";
- break;
- default:
- assert(!"Unknown kind");
+ case OP:
+ if (op.compare(0, 8, "operator") == 0)
+ op.erase(0, 8);
+ call.str(std::string());
+ switch (call_args.size())
+ {
+ case 1:
+ call << op << "(" << *call_args.begin() <<
")";
+ break;
+ case 2:
+ it = call_args.begin();
+ call << "(" << *it++ << ") ";
+ call << op
+ << " (" << *it << ")";
+ break;
+ default: assert(0);
+ }
+ // no break here
+ case METH:
+ case FUN:
+ body << "policy::receiver<select_dyn_policy(("
+ << call.str() << "))> receiver;" << nl
+ << "(receiver(), " << call.str() << ");"
<< nl
+ << "data ret(receiver.proxy(), (proxy_tag*)0);" << nl
+ << "return ret;\n";
+ break;
+ case CTOR:
+ body << "typedef " << name << " T;" << nl
+ << "T* ptr = new T(";
+ join(call_args.begin(), call_args.end(), ", ", body);
+ body << ");" << nl
+ << "abstract_data* proxy = new data_proxy_by_ptr<T>(ptr);"
<< nl
+ << "data ret(proxy, (proxy_tag*)0);" << nl
+ << "return ret;\n";
+ break;
+ default:
+ assert(!"Unknown kind");
}
ostr << ")\n"
- << " {" << nl
- << body.str()
- << " }\n"
- << " }\n"
- << " }\n"
- << "};\n";
+ << " {" << nl
+ << body.str()
+ << " }\n"
+ << " }\n"
+ << " }\n"
+ << "};\n";
}
@@ -339,7 +345,7 @@ namespace dyn {
<< out_log.rdbuf() << std::endl;
// FIXME: Isn't this a bit too violent?
std::exit(1);
- }
+ }
}
// Most of the ruby-dependent code generator is in this function.
@@ -354,16 +360,16 @@ namespace dyn {
arguments_types_t::const_iterator it(arguments_types.begin());
if (it != arguments_types.end())
{
- ostr << *it;
- for (++it; it != arguments_types.end(); ++it)
- ostr << ", " << *it;
+ ostr << *it;
+ for (++it; it != arguments_types.end(); ++it)
+ ostr << ", " << *it;
}
ostr << ')';
if (paths != "")
{
- ostr << ", paths: ";
- gen_path<std::ostream> fun(ostr);
- foreach_path_in_paths(paths, fun);
+ ostr << ", paths: ";
+ gen_path<std::ostream> fun(ostr);
+ foreach_path_in_paths(paths, fun);
}
std::string prototype = ostr.str();
@@ -372,19 +378,21 @@ namespace dyn {
cache_type::iterator ptr_it = cache.find(identifier);
- if ( ptr_it != cache.end() )
+ if (ptr_it != cache.end())
{
+ // FIXME: Don't use a hard-coded error stream (std::cerr).
// FIXME: Colors should be used only when the terminal supports them.
#if 0
- std::cerr << "\e[36mJIT: \e[32mHIT: \e[0m " << prototype
<< std::endl;
+ std::cerr << "\e[36mJIT: \e[32mHIT: \e[0m " << prototype <<
std::endl;
#endif
- std::cerr << "JIT: HIT: " << prototype <<
std::endl;
- return ptr_it->second;
+ std::cerr << "JIT: HIT: " << prototype << std::endl;
+ return ptr_it->second;
}
// FIXME: Colors should be used only when the terminal supports them.
#if 0
- std::cerr << "\e[36mJIT: \e[31mMISS: compile: \e[0m " <<
prototype << std::endl;
+ std::cerr
+ << "\e[36mJIT: \e[31mMISS: compile: \e[0m " << prototype <<
std::endl;
#endif
std::cerr << "JIT: MISS: compile: " << prototype <<
std::endl;
@@ -398,7 +406,7 @@ namespace dyn {
const char* error;
std::string lib_path = std::string("repository/") + identifier
- + "/libdyn_" + identifier + ".la";
+ + "/libdyn_" + identifier + ".la";
std::string symb = std::string("dyn_") + identifier;
lt_dlhandle lib = lt_dlopen(lib_path.c_str());
@@ -421,22 +429,23 @@ namespace dyn {
arguments_types_t::const_iterator it(arguments_types.begin());
if (it != arguments_types.end())
{
- ostr << *it;
- for (++it; it != arguments_types.end(); ++it)
- ostr << ", " << *it;
+ ostr << *it;
+ for (++it; it != arguments_types.end(); ++it)
+ ostr << ", " << *it;
}
ostr << ')';
if (paths != "")
{
- ostr << ", paths: ";
- gen_path<std::ostream> fun(ostr);
- foreach_path_in_paths(paths, fun);
+ ostr << ", paths: ";
+ gen_path<std::ostream> fun(ostr);
+ foreach_path_in_paths(paths, fun);
}
std::string prototype = ostr.str();
// FIXME: Careful, this cast removes a const! We should improve
// the interface of libmd5.
- std::string identifier(MD5((unsigned char*)prototype.c_str()).hex_digest());
+ std::string identifier =
+ MD5((unsigned char*)prototype.c_str()).hex_digest();
cache_type::iterator ptr_it = cache.find(identifier);
@@ -444,17 +453,19 @@ namespace dyn {
// never hit). See why this is happening.
if (ptr_it != cache.end())
{
+ // FIXME: Don't use a hard-coded error stream (std::cerr).
// FIXME: Colors should be used only when the terminal supports them.
#if 0
- std::cerr << "\e[36mJIT: \e[32mHIT: \e[0m " << prototype
<< std::endl;
+ std::cerr << "\e[36mJIT: \e[32mHIT: \e[0m " << prototype <<
std::endl;
#endif
- std::cerr << "JIT: HIT: " << prototype <<
std::endl;
- return ptr_it->second;
+ std::cerr << "JIT: HIT: " << prototype << std::endl;
+ return ptr_it->second;
}
// FIXME: Colors should be used only when the terminal supports them.
#if 0
- std::cerr << "\e[36mJIT: \e[31mMISS: compile: \e[0m " <<
prototype << std::endl;
+ std::cerr
+ << "\e[36mJIT: \e[31mMISS: compile: \e[0m " << prototype <<
std::endl;
#endif
std::cerr << "JIT: MISS: compile: " << prototype <<
std::endl;
@@ -486,7 +497,7 @@ namespace dyn {
const char* error;
std::string lib_path = std::string("repository/") + identifier
- + "/libdyn_" + identifier + ".la";
+ + "/libdyn_" + identifier + ".la";
std::string symb = std::string("dyn_") + identifier;
lt_dlhandle lib = lt_dlopen(lib_path.c_str());
@@ -497,7 +508,7 @@ namespace dyn {
return ptr;
}
- protected:
+ protected:
typedef std::map<std::string, void*> cache_type;
/* FIXME: Introduce a real cache object, with
debugging/pretty-printing methods. */
@@ -506,6 +517,7 @@ namespace dyn {
executions. Of course, this is safer, but it would be great to
benefit from a long-term cache. */
cache_type cache;
+ // FIXME: Rename cflags as cxxflags.
std::list<std::string> cflags_, ldflags_;
ruby::stream ruby;
};
@@ -536,9 +548,9 @@ namespace dyn {
void*
load_function(fun_kind kind,
- const std::string& name,
- const arguments_types_t& arguments_types,
- const std::string& header_path)
+ const std::string& name,
+ const arguments_types_t& arguments_types,
+ const std::string& header_path)
{
if (HAVE_DYN_RUBY_GENERATOR)
return function_loader.ruby_load(kind, name, arguments_types,
diff --git a/dynamic-use-of-static-c++/test/test_containers.cc
b/dynamic-use-of-static-c++/test/test_containers.cc
index 2413b30..6a79e02 100644
--- a/dynamic-use-of-static-c++/test/test_containers.cc
+++ b/dynamic-use-of-static-c++/test/test_containers.cc
@@ -85,5 +85,4 @@ int main()
assert(i == 4);
echo("exiting");
- return 0;
}
diff --git a/dynamic-use-of-static-c++/test/test_damien.cc
b/dynamic-use-of-static-c++/test/test_damien.cc
index 4b30fbd..1b55fd1 100644
--- a/dynamic-use-of-static-c++/test/test_damien.cc
+++ b/dynamic-use-of-static-c++/test/test_damien.cc
@@ -92,5 +92,4 @@ int main()
}
std::cout << "exiting" << std::endl;
- return 0;
}
diff --git a/dynamic-use-of-static-c++/test/test_function_loader.cc
b/dynamic-use-of-static-c++/test/test_function_loader.cc
index 50ee9d4..fc8984a 100644
--- a/dynamic-use-of-static-c++/test/test_function_loader.cc
+++ b/dynamic-use-of-static-c++/test/test_function_loader.cc
@@ -71,5 +71,4 @@ int main()
assert(count == 1);
echo("exiting");
- return 0;
}
diff --git a/dynamic-use-of-static-c++/test/test_methods.cc
b/dynamic-use-of-static-c++/test/test_methods.cc
index 079e49e..1ea7f0b 100644
--- a/dynamic-use-of-static-c++/test/test_methods.cc
+++ b/dynamic-use-of-static-c++/test/test_methods.cc
@@ -22,5 +22,4 @@ int main()
print(v2, 2, "21");
std::cout << "exiting" << std::endl;
- return 0;
}
diff --git a/dynamic-use-of-static-c++/test/test_var_and_val.cc
b/dynamic-use-of-static-c++/test/test_var_and_val.cc
index e890e18..b5da732 100644
--- a/dynamic-use-of-static-c++/test/test_var_and_val.cc
+++ b/dynamic-use-of-static-c++/test/test_var_and_val.cc
@@ -91,5 +91,4 @@ int main()
assert(str == "b youhou");
echo("exiting");
- return 0;
}
--
1.6.5