From d5ebf27e02cd8f4f09e8b022a126932e4e62893d Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Tue, 25 Jan 2011 19:54:29 +0100 Subject: [PATCH] DSM: fix for ($bar in array) for structs Example: set($foo[0].a="a0"); set($foo[0].b="b0"); set($foo[1].a="a1"); set($foo[1].b="b1"); for ($bar in $foo) { log(1, $bar); } --- apps/dsm/DSMStateEngine.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/apps/dsm/DSMStateEngine.cpp b/apps/dsm/DSMStateEngine.cpp index 2466bd36..d46b7473 100644 --- a/apps/dsm/DSMStateEngine.cpp +++ b/apps/dsm/DSMStateEngine.cpp @@ -338,14 +338,24 @@ bool DSMStateEngine::runactions(vector::iterator from, } } else if (array_for->for_type == DSMArrayFor::Array) { unsigned int a_index = 0; - while (true) { - VarMapT::iterator v = sc_sess->var.find(array_name+"["+int2str(a_index)+"]"); - if (v == sc_sess->var.end()) - break; + VarMapT::iterator v = sc_sess-> + var.lower_bound(array_name+"["+int2str(a_index)+"]"); + + while (v != sc_sess->var.end()) { + string this_index = array_name+"["+int2str(a_index)+"]"; + if (v->first.substr(0, this_index.length()) != this_index) { + a_index++; + this_index = array_name+"["+int2str(a_index)+"]"; + if (v->first.substr(0, this_index.length()) != this_index) { + break; + } + } + cnt_values.push_back(make_pair(v->second, "")); DBG(" '%s'\n", v->second.c_str()); - a_index++; + v++; } + } // save counter k