summaryrefslogtreecommitdiff
path: root/icespider/compile
diff options
context:
space:
mode:
Diffstat (limited to 'icespider/compile')
-rw-r--r--icespider/compile/Jamfile.jam21
-rw-r--r--icespider/compile/icespider.jam3
-rw-r--r--icespider/compile/main.cpp1
-rw-r--r--icespider/compile/routeCompiler.cpp75
-rw-r--r--icespider/compile/routeCompiler.h6
-rw-r--r--icespider/compile/routes.ice74
-rw-r--r--icespider/compile/slice/Jamroot.jam22
7 files changed, 128 insertions, 74 deletions
diff --git a/icespider/compile/Jamfile.jam b/icespider/compile/Jamfile.jam
index 986b3c3..2021abe 100644
--- a/icespider/compile/Jamfile.jam
+++ b/icespider/compile/Jamfile.jam
@@ -4,30 +4,32 @@ lib slicer-json ;
lib boost_program_options ;
lib boost_system ;
lib boost_filesystem ;
-lib Slice ;
+lib mcpp ;
lib icespider-compile :
- [ glob-tree *.cpp : bin main.cpp ]
- ../common/routes.ice
+ routeCompiler.cpp
+ routes.ice
:
- <slicer>pure
- <allow-ice>yes
+ <slicer>yes
+# Need to disable LTO here cos of a GCC bug, this isn't
+# performance critical anyway
+ <linkflags>-fno-lto
+ <cxxflags>-fno-lto
<library>slicer
<library>adhocutil
<library>slicer-json
<library>boost_system
<library>boost_filesystem
- <library>Slice
+ <library>slice//Slice
<library>../common//icespider-common
- <implicit-dependency>../common
+ <implicit-dependency>../common//icespider-common
<library>..//Ice
- <library>..//IceUtil
<library>..//pthread
+ <library>mcpp
: :
<library>boost_system
<library>boost_filesystem
<library>../common//icespider-common
- <implicit-dependency>../common
;
exe icespider :
@@ -35,5 +37,6 @@ exe icespider :
:
<library>boost_program_options
<library>icespider-compile
+ <implicit-dependency>icespider-compile
;
diff --git a/icespider/compile/icespider.jam b/icespider/compile/icespider.jam
index 4513494..6f5266c 100644
--- a/icespider/compile/icespider.jam
+++ b/icespider/compile/icespider.jam
@@ -8,11 +8,10 @@ type.register JSON : json ;
generators.register-standard icespider.routes2cpp : JSON : CPP(icespider-routes-%) H(icespider-routes-%) ;
flags icespider.routes2cpp INCLUDES <include> ;
-flags icespider.routes2cpp ALLOWICE <allow-ice>yes : --ice ;
actions icespider.routes2cpp bind ICESPIDER
{
- icespider -I"$(INCLUDES)" $(ALLOWICE[1]) $(2) $(1[1])
+ icespider -I"$(INCLUDES)" $(2) $(1[1])
}
IMPORT $(__name__) : icespider.routes2cpp : : icespider.routes2cpp ;
diff --git a/icespider/compile/main.cpp b/icespider/compile/main.cpp
index 7be6579..3d5311f 100644
--- a/icespider/compile/main.cpp
+++ b/icespider/compile/main.cpp
@@ -14,7 +14,6 @@ main(int c, char ** v)
("input", po::value(&input), "Input .json file")
("output", po::value(&output), "Output .cpp file")
("include,I", po::value(&rc.searchPath)->composing(), "Search path")
- ("ice", po::value(&rc.allowIcePrefix)->default_value(rc.allowIcePrefix)->zero_tokens(), "Allow reserved Ice prefix in Slice identifiers")
("help,h", po::value(&showHelp)->default_value(false)->zero_tokens(), "Help")
;
po::positional_options_description pod;
diff --git a/icespider/compile/routeCompiler.cpp b/icespider/compile/routeCompiler.cpp
index e069b4f..40ce5fd 100644
--- a/icespider/compile/routeCompiler.cpp
+++ b/icespider/compile/routeCompiler.cpp
@@ -11,10 +11,10 @@
#include <Slice/CPlusPlusUtil.h>
#include <compileTimeFormatter.h>
+
namespace IceSpider {
namespace Compile {
- RouteCompiler::RouteCompiler() :
- allowIcePrefix(false)
+ RouteCompiler::RouteCompiler()
{
searchPath.push_back(boost::filesystem::current_path());
}
@@ -119,7 +119,7 @@ namespace IceSpider {
{
for (const auto & r : c->routes) {
if (r.second->operation) {
- r.second->operations[std::string()] = new Operation(*r.second->operation, {});
+ r.second->operations[std::string()] = std::make_shared<Operation>(*r.second->operation, StringMap());
}
auto ps = findParameters(r.second, u);
for (const auto & p : ps) {
@@ -130,7 +130,7 @@ namespace IceSpider {
}
}
else {
- defined = r.second->params.insert({ p.first, new Parameter(ParameterSource::URL, p.first, false, IceUtil::Optional<std::string>(), IceUtil::Optional<std::string>(), false) }).first;
+ defined = r.second->params.insert({ p.first, std::make_shared<Parameter>(ParameterSource::URL, p.first, false, Ice::optional<std::string>(), Ice::optional<std::string>(), false) }).first;
}
auto d = defined->second;
if (d->source == ParameterSource::URL) {
@@ -206,7 +206,7 @@ namespace IceSpider {
throw std::runtime_error("Preprocess failed");
}
- Slice::UnitPtr u = Slice::Unit::createUnit(false, false, allowIcePrefix, false);
+ Slice::UnitPtr u = Slice::Unit::createUnit(false, false, false, false);
uDestroy.onFailure.push_back([u]() { u->destroy(); });
int parseStatus = u->parse(realSlice.string(), cppHandle, false);
@@ -247,16 +247,6 @@ namespace IceSpider {
return boost::algorithm::replace_all_copy(os.second->serializer, ".", "::");
}
- static
- std::string
- outputSerializerName(const IceSpider::OutputSerializers::value_type & os)
- {
- std::string name("_serializer_");
- std::replace_copy_if(os.first.begin(), os.first.end(), std::back_inserter(name),
- std::not1(std::ptr_fun(isalnum)), '_');
- return name;
- }
-
AdHocFormatter(MimePair, R"C({ "%?", "%?" })C");
static
std::string
@@ -268,48 +258,20 @@ namespace IceSpider {
}
void
- RouteCompiler::defineOutputSerializers(FILE * output, RoutePtr r) const
+ RouteCompiler::registerOutputSerializers(FILE * output, RoutePtr r) const
{
for (const auto & os : r->outputSerializers) {
- fprintf(output, ",\n");
- fprintbf(4, output, "%s(",
- outputSerializerName(os));
+ fprintbf(4, output, "addRouteSerializer(%s,\n",
+ outputSerializerMime(os));
+ fprintbf(6, output, "std::make_shared<%s::IceSpiderFactory>(",
+ outputSerializerClass(os));
for (auto p = os.second->params.begin(); p != os.second->params.end(); ++p) {
if (p != os.second->params.begin()) {
fprintf(output, ", ");
}
fputs(p->c_str(), output);
}
- fprintf(output, ")");
- }
- }
-
- void
- RouteCompiler::registerOutputSerializers(FILE * output, RoutePtr r) const
- {
- for (const auto & os : r->outputSerializers) {
- fprintbf(4, output, "addRouteSerializer(%s, &%s);\n",
- outputSerializerMime(os),
- outputSerializerName(os));
- }
- }
-
- void
- RouteCompiler::releaseOutputSerializers(FILE * output, RoutePtr r) const
- {
- for (const auto & os : r->outputSerializers) {
- fprintbf(4, output, "removeRouteSerializer(%s);\n",
- outputSerializerMime(os));
- }
- }
-
- void
- RouteCompiler::declareOutputSerializers(FILE * output, RoutePtr r) const
- {
- for (const auto & os : r->outputSerializers) {
- fprintbf(3, output, "%s::IceSpiderFactory %s;\n",
- outputSerializerClass(os),
- outputSerializerName(os));
+ fprintf(output, "));\n");
}
}
@@ -382,7 +344,7 @@ namespace IceSpider {
fprintf(output, "\n");
unsigned int pn = 0;
for (const auto & p : b.second->proxies) {
- fprintbf(3, outputh, "const %sPrx prx%u;\n",
+ fprintbf(3, outputh, "const %sPrxPtr prx%u;\n",
boost::algorithm::replace_all_copy(p, ".", "::"), pn);
fprintbf(3, output, "prx%u(core->getProxy<%s>())",
pn, boost::algorithm::replace_all_copy(p, ".", "::"));
@@ -432,7 +394,6 @@ namespace IceSpider {
fprintbf(4, output, "%s(core)", b);
}
auto proxies = initializeProxies(output, r.second);
- defineOutputSerializers(output, r.second);
for (const auto & p : r.second->params) {
if (p.second->hasUserSource) {
if (p.second->source == ParameterSource::URL) {
@@ -458,7 +419,7 @@ namespace IceSpider {
if (p.second->defaultExpr) {
fprintf(output, ",\n");
fprintbf(4, output, "_pd_%s(%s)",
- p.first, p.second->defaultExpr.get());
+ p.first, *p.second->defaultExpr);
}
}
fprintf(output, "\n");
@@ -467,7 +428,6 @@ namespace IceSpider {
fprintbf(3, output, "}\n\n");
fprintbf(3, output, "~%s()\n", r.first);
fprintbf(3, output, "{\n");
- releaseOutputSerializers(output, r.second);
fprintbf(3, output, "}\n\n");
fprintbf(3, output, "void execute(IceSpider::IHttpRequest * request) const\n");
fprintbf(3, output, "{\n");
@@ -532,7 +492,6 @@ namespace IceSpider {
fprintbf(3, output, "}\n\n");
fprintbf(2, output, "private:\n");
declareProxies(output, proxies);
- declareOutputSerializers(output, r.second);
for (const auto & p : r.second->params) {
if (p.second->hasUserSource) {
if (p.second->source == ParameterSource::URL) {
@@ -573,7 +532,7 @@ namespace IceSpider {
RouteCompiler::declareProxies(FILE * output, const Proxies & proxies) const
{
for (const auto & p : proxies) {
- fprintbf(3, output, "const %sPrx prx%d;\n", boost::algorithm::replace_all_copy(p.first, ".", "::"), p.second);
+ fprintbf(3, output, "const %sPrxPtr prx%d;\n", boost::algorithm::replace_all_copy(p.first, ".", "::"), p.second);
}
}
@@ -614,7 +573,7 @@ namespace IceSpider {
for (const auto & o : r->operations) {
auto proxyName = o.second->operation.substr(0, o.second->operation.find_last_of('.'));
auto operation = o.second->operation.substr(o.second->operation.find_last_of('.') + 1);
- fprintbf(4, output, "auto _ar_%s = prx%s->begin_%s(", o.first, proxies.find(proxyName)->second, operation);
+ fprintbf(4, output, "auto _ar_%s = prx%s->%sAsync(", o.first, proxies.find(proxyName)->second, operation);
auto so = findOperation(o.second->operation, us);
for (const auto & p : so->parameters()) {
auto po = o.second->paramOverrides.find(p->name());
@@ -631,7 +590,7 @@ namespace IceSpider {
auto t = findType(r->type, us);
Slice::DataMemberList members;
if (t.second) {
- fprintbf(4, output, "%s _responseModel = new %s();\n",
+ fprintbf(4, output, "%s _responseModel = std::make_shared<%s>();\n",
Slice::typeToString(t.second),
t.second->scoped());
members = t.second->definition()->dataMembers();
@@ -650,7 +609,7 @@ namespace IceSpider {
auto proxyName = o.second->operation.substr(0, o.second->operation.find_last_of('.'));
auto operation = o.second->operation.substr(o.second->operation.find_last_of('.') + 1);
if (mi->name() == o.first) {
- fprintbf(output, "prx%s->end_%s(_ar_%s)", proxies.find(proxyName)->second, operation, o.first);
+ fprintbf(output, "_ar_%s.get()", o.first);
isOp = true;
break;
}
diff --git a/icespider/compile/routeCompiler.h b/icespider/compile/routeCompiler.h
index cfc215f..b8bb6b9 100644
--- a/icespider/compile/routeCompiler.h
+++ b/icespider/compile/routeCompiler.h
@@ -23,20 +23,17 @@ namespace IceSpider {
void compile(const boost::filesystem::path & input, const boost::filesystem::path & output) const;
std::vector<boost::filesystem::path> searchPath;
- bool allowIcePrefix;
private:
typedef std::map<std::string, int> Proxies;
+#pragma GCC visibility push(hidden)
void processConfiguration(FILE * output, FILE * outputh, const std::string & name, RouteConfigurationPtr, const Units &) const;
void processBases(FILE * output, FILE * outputh, RouteConfigurationPtr, const Units &) const;
void processBase(FILE * output, FILE * outputh, const RouteBases::value_type &, const Units &) const;
void processRoutes(FILE * output, RouteConfigurationPtr, const Units &) const;
void processRoute(FILE * output, const Routes::value_type &, const Units &) const;
- void defineOutputSerializers(FILE * output, RoutePtr) const;
void registerOutputSerializers(FILE * output, RoutePtr) const;
- void releaseOutputSerializers(FILE * output, RoutePtr) const;
- void declareOutputSerializers(FILE * output, RoutePtr) const;
Proxies initializeProxies(FILE * output, RoutePtr) const;
void declareProxies(FILE * output, const Proxies &) const;
void addSingleOperation(FILE * output, RoutePtr, Slice::OperationPtr) const;
@@ -48,6 +45,7 @@ namespace IceSpider {
typedef std::pair<Slice::StructPtr, Slice::ClassDeclPtr> Type;
static Type findType(const std::string &, const Units &);
static Type findType(const std::string &, const Slice::ContainerPtr &, const Ice::StringSeq & = Ice::StringSeq());
+#pragma GCC visibility pop
};
}
}
diff --git a/icespider/compile/routes.ice b/icespider/compile/routes.ice
new file mode 100644
index 0000000..2c25664
--- /dev/null
+++ b/icespider/compile/routes.ice
@@ -0,0 +1,74 @@
+#ifndef ICESPIDER_ROUTES_ICE
+#define ICESPIDER_ROUTES_ICE
+
+#include "http.ice"
+
+[["ice-prefix"]]
+module IceSpider {
+ local sequence<string> StringSeq;
+
+ local class Parameter {
+ ParameterSource source = URL;
+ optional(0) string key;
+ bool isOptional = false;
+ ["slicer:name:default"]
+ optional(1) string defaultExpr;
+ optional(2) string type;
+
+ ["slicer:ignore"]
+ bool hasUserSource = true;
+ };
+
+ ["slicer:json:object"]
+ local dictionary<string, Parameter> Parameters;
+
+ local class OutputSerializer {
+ string serializer;
+ StringSeq params;
+ };
+
+ ["slicer:json:object"]
+ local dictionary<string, OutputSerializer> OutputSerializers;
+
+ local class Operation {
+ string operation;
+ StringMap paramOverrides;
+ };
+
+ ["slicer:json:object"]
+ local dictionary<string, Operation> Operations;
+
+ local class Route {
+ string path;
+ HttpMethod method = GET;
+ optional(0) string operation;
+ Parameters params;
+ Operations operations;
+ string type;
+ OutputSerializers outputSerializers;
+ StringSeq bases;
+ StringSeq mutators;
+ };
+
+ ["slicer:json:object"]
+ local dictionary<string, Route> Routes;
+
+ local class RouteBase {
+ StringSeq proxies;
+ StringSeq functions;
+ };
+
+ ["slicer:json:object"]
+ local dictionary<string, RouteBase> RouteBases;
+
+ local class RouteConfiguration {
+ string name;
+ Routes routes;
+ RouteBases routeBases;
+ StringSeq slices;
+ StringSeq headers;
+ };
+};
+
+#endif
+
diff --git a/icespider/compile/slice/Jamroot.jam b/icespider/compile/slice/Jamroot.jam
new file mode 100644
index 0000000..46b4e3c
--- /dev/null
+++ b/icespider/compile/slice/Jamroot.jam
@@ -0,0 +1,22 @@
+project ice :
+ : requirements
+ ;
+
+path-constant ice : ../../../ice ;
+
+lib Slice :
+ $(ice)/cpp/src/Slice/Parser.cpp
+ $(ice)/cpp/src/Slice/Grammar.cpp
+ $(ice)/cpp/src/Slice/Preprocessor.cpp
+ $(ice)/cpp/src/Slice/CPlusPlusUtil.cpp
+ $(ice)/cpp/src/Slice/SliceUtil.cpp
+ $(ice)/cpp/src/Slice/FileTracker.cpp
+ $(ice)/cpp/src/Slice/Scanner.cpp
+ :
+ <cxxflags>-fPIC
+ <include>$(ice)/cpp/src
+ <link>static
+ : :
+ <include>$(ice)/cpp/src
+ ;
+