From 280b5072b35cb9658ad4e6be0203a587c0593b1c Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Fri, 13 May 2016 00:47:38 +0200 Subject: Conditionalized V8 on version and used C++11 list initializers --- contrib/cmake/FindV8.cmake | 8 +++--- src/uscxml/interpreter/MicroStepFast.cpp | 24 +++++++++-------- src/uscxml/transform/ChartToC.cpp | 45 ++++++++++++++------------------ src/uscxml/util/DOM.cpp | 12 ++++++--- src/uscxml/util/DOM.h | 17 ------------ 5 files changed, 45 insertions(+), 61 deletions(-) diff --git a/contrib/cmake/FindV8.cmake b/contrib/cmake/FindV8.cmake index e3ec38c..725d9d1 100644 --- a/contrib/cmake/FindV8.cmake +++ b/contrib/cmake/FindV8.cmake @@ -55,11 +55,11 @@ include(CheckCXXSourceCompiles) set(CMAKE_REQUIRED_INCLUDES ${V8_INCLUDE_DIR}) set(CMAKE_REQUIRED_LIBRARIES ${V8_LIBRARY}) check_cxx_source_compiles(" - #include - int main(){ v8::Array::New(v8::Isolate::GetCurrent()); } -" V8_VER_AFTER_032318) + #include + int main(){ v8::Local foo = v8::Array::New(v8::Isolate::GetCurrent()); } +" V8_VER_GREATER_032317) -if (NOT V8_VER_AFTER_032318) +if (NOT V8_VER_GREATER_032317) message(STATUS "Your V8 installation is too old - we need >= 3.23.17") unset(V8_LIBRARY) unset(V8_INCLUDE_DIR) diff --git a/src/uscxml/interpreter/MicroStepFast.cpp b/src/uscxml/interpreter/MicroStepFast.cpp index fbddbc9..158c3ee 100644 --- a/src/uscxml/interpreter/MicroStepFast.cpp +++ b/src/uscxml/interpreter/MicroStepFast.cpp @@ -172,18 +172,17 @@ void MicroStepFast::init(xercesc::DOMElement* scxml) { /** -- All things states -- */ - std::set elements; - elements.insert(_xmlPrefix.str() + "state"); - elements.insert(_xmlPrefix.str() + "parallel"); - elements.insert(_xmlPrefix.str() + "scxml"); - elements.insert(_xmlPrefix.str() + "initial"); - elements.insert(_xmlPrefix.str() + "final"); - elements.insert(_xmlPrefix.str() + "history"); - std::list tmp; size_t i, j; - tmp = DOMUtils::inDocumentOrder(elements, _scxml); + tmp = DOMUtils::inDocumentOrder({ + _xmlPrefix.str() + "state", + _xmlPrefix.str() + "parallel", + _xmlPrefix.str() + "scxml", + _xmlPrefix.str() + "initial", + _xmlPrefix.str() + "final", + _xmlPrefix.str() + "history"}, _scxml); + _states.resize(tmp.size()); _configuration.resize(tmp.size()); _history.resize(tmp.size()); @@ -308,7 +307,7 @@ void MicroStepFast::init(xercesc::DOMElement* scxml) { /** -- All things transitions -- */ - tmp = DOMUtils::inPostFixOrder(_xmlPrefix.str() + "transition", _scxml); + tmp = DOMUtils::inPostFixOrder({_xmlPrefix.str() + "transition"}, _scxml); _transitions.resize(tmp.size()); for (i = 0; i < _transitions.size(); i++) { @@ -319,10 +318,13 @@ void MicroStepFast::init(xercesc::DOMElement* scxml) { _transitions[i]->target.resize(_states.size()); tmp.pop_front(); } - + assert(tmp.size() == 0); + for (i = 0; i < _transitions.size(); i++) { // establish the transitions' exit set + assert(_transitions[i]->element != NULL); + std::cout << "i: " << i << std::endl << std::flush; std::list exitList = getExitSet(_transitions[i]->element, _scxml); for (j = 0; j < _states.size(); j++) { if (!exitList.empty() && _states[j]->element == exitList.front()) { diff --git a/src/uscxml/transform/ChartToC.cpp b/src/uscxml/transform/ChartToC.cpp index 896ef09..d4a462a 100644 --- a/src/uscxml/transform/ChartToC.cpp +++ b/src/uscxml/transform/ChartToC.cpp @@ -68,10 +68,8 @@ ChartToC::ChartToC(const Interpreter& other) : TransformerImpl(other), _topMostM } void ChartToC::setHistoryCompletion() { - std::set elements; - elements.insert(XML_PREFIX(_scxml).str() + "history"); - std::list histories = DOMUtils::inPostFixOrder(elements, _scxml); + std::list histories = DOMUtils::inPostFixOrder({ XML_PREFIX(_scxml).str() + "history" }, _scxml); std::list covered; std::list perParentcovered; @@ -247,15 +245,14 @@ void ChartToC::prepare() { // make sure initial and history elements always precede propoer states resortStates(_scxml); - std::set elements; - elements.insert(XML_PREFIX(_scxml).str() + "scxml"); - elements.insert(XML_PREFIX(_scxml).str() + "state"); - elements.insert(XML_PREFIX(_scxml).str() + "final"); - elements.insert(XML_PREFIX(_scxml).str() + "history"); - elements.insert(XML_PREFIX(_scxml).str() + "initial"); - elements.insert(XML_PREFIX(_scxml).str() + "parallel"); - - std::list tmp = DOMUtils::inDocumentOrder(elements, _scxml); + std::list tmp = DOMUtils::inDocumentOrder({ + XML_PREFIX(_scxml).str() + "scxml", + XML_PREFIX(_scxml).str() + "state", + XML_PREFIX(_scxml).str() + "final", + XML_PREFIX(_scxml).str() + "history", + XML_PREFIX(_scxml).str() + "initial", + XML_PREFIX(_scxml).str() + "parallel" + }, _scxml); _states.insert(_states.end(), tmp.begin(), tmp.end()); // set states' document order and parent attribute @@ -300,9 +297,7 @@ void ChartToC::prepare() { // set transitions' document order and source attribute - elements.clear(); - elements.insert(XML_PREFIX(_scxml).str() + "transition"); - tmp = DOMUtils::inDocumentOrder(elements, _scxml); + tmp = DOMUtils::inDocumentOrder({ XML_PREFIX(_scxml).str() + "transition" }, _scxml); size_t index = 0; for (auto transIter = tmp.begin(); transIter != tmp.end(); transIter++, index++) { DOMElement* transition = *transIter; @@ -314,7 +309,7 @@ void ChartToC::prepare() { } // set transitions' postfix order attribute - tmp = DOMUtils::inPostFixOrder(elements, _scxml); + tmp = DOMUtils::inPostFixOrder({ XML_PREFIX(_scxml).str() + "transition" }, _scxml); _transitions.insert(_transitions.end(), tmp.begin(), tmp.end()); for (size_t i = 0; i < _transitions.size(); i++) { @@ -1032,7 +1027,7 @@ void ChartToC::writeHelpers(std::ostream& stream) { void ChartToC::writeExecContentFinalize(std::ostream& stream) { // needs to be written prior to invocation elem info - std::list finalizes = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "finalize", _scxml); + std::list finalizes = DOMUtils::inDocumentOrder({ XML_PREFIX(_scxml).str() + "finalize" }, _scxml); if (finalizes.size() > 0) { stream << "#ifndef USCXML_NO_EXEC_CONTENT" << std::endl; @@ -1502,7 +1497,7 @@ void ChartToC::writeElementInfo(std::ostream& stream) { stream << "#ifndef USCXML_NO_ELEM_INFO" << std::endl; stream << std::endl; - std::list foreachs = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "foreach", _scxml); + std::list foreachs = DOMUtils::inDocumentOrder({ XML_PREFIX(_scxml).str() + "foreach" }, _scxml); if (foreachs.size() > 0) { _hasElement.insert("foreach"); stream << "static const uscxml_elem_foreach " << _prefix << "_elem_foreachs[" << foreachs.size() << "] = {" << std::endl; @@ -1521,7 +1516,7 @@ void ChartToC::writeElementInfo(std::ostream& stream) { stream << std::endl; } - std::list assigns = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "assign", _scxml); + std::list assigns = DOMUtils::inDocumentOrder({ XML_PREFIX(_scxml).str() + "assign" }, _scxml); if (assigns.size() > 0) { _hasElement.insert("assign"); stream << "static const uscxml_elem_assign " << _prefix << "_elem_assigns[" << assigns.size() << "] = {" << std::endl; @@ -1554,7 +1549,7 @@ void ChartToC::writeElementInfo(std::ostream& stream) { } - std::list datas = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "data", _scxml); + std::list datas = DOMUtils::inDocumentOrder({ XML_PREFIX(_scxml).str() + "data" }, _scxml); if (datas.size() > 0) { _hasElement.insert("data"); size_t dataIndexOffset = 0; @@ -1612,7 +1607,7 @@ void ChartToC::writeElementInfo(std::ostream& stream) { stream << std::endl; } - std::list params = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "param", _scxml); + std::list params = DOMUtils::inDocumentOrder({ XML_PREFIX(_scxml).str() + "param" }, _scxml); if (params.size() > 0) { _hasElement.insert("param"); DOMNode* parent = NULL; @@ -1649,7 +1644,7 @@ void ChartToC::writeElementInfo(std::ostream& stream) { stream << std::endl; } - std::list sends = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "send", _scxml); + std::list sends = DOMUtils::inDocumentOrder({ XML_PREFIX(_scxml).str() + "send" }, _scxml); if (sends.size() > 0) { _hasElement.insert("send"); stream << "static const uscxml_elem_send " << _prefix << "_elem_sends[" << sends.size() << "] = {" << std::endl; @@ -1713,7 +1708,7 @@ void ChartToC::writeElementInfo(std::ostream& stream) { stream << std::endl; } - std::list donedatas = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "donedata", _scxml); + std::list donedatas = DOMUtils::inDocumentOrder({ XML_PREFIX(_scxml).str() + "donedata" }, _scxml); stream << "static const uscxml_elem_donedata " << _prefix << "_elem_donedatas[" << donedatas.size() + 1 << "] = {" << std::endl; stream << " /* source, content, contentexpr, params */" << std::endl; size_t i = 0; @@ -1975,9 +1970,7 @@ void ChartToC::writeTransitions(std::ostream& stream) { stream << std::endl; // cross reference transition by document order - is this really needed?! - std::set elements; - elements.insert(XML_PREFIX(_scxml).str() + "transition"); - std::list transDocOrder = DOMUtils::inDocumentOrder(elements, _scxml); + std::list transDocOrder = DOMUtils::inDocumentOrder({ XML_PREFIX(_scxml).str() + "transition" }, _scxml); if (_transitions.size() > 0) { stream << "static const uscxml_transition " << _prefix << "_transitions[" << toStr(_transitions.size()) << "] = {" << std::endl; diff --git a/src/uscxml/util/DOM.cpp b/src/uscxml/util/DOM.cpp index c7ed1e9..b68901c 100644 --- a/src/uscxml/util/DOM.cpp +++ b/src/uscxml/util/DOM.cpp @@ -233,6 +233,9 @@ void DOMUtils::inPostFixOrder(const std::set& elements, const bool includeEmbeddedDoc, std::list& nodes) { + if (root == NULL) + return; + DOMNodeList* children = root->getChildNodes(); for (size_t i = 0; i < children->getLength(); i++) { if (children->item(i)->getNodeType() != DOMNode::ELEMENT_NODE) @@ -257,8 +260,8 @@ void DOMUtils::inPostFixOrder(const std::set& elements, } std::list DOMUtils::inDocumentOrder(const std::set& elements, - const DOMElement* root, - const bool includeEmbeddedDoc) { + const DOMElement* root, + const bool includeEmbeddedDoc) { std::list nodes; inDocumentOrder(elements, root, includeEmbeddedDoc, nodes); return nodes; @@ -268,7 +271,10 @@ void DOMUtils::inDocumentOrder(const std::set& elements, const DOMElement* root, const bool includeEmbeddedDoc, std::list& nodes) { - if (elements.find(TAGNAME(root)) != elements.end()) { + if (root == NULL) + return; + + if (elements.find(TAGNAME(root)) != elements.end()) { nodes.push_back((DOMElement*)root); } diff --git a/src/uscxml/util/DOM.h b/src/uscxml/util/DOM.h index 4eb0e36..1f2ced2 100644 --- a/src/uscxml/util/DOM.h +++ b/src/uscxml/util/DOM.h @@ -75,27 +75,10 @@ public: static std::list getElementsByType(const xercesc::DOMNode* root, xercesc::DOMNode::NodeType type); - static std::list inPostFixOrder(const std::string& element, - const xercesc::DOMElement* root, - const bool includeEmbeddedDoc = false) { - std::set elements; - elements.insert(element); - return inPostFixOrder(elements, root, includeEmbeddedDoc); - } - static std::list inPostFixOrder(const std::set& elements, const xercesc::DOMElement* root, const bool includeEmbeddedDoc = false); - - static std::list inDocumentOrder(const std::string& element, - const xercesc::DOMElement* root, - const bool includeEmbeddedDoc = false) { - std::set elements; - elements.insert(element); - return inDocumentOrder(elements, root, includeEmbeddedDoc); - } - static std::list inDocumentOrder(const std::set& elements, const xercesc::DOMElement* root, const bool includeEmbeddedDoc = false); -- cgit v0.12