From 2b9e5d72a31c5060a443a0535d2d139326c51f04 Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Wed, 26 Apr 2017 21:35:29 +0200 Subject: Fixed issue109 --- src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp | 22 +++++++++++++++++++++- test/issues/test-issue109.scxml | 16 ++++++++-------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp index 890b8cf..33255db 100644 --- a/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp +++ b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp @@ -554,7 +554,27 @@ void LuaDataModel::assign(const std::string& location, const Data& data, const s } } if (field.second) { - value[strTo(field.first)] = lua; + if (field.first.length() == 0) { + ERROR_EXECUTION_THROW("Subscript operator is empty"); + } + + if (!isNumeric(field.first.c_str(), 10) && field.first[0] != '"' && field.first[0] != '\'') { + // evaluate subscript as variable + Data subscript = evalAsData(field.first); + if (subscript.atom.length() > 0) { + field.first = subscript.atom; + } else { + ERROR_EXECUTION_THROW("Evaluated subscript operator '" + subscript.asJSON() + "' is invalid"); + } + } + + if (isNumeric(field.first.c_str(), 10)) { + // numeric array subscript + value[strTo(field.first)] = lua; + } else { + // string array subscript + value[field.first] = lua; + } } else { value[field.first] = lua; } diff --git a/test/issues/test-issue109.scxml b/test/issues/test-issue109.scxml index bb366dd..4e6373d 100644 --- a/test/issues/test-issue109.scxml +++ b/test/issues/test-issue109.scxml @@ -1,17 +1,17 @@ - + { 0, 0, 0 } - + - - - + + + + - - - + + -- cgit v0.12