From fa6b4f074d4be04d913d8b7dc062920341c34ecb Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Thu, 16 Jun 2016 16:51:27 +0200 Subject: Fixed issue86 and some more bug fixes --- contrib/src/easylogging++.h | 6 +-- src/uscxml/debug/InterpreterIssue.cpp | 2 +- src/uscxml/interpreter/BasicContentExecutor.cpp | 8 ++-- src/uscxml/interpreter/BasicEventQueue.cpp | 11 +++++ src/uscxml/interpreter/BasicEventQueue.h | 4 +- src/uscxml/interpreter/EventQueue.cpp | 3 ++ src/uscxml/interpreter/EventQueue.h | 1 + src/uscxml/interpreter/EventQueueImpl.h | 1 + src/uscxml/interpreter/FastMicroStep.cpp | 4 +- src/uscxml/interpreter/InterpreterImpl.h | 7 ++- .../ecmascript/JavaScriptCore/JSCDataModel.cpp | 20 ++++++++- .../datamodel/ecmascript/v8/V8DataModel.cpp | 20 ++++++++- src/uscxml/transform/ChartToC.cpp | 2 +- src/uscxml/util/DOM.h | 5 +++ src/uscxml/util/Predicates.cpp | 25 +++++++---- src/uscxml/util/Predicates.h | 2 +- test/CMakeLists.txt | 50 +++++++++++++++------- test/ctest/CTestCustom.ctest.in | 2 + test/issues/test-issue86.scxml | 36 ++++++++++++++++ test/src/test-gen-c.cpp | 9 ++-- test/src/test-stress.cpp | 7 ++- 21 files changed, 178 insertions(+), 47 deletions(-) create mode 100644 test/issues/test-issue86.scxml diff --git a/contrib/src/easylogging++.h b/contrib/src/easylogging++.h index 7378d41..b00f074 100644 --- a/contrib/src/easylogging++.h +++ b/contrib/src/easylogging++.h @@ -2611,9 +2611,9 @@ public: setGlobally(ConfigurationType::Format, std::string("%datetime %level %fbase:%line: %msg"), true); set(Level::Debug, ConfigurationType::Format, std::string("%datetime %level [%logger] [%user@%host] [%func] [%loc] %msg")); // INFO and WARNING are set to default by Level::Global - set(Level::Error, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); - set(Level::Fatal, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); - set(Level::Verbose, ConfigurationType::Format, std::string("%datetime %level-%vlevel [%logger] %msg")); + set(Level::Error, ConfigurationType::Format, std::string("%datetime %level %fbase:%line: %msg")); + set(Level::Fatal, ConfigurationType::Format, std::string("%datetime %level %fbase:%line: %msg")); + set(Level::Verbose, ConfigurationType::Format, std::string("%datetime %level-%vlevel %fbase:%line: %msg")); set(Level::Trace, ConfigurationType::Format, std::string("%datetime %level [%logger] [%func] [%loc] %msg")); } diff --git a/src/uscxml/debug/InterpreterIssue.cpp b/src/uscxml/debug/InterpreterIssue.cpp index 49d31c8..df2d125 100644 --- a/src/uscxml/debug/InterpreterIssue.cpp +++ b/src/uscxml/debug/InterpreterIssue.cpp @@ -384,7 +384,7 @@ std::list InterpreterIssue::forInterpreter(InterpreterImpl* in } // check whether state is reachable - if (!DOMUtils::isMember(state, reachable) && !isInEmbeddedDocument(state)) { + if (!DOMUtils::isMember(state, reachable) && areFromSameMachine(state, interpreter->_scxml)) { issues.push_back(InterpreterIssue("State with id '" + stateId + "' is unreachable", state, InterpreterIssue::USCXML_ISSUE_FATAL)); } diff --git a/src/uscxml/interpreter/BasicContentExecutor.cpp b/src/uscxml/interpreter/BasicContentExecutor.cpp index 366c4bd..58d3eae 100644 --- a/src/uscxml/interpreter/BasicContentExecutor.cpp +++ b/src/uscxml/interpreter/BasicContentExecutor.cpp @@ -404,7 +404,7 @@ void BasicContentExecutor::invoke(XERCESC_NS::DOMElement* element) { } } - // we need the invokeid to uninvoke - TODO: This is leaking! + // we need the invokeid to uninvoke char* invokeId = (char*)malloc(invokeEvent.invokeid.size() + 1); memcpy(invokeId, invokeEvent.invokeid.c_str(), invokeEvent.invokeid.size()); invokeId[invokeEvent.invokeid.size()] = 0; @@ -469,7 +469,6 @@ void BasicContentExecutor::invoke(XERCESC_NS::DOMElement* element) { } void BasicContentExecutor::uninvoke(XERCESC_NS::DOMElement* invoke) { - // TODO: DANGER This is the real danger here char* invokeId = (char*)invoke->getUserData(X("invokeid")); assert(invokeId != NULL); @@ -557,13 +556,16 @@ void BasicContentExecutor::processParams(std::multimap& param Data BasicContentExecutor::elementAsData(XERCESC_NS::DOMElement* element) { if (HAS_ATTR(element, "expr")) { // return _callbacks->evalAsData(ATTR(element, "expr")); - if (LOCALNAME(element) == "content") { +#if 0 + if (LOCALNAME(element) == "content") { // test 528 return _callbacks->evalAsData(ATTR(element, "expr")); } else { // test 326 return Data(ATTR(element, "expr"), Data::INTERPRETED); } +#endif + return _callbacks->evalAsData(ATTR(element, "expr")); } if (HAS_ATTR(element, "src")) { diff --git a/src/uscxml/interpreter/BasicEventQueue.cpp b/src/uscxml/interpreter/BasicEventQueue.cpp index d484ada..7505f46 100644 --- a/src/uscxml/interpreter/BasicEventQueue.cpp +++ b/src/uscxml/interpreter/BasicEventQueue.cpp @@ -74,6 +74,11 @@ void BasicEventQueue::enqueue(const Event& event) { _cond.notify_all(); } +void BasicEventQueue::reset() { + std::lock_guard lock(_mutex); + _queue.clear(); +} + static void dummyCallback(evutil_socket_t fd, short what, void *arg) { timeval tv; tv.tv_sec = 365 * 24 * 3600; @@ -206,4 +211,10 @@ void BasicDelayedEventQueue::stop() { } } +void BasicDelayedEventQueue::reset() { + std::lock_guard lock(_mutex); + cancelAllDelayed(); + _queue.clear(); +} + } \ No newline at end of file diff --git a/src/uscxml/interpreter/BasicEventQueue.h b/src/uscxml/interpreter/BasicEventQueue.h index a6374d8..1542e30 100644 --- a/src/uscxml/interpreter/BasicEventQueue.h +++ b/src/uscxml/interpreter/BasicEventQueue.h @@ -43,7 +43,8 @@ public: virtual ~BasicEventQueue(); virtual Event dequeue(size_t blockMs); virtual void enqueue(const Event& event); - + virtual void reset(); + protected: std::list _queue; std::recursive_mutex _mutex; @@ -67,6 +68,7 @@ public: virtual void enqueue(const Event& event) { return BasicEventQueue::enqueue(event); } + virtual void reset(); protected: struct callbackData { diff --git a/src/uscxml/interpreter/EventQueue.cpp b/src/uscxml/interpreter/EventQueue.cpp index c460e02..7ff0bfb 100644 --- a/src/uscxml/interpreter/EventQueue.cpp +++ b/src/uscxml/interpreter/EventQueue.cpp @@ -38,6 +38,9 @@ Event EventQueue::dequeue(size_t blockMs) { void EventQueue::enqueue(const Event& event) { return _impl->enqueue(event); } +void EventQueue::reset() { + return _impl->reset(); +} PIMPL_OPERATORS_INHERIT_IMPL(DelayedEventQueue, EventQueue) diff --git a/src/uscxml/interpreter/EventQueue.h b/src/uscxml/interpreter/EventQueue.h index 1e8b018..37b90be 100644 --- a/src/uscxml/interpreter/EventQueue.h +++ b/src/uscxml/interpreter/EventQueue.h @@ -38,6 +38,7 @@ public: virtual Event dequeue(size_t blockMs); virtual void enqueue(const Event& event); + virtual void reset(); protected: std::shared_ptr _impl; diff --git a/src/uscxml/interpreter/EventQueueImpl.h b/src/uscxml/interpreter/EventQueueImpl.h index 1ccd3f1..befd684 100644 --- a/src/uscxml/interpreter/EventQueueImpl.h +++ b/src/uscxml/interpreter/EventQueueImpl.h @@ -42,6 +42,7 @@ class USCXML_API EventQueueImpl { public: virtual Event dequeue(size_t blockMs) = 0; virtual void enqueue(const Event& event) = 0; + virtual void reset() = 0; }; /** diff --git a/src/uscxml/interpreter/FastMicroStep.cpp b/src/uscxml/interpreter/FastMicroStep.cpp index 927fbbc..ea43c5d 100644 --- a/src/uscxml/interpreter/FastMicroStep.cpp +++ b/src/uscxml/interpreter/FastMicroStep.cpp @@ -234,8 +234,8 @@ void FastMicroStep::init(XERCESC_NS::DOMElement* scxml) { std::list dataModels = DOMUtils::filterChildElements(_xmlPrefix.str() + "datamodel", _states[0]->element, true); dataModels.erase(std::remove_if(dataModels.begin(), dataModels.end(), - [](DOMElement* elem) { - return isInEmbeddedDocument(elem); + [this](DOMElement* elem) { + return !areFromSameMachine(elem, _scxml); }), dataModels.end()); diff --git a/src/uscxml/interpreter/InterpreterImpl.h b/src/uscxml/interpreter/InterpreterImpl.h index e693bbf..be33306 100644 --- a/src/uscxml/interpreter/InterpreterImpl.h +++ b/src/uscxml/interpreter/InterpreterImpl.h @@ -76,11 +76,14 @@ public: } virtual void reset() {///< Reset state machine - _microStepper.reset(); + if (_microStepper) + _microStepper.reset(); + _isInitialized = false; _state = USCXML_INSTANTIATED; // _dataModel.reset(); -// _eventQueue.reset(); + if (_delayQueue) + _delayQueue.reset(); // _contentExecutor.reset(); } diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp index 35d9c4b..05d37d4 100644 --- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp +++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp @@ -28,6 +28,8 @@ #include "uscxml/util/DOM.h" #include +#include + #define EVENT_STRING_OR_UNDEF(field, cond) \ JSStringRef field##Name = JSStringCreateWithUTF8CString( #field ); \ JSStringRef field##Val = JSStringCreateWithUTF8CString(event.field.c_str()); \ @@ -399,7 +401,23 @@ Data JSCDataModel::evalAsData(const std::string& content) { Data JSCDataModel::getAsData(const std::string& content) { // parse as JSON test 578 - return Data::fromJSON(content); + Data d = Data::fromJSON(content); + if (!d.empty()) + return d; + + std::string trimmed = boost::trim_copy(content); + if (trimmed.length() > 0) { + if (isNumeric(trimmed.c_str(), 10)) { + d = Data(trimmed, Data::INTERPRETED); + } else if (trimmed.length() >= 2 && + ((trimmed[0] == '"' && trimmed[trimmed.length() - 1] == '"') || + (trimmed[0] == '\'' && trimmed[trimmed.length() - 1] == '\''))) { + d = Data(trimmed.substr(1, trimmed.length() - 2), Data::VERBATIM); + } else { + d = Data(trimmed, Data::INTERPRETED); + } + } + return d; } JSValueRef JSCDataModel::getDataAsValue(const Data& data) { diff --git a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp index 1db4f45..db65ebf 100644 --- a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp +++ b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp @@ -33,6 +33,8 @@ #include "uscxml/util/DOM.h" #include +#include + using namespace XERCESC_NS; static v8::Local XMLString2JS(const XMLCh* input) { @@ -421,7 +423,23 @@ void V8DataModel::setEvent(const Event& event) { } Data V8DataModel::getAsData(const std::string& content) { - return Data::fromJSON(content); + Data d = Data::fromJSON(content); + if (!d.empty()) + return d; + + std::string trimmed = boost::trim_copy(content); + if (trimmed.length() > 0) { + if (isNumeric(trimmed.c_str(), 10)) { + d = Data(trimmed, Data::INTERPRETED); + } else if (trimmed.length() >= 2 && + ((trimmed[0] == '"' && trimmed[trimmed.length() - 1] == '"') || + (trimmed[0] == '\'' && trimmed[trimmed.length() - 1] == '\''))) { + d = Data(trimmed.substr(1, trimmed.length() - 2), Data::VERBATIM); + } else { + d = Data(trimmed, Data::INTERPRETED); + } + } + return d; } Data V8DataModel::evalAsData(const std::string& content) { diff --git a/src/uscxml/transform/ChartToC.cpp b/src/uscxml/transform/ChartToC.cpp index b76d4da..84f325e 100644 --- a/src/uscxml/transform/ChartToC.cpp +++ b/src/uscxml/transform/ChartToC.cpp @@ -1726,7 +1726,7 @@ void ChartToC::writeElementInfo(std::ostream& stream) { std::stringstream ss; DOMNodeList* cChilds = contents.front()->getChildNodes(); for (size_t j = 0; j < cChilds->getLength(); j++) { - ss << cChilds->item(j); + ss << *(cChilds->item(j)); } stream << (ss.str().size() > 0 ? "\"" + escape(ss.str()) + "\", " : "NULL, "); stream << (HAS_ATTR_CAST(contents.front(), "expr") ? "\"" + ATTR_CAST(contents.front(), "expr") + "\", " : "NULL, "); diff --git a/src/uscxml/util/DOM.h b/src/uscxml/util/DOM.h index 3ab27a3..0b35f40 100644 --- a/src/uscxml/util/DOM.h +++ b/src/uscxml/util/DOM.h @@ -118,6 +118,11 @@ protected: #define XML_PREFIX(element) X(element->getPrefix() ? X(element->getPrefix()).str() + ":" : "") #if 1 +/** + * @todo: More performant XercesStrings + * https://alfps.wordpress.com/2010/05/27/cppx-xerces-strings-simplified-by-ownership-part-i/ + */ + class USCXML_API X { public : diff --git a/src/uscxml/util/Predicates.cpp b/src/uscxml/util/Predicates.cpp index cd41089..006e8dc 100644 --- a/src/uscxml/util/Predicates.cpp +++ b/src/uscxml/util/Predicates.cpp @@ -460,16 +460,25 @@ std::list getReachableStates(const DOMElement* root) { } -bool isInEmbeddedDocument(const DOMNode* node) { - // a node is in an embedded document if there is a content element in its parents - const DOMNode* parent = node; - while(parent) { - if(iequals(LOCALNAME(parent), "content")) { - return true; +bool areFromSameMachine(const DOMNode* n1, const DOMNode* n2) { + // we traverse each nodes parent's until we reach an scxml element or null + const DOMNode* p1 = n1; + while(p1) { + if(iequals(LOCALNAME(p1), "scxml")) { + break; } - parent = parent->getParentNode(); + p1 = p1->getParentNode(); } - return false; + + const DOMNode* p2 = n2; + while(p2) { + if(iequals(LOCALNAME(p2), "scxml")) { + break; + } + p2 = p2->getParentNode(); + } + + return p1 == p2; } } \ No newline at end of file diff --git a/src/uscxml/util/Predicates.h b/src/uscxml/util/Predicates.h index 7bc4a9c..6204d6a 100644 --- a/src/uscxml/util/Predicates.h +++ b/src/uscxml/util/Predicates.h @@ -39,7 +39,7 @@ std::list getTargetStates(const XERCESC_NS::DOMElement* std::list getEffectiveTargetStates(const XERCESC_NS::DOMElement* transition); XERCESC_NS::DOMElement* getTransitionDomain(const XERCESC_NS::DOMElement* transition, const XERCESC_NS::DOMElement* root); -bool isInEmbeddedDocument(const XERCESC_NS::DOMNode* node); +bool areFromSameMachine(const XERCESC_NS::DOMNode* n1, const XERCESC_NS::DOMNode* n2); std::list getStates(const std::list& stateIds, const XERCESC_NS::DOMElement* root); XERCESC_NS::DOMElement* getState(const std::string& stateId, const XERCESC_NS::DOMElement* root); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 5ef92c6..8719a41 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -28,7 +28,10 @@ USCXML_TEST_COMPILE(NAME test-url LABEL general/test-url FILES src/test-url.cpp) USCXML_TEST_COMPILE(NAME test-lifecycle LABEL general/test-lifecycle FILES src/test-lifecycle.cpp) USCXML_TEST_COMPILE(NAME test-validating LABEL general/test-validating FILES src/test-validating.cpp) USCXML_TEST_COMPILE(NAME test-snippets LABEL general/test-snippets FILES src/test-snippets.cpp) -USCXML_TEST_COMPILE(NAME test-stress LABEL general/test-stress FILES src/test-stress.cpp) + +# test-stress is not an automated test +add_executable(test-stress src/test-stress.cpp) +target_link_libraries(test-stress uscxml) file(GLOB_RECURSE USCXML_WRAPPERS ${PROJECT_SOURCE_DIR}/src/bindings/swig/wrapped/*.cpp @@ -140,7 +143,7 @@ if (NOT BUILD_MINIMAL) # "perf/gen/c/ecma" # "perf/ecma" ) - + # prepare directories for test classes and copy resources over foreach(W3C_RESOURCE ${W3C_RESOURCES} ) get_filename_component(TEST_DATAMODEL ${W3C_RESOURCE} PATH) @@ -183,13 +186,22 @@ if (NOT BUILD_MINIMAL) # normal IRP tests - get all scxml files within foreach(W3C_TEST ${W3C_TESTS} ) + set(TEST_ADDED OFF) get_filename_component(TEST_FILE ${W3C_TEST} NAME) set(TEST_NAME "w3c/${TEST_CLASS}/${TEST_FILE}") - if (NOT TEST_NAME MATCHES ".*sub.*") + if (OFF) + # manual tests: + elseif (TEST_FILE STREQUAL "test307.scxml") + # scxml files, but no proper tests: + elseif (TEST_NAME MATCHES ".*sub.*") + # rest is a proper test: + else () + if (IS_STANDARD_TEST) add_test(${TEST_NAME} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-state-pass ${W3C_TEST}) + set(TEST_ADDED ON) if (TEST_NAME MATCHES ".*/test250.scxml") set_tests_properties(${TEST_NAME} PROPERTIES FAIL_REGULAR_EXPRESSION "entering final state, invocation was not cancelled") @@ -226,20 +238,24 @@ if (NOT BUILD_MINIMAL) -DSCAFFOLDING_FOR_GENERATED_C:FILEPATH=${CMAKE_CURRENT_SOURCE_DIR}/src/test-gen-c.cpp -P ${CMAKE_CURRENT_SOURCE_DIR}/ctest/scripts/run_generated_test.cmake) set_tests_properties("${TEST_NAME}" PROPERTIES DEPENDS uscxml-transform) + set(TEST_ADDED ON) endif() elseif (TEST_TYPE MATCHES "^binding.*") get_filename_component(TEST_LANG ${TEST_TYPE} NAME) - add_test(NAME "${TEST_NAME}" - COMMAND - ${ANT_EXECUTABLE} - -Dtest.file=${W3C_TEST} - -Duscxml.jar=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/uscxml.jar - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bindings/java - ) - set_tests_properties("${TEST_NAME}" PROPERTIES DEPENDS jar) + if (TARGET jar AND TEST_LANG STREQUAL "java") + add_test(NAME "${TEST_NAME}" + COMMAND + ${ANT_EXECUTABLE} + -Dtest.file=${W3C_TEST} + -Duscxml.jar=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/uscxml.jar + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bindings/java + ) + set_tests_properties("${TEST_NAME}" PROPERTIES DEPENDS jar) + set(TEST_ADDED ON) + endif() elseif (TEST_TYPE MATCHES "^spin.*") @@ -257,18 +273,22 @@ if (NOT BUILD_MINIMAL) -P ${CMAKE_CURRENT_SOURCE_DIR}/ctest/scripts/run_promela_test.cmake) set_tests_properties("${TEST_NAME}" PROPERTIES PASS_REGULAR_EXPRESSION "depth reached [0-9]+, errors: 0") set_tests_properties("${TEST_NAME}" PROPERTIES FAIL_REGULAR_EXPRESSION "depth reached [0-9]+, errors: [1-9]+") + set(TEST_ADDED ON) elseif (TEST_TYPE MATCHES "^fsm.*") add_test("${TEST_NAME}" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-state-pass -f ${W3C_TEST}) + set(TEST_ADDED ON) endif() endif() - set_property(TEST ${TEST_NAME} PROPERTY LABELS ${TEST_NAME}) - set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT ${TEST_TIMEOUT}) - if (IS_PERFORMANCE_TEST) - set_tests_properties("${TEST_NAME}" PROPERTIES ENVIRONMENT USCXML_BENCHMARK_ITERATIONS=${TEST_BENCHMARK_ITERATIONS}) + if(TEST_ADDED) + set_property(TEST ${TEST_NAME} PROPERTY LABELS ${TEST_NAME}) + set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT ${TEST_TIMEOUT}) + if (IS_PERFORMANCE_TEST) + set_tests_properties("${TEST_NAME}" PROPERTIES ENVIRONMENT USCXML_BENCHMARK_ITERATIONS=${TEST_BENCHMARK_ITERATIONS}) + endif() endif() endif() diff --git a/test/ctest/CTestCustom.ctest.in b/test/ctest/CTestCustom.ctest.in index e20f00d..c5c2bd6 100644 --- a/test/ctest/CTestCustom.ctest.in +++ b/test/ctest/CTestCustom.ctest.in @@ -13,6 +13,8 @@ # "w3c/test415.scxml" # "w3c/test513.txt" +# some manual tests are removed in test/CMakeLists.txt already! + # null datamodel # "test436.scxml" diff --git a/test/issues/test-issue86.scxml b/test/issues/test-issue86.scxml new file mode 100644 index 0000000..a978d4b --- /dev/null +++ b/test/issues/test-issue86.scxml @@ -0,0 +1,36 @@ + + + + + + + { + iSec = 1 +} + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/src/test-gen-c.cpp b/test/src/test-gen-c.cpp index 7870578..48c99e8 100644 --- a/test/src/test-gen-c.cpp +++ b/test/src/test-gen-c.cpp @@ -17,7 +17,8 @@ #endif #ifndef AUTOINCLUDE_TEST -#include "test-c-machine.scxml.c" +//#include "test-c-machine.scxml.c" +#include "/Users/sradomski/Documents/TK/Code/uscxml/build/cli/test/gen/c/ecma/test329.scxml.machine.c" #endif #include "uscxml/util/URL.h" @@ -127,7 +128,7 @@ public: } else if (param->location != NULL) { identifier = param->location; } - invokeData[identifier] = parentMachine->dataModel.getAsData(param->expr); + invokeData[identifier] = parentMachine->dataModel.evalAsData(param->expr); param++; } } @@ -146,7 +147,7 @@ public: break; std::string identifier = std::string(aPtr, cPtr - aPtr); - invokeData[identifier] = parentMachine->dataModel.getAsData(identifier); + invokeData[identifier] = parentMachine->dataModel.evalAsData(identifier); } } } @@ -555,7 +556,7 @@ public: // Data d = USER_DATA(ctx)->dataModel.getStringAsData(expr); if (assign->expr != NULL) { USER_DATA(ctx)->dataModel.assign(key, - USER_DATA(ctx)->dataModel.evalAsData(assign->expr)); + USER_DATA(ctx)->dataModel.getAsData(assign->expr)); } else if (assign->content != NULL) { Data d = Data(assign->content, Data::INTERPRETED); USER_DATA(ctx)->dataModel.assign(key, d); diff --git a/test/src/test-stress.cpp b/test/src/test-stress.cpp index 588e0f7..8bd2e4a 100644 --- a/test/src/test-stress.cpp +++ b/test/src/test-stress.cpp @@ -97,10 +97,9 @@ int main(int argc, char** argv) { entryIter++; // forever - if (entryIter == entries.end()) { - entryIter = entries.begin(); - std::this_thread::sleep_for(std::chrono::seconds(10)); - } +// if (entryIter == entries.end()) { +// entryIter = entries.begin(); +// } } delete watcher; -- cgit v0.12