Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Tarassov2016-03-26 19:18:44 +0000
committerEugene Tarassov2016-03-26 19:18:44 +0000
commitd9acc9038dcf10c43a2feebda1127f70494958db (patch)
tree8184b9def7ff85934812d64cb7c421789268bfc3 /agent/tcf/services/expressions.c
parent7914102ecd5ee9ddc13d703380d5d08b156d4c29 (diff)
downloadorg.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.c11
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");

Back to the top