From c761e5f3931e4709f2736d5c3c0e11dc7b61ded5 Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Fri, 22 Apr 2016 12:21:14 +0200 Subject: Minor bug-fixes and issue62 prepared --- src/uscxml/CMakeLists.txt | 3 +- src/uscxml/Interpreter.cpp | 2 +- src/uscxml/transform/ChartToC.cpp | 10 +- test/CMakeLists.txt | 2 + test/src/issues/test-issue62.cpp | 69 ++++++++++++ test/src/test-c-inline.c | 201 ++++++++++++++++++++++++++++------- test/src/test-c-inline.c.scxml.c | 215 ++++++++++++++++++++++++++++---------- 7 files changed, 407 insertions(+), 95 deletions(-) create mode 100644 test/src/issues/test-issue62.cpp diff --git a/src/uscxml/CMakeLists.txt b/src/uscxml/CMakeLists.txt index 4e76148..e98aed6 100644 --- a/src/uscxml/CMakeLists.txt +++ b/src/uscxml/CMakeLists.txt @@ -74,10 +74,11 @@ endif() file(GLOB USCXML_CORE ${CMAKE_SOURCE_DIR}/contrib/src/jsmn/jsmn.c - ${CMAKE_SOURCE_DIR}/contrib/src/evws/*.c + ${CMAKE_SOURCE_DIR}/contrib/src/evws/evws.c *.cpp *.h ) + source_group("Interpreter" FILES ${USCXML_CORE}) list (APPEND USCXML_FILES ${USCXML_CORE}) diff --git a/src/uscxml/Interpreter.cpp b/src/uscxml/Interpreter.cpp index 27b3f08..3e4171e 100644 --- a/src/uscxml/Interpreter.cpp +++ b/src/uscxml/Interpreter.cpp @@ -2516,7 +2516,7 @@ void InterpreterImpl::executeContent(const Arabica::DOM::Element& c } } } else if (iequals(TAGNAME(content), _nsInfo.xmlNSPrefix + "elseif")) { - LOG(ERROR) << "Found single elsif to evaluate!" << std::endl; + LOG(ERROR) << "Found single elseif to evaluate!" << std::endl; } else if (iequals(TAGNAME(content), _nsInfo.xmlNSPrefix + "else")) { LOG(ERROR) << "Found single else to evaluate!" << std::endl; } else if (iequals(TAGNAME(content), _nsInfo.xmlNSPrefix + "foreach")) { diff --git a/src/uscxml/transform/ChartToC.cpp b/src/uscxml/transform/ChartToC.cpp index 159b4c5..a599532 100644 --- a/src/uscxml/transform/ChartToC.cpp +++ b/src/uscxml/transform/ChartToC.cpp @@ -57,6 +57,8 @@ ChartToC::ChartToC(const Interpreter& other) : TransformerImpl(), _topMostMachin prepare(); findNestedMachines(); +// std::cout << _scxml; + if (_extensions.find("prefix") != _extensions.end()) { _prefixes = new std::list(); std::pair::iterator, @@ -251,7 +253,6 @@ void ChartToC::prepare() { elements.insert(_nsInfo.xmlNSPrefix + "scxml"); elements.insert(_nsInfo.xmlNSPrefix + "state"); elements.insert(_nsInfo.xmlNSPrefix + "final"); - elements.insert(_nsInfo.xmlNSPrefix + "parallel"); elements.insert(_nsInfo.xmlNSPrefix + "history"); elements.insert(_nsInfo.xmlNSPrefix + "initial"); elements.insert(_nsInfo.xmlNSPrefix + "parallel"); @@ -1972,7 +1973,7 @@ void ChartToC::writeTransitions(std::ostream& stream) { stream << " /* " << ATTR(transition, "targetBools") << " */ }"; } else { - stream << "{ NULL }"; + stream << "{ 0x00 }"; } stream << "," << std::endl; @@ -2179,7 +2180,8 @@ void ChartToC::writeFSM(std::ostream& stream) { stream << " }" << std::endl; stream << std::endl; - stream << " if (ctx->flags & USCXML_CTX_SPONTANEOUS) {" << std::endl; + stream << "DEQUEUE_EVENT:" << std::endl; + stream << " if (ctx->flags & USCXML_CTX_SPONTANEOUS) {" << std::endl; stream << " ctx->event = NULL;" << std::endl; stream << " goto SELECT_TRANSITIONS;" << std::endl; stream << " }" << std::endl; @@ -2261,7 +2263,7 @@ void ChartToC::writeFSM(std::ostream& stream) { stream << " ctx->flags &= ~USCXML_CTX_TRANSITION_FOUND;" << std::endl; stream << " } else {" << std::endl; stream << " ctx->flags &= ~USCXML_CTX_SPONTANEOUS;" << std::endl; -// stream << " return USCXML_ERR_OK;" << std::endl; + stream << " goto DEQUEUE_EVENT;" << std::endl; stream << " }" << std::endl; stream << std::endl; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b5b0906..fed5265 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -50,6 +50,8 @@ endif() USCXML_TEST_COMPILE(BUILD_ONLY NAME test-sockets LABEL general/test-sockets FILES src/test-sockets.cpp) +USCXML_TEST_COMPILE(NAME test-issue62 LABEL general/test-issue64 FILES src/issues/test-issue62.cpp) + USCXML_TEST_COMPILE(NAME test-url LABEL general/test-url FILES src/test-url.cpp) USCXML_TEST_COMPILE(NAME test-doneevent LABEL general/test-doneevent FILES src/test-doneevent.cpp) USCXML_TEST_COMPILE(NAME test-base64 LABEL general/test-base64 FILES src/test-base64.cpp) diff --git a/test/src/issues/test-issue62.cpp b/test/src/issues/test-issue62.cpp new file mode 100644 index 0000000..b75693c --- /dev/null +++ b/test/src/issues/test-issue62.cpp @@ -0,0 +1,69 @@ +#include "uscxml/Interpreter.h" +#include "glog/logging.h" + +using namespace uscxml; + +int main(int argc, char** argv) { + google::LogToStderr(); + google::InitGoogleLogging(argv[0]); + + const char* scxmlContent = + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " "; + + std::string msg; + + uscxml::Interpreter scxml = uscxml::Interpreter(uscxml::Interpreter::fromXML(scxmlContent, "")); + scxml.addMonitor(new StateTransitionMonitor()); + + uscxml::InterpreterState state; + + // assume initial stable configuration + do { + state = scxml.step(); + } while(state > 0); + + scxml.receive(Event("move_here")); + scxml.receive(Event("inside_invoke")); + + while(state != uscxml::USCXML_FINISHED) { + + do { + state = scxml.step(); + } while(state > 0); + + } + + std::cout << "************************************" << std::endl; + std::cout << "Successfully finished state machine!" << std::endl; + + return EXIT_SUCCESS; + +} \ No newline at end of file diff --git a/test/src/test-c-inline.c b/test/src/test-c-inline.c index 659fcdf..7b375a9 100644 --- a/test/src/test-c-inline.c +++ b/test/src/test-c-inline.c @@ -1,60 +1,191 @@ -#include // EXIT_SUCCESS -#include // printf +//#include // EXIT_SUCCESS +//#include // printf #include // memset +#undef ON_AVR + /** * Preprocess: - * uscxml-transform -tc -i ./test-c-inline.c -o ./test-c-inline.c.scxml.c + * uscxml-transform -tc -i ./gadget-inline-avr.c -o ./gadget-inline-avr.c.scxml.c */ /** INLINE SCXML BEGIN - - - - - enteredFoo(); - - - - - enteredDone(); - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ledOff(); + + + ledOn(); + + + INLINE SCXML END */ -/** - * These function can be called from within executable content - */ -void enteredFoo() { - printf("Entered Foo!\n"); -} +#define IQ_LENGTH 10 +#define EQ_LENGTH 10 + +const char* iQ[IQ_LENGTH]; +size_t iwPtr = 0; +size_t irPtr = 0; + +const char* eQ[EQ_LENGTH]; +size_t ewPtr = 0; +size_t erPtr = 0; + -void enteredDone() { - printf("Entered Done!\n"); +void ledOn() { + printf("Turned on LED!\n"); } -struct userData { - int foo; -}; +void ledOff() { + printf("Turned off LED!\n"); +} -#define UD ((struct userData*)ctx->user_data) #include "test-c-inline.c.scxml.c" +void* dequeue_internal(const uscxml_ctx* ctx) { + if (iwPtr != irPtr) { + size_t tmp = irPtr; + irPtr = (irPtr + 1 >= IQ_LENGTH ? 0 : irPtr + 1); + return iQ[tmp]; + } + return NULL; +} + +void* dequeue_external(const uscxml_ctx* ctx) { + if (ewPtr != erPtr) { + size_t tmp = erPtr; + irPtr = (erPtr + 1 >= EQ_LENGTH ? 0 : erPtr + 1); + return eQ[tmp]; + } + return NULL; +} + +int is_matched(const uscxml_ctx* ctx, const uscxml_transition* transition, const void* event) { + char* tPtr1 = (char*)event; + char* tPtr2 = (char*)transition->event; + while(*tPtr1 && *tPtr2) { + if (tPtr1 != tPtr2) + return 0; + tPtr1++; + tPtr2++; + } + return 1; +} + +int raise(const uscxml_ctx* ctx, const char* event) { + iQ[iwPtr] = event; + iwPtr = (iwPtr + 1 >= IQ_LENGTH ? 0 : iwPtr + 1); + return USCXML_ERR_OK; +} + +int send(const uscxml_ctx* ctx, const char* event) { + eQ[ewPtr] = event; + ewPtr = (ewPtr + 1 >= IQ_LENGTH ? 0 : ewPtr + 1); + return USCXML_ERR_OK; +} int main(int argc, char** argv) { - struct userData ud; - uscxml_ctx ctx; - int err = USCXML_ERR_OK; + +#ifdef ON_AVR + int ir_led = 9; + int blue_touch = 1; + int red_touch = 2; + int yellow_touch = 3; + pinMode(ir_led, OUTPUT); + pinMode(blue_touch, INPUT); + pinMode(red_touch, INPUT); + pinMode(yellow_touch, INPUT); + +#endif + + + uscxml_ctx ctx; + int err = USCXML_ERR_OK; + memset(&ctx, 0, sizeof(uscxml_ctx)); - ctx.machine = &USCXML_MACHINE_TEST_INLINE; - ctx.user_data = &ud; - ud.foo = 3; + ctx.machine = &USCXML_MACHINE; + + ctx.exec_content_raise = raise; + ctx.dequeue_internal = dequeue_internal; + ctx.dequeue_external = dequeue_external; + ctx.is_matched = is_matched; while(err != USCXML_ERR_DONE) { + err = uscxml_step(&ctx); +#ifdef ON_AVR + if (err == USCXML_IDLE) { + if (digitalRead(blue) == HIGH) { + send(ctx, "blueHigh"); + } + if (digitalRead(blue) == HIGH) { + send(ctx, "redHigh"); + } + if (digitalRead(blue) == HIGH) { + send(ctx, "greenHigh"); + } + } + delay(20); +#endif } - return EXIT_SUCCESS; -} \ No newline at end of file + return 0; +} diff --git a/test/src/test-c-inline.c.scxml.c b/test/src/test-c-inline.c.scxml.c index 9bd1464..f3d8b01 100644 --- a/test/src/test-c-inline.c.scxml.c +++ b/test/src/test-c-inline.c.scxml.c @@ -116,6 +116,7 @@ #define USCXML_ERR_INVALID_TARGET 6 #define USCXML_ERR_INVALID_TYPE 7 #define USCXML_ERR_UNSUPPORTED 8 +#define USCXML_ERR_MACRO 9 #define USCXML_TRANS_SPONTANEOUS 0x01 #define USCXML_TRANS_TARGETLESS 0x02 @@ -368,11 +369,11 @@ struct uscxml_ctx { #endif /* forward declare machines to allow references */ -extern const uscxml_machine _uscxml_04E4C4CE_machine; +extern const uscxml_machine _uscxml_C4473F72_machine; #ifndef USCXML_NO_ELEM_INFO -static const uscxml_elem_donedata _uscxml_04E4C4CE_elem_donedatas[1] = { +static const uscxml_elem_donedata _uscxml_C4473F72_elem_donedatas[1] = { /* source, content, contentexpr, params */ { 0, NULL, NULL, NULL } }; @@ -385,73 +386,152 @@ static const uscxml_elem_donedata _uscxml_04E4C4CE_elem_donedatas[1] = { #ifndef USCXML_NO_EXEC_CONTENT -static int _uscxml_04E4C4CE_foo_on_entry_0(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { +static int _uscxml_C4473F72_scxml0_parallel0_on_entry_0(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { int err = USCXML_ERR_OK; - - enteredFoo(); - return USCXML_ERR_OK; + if likely(ctx->exec_content_raise != NULL) { + if unlikely((ctx->exec_content_raise(ctx, "blueHigh")) != USCXML_ERR_OK) return err; + } else { + return USCXML_ERR_MISSING_CALLBACK; + } + return USCXML_ERR_OK; } -static int _uscxml_04E4C4CE_foo_on_entry(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { - _uscxml_04E4C4CE_foo_on_entry_0(ctx, state, event); +static int _uscxml_C4473F72_scxml0_parallel0_on_entry(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { + _uscxml_C4473F72_scxml0_parallel0_on_entry_0(ctx, state, event); return USCXML_ERR_OK; } -static int _uscxml_04E4C4CE_done_on_entry_0(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { +static int _uscxml_C4473F72_IRLedOff_on_entry_0(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { int err = USCXML_ERR_OK; +ledOff(); return USCXML_ERR_OK; +} - enteredDone(); - return USCXML_ERR_OK; +static int _uscxml_C4473F72_IRLedOff_on_entry(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { + _uscxml_C4473F72_IRLedOff_on_entry_0(ctx, state, event); + return USCXML_ERR_OK; } -static int _uscxml_04E4C4CE_done_on_entry(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { - _uscxml_04E4C4CE_done_on_entry_0(ctx, state, event); +static int _uscxml_C4473F72_IRLedOn_on_entry_0(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { + int err = USCXML_ERR_OK; +ledOn(); return USCXML_ERR_OK; +} + +static int _uscxml_C4473F72_IRLedOn_on_entry(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { + _uscxml_C4473F72_IRLedOn_on_entry_0(ctx, state, event); return USCXML_ERR_OK; } -static int _uscxml_04E4C4CE_foo_transition0_is_enabled(const uscxml_ctx* ctx, const uscxml_transition* transition) { - return (UD->foo == 3); +static int _uscxml_C4473F72_interaction_transition0_on_trans(const uscxml_ctx* ctx, const uscxml_state* state, const void* event) { + int err = USCXML_ERR_OK; + if likely(ctx->exec_content_raise != NULL) { + if unlikely((ctx->exec_content_raise(ctx, "IROn")) != USCXML_ERR_OK) return err; + } else { + return USCXML_ERR_MISSING_CALLBACK; + } + if likely(ctx->exec_content_raise != NULL) { + if unlikely((ctx->exec_content_raise(ctx, "IROn")) != USCXML_ERR_OK) return err; + } else { + return USCXML_ERR_MISSING_CALLBACK; + } + if likely(ctx->exec_content_raise != NULL) { + if unlikely((ctx->exec_content_raise(ctx, "IROn")) != USCXML_ERR_OK) return err; + } else { + return USCXML_ERR_MISSING_CALLBACK; + } + if likely(ctx->exec_content_raise != NULL) { + if unlikely((ctx->exec_content_raise(ctx, "IROff")) != USCXML_ERR_OK) return err; + } else { + return USCXML_ERR_MISSING_CALLBACK; + } + if likely(ctx->exec_content_raise != NULL) { + if unlikely((ctx->exec_content_raise(ctx, "IROn")) != USCXML_ERR_OK) return err; + } else { + return USCXML_ERR_MISSING_CALLBACK; + } + if likely(ctx->exec_content_raise != NULL) { + if unlikely((ctx->exec_content_raise(ctx, "IROff")) != USCXML_ERR_OK) return err; + } else { + return USCXML_ERR_MISSING_CALLBACK; + } + return USCXML_ERR_OK; } + #endif #ifndef USCXML_NO_ELEM_INFO -static const uscxml_state _uscxml_04E4C4CE_states[3] = { +static const uscxml_state _uscxml_C4473F72_states[6] = { { /* state number 0 */ /* name */ NULL, /* parent */ 0, /* onentry */ NULL, /* onexit */ NULL, /* invoke */ NULL, - /* children */ { 0x06 /* 011 */ }, - /* completion */ { 0x02 /* 010 */ }, - /* ancestors */ { 0x00 /* 000 */ }, + /* children */ { 0x02 /* 010000 */ }, + /* completion */ { 0x02 /* 010000 */ }, + /* ancestors */ { 0x00 /* 000000 */ }, /* data */ NULL, /* type */ USCXML_STATE_COMPOUND, }, { /* state number 1 */ - /* name */ "foo", + /* name */ "0a3ff41d-98e6-40fe-b147-cf397c12eb55", /* parent */ 0, - /* onentry */ _uscxml_04E4C4CE_foo_on_entry, + /* onentry */ _uscxml_C4473F72_scxml0_parallel0_on_entry, /* onexit */ NULL, /* invoke */ NULL, - /* children */ { 0x00 /* 000 */ }, - /* completion */ { 0x00 /* 000 */ }, - /* ancestors */ { 0x01 /* 100 */ }, + /* children */ { 0x0c /* 001100 */ }, + /* completion */ { 0x0c /* 001100 */ }, + /* ancestors */ { 0x01 /* 100000 */ }, /* data */ NULL, - /* type */ USCXML_STATE_ATOMIC, + /* type */ USCXML_STATE_PARALLEL, }, { /* state number 2 */ - /* name */ "done", - /* parent */ 0, - /* onentry */ _uscxml_04E4C4CE_done_on_entry, + /* name */ "interaction", + /* parent */ 1, + /* onentry */ NULL, + /* onexit */ NULL, + /* invoke */ NULL, + /* children */ { 0x00 /* 000000 */ }, + /* completion */ { 0x00 /* 000000 */ }, + /* ancestors */ { 0x03 /* 110000 */ }, + /* data */ NULL, + /* type */ USCXML_STATE_ATOMIC, + }, + { /* state number 3 */ + /* name */ "periphery", + /* parent */ 1, + /* onentry */ NULL, + /* onexit */ NULL, + /* invoke */ NULL, + /* children */ { 0x30 /* 000011 */ }, + /* completion */ { 0x10 /* 000010 */ }, + /* ancestors */ { 0x03 /* 110000 */ }, + /* data */ NULL, + /* type */ USCXML_STATE_COMPOUND, + }, + { /* state number 4 */ + /* name */ "IRLedOff", + /* parent */ 3, + /* onentry */ _uscxml_C4473F72_IRLedOff_on_entry, + /* onexit */ NULL, + /* invoke */ NULL, + /* children */ { 0x00 /* 000000 */ }, + /* completion */ { 0x00 /* 000000 */ }, + /* ancestors */ { 0x0b /* 110100 */ }, + /* data */ NULL, + /* type */ USCXML_STATE_ATOMIC, + }, + { /* state number 5 */ + /* name */ "IRLedOn", + /* parent */ 3, + /* onentry */ _uscxml_C4473F72_IRLedOn_on_entry, /* onexit */ NULL, /* invoke */ NULL, - /* children */ { 0x00 /* 000 */ }, - /* completion */ { 0x00 /* 000 */ }, - /* ancestors */ { 0x01 /* 100 */ }, + /* children */ { 0x00 /* 000000 */ }, + /* completion */ { 0x00 /* 000000 */ }, + /* ancestors */ { 0x0b /* 110100 */ }, /* data */ NULL, - /* type */ USCXML_STATE_FINAL, + /* type */ USCXML_STATE_ATOMIC, } }; @@ -459,19 +539,45 @@ static const uscxml_state _uscxml_04E4C4CE_states[3] = { #ifndef USCXML_NO_ELEM_INFO -static const uscxml_transition _uscxml_04E4C4CE_transitions[1] = { +static const uscxml_transition _uscxml_C4473F72_transitions[3] = { { /* transition number 0 with priority 0 - target: done + target: + */ + /* source */ 2, + /* target */ { NULL }, + /* event */ "blueHigh", + /* condition */ NULL, + /* is_enabled */ NULL, + /* ontrans */ _uscxml_C4473F72_interaction_transition0_on_trans, + /* type */ USCXML_TRANS_TARGETLESS, + /* conflicts */ { 0x01 /* 100 */ }, + /* exit set */ { 0x00 /* 000000 */ } + }, + { /* transition number 1 with priority 1 + target: IRLedOn + */ + /* source */ 3, + /* target */ { 0x20 /* 000001 */ }, + /* event */ "IROn", + /* condition */ NULL, + /* is_enabled */ NULL, + /* ontrans */ NULL, + /* type */ USCXML_TRANS_INTERNAL, + /* conflicts */ { 0x06 /* 011 */ }, + /* exit set */ { 0x30 /* 000011 */ } + }, + { /* transition number 2 with priority 2 + target: IRLedOff */ - /* source */ 1, - /* target */ { 0x04 /* 001 */ }, - /* event */ NULL, - /* condition */ "UD->foo == 3", - /* is_enabled */ _uscxml_04E4C4CE_foo_transition0_is_enabled, + /* source */ 3, + /* target */ { 0x10 /* 000010 */ }, + /* event */ "IROff", + /* condition */ NULL, + /* is_enabled */ NULL, /* ontrans */ NULL, - /* type */ USCXML_TRANS_SPONTANEOUS, - /* conflicts */ { 0x01 /* 1 */ }, - /* exit set */ { 0x06 /* 011 */ } + /* type */ USCXML_TRANS_INTERNAL, + /* conflicts */ { 0x06 /* 011 */ }, + /* exit set */ { 0x30 /* 000011 */ } } }; @@ -480,22 +586,21 @@ static const uscxml_transition _uscxml_04E4C4CE_transitions[1] = { #ifndef USCXML_NO_ELEM_INFO #ifndef USCXML_MACHINE -# define USCXML_MACHINE _uscxml_04E4C4CE_machine +# define USCXML_MACHINE _uscxml_C4473F72_machine #endif -#define USCXML_MACHINE_0 _uscxml_04E4C4CE_machine -#define USCXML_MACHINE_TEST_INLINE _uscxml_04E4C4CE_machine +#define USCXML_MACHINE_0 _uscxml_C4473F72_machine -const uscxml_machine _uscxml_04E4C4CE_machine = { +const uscxml_machine _uscxml_C4473F72_machine = { /* flags */ 0, - /* nr_states */ 3, - /* nr_transitions */ 1, - /* name */ "test-inline", - /* datamodel */ "native", - /* uuid */ "04E4C4CEB25F6A7D5638FCE2C3213285", - /* states */ &_uscxml_04E4C4CE_states[0], - /* transitions */ &_uscxml_04E4C4CE_transitions[0], + /* nr_states */ 6, + /* nr_transitions */ 3, + /* name */ "", + /* datamodel */ "null", + /* uuid */ "C4473F72ECDBC2BBAE099A8F6849A804", + /* states */ &_uscxml_C4473F72_states[0], + /* transitions */ &_uscxml_C4473F72_transitions[0], /* parent */ NULL, - /* donedata */ &_uscxml_04E4C4CE_elem_donedatas[0], + /* donedata */ &_uscxml_C4473F72_elem_donedatas[0], /* script */ NULL }; @@ -659,6 +764,7 @@ int uscxml_step(uscxml_ctx* ctx) { goto ESTABLISH_ENTRY_SET; } +DEQUEUE_EVENT: if (ctx->flags & USCXML_CTX_SPONTANEOUS) { ctx->event = NULL; goto SELECT_TRANSITIONS; @@ -736,6 +842,7 @@ SELECT_TRANSITIONS: ctx->flags &= ~USCXML_CTX_TRANSITION_FOUND; } else { ctx->flags &= ~USCXML_CTX_SPONTANEOUS; + goto DEQUEUE_EVENT; } #ifdef USCXML_VERBOSE -- cgit v0.12