diff options
Diffstat (limited to 'icespider/compile')
-rw-r--r-- | icespider/compile/Jamfile.jam | 21 | ||||
-rw-r--r-- | icespider/compile/icespider.jam | 3 | ||||
-rw-r--r-- | icespider/compile/main.cpp | 1 | ||||
-rw-r--r-- | icespider/compile/routeCompiler.cpp | 75 | ||||
-rw-r--r-- | icespider/compile/routeCompiler.h | 6 | ||||
-rw-r--r-- | icespider/compile/routes.ice | 74 | ||||
-rw-r--r-- | icespider/compile/slice/Jamroot.jam | 22 |
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 + ; + |