diff options
-rw-r--r-- | lldb/include/lldb/API/SBValue.h | 4 | ||||
-rw-r--r-- | lldb/include/lldb/Core/ValueObject.h | 4 | ||||
-rw-r--r-- | lldb/include/lldb/Core/ValueObjectDynamicValue.h | 3 | ||||
-rw-r--r-- | lldb/include/lldb/Core/ValueObjectRegister.h | 2 | ||||
-rw-r--r-- | lldb/scripts/Python/interface/SBValue.i | 3 | ||||
-rw-r--r-- | lldb/source/API/SBValue.cpp | 10 | ||||
-rw-r--r-- | lldb/source/Core/ValueObject.cpp | 17 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectDynamicValue.cpp | 36 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectRegister.cpp | 4 |
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)) |