[nemiver: 1/2] Don't split member vars incorrectly if value has c



commit 9eeb571a29639e5b1a62ad4424002826b6da473f
Author: Jonathon Jongsma <jonathon jongsma collabora co uk>
Date:   Sat Mar 7 16:23:04 2009 -0600

    Don't split member vars incorrectly if value has comma (Closes: #527947)
    
    	* src/dbgengine/nmv-gdbmi-parser.cc: add a variable for keeping track of the
    	  'brace level'.  e.g., the characters '(', '[', and '<' increment the brace
    	  level and the characters ')', ']', and '>' decrement the brace level.  If
    	  the brace level is 0, treat a comma as a delimiter between member
    	  variables; if it is greater than zero, treat a comma as part of the
    	  variable value.  For this particular case, we only really need to check
    	  for <> braces, but I added () and [] as well.
    	* tests/test-gdbmi.cc: add a regression test for correct var value parsing
---
 src/dbgengine/nmv-gdbmi-parser.cc |   16 +++++++++++++++-
 tests/test-gdbmi.cc               |   37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletions(-)

diff --git a/src/dbgengine/nmv-gdbmi-parser.cc b/src/dbgengine/nmv-gdbmi-parser.cc
index 7329d48..cc9c3b4 100644
--- a/src/dbgengine/nmv-gdbmi-parser.cc
+++ b/src/dbgengine/nmv-gdbmi-parser.cc
@@ -5815,6 +5815,7 @@ GDBMIParser::parse_member_variable (const UString::size_type a_from,
             //so let's try to parse B
             SKIP_BLANK2 (cur);
             value_start = cur;
+            unsigned int brace_level = 0;
             while (true) {
                 UString str;
                 if ( RAW_CHAR_AT (cur) == '"'
@@ -5834,8 +5835,21 @@ GDBMIParser::parse_member_variable (const UString::size_type a_from,
                     }
                 } else if ((RAW_CHAR_AT (cur) != ','
                                || ((!m_priv->index_passed_end (cur+1))
-                                   && RAW_CHAR_AT (cur+1) != ' '))
+                                   && RAW_CHAR_AT (cur+1) != ' ')
+                               // don't treat a comma inside braces as a
+                               // variable separator.  e.g the following output:
+                               // "0x40085e <my_func(void*, void*)>"
+                               || (brace_level > 0))
                            && RAW_CHAR_AT (cur) != '}') {
+                    if (RAW_CHAR_AT (cur) == '(' ||
+                        RAW_CHAR_AT (cur) == '[' ||
+                        RAW_CHAR_AT (cur) == '<') {
+                        ++brace_level;
+                    } else if (RAW_CHAR_AT (cur) == ')' ||
+                               RAW_CHAR_AT (cur) == ']' ||
+                               RAW_CHAR_AT (cur) == '>') {
+                        --brace_level;
+                    }
                     ++cur;
                     CHECK_END2 (cur);
                 } else {
diff --git a/tests/test-gdbmi.cc b/tests/test-gdbmi.cc
index a6f374b..87a347e 100644
--- a/tests/test-gdbmi.cc
+++ b/tests/test-gdbmi.cc
@@ -79,6 +79,11 @@ static const char *gv_var_with_member6 = "value=\"{{notice_offset = 0 '\\\\0', f
 
 static const char *gv_var_with_member7 = "value=\"{{upper = 65, method = 0, count = 26, offset = 32}, {upper = 181, method = 0, count = 1, offset = 775}, {upper = 192, method = 0, count = 23, offset = 32}, {upper = 216, method = 0, count = 7, offset = 32}, {upper = 223, method = 2, count = 2, offset = 0}, {upper = 256, method = 1, count = 47, offset = 1}, {upper = 304, method = 2, count = 3, offset = 2}, {upper = 306, method = 1, count = 5, offset = 1}, {upper = 313, method = 1, count = 15, offset = 1}, {upper = 329, method = 2, count = 3, offset = 5}, {upper = 330, method = 1, count = 45, offset = 1}, {upper = 376, method = 0, count = 1, offset = -121}, {upper = 377, method = 1, count = 5, offset = 1}, {upper = 383, method = 0, count = 1, offset = -268}, {upper = 385, method = 0, count = 1, offset = 210}, {upper = 386, method = 1, count = 3, offset = 1}, {upper = 390, method = 0, count = 1, offset = 206}, {upper = 391, method = 1, count = 1, offset = 1}, {upper = 393, metho
 d = 0, count = 2, offset = 205}, {upper = 395, method = 1, count = 1, offset = 1}, {upper = 398, method = 0, count = 1, offset = 79}, {upper = 399, method = 0, count = 1, offset = 202}, {upper = 400, method = 0, count = 1, offset = 203}, {upper = 401, method = 1, count = 1, offset = 1}, {upper = 403, method = 0, count = 1, offset = 205}, {upper = 404, method = 0, count = 1, offset = 207}, {upper = 406, method = 0, count = 1, offset = 211}, {upper = 407, method = 0, count = 1, offset = 209}, {upper = 408, method = 1, count = 1, offset = 1}, {upper = 412, method = 0, count = 1, offset = 211}, {upper = 413, method = 0, count = 1, offset = 213}, {upper = 415, method = 0, count = 1, offset = 214}, {upper = 416, method = 1, count = 5, offset = 1}, {upper = 422, method = 0, count = 1, offset = 218}, {upper = 423, method = 1, count = 1, offset = 1}, {upper = 425, method = 0, count = 1, offset = 218}, {upper = 428, method = 1, count = 1, offset = 1}, {upper = 430, method = 0, count =
  1, offset = 218}, {upper = 431, method = 1, count = 1, offset = 1}, {upper = 433, method = 0, count = 2, offset = 217}, {upper = 435, method = 1, count = 3, offset = 1}, {upper = 439, method = 0, count = 1, offset = 219}, {upper = 440, method = 1, count = 1, offset = 1}, {upper = 444, method = 1, count = 1, offset = 1}, {upper = 452, method = 0, count = 1, offset = 2}, {upper = 453, method = 1, count = 1, offset = 1}, {upper = 455, method = 0, count = 1, offset = 2}, {upper = 456, method = 1, count = 1, offset = 1}, {upper = 458, method = 0, count = 1, offset = 2}, {upper = 459, method = 1, count = 17, offset = 1}, {upper = 478, method = 1, count = 17, offset = 1}, {upper = 496, method = 2, count = 3, offset = 8}, {upper = 497, method = 0, count = 1, offset = 2}, {upper = 498, method = 1, count = 3, offset = 1}, {upper = 502, method = 0, count = 1, offset = -97}, {upper = 503, method = 0, count = 1, offset = -56}, {upper = 504, method = 1, count = 39, offset = 1}, {upper = 
 544, method = 0, count = 1, offset = -130}, {upper = 546, method = 1, count = 17, offset = 1}, {upper = 570, method = 0, count = 1, offset = 10795}, {upper = 571, method = 1, count = 1, offset = 1}, {upper = 573, method = 0, count = 1, offset = -163}, {upper = 574, method = 0, count = 1, offset = 10792}, {upper = 577, method = 1, count = 1, offset = 1}, {upper = 579, method = 0, count = 1, offset = -195}, {upper = 580, method = 0, count = 1, offset = 69}, {upper = 581, method = 0, count = 1, offset = 71}, {upper = 582, method = 1, count = 9, offset = 1}, {upper = 837, method = 0, count = 1, offset = 116}, {upper = 902, method = 0, count = 1, offset = 38}, {upper = 904, method = 0, count = 3, offset = 37}, {upper = 908, method = 0, count = 1, offset = 64}, {upper = 910, method = 0, count = 2, offset = 63}, {upper = 912, method = 2, count = 6, offset = 11}, {upper = 913, method = 0, count = 17, offset = 32}, {upper = 931, method = 0, count = 9, offset = 32}, {upper = 944, meth
 od = 2, count = 6, offset = 17}, {upper = 962, method = 1, count = 1, offset = 1}, {upper = 976, method = 0, count = 1, offset = -30}, {upper = 977, method = 0, count = 1, offset = -25}, {upper = 981, method = 0, count = 1, offset = -15}, {upper = 982, method = 0, count = 1, offset = -22}, {upper = 984, method = 1, count = 23, offset = 1}, {upper = 1008, method = 0, count = 1, offset = -54}, {upper = 1009, method = 0, count = 1, offset = -48}, {upper = 1012, method = 0, count = 1, offset = -60}, {upper = 1013, method = 0, count = 1, offset = -64}, {upper = 1015, method = 1, count = 1, offset = 1}, {upper = 1017, method = 0, count = 1, offset = -7}, {upper = 1018, method = 1, count = 1, offset = 1}, {upper = 1021, method = 0, count = 3, offset = -130}, {upper = 1024, method = 0, count = 16, offset = 80}, {upper = 1040, method = 0, count = 32, offset = 32}, {upper = 1120, method = 1, count = 33, offset = 1}, {upper = 1162, method = 1, count = 53, offset = 1}, {upper = 1216, me
 thod = 0, count = 1, offset = 15}, {upper = 1217, method = 1, count = 13, offset = 1}, {upper = 1232, method = 1, count = 67, offset = 1}, {upper = 1329, method = 0, count = 38, offset = 48}, {upper = 1415, method = 2, count = 4, offset = 23}, {upper = 4256, method = 0, count = 38, offset = 7264}, {upper = 7680, method = 1, count = 149, offset = 1}, {upper = 7830, method = 2, count = 3, offset = 27}, {upper = 7831, method = 2, count = 3, offset = 30}, {upper = 7832, method = 2, count = 3, offset = 33}, {upper = 7833, method = 2, count = 3, offset = 36}, {upper = 7834, method = 2, count = 3, offset = 39}, {upper = 7835, method = 0, count = 1, offset = -58}, {upper = 7840, method = 1, count = 89, offset = 1}, {upper = 7944, method = 0, count = 8, offset = -8}, {upper = 7960, method = 0, count = 6, offset = -8}, {upper = 7976, method = 0, count = 8, offset = -8}, {upper = 7992, method = 0, count = 8, offset = -8}, {upper = 8008, method = 0, count = 6, offset = -8}, {upper = 801
 6, method = 2, count = 4, offset = 42}, {upper = 8018, method = 2, count = 6, offset = 46}, {upper = 8020, method = 2, count = 6, offset = 52}, {upper = 8022, method = 2, count = 6, offset = 58}, {upper = 8025, method = 0, count = 1, offset = -8}, {upper = 8027, method = 0, count = 1, offset = -8}, {upper = 8029, method = 0, count = 1, offset = -8}, {upper = 8031, method = 0, count = 1, offset = -8}, {upper = 8040, method = 0, count = 8, offset = -8}, {upper = 8064, method = 2, count = 5, offset = 64}, {upper = 8065, method = 2, count = 5, offset = 69}, {upper = 8066, method = 2, count = 5, offset = 74}, {upper = 8067, method = 2, count = 5, offset = 79}, {upper = 8068, method = 2, count = 5, offset = 84}, {upper = 8069, method = 2, count = 5, offset = 89}, {upper = 8070, method = 2, count = 5, offset = 94}, {upper = 8071, method = 2, count = 5, offset = 99}, {upper = 8072, method = 2, count = 5, offset = 104}, {upper = 8073, method = 2, count = 5, offset = 109}, {upper = 80
 74, method = 2, count = 5, offset = 114}, {upper = 8075, method = 2, count = 5, offset = 119}, {upper = 8076, method = 2, count = 5, offset = 124}, {upper = 8077, method = 2, count = 5, offset = 129}, {upper = 8078, method = 2, count = 5, offset = 134}, {upper = 8079, method = 2, count = 5, offset = 139}, {upper = 8080, method = 2, count = 5, offset = 144}, {upper = 8081, method = 2, count = 5, offset = 149}, {upper = 8082, method = 2, count = 5, offset = 154}, {upper = 8083, method = 2, count = 5, offset = 159}, {upper = 8084, method = 2, count = 5, offset = 164}, {upper = 8085, method = 2, count = 5, offset = 169}, {upper = 8086, method = 2, count = 5, offset = 174}, {upper = 8087, method = 2, count = 5, offset = 179}, {upper = 8088, method = 2, count = 5, offset = 184}, {upper = 8089, method = 2, count = 5, offset = 189}, {upper = 8090, method = 2, count = 5, offset = 194}, {upper = 8091, method = 2, count = 5, offset = 199}, {upper = 8092, method = 2, count = 5, offset =
  204}, {upper = 8093, method = 2, count = 5, offset = 209}, {upper = 8094, method = 2, count = 5, offset = 214}, {upper = 8095, method = 2, count = 5, offset = 219}, {upper = 8096, method = 2, count = 5, offset = 224}, {upper = 8097, method = 2, count = 5, offset = 229}, {upper = 8098, method = 2, count = 5, offset = 234}, {upper = 8099, method = 2, count = 5, offset = 239}, {upper = 8100, method = 2, count = 5, offset = 244}, {upper = 8101, method = 2, count = 5, offset = 249}, {upper = 8102, method = 2, count = 5, offset = 254}, {upper = 8103, method = 2, count = 5, offset = 259}, {upper = 8104, method = 2, count = 5, offset = 264}, {upper = 8105, method = 2, count = 5, offset = 269}, {upper = 8106, method = 2, count = 5, offset = 274}, {upper = 8107, method = 2, count = 5, offset = 279}, {upper = 8108, method = 2, count = 5, offset = 284}, {upper = 8109, method = 2, count = 5, offset = 289}, {upper = 8110, method = 2, count = 5, offset = 294}, {upper = 8111, method = 2, c
 ount = 5, offset = 299}, {upper = 8114, method = 2, count = 5, offset = 304}, {upper = 8115, method = 2, count = 4, offset = 309}, {upper = 8116, method = 2, count = 4, offset = 313}, {upper = 8118, method = 2, count = 4, offset = 317}, {upper = 8119, method = 2, count = 6, offset = 321}, {upper = 8120, method = 0, count = 2, offset = -8}, {upper = 8122, method = 0, count = 2, offset = -74}, {upper = 8124, method = 2, count = 4, offset = 327}, {upper = 8126, method = 0, count = 1, offset = -7173}, {upper = 8130, method = 2, count = 5, offset = 331}, {upper = 8131, method = 2, count = 4, offset = 336}, {upper = 8132, method = 2, count = 4, offset = 340}, {upper = 8134, method = 2, count = 4, offset = 344}, {upper = 8135, method = 2, count = 6, offset = 348}, {upper = 8136, method = 0, count = 4, offset = -86}, {upper = 8140, method = 2, count = 4, offset = 354}, {upper = 8146, method = 2, count = 6, offset = 358}, {upper = 8147, method = 2, count = 6, offset = 364}, {upper = 
 8150, method = 2, count = 4, offset = 370}, {upper = 8151, method = 2, count = 6, offset = 374}, {upper = 8152, method = 0, count = 2, offset = -8}, {upper = 8154, method = 0, count = 2, offset = -100}, {upper = 8162, method = 2, count = 6, offset = 380}, {upper = 8163, method = 2, count = 6, offset = 386}, {upper = 8164, method = 2, count = 4, offset = 392}, {upper = 8166, method = 2, count = 4, offset = 396}, {upper = 8167, method = 2, count = 6, offset = 400}, {upper = 8168, method = 0, count = 2, offset = -8}, {upper = 8170, method = 0, count = 2, offset = -112}...}\"";
 
+// make sure we don't treat the comma within the <> as a separator for a new
+// member variable
+static const char *gv_var_with_member8 = "value=\"{member = 0x40085e <my_func(void*, void*)>}\"";
+static const char *gv_var_with_comma = "value=\"0x40085e <my_func(void*, void*)>\"";
+
 static const char* gv_stack_arguments1 =
 "stack-args=[frame={level=\"0\",args=[{name=\"a_comp\",value=\"(icalcomponent *) 0x80596f8\"},{name=\"a_entry\",value=\"(MokoJEntry **) 0xbfe02178\"}]},frame={level=\"1\",args=[{name=\"a_view\",value=\"(ECalView *) 0x804ba60\"},{name=\"a_entries\",value=\"(GList *) 0x8054930\"},{name=\"a_journal\",value=\"(MokoJournal *) 0x8050580\"}]},frame={level=\"2\",args=[{name=\"closure\",value=\"(GClosure *) 0x805a010\"},{name=\"return_value\",value=\"(GValue *) 0x0\"},{name=\"n_param_values\",value=\"2\"},{name=\"param_values\",value=\"(const GValue *) 0xbfe023cc\"},{name=\"invocation_hint\",value=\"(gpointer) 0xbfe022dc\"},{name=\"marshal_data\",value=\"(gpointer) 0xb7f9a146\"}]},frame={level=\"3\",args=[{name=\"closure\",value=\"(GClosure *) 0x805a010\"},{name=\"return_value\",value=\"(GValue *) 0x0\"},{name=\"n_param_values\",value=\"2\"},{name=\"param_values\",value=\"(const GValue *) 0xbfe023cc\"},{name=\"invocation_hint\",value=\"(gpointer) 0xbfe022dc\"}]},frame={level=\"4\",ar
 gs=[{name=\"node\",value=\"(SignalNode *) 0x80599c8\"},{name=\"detail\",value=\"0\"},{name=\"instance\",value=\"(gpointer) 0x804ba60\"},{name=\"emission_return\",value=\"(GValue *) 0x0\"},{name=\"instance_and_params\",value=\"(const GValue *) 0xbfe023cc\"}]},frame={level=\"5\",args=[{name=\"instance\",value=\"(gpointer) 0x804ba60\"},{name=\"signal_id\",value=\"18\"},{name=\"detail\",value=\"0\"},{name=\"var_args\",value=\"0xbfe02610 \\\"\\\\300\\\\365\\\\004\\\\b\\\\020,\\\\340\\\\277\\\\370\\\\024[\\\\001\\\\360\\\\226i\\\\267\\\\320`\\\\234\\\\267\\\\200\\\\237\\\\005\\\\bX&\\\\340\\\\277\\\\333cg\\\\267\\\\200{\\\\005\\\\b0I\\\\005\\\\b`\\\\272\\\\004\\\\b\\\\002\\\"\"}]},frame={level=\"6\",args=[{name=\"instance\",value=\"(gpointer) 0x804ba60\"},{name=\"signal_id\",value=\"18\"},{name=\"detail\",value=\"0\"}]},frame={level=\"7\",args=[{name=\"listener\",value=\"(ECalViewListener *) 0x8057b80\"},{name=\"objects\",value=\"(GList *) 0x8054930\"},{name=\"data\",value=\"(gpoi
 nter) 0x804ba60\"}]},frame={level=\"8\",args=[{name=\"closure\",value=\"(GClosure *) 0x8059f80\"},{name=\"return_value\",value=\"(GValue *) 0x0\"},{name=\"n_param_values\",value=\"2\"},{name=\"param_values\",value=\"(const GValue *) 0xbfe0286c\"},{name=\"invocation_hint\",value=\"(gpointer) 0xbfe0277c\"},{name=\"marshal_data\",value=\"(gpointer) 0xb79c60d0\"}]},frame={level=\"9\",args=[{name=\"closure\",value=\"(GClosure *) 0x8059f80\"},{name=\"return_value\",value=\"(GValue *) 0x0\"},{name=\"n_param_values\",value=\"2\"},{name=\"param_values\",value=\"(const GValue *) 0xbfe0286c\"},{name=\"invocation_hint\",value=\"(gpointer) 0xbfe0277c\"}]},frame={level=\"10\",args=[{name=\"node\",value=\"(SignalNode *) 0x8057a08\"},{name=\"detail\",value=\"0\"},{name=\"instance\",value=\"(gpointer) 0x8057b80\"},{name=\"emission_return\",value=\"(GValue *) 0x0\"},{name=\"instance_and_params\",value=\"(const GValue *) 0xbfe0286c\"}]},frame={level=\"11\",args=[{name=\"instance\",value=\"(gpo
 inter) 0x8057b80\"},{name=\"signal_id\",value=\"12\"},{name=\"detail\",value=\"0\"},{name=\"var_args\",value=\"0xbfe02ab0 \\\"\\\\314,\\\\340\\\\277\\\\300m\\\\006\\\\b\\\\233d\\\\234\\\\267\\\\020\\\\347\\\\240\\\\267\\\\220d\\\\234\\\\267\\\\230m\\\\006\\\\b\\\\370*\\\\340\\\\277\\\\317i\\\\234\\\\267\\\\200{\\\\005\\\\b n\\\\006\\\\b\\\\200*\\\\005\\\\b\\\"\"}]},frame={level=\"12\",args=[{name=\"instance\",value=\"(gpointer) 0x8057b80\"},{name=\"signal_id\",value=\"12\"},{name=\"detail\",value=\"0\"}]},frame={level=\"13\",args=[{name=\"ql\",value=\"(ECalViewListener *) 0x8057b80\"},{name=\"objects\",value=\"(char **) 0x8066e40\"},{name=\"context\",value=\"(DBusGMethodInvocation *) 0x8052a80\"}]},frame={level=\"14\",args=[{name=\"closure\",value=\"(GClosure *) 0xbfe02d1c\"},{name=\"return_value\",value=\"(GValue *) 0x0\"},{name=\"n_param_values\",value=\"3\"},{name=\"param_values\",value=\"(const GValue *) 0x8066d98\"},{name=\"invocation_hint\",value=\"(gpointer) 0x0\"},{n
 ame=\"marshal_data\",value=\"(gpointer) 0xb79c6490\"}]},frame={level=\"15\",args=[]},frame={level=\"16\",args=[]},frame={level=\"17\",args=[]}]" ;
 
@@ -402,6 +407,37 @@ test_var_with_member_variable ()
 }
 
 void
+test_var_with_comma ()
+{
+    // gdb sometimes returns values that don't exactly conform to spec, for
+    // instance, for function pointers, it appends the name and signature of the
+    // function withing < > after the address.  If the value is a member
+    // variable, we have to make sure that we don't treat the commas from the
+    // function declaration as a delimiter between member variables.  e.g.
+    // {A = 0, b = 1 } is two member variables,
+    // {A = 0x1234 <void foo(int, int)>} is a single member variable
+
+    UString::size_type to = 0;
+    IDebugger::VariableSafePtr var (new IDebugger::Variable) ;
+
+    GDBMIParser parser (gv_var_with_member);
+
+    parser.push_input (gv_var_with_member8);
+    BOOST_REQUIRE (parser.parse_variable_value (0, to, var)) ;
+    BOOST_REQUIRE (var) ;
+    BOOST_REQUIRE (1 == var->members ().size ()) ;
+    BOOST_REQUIRE_EQUAL("0x40085e <my_func(void*, void*)>", (*var->members ().begin ())->value ());
+
+    to = 0;
+    var.reset (new IDebugger::Variable);
+    parser.push_input (gv_var_with_comma);
+    BOOST_REQUIRE (parser.parse_variable_value (0, to, var)) ;
+    BOOST_REQUIRE (var) ;
+    BOOST_REQUIRE (var->members ().empty ()) ;
+    BOOST_REQUIRE_EQUAL("0x40085e <my_func(void*, void*)>", var->value ());
+}
+
+void
 test_embedded_string ()
 {
     UString::size_type to = 0 ;
@@ -688,6 +724,7 @@ init_unit_test_suite (int argc, char **argv)
     suite->add (BOOST_TEST_CASE (&test_local_vars)) ;
     suite->add (BOOST_TEST_CASE (&test_member_variable)) ;
     suite->add (BOOST_TEST_CASE (&test_var_with_member_variable)) ;
+    suite->add (BOOST_TEST_CASE (&test_var_with_comma)) ;
     suite->add (BOOST_TEST_CASE (&test_embedded_string)) ;
     suite->add (BOOST_TEST_CASE (&test_overloads_prompt)) ;
     suite->add (BOOST_TEST_CASE (&test_register_names));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]