From 41ee317073adeaef5472abf06a0f40cd36c8d455 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Tue, 14 Apr 2015 20:24:30 +0300 Subject: [PATCH 1/2] set_internalvar_lazy --- gdb/value.c | 18 +++++++++++++++--- gdb/value.h | 3 +++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/gdb/value.c b/gdb/value.c index cb56849..29b2999 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -2167,8 +2167,6 @@ value_of_internalvar (struct gdbarch *gdbarch, struct internalvar *var) case INTERNALVAR_VALUE: val = value_copy (var->u.value); - if (value_lazy (val)) - value_fetch_lazy (val); break; case INTERNALVAR_MAKE_VALUE: @@ -2271,7 +2269,7 @@ set_internalvar_component (struct internalvar *var, int offset, int bitpos, } void -set_internalvar (struct internalvar *var, struct value *val) +set_internalvar_lazy (struct internalvar *var, struct value *val) { enum internalvar_kind new_kind; union internalvar_data new_data = { 0 }; @@ -2323,6 +2321,20 @@ set_internalvar (struct internalvar *var, struct value *val) } void +set_internalvar (struct internalvar *var, struct value *val) +{ + /* Force the value to be fetched from the target now, to avoid problems + later when this internalvar is referenced and the target is gone or + has changed. */ + if (value_lazy (val)) + value_fetch_lazy (val); + + /* Since we've already fetched the value, the value copied + into internal variable won't be lazy. */ + set_internalvar_lazy (var, val); +} + +void set_internalvar_integer (struct internalvar *var, LONGEST l) { /* Clean up old contents. */ diff --git a/gdb/value.h b/gdb/value.h index 21baa32..a05911d 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -861,6 +861,9 @@ extern void set_internalvar_integer (struct internalvar *var, LONGEST l); extern void set_internalvar_string (struct internalvar *var, const char *string); +extern void set_internalvar_lazy (struct internalvar *var, struct value *val); + + extern void clear_internalvar (struct internalvar *var); extern void set_internalvar_component (struct internalvar *var, -- 1.9.1