diff options
author | Eugene Tarassov | 2016-03-26 19:18:44 +0000 |
---|---|---|
committer | Eugene Tarassov | 2016-03-26 19:18:44 +0000 |
commit | d9acc9038dcf10c43a2feebda1127f70494958db (patch) | |
tree | 8184b9def7ff85934812d64cb7c421789268bfc3 /agent/tcf/services/expressions.c | |
parent | 7914102ecd5ee9ddc13d703380d5d08b156d4c29 (diff) | |
download | org.eclipse.tcf.agent-d9acc9038dcf10c43a2feebda1127f70494958db.tar.gz org.eclipse.tcf.agent-d9acc9038dcf10c43a2feebda1127f70494958db.tar.xz org.eclipse.tcf.agent-d9acc9038dcf10c43a2feebda1127f70494958db.zip |
TCF Agent: fixed: in expression like X::Y, don't compute value of X, only type of X is needed
Diffstat (limited to 'agent/tcf/services/expressions.c')
-rw-r--r-- | agent/tcf/services/expressions.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/agent/tcf/services/expressions.c b/agent/tcf/services/expressions.c index 2cdcff86..568b25a9 100644 --- a/agent/tcf/services/expressions.c +++ b/agent/tcf/services/expressions.c @@ -1247,7 +1247,7 @@ static int qualified_name(int mode, Value * scope, SYM_FLAGS flags, Value * v) { name = tilda ? tmp_strdup2("~", name) : tmp_strdup(name); next_sy(); if (text_sy == SY_SCOPE) f |= SYM_FLAG_TYPE; - sym_class = identifier(mode, scope, name, f, v); + sym_class = identifier(text_sy != SY_SCOPE ? mode : MODE_TYPE, scope, name, f, v); if (sym_class < 0) error(ERR_INV_EXPRESSION, "Undefined identifier '%s'", name); } else { @@ -1260,7 +1260,8 @@ static int qualified_name(int mode, Value * scope, SYM_FLAGS flags, Value * v) { Context * ctx = NULL; int frame = STACK_NO_FRAME; RegisterDefinition * def = NULL; - const char * id = (char *)text_val.value; + const char * id = tmp_strdup((char *)text_val.value); + next_sy(); if (id2register(id, &ctx, &frame, &def) >= 0) { if (frame == STACK_TOP_FRAME) frame = expression_frame; sym_class = SYM_CLASS_UNKNOWN; @@ -1271,14 +1272,16 @@ static int qualified_name(int mode, Value * scope, SYM_FLAGS flags, Value * v) { if (!ok) { Symbol * sym = NULL; if (id2symbol(id, &sym) >= 0) { - sym_class = sym2value(mode, sym, v); + sym_class = sym2value(text_sy != SY_SCOPE ? mode : MODE_TYPE, sym, v); ok = 1; } } #endif if (!ok) error(ERR_INV_EXPRESSION, "Symbol not found: %s", id); } - next_sy(); + else { + next_sy(); + } } else { error(ERR_INV_EXPRESSION, "Identifier expected"); |