summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/API/SBValue.h4
-rw-r--r--lldb/include/lldb/Core/ValueObject.h4
-rw-r--r--lldb/include/lldb/Core/ValueObjectDynamicValue.h3
-rw-r--r--lldb/include/lldb/Core/ValueObjectRegister.h2
-rw-r--r--lldb/scripts/Python/interface/SBValue.i3
-rw-r--r--lldb/source/API/SBValue.cpp10
-rw-r--r--lldb/source/Core/ValueObject.cpp17
-rw-r--r--lldb/source/Core/ValueObjectDynamicValue.cpp36
-rw-r--r--lldb/source/Core/ValueObjectRegister.cpp4
9 files changed, 73 insertions, 10 deletions
diff --git a/lldb/include/lldb/API/SBValue.h b/lldb/include/lldb/API/SBValue.h
index 67a1f1168f9..7e7b9dbdb6e 100644
--- a/lldb/include/lldb/API/SBValue.h
+++ b/lldb/include/lldb/API/SBValue.h
@@ -101,8 +101,12 @@ public:
const char *
GetLocation ();
+ // Deprecated - use the one that takes SBError&
bool
SetValueFromCString (const char *value_str);
+
+ bool
+ SetValueFromCString (const char *value_str, lldb::SBError& error);
lldb::SBTypeFormat
GetTypeFormat ();
diff --git a/lldb/include/lldb/Core/ValueObject.h b/lldb/include/lldb/Core/ValueObject.h
index 80e9f6bf02f..225d89f4f21 100644
--- a/lldb/include/lldb/Core/ValueObject.h
+++ b/lldb/include/lldb/Core/ValueObject.h
@@ -696,8 +696,8 @@ public:
GetValueAsUnsigned (uint64_t fail_value);
virtual bool
- SetValueFromCString (const char *value_str);
-
+ SetValueFromCString (const char *value_str, Error& error);
+
// Return the module associated with this value object in case the
// value is from an executable file and might have its data in
// sections of the file. This can be used for variables.
diff --git a/lldb/include/lldb/Core/ValueObjectDynamicValue.h b/lldb/include/lldb/Core/ValueObjectDynamicValue.h
index 7b2785f5229..04fe12918e3 100644
--- a/lldb/include/lldb/Core/ValueObjectDynamicValue.h
+++ b/lldb/include/lldb/Core/ValueObjectDynamicValue.h
@@ -160,6 +160,9 @@ public:
m_owning_valobj_sp = owning_sp;
}
+ virtual bool
+ SetValueFromCString (const char *value_str, Error& error);
+
protected:
virtual bool
UpdateValue ();
diff --git a/lldb/include/lldb/Core/ValueObjectRegister.h b/lldb/include/lldb/Core/ValueObjectRegister.h
index 39b1871b687..ded6b3431f7 100644
--- a/lldb/include/lldb/Core/ValueObjectRegister.h
+++ b/lldb/include/lldb/Core/ValueObjectRegister.h
@@ -158,7 +158,7 @@ public:
CalculateNumChildren();
virtual bool
- SetValueFromCString (const char *value_str);
+ SetValueFromCString (const char *value_str, Error& error);
virtual bool
ResolveValue (Scalar &scalar);
diff --git a/lldb/scripts/Python/interface/SBValue.i b/lldb/scripts/Python/interface/SBValue.i
index d529e656099..9b9fd529de8 100644
--- a/lldb/scripts/Python/interface/SBValue.i
+++ b/lldb/scripts/Python/interface/SBValue.i
@@ -139,6 +139,9 @@ public:
bool
SetValueFromCString (const char *value_str);
+ bool
+ SetValueFromCString (const char *value_str, lldb::SBError& error);
+
lldb::SBTypeFormat
GetTypeFormat ();
diff --git a/lldb/source/API/SBValue.cpp b/lldb/source/API/SBValue.cpp
index a94b18bfa1f..5f8251ec28a 100644
--- a/lldb/source/API/SBValue.cpp
+++ b/lldb/source/API/SBValue.cpp
@@ -430,9 +430,17 @@ SBValue::GetLocation ()
return cstr;
}
+// Deprecated - use the one that takes an lldb::SBError
bool
SBValue::SetValueFromCString (const char *value_str)
{
+ lldb::SBError dummy;
+ return SetValueFromCString(value_str,dummy);
+}
+
+bool
+SBValue::SetValueFromCString (const char *value_str, lldb::SBError& error)
+{
bool success = false;
lldb::ValueObjectSP value_sp(GetSP());
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
@@ -451,7 +459,7 @@ SBValue::SetValueFromCString (const char *value_str)
if (target_sp)
{
Mutex::Locker api_locker (target_sp->GetAPIMutex());
- success = value_sp->SetValueFromCString (value_str);
+ success = value_sp->SetValueFromCString (value_str,error.ref());
}
}
}
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index b0b1a67095a..cd41f1d689f 100644
--- a/lldb/source/Core/ValueObject.cpp
+++ b/lldb/source/Core/ValueObject.cpp
@@ -1591,12 +1591,16 @@ ValueObject::GetPointerValue (AddressType *address_type)
}
bool
-ValueObject::SetValueFromCString (const char *value_str)
+ValueObject::SetValueFromCString (const char *value_str, Error& error)
{
+ error.Clear();
// Make sure our value is up to date first so that our location and location
// type is valid.
if (!UpdateValueIfNeeded(false))
+ {
+ error.SetErrorString("unable to read value");
return false;
+ }
uint32_t count = 0;
Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count);
@@ -1615,7 +1619,6 @@ ValueObject::SetValueFromCString (const char *value_str)
// If the value fits in a scalar, then make a new scalar and again let the
// scalar code do the conversion, then figure out where to put the new value.
Scalar new_scalar;
- Error error;
error = new_scalar.SetValueFromCString (value_str, encoding, byte_size);
if (error.Success())
{
@@ -1634,8 +1637,13 @@ ValueObject::SetValueFromCString (const char *value_str)
new_scalar,
byte_size,
error);
- if (!error.Success() || bytes_written != byte_size)
- return false;
+ if (!error.Success())
+ return false;
+ if (bytes_written != byte_size)
+ {
+ error.SetErrorString("unable to write value to memory");
+ return false;
+ }
}
}
break;
@@ -1673,6 +1681,7 @@ ValueObject::SetValueFromCString (const char *value_str)
else
{
// We don't support setting things bigger than a scalar at present.
+ error.SetErrorString("unable to write aggregate data type");
return false;
}
diff --git a/lldb/source/Core/ValueObjectDynamicValue.cpp b/lldb/source/Core/ValueObjectDynamicValue.cpp
index 6fd4ee88592..e3f27fc0bb9 100644
--- a/lldb/source/Core/ValueObjectDynamicValue.cpp
+++ b/lldb/source/Core/ValueObjectDynamicValue.cpp
@@ -359,3 +359,39 @@ ValueObjectDynamicValue::IsInScope ()
return m_parent->IsInScope();
}
+bool
+ValueObjectDynamicValue::SetValueFromCString (const char *value_str, Error& error)
+{
+ if (!UpdateValueIfNeeded(false))
+ {
+ error.SetErrorString("unable to read value");
+ return false;
+ }
+
+ uint64_t my_value = GetValueAsUnsigned(UINT64_MAX);
+ uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX);
+
+ if (my_value == UINT64_MAX || parent_value == UINT64_MAX)
+ {
+ error.SetErrorString("unable to read value");
+ return false;
+ }
+
+ // if we are at an offset from our parent, in order to set ourselves correctly we would need
+ // to change the new value so that it refers to the correct dynamic type. we choose not to deal
+ // with that - if anything more than a value overwrite is required, you should be using the
+ // expression parser instead of the value editing facility
+ if (my_value != parent_value)
+ {
+ // but NULL'ing out a value should always be allowed
+ if (strcmp(value_str,"0"))
+ {
+ error.SetErrorString("unable to modify dynamic value, use 'expression' command");
+ return false;
+ }
+ }
+
+ bool ret_val = m_parent->SetValueFromCString(value_str,error);
+ SetNeedsUpdate();
+ return ret_val;
+}
diff --git a/lldb/source/Core/ValueObjectRegister.cpp b/lldb/source/Core/ValueObjectRegister.cpp
index 2df5af6d320..2f2959dd1fe 100644
--- a/lldb/source/Core/ValueObjectRegister.cpp
+++ b/lldb/source/Core/ValueObjectRegister.cpp
@@ -404,10 +404,10 @@ ValueObjectRegister::UpdateValue ()
}
bool
-ValueObjectRegister::SetValueFromCString (const char *value_str)
+ValueObjectRegister::SetValueFromCString (const char *value_str, Error& error)
{
// The new value will be in the m_data. Copy that into our register value.
- Error error = m_reg_value.SetValueFromCString (&m_reg_info, value_str);
+ error = m_reg_value.SetValueFromCString (&m_reg_info, value_str);
if (error.Success())
{
if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value))
OpenPOWER on IntegriCloud