summaryrefslogtreecommitdiffstats
path: root/src/uscxml/interpreter
diff options
context:
space:
mode:
authorStefan Radomski <github@mintwerk.de>2017-08-01 21:47:10 (GMT)
committerStefan Radomski <github@mintwerk.de>2017-08-01 21:47:10 (GMT)
commit045bde78c0587316e0373c7698413412d0f315f9 (patch)
treef90d4ceb9d48fdc0dc240fce031dc81308e471dd /src/uscxml/interpreter
parente0a7e43e2e41639bb50127cc5419b712a7b1f6e2 (diff)
downloaduscxml-045bde78c0587316e0373c7698413412d0f315f9.zip
uscxml-045bde78c0587316e0373c7698413412d0f315f9.tar.gz
uscxml-045bde78c0587316e0373c7698413412d0f315f9.tar.bz2
Reenabled V8, Debugger tests and smaller fixes
Diffstat (limited to 'src/uscxml/interpreter')
-rw-r--r--src/uscxml/interpreter/BasicContentExecutor.cpp22
-rw-r--r--src/uscxml/interpreter/BasicContentExecutor.h2
-rw-r--r--src/uscxml/interpreter/ContentExecutor.cpp4
-rw-r--r--src/uscxml/interpreter/ContentExecutor.h2
-rw-r--r--src/uscxml/interpreter/ContentExecutorImpl.h2
-rw-r--r--src/uscxml/interpreter/InterpreterImpl.cpp19
6 files changed, 28 insertions, 23 deletions
diff --git a/src/uscxml/interpreter/BasicContentExecutor.cpp b/src/uscxml/interpreter/BasicContentExecutor.cpp
index 87c2180..7b62fd4 100644
--- a/src/uscxml/interpreter/BasicContentExecutor.cpp
+++ b/src/uscxml/interpreter/BasicContentExecutor.cpp
@@ -251,7 +251,7 @@ void BasicContentExecutor::processAssign(XERCESC_NS::DOMElement* content) {
additionalAttr[X(attr->getNodeName()).str()] = X(attr->getNodeValue()).str();
}
- _callbacks->assign(location, elementAsData(content, true), additionalAttr);
+ _callbacks->assign(location, elementAsData(content), additionalAttr);
}
void BasicContentExecutor::processForeach(XERCESC_NS::DOMElement* content) {
@@ -545,7 +545,12 @@ void BasicContentExecutor::raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC
// content
std::list<DOMElement*> contents = DOMUtils::filterChildElements(XML_PREFIX(doneData).str() + "content", doneData);
if (contents.size() > 0) {
- doneEvent.data = elementAsData(contents.front());
+ if (HAS_ATTR(contents.front(), kXMLCharExpr) &&
+ !_callbacks->isLegalDataValue(ATTR(contents.front(), kXMLCharExpr))) {
+ ERROR_EXECUTION_THROW2("Expression '" + ATTR(contents.front(), kXMLCharExpr) + "' is not a legal data value", contents.front());
+ } else {
+ doneEvent.data = elementAsData(contents.front());
+ }
}
} catch (ErrorEvent e) {
ERROR_EXECUTION_RETHROW(e, "Syntax error in donedata element content", doneData);
@@ -594,15 +599,14 @@ void BasicContentExecutor::processParams(std::multimap<std::string, Data>& param
}
}
-Data BasicContentExecutor::elementAsData(XERCESC_NS::DOMElement* element, bool asExpression) {
+Data BasicContentExecutor::elementAsData(XERCESC_NS::DOMElement* element) {
// element with expr
if (HAS_ATTR(element, kXMLCharExpr)) {
- std::string expr = ATTR(element, kXMLCharExpr);
- if (_callbacks->isLegalDataValue(expr)) {
- return Data(expr, Data::INTERPRETED);
- } else {
- ERROR_EXECUTION_THROW2("Expression '" + expr + "' is not a legal data value", element);
- }
+ // we cannot throw here:
+ // - with init, we need to check in the datamodel
+ // - with content, we need to invoke isLegalDataValue later
+ // test 277, 528
+ return Data(ATTR(element, kXMLCharExpr), Data::INTERPRETED);
}
// element with external src - this ought to behave just as with child nodes below
diff --git a/src/uscxml/interpreter/BasicContentExecutor.h b/src/uscxml/interpreter/BasicContentExecutor.h
index 469c28e..de756dc 100644
--- a/src/uscxml/interpreter/BasicContentExecutor.h
+++ b/src/uscxml/interpreter/BasicContentExecutor.h
@@ -53,7 +53,7 @@ public:
virtual void uninvoke(XERCESC_NS::DOMElement* invoke);
virtual void raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC_NS::DOMElement* doneData);
- virtual Data elementAsData(XERCESC_NS::DOMElement* element, bool asExpression = false);
+ virtual Data elementAsData(XERCESC_NS::DOMElement* element);
protected:
void processNameLists(std::map<std::string, Data>& nameMap, XERCESC_NS::DOMElement* element);
diff --git a/src/uscxml/interpreter/ContentExecutor.cpp b/src/uscxml/interpreter/ContentExecutor.cpp
index 4aa6eb4..3e20e50 100644
--- a/src/uscxml/interpreter/ContentExecutor.cpp
+++ b/src/uscxml/interpreter/ContentExecutor.cpp
@@ -35,8 +35,8 @@ void ContentExecutor::uninvoke(XERCESC_NS::DOMElement* invoke) {
_impl->uninvoke(invoke);
}
-Data ContentExecutor::elementAsData(XERCESC_NS::DOMElement* element, bool asExpression) {
- return _impl->elementAsData(element, asExpression);
+Data ContentExecutor::elementAsData(XERCESC_NS::DOMElement* element) {
+ return _impl->elementAsData(element);
}
void ContentExecutor::raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC_NS::DOMElement* doneData) {
diff --git a/src/uscxml/interpreter/ContentExecutor.h b/src/uscxml/interpreter/ContentExecutor.h
index 78fdf94..64d1da6 100644
--- a/src/uscxml/interpreter/ContentExecutor.h
+++ b/src/uscxml/interpreter/ContentExecutor.h
@@ -46,7 +46,7 @@ public:
virtual void process(XERCESC_NS::DOMElement* block);
virtual void invoke(XERCESC_NS::DOMElement* invoke);
virtual void uninvoke(XERCESC_NS::DOMElement* invoke);
- virtual Data elementAsData(XERCESC_NS::DOMElement* element, bool asExpression = false);
+ virtual Data elementAsData(XERCESC_NS::DOMElement* element);
virtual void raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC_NS::DOMElement* doneData);
virtual std::shared_ptr<ContentExecutorImpl> getImpl() const;
diff --git a/src/uscxml/interpreter/ContentExecutorImpl.h b/src/uscxml/interpreter/ContentExecutorImpl.h
index 8221591..42ef738 100644
--- a/src/uscxml/interpreter/ContentExecutorImpl.h
+++ b/src/uscxml/interpreter/ContentExecutorImpl.h
@@ -100,7 +100,7 @@ public:
virtual void uninvoke(XERCESC_NS::DOMElement* invoke) = 0;
virtual void raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC_NS::DOMElement* doneData) = 0;
- virtual Data elementAsData(XERCESC_NS::DOMElement* element, bool asExpression = false) = 0;
+ virtual Data elementAsData(XERCESC_NS::DOMElement* element) = 0;
protected:
ContentExecutorCallbacks* _callbacks;
diff --git a/src/uscxml/interpreter/InterpreterImpl.cpp b/src/uscxml/interpreter/InterpreterImpl.cpp
index 185ad75..5d6ced1 100644
--- a/src/uscxml/interpreter/InterpreterImpl.cpp
+++ b/src/uscxml/interpreter/InterpreterImpl.cpp
@@ -142,7 +142,7 @@ void InterpreterImpl::reset() {
if (_microStepper)
_microStepper.reset();
-// _isInitialized = false;
+ _isInitialized = false;
_state = USCXML_INSTANTIATED;
// _dataModel.reset();
if (_delayQueue)
@@ -320,7 +320,12 @@ SCXML_STOP_SEARCH:
XERCESC_NS::DOMText* scriptText = _document->createTextNode(X(contents));
XERCESC_NS::DOMNode* newNode = _document->importNode(scriptText, true);
script->appendChild(newNode);
- script->removeAttribute(kXMLCharSource); // remove attribute for validation: see issue 141
+ /**
+ * We nees to download all scripts (issue134) but also fail validation when there
+ * are child nodes with the src attribute present (issue141). Make a note that we
+ * already downloaded the content.
+ */
+ script->setUserData(X("downloaded"), newNode, NULL);
}
}
@@ -378,7 +383,6 @@ void InterpreterImpl::init() {
// do not override if already set
if (_ioProcs.find(ioProcIter->first) != _ioProcs.end()) {
- ioProcIter++;
continue;
}
@@ -438,15 +442,12 @@ void InterpreterImpl::initData(XERCESC_NS::DOMElement* root) {
} else if (_invokeReq.namelist.find(id) != _invokeReq.namelist.end()) {
_dataModel.init(id, _invokeReq.namelist[id], additionalAttr);
} else {
- try {
- _dataModel.init(id, _execContent.elementAsData(root), additionalAttr);
- } catch (ErrorEvent e) {
- // test 453
- _dataModel.init(id, _execContent.elementAsData(root, true), additionalAttr);
- }
+ _dataModel.init(id, _execContent.elementAsData(root), additionalAttr);
}
} catch(ErrorEvent e) {
// test 277
+ e.data.compound["xpath"] = uscxml::Data(DOMUtils::xPathForNode(root), uscxml::Data::VERBATIM);
+ \
enqueueInternal(e);
}
}