summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorazhornyak <alexander.zhornyak@gmail.com>2017-05-13 15:43:52 (GMT)
committerazhornyak <alexander.zhornyak@gmail.com>2017-05-13 15:43:52 (GMT)
commit82087b37adc295d1aab5afd51f855f8d9f0923f8 (patch)
treeb4fe19d3abafa2e0ef4905bfb45b47d24c3bff15 /src
parentdacba30880611af98b40ed908797da935a185d81 (diff)
downloaduscxml-82087b37adc295d1aab5afd51f855f8d9f0923f8.zip
uscxml-82087b37adc295d1aab5afd51f855f8d9f0923f8.tar.gz
uscxml-82087b37adc295d1aab5afd51f855f8d9f0923f8.tar.bz2
Fixes issue #126
Fixes issue #128 Fixes issue #124 Fixes issue #118
Diffstat (limited to 'src')
-rw-r--r--src/uscxml/interpreter/BasicContentExecutor.cpp30
-rw-r--r--src/uscxml/messages/Event.h8
-rw-r--r--src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp73
-rw-r--r--src/uscxml/plugins/datamodel/lua/LuaDataModel.h2
-rw-r--r--src/uscxml/util/Convenience.h6
5 files changed, 71 insertions, 48 deletions
diff --git a/src/uscxml/interpreter/BasicContentExecutor.cpp b/src/uscxml/interpreter/BasicContentExecutor.cpp
index a21255a..cb77d9a 100644
--- a/src/uscxml/interpreter/BasicContentExecutor.cpp
+++ b/src/uscxml/interpreter/BasicContentExecutor.cpp
@@ -67,7 +67,7 @@ void BasicContentExecutor::processSend(XERCESC_NS::DOMElement* element) {
sendEvent.name = ATTR(element, kXMLCharEvent);
}
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element eventexpr", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element eventexpr", element);
}
try {
@@ -78,7 +78,7 @@ void BasicContentExecutor::processSend(XERCESC_NS::DOMElement* element) {
target = ATTR(element, kXMLCharTarget);
}
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element targetexpr", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element targetexpr", element);
}
try {
@@ -89,7 +89,7 @@ void BasicContentExecutor::processSend(XERCESC_NS::DOMElement* element) {
type = ATTR(element, kXMLCharType);
}
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element typeexpr", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element typeexpr", element);
}
try {
@@ -124,7 +124,7 @@ void BasicContentExecutor::processSend(XERCESC_NS::DOMElement* element) {
}
}
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element idlocation", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element idlocation", element);
}
try {
@@ -148,14 +148,14 @@ void BasicContentExecutor::processSend(XERCESC_NS::DOMElement* element) {
}
}
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element delayexpr", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element delayexpr", element);
}
try {
// namelist
processNameLists(sendEvent.namelist, element);
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element namelist", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element namelist", element);
}
@@ -163,7 +163,7 @@ void BasicContentExecutor::processSend(XERCESC_NS::DOMElement* element) {
// params
processParams(sendEvent.params, element);
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element param expr", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element param expr", element);
}
try {
@@ -173,7 +173,7 @@ void BasicContentExecutor::processSend(XERCESC_NS::DOMElement* element) {
sendEvent.data = elementAsData(contents.front());
}
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element content", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element content", element);
}
// if (sendReq->dom) {
@@ -431,14 +431,14 @@ void BasicContentExecutor::invoke(XERCESC_NS::DOMElement* element) {
element->setUserData(kXMLCharInvokeId, (void*)invokeId, NULL);
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in invoke element idlocation", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in invoke element idlocation", element);
}
try {
// namelist
processNameLists(invokeEvent.namelist, element);
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element namelist", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element namelist", element);
}
@@ -446,7 +446,7 @@ void BasicContentExecutor::invoke(XERCESC_NS::DOMElement* element) {
// params
processParams(invokeEvent.params, element);
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in send element param expr", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in send element param expr", element);
}
try {
@@ -467,7 +467,7 @@ void BasicContentExecutor::invoke(XERCESC_NS::DOMElement* element) {
#endif
}
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in invoke element content", element);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in invoke element content", element);
}
// autoforward
@@ -513,7 +513,7 @@ void BasicContentExecutor::raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC
// namelist
processNameLists(doneEvent.namelist, doneData);
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in donedata element namelist", doneData);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in donedata element namelist", doneData);
}
@@ -521,7 +521,7 @@ void BasicContentExecutor::raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC
// params
processParams(doneEvent.params, doneData);
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in donedata element param expr", doneData);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in donedata element param expr", doneData);
}
try {
@@ -531,7 +531,7 @@ void BasicContentExecutor::raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC
doneEvent.data = elementAsData(contents.front());
}
} catch (Event e) {
- ERROR_EXECUTION_THROW2("Syntax error in donedata element content", doneData);
+ ERROR_EXECUTION_THROW3(e,"Syntax error in donedata element content", doneData);
}
} catch (ErrorEvent exc) {
diff --git a/src/uscxml/messages/Event.h b/src/uscxml/messages/Event.h
index b774f8a..fd9dd42 100644
--- a/src/uscxml/messages/Event.h
+++ b/src/uscxml/messages/Event.h
@@ -77,6 +77,14 @@
throw exc;\
}
+#define ERROR_EXECUTION_THROW3(evt,caption,node) \
+{\
+ auto it = evt.data.compound.find("cause"); \
+ ERROR_EXECUTION2(exc,it!=evt.data.compound.end() ? it->second.atom : "",node); \
+ exc.data.compound["caption"] = uscxml::Data(caption, uscxml::Data::VERBATIM); \
+ throw exc;\
+}
+
#define ERROR_COMMUNICATION_THROW(cause) \
{\
ERROR_COMMUNICATION(exc, cause); \
diff --git a/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp
index 899237a..ea90e8c 100644
--- a/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp
+++ b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp
@@ -212,12 +212,23 @@ int LuaDataModel::luaInFunction(lua_State * l) {
std::shared_ptr<DataModelImpl> LuaDataModel::create(DataModelCallbacks* callbacks) {
std::shared_ptr<LuaDataModel> dm(new LuaDataModel());
- dm->_callbacks = callbacks;
- dm->_luaState = luaL_newstate();
- luaL_openlibs(dm->_luaState);
+ dm->doCreate(callbacks);
+
+ return dm;
+}
+
+LuaDataModel::~LuaDataModel() {
+ if (_luaState != NULL)
+ lua_close(_luaState);
+}
+
+void LuaDataModel::doCreate(DataModelCallbacks* callbacks) {
+ this->_callbacks = callbacks;
+ this->_luaState = luaL_newstate();
+ luaL_openlibs(this->_luaState);
try {
- const luabridge::LuaRef& requireFunc = luabridge::getGlobal(dm->_luaState, "require");
+ const luabridge::LuaRef& requireFunc = luabridge::getGlobal(this->_luaState, "require");
if (requireFunc.isFunction()) {
const luabridge::LuaRef& resultLxp = requireFunc("lxp");
const luabridge::LuaRef& resultLxpLOM = requireFunc("lxp.lom");
@@ -225,48 +236,42 @@ std::shared_ptr<DataModelImpl> LuaDataModel::create(DataModelCallbacks* callback
// MSVC compiler bug with implicit cast operators, see comments in LuaRef class
if ((bool)resultLxp && (bool)resultLxpLOM) {
_luaHasXMLParser = true;
- luabridge::setGlobal(dm->_luaState, resultLxp, "lxp");
- luabridge::setGlobal(dm->_luaState, resultLxpLOM, "lxp.lom");
+ luabridge::setGlobal(this->_luaState, resultLxp, "lxp");
+ luabridge::setGlobal(this->_luaState, resultLxpLOM, "lxp.lom");
}
}
- } catch (luabridge::LuaException e) {
- LOG(dm->_callbacks->getLogger(), USCXML_INFO) << e.what() << std::endl;
+ }
+ catch (luabridge::LuaException e) {
+ LOG(this->_callbacks->getLogger(), USCXML_INFO) << e.what() << std::endl;
}
- luabridge::getGlobalNamespace(dm->_luaState).beginClass<LuaDataModel>("DataModel").endClass();
- luabridge::setGlobal(dm->_luaState, dm.get(), "__datamodel");
+ luabridge::getGlobalNamespace(this->_luaState).beginClass<LuaDataModel>("DataModel").endClass();
+ luabridge::setGlobal(this->_luaState, this, "__datamodel");
- luabridge::getGlobalNamespace(dm->_luaState).addCFunction("In", luaInFunction);
+ luabridge::getGlobalNamespace(this->_luaState).addCFunction("In", luaInFunction);
- luabridge::LuaRef ioProcTable = luabridge::newTable(dm->_luaState);
- std::map<std::string, IOProcessor> ioProcs = dm->_callbacks->getIOProcessors();
+ luabridge::LuaRef ioProcTable = luabridge::newTable(this->_luaState);
+ std::map<std::string, IOProcessor> ioProcs = this->_callbacks->getIOProcessors();
std::map<std::string, IOProcessor>::const_iterator ioProcIter = ioProcs.begin();
- while(ioProcIter != ioProcs.end()) {
+ while (ioProcIter != ioProcs.end()) {
Data ioProcData = ioProcIter->second.getDataModelVariables();
- ioProcTable[ioProcIter->first] = getDataAsLua(dm->_luaState, ioProcData);
+ ioProcTable[ioProcIter->first] = getDataAsLua(this->_luaState, ioProcData);
ioProcIter++;
}
- luabridge::setGlobal(dm->_luaState, ioProcTable, "_ioprocessors");
+ luabridge::setGlobal(this->_luaState, ioProcTable, "_ioprocessors");
- luabridge::LuaRef invTable = luabridge::newTable(dm->_luaState);
- std::map<std::string, Invoker> invokers = dm->_callbacks->getInvokers();
+ luabridge::LuaRef invTable = luabridge::newTable(this->_luaState);
+ std::map<std::string, Invoker> invokers = this->_callbacks->getInvokers();
std::map<std::string, Invoker>::const_iterator invIter = invokers.begin();
- while(invIter != invokers.end()) {
+ while (invIter != invokers.end()) {
Data invData = invIter->second.getDataModelVariables();
- invTable[invIter->first] = getDataAsLua(dm->_luaState, invData);
+ invTable[invIter->first] = getDataAsLua(this->_luaState, invData);
invIter++;
}
- luabridge::setGlobal(dm->_luaState, invTable, "_invokers");
-
- luabridge::setGlobal(dm->_luaState, dm->_callbacks->getName(), "_name");
- luabridge::setGlobal(dm->_luaState, dm->_callbacks->getSessionId(), "_sessionid");
+ luabridge::setGlobal(this->_luaState, invTable, "_invokers");
- return dm;
-}
-
-LuaDataModel::~LuaDataModel() {
- if (_luaState != NULL)
- lua_close(_luaState);
+ luabridge::setGlobal(this->_luaState, this->_callbacks->getName(), "_name");
+ luabridge::setGlobal(this->_luaState, this->_callbacks->getSessionId(), "_sessionid");
}
void LuaDataModel::addExtension(DataModelExtension* ext) {
@@ -484,6 +489,7 @@ void LuaDataModel::assign(const std::string& location, const Data& data, const s
// JSObjectSetProperty(_ctx, JSContextGetGlobalObject(_ctx), JSStringCreateWithUTF8CString(location.c_str()), getNodeAsValue(data.node), 0, &exception);
} else {
+#if 0
// trigger error.execution for undefined locations, test286 test311
int retVals = luaEval(_luaState, location + " = " + location);
lua_pop(_luaState, retVals);
@@ -504,9 +510,14 @@ void LuaDataModel::assign(const std::string& location, const Data& data, const s
if (idPath.size() == 0)
return;
+#endif
luabridge::LuaRef lua = getDataAsLua(_luaState, data);
+ luabridge::setGlobal(_luaState, lua, "__tmpAssign");
+ evalAsScript(location + "= __tmpAssign");
+
+#if 0
if (idPath.size() == 1) {
// trivial case where we reference a simple toplevel identifier
luabridge::setGlobal(_luaState, lua, location.c_str());
@@ -559,7 +570,7 @@ void LuaDataModel::assign(const std::string& location, const Data& data, const s
}
}
-
+#endif
// std::cout << Data::toJSON(evalAsData(location)) << std::endl;
}
}
diff --git a/src/uscxml/plugins/datamodel/lua/LuaDataModel.h b/src/uscxml/plugins/datamodel/lua/LuaDataModel.h
index a71a734..4912868 100644
--- a/src/uscxml/plugins/datamodel/lua/LuaDataModel.h
+++ b/src/uscxml/plugins/datamodel/lua/LuaDataModel.h
@@ -91,6 +91,8 @@ protected:
static int luaInFunction(lua_State * l);
lua_State* _luaState;
+
+ void doCreate(DataModelCallbacks* callbacks);
};
#ifdef BUILD_AS_PLUGINS
diff --git a/src/uscxml/util/Convenience.h b/src/uscxml/util/Convenience.h
index 98c4220..dec027f 100644
--- a/src/uscxml/util/Convenience.h
+++ b/src/uscxml/util/Convenience.h
@@ -29,14 +29,16 @@ namespace uscxml {
inline bool isnan(double x);
// see http://stackoverflow.com/questions/228005/alternative-to-itoa-for-converting-integer-to-string-c
-template <typename T> std::string USCXML_API toStr(T tmp) {
+// error C2491 !!! template <typename T> std::string USCXML_API toStr(T tmp) {
+template <typename T> std::string toStr(T tmp) {
std::ostringstream outSS;
outSS.precision(std::numeric_limits<double>::digits10 + 1);
outSS << tmp;
return outSS.str();
}
-template <typename T> T USCXML_API strTo(std::string tmp) {
+// error C2491 !!! template <typename T> T USCXML_API strTo(std::string tmp) {
+template <typename T> T strTo(std::string tmp) {
T output;
std::istringstream in(tmp);
in >> output;