summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Radomski <github@mintwerk.de>2016-05-12 22:47:38 (GMT)
committerStefan Radomski <github@mintwerk.de>2016-05-12 22:47:38 (GMT)
commit280b5072b35cb9658ad4e6be0203a587c0593b1c (patch)
treeabfb59100608dba6df017d3ed52cde3bdf471b74
parent11e7301fb1f86a35e35072c8e4753095d28dc43c (diff)
downloaduscxml-280b5072b35cb9658ad4e6be0203a587c0593b1c.zip
uscxml-280b5072b35cb9658ad4e6be0203a587c0593b1c.tar.gz
uscxml-280b5072b35cb9658ad4e6be0203a587c0593b1c.tar.bz2
Conditionalized V8 on version and used C++11 list initializers
-rw-r--r--contrib/cmake/FindV8.cmake8
-rw-r--r--src/uscxml/interpreter/MicroStepFast.cpp24
-rw-r--r--src/uscxml/transform/ChartToC.cpp45
-rw-r--r--src/uscxml/util/DOM.cpp12
-rw-r--r--src/uscxml/util/DOM.h17
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 <v8>
- int main(){ v8::Array::New(v8::Isolate::GetCurrent()); }
-" V8_VER_AFTER_032318)
+ #include <v8.h>
+ int main(){ v8::Local<v8::Value> 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<std::string> 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<xercesc::DOMElement*> 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<DOMElement*> 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<std::string> elements;
- elements.insert(XML_PREFIX(_scxml).str() + "history");
- std::list<DOMElement*> histories = DOMUtils::inPostFixOrder(elements, _scxml);
+ std::list<DOMElement*> histories = DOMUtils::inPostFixOrder({ XML_PREFIX(_scxml).str() + "history" }, _scxml);
std::list<DOMElement*> covered;
std::list<DOMElement*> perParentcovered;
@@ -247,15 +245,14 @@ void ChartToC::prepare() {
// make sure initial and history elements always precede propoer states
resortStates(_scxml);
- std::set<std::string> 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<xercesc::DOMElement*> tmp = DOMUtils::inDocumentOrder(elements, _scxml);
+ std::list<xercesc::DOMElement*> 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<DOMElement*> finalizes = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "finalize", _scxml);
+ std::list<DOMElement*> 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<DOMElement*> foreachs = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "foreach", _scxml);
+ std::list<DOMElement*> 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<DOMElement*> assigns = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "assign", _scxml);
+ std::list<DOMElement*> 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<DOMElement*> datas = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "data", _scxml);
+ std::list<DOMElement*> 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<DOMElement*> params = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "param", _scxml);
+ std::list<DOMElement*> 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<DOMElement*> sends = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "send", _scxml);
+ std::list<DOMElement*> 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<DOMElement*> donedatas = DOMUtils::inDocumentOrder(XML_PREFIX(_scxml).str() + "donedata", _scxml);
+ std::list<DOMElement*> 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<std::string> elements;
- elements.insert(XML_PREFIX(_scxml).str() + "transition");
- std::list<DOMElement*> transDocOrder = DOMUtils::inDocumentOrder(elements, _scxml);
+ std::list<DOMElement*> 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<std::string>& elements,
const bool includeEmbeddedDoc,
std::list<DOMElement*>& 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<std::string>& elements,
}
std::list<DOMElement*> DOMUtils::inDocumentOrder(const std::set<std::string>& elements,
- const DOMElement* root,
- const bool includeEmbeddedDoc) {
+ const DOMElement* root,
+ const bool includeEmbeddedDoc) {
std::list<DOMElement*> nodes;
inDocumentOrder(elements, root, includeEmbeddedDoc, nodes);
return nodes;
@@ -268,7 +271,10 @@ void DOMUtils::inDocumentOrder(const std::set<std::string>& elements,
const DOMElement* root,
const bool includeEmbeddedDoc,
std::list<DOMElement*>& 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<xercesc::DOMNode*> getElementsByType(const xercesc::DOMNode* root,
xercesc::DOMNode::NodeType type);
- static std::list<xercesc::DOMElement*> inPostFixOrder(const std::string& element,
- const xercesc::DOMElement* root,
- const bool includeEmbeddedDoc = false) {
- std::set<std::string> elements;
- elements.insert(element);
- return inPostFixOrder(elements, root, includeEmbeddedDoc);
- }
-
static std::list<xercesc::DOMElement*> inPostFixOrder(const std::set<std::string>& elements,
const xercesc::DOMElement* root,
const bool includeEmbeddedDoc = false);
-
- static std::list<xercesc::DOMElement*> inDocumentOrder(const std::string& element,
- const xercesc::DOMElement* root,
- const bool includeEmbeddedDoc = false) {
- std::set<std::string> elements;
- elements.insert(element);
- return inDocumentOrder(elements, root, includeEmbeddedDoc);
- }
-
static std::list<xercesc::DOMElement*> inDocumentOrder(const std::set<std::string>& elements,
const xercesc::DOMElement* root,
const bool includeEmbeddedDoc = false);