diff options
author | David Crocker <dcrocker@eschertech.com> | 2021-03-07 12:35:55 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2021-03-07 12:35:55 +0300 |
commit | b26b9cd7e3506fa243031975578e26a42ab0c2fc (patch) | |
tree | 937231bcdf765a5ef9905c5004b6ca7d340e34db /src/ObjectModel | |
parent | 4cf8ed602d836ff2846786ed287f72ca5b4bb709 (diff) |
Fixes to HeapString handling in expressions
Diffstat (limited to 'src/ObjectModel')
-rw-r--r-- | src/ObjectModel/ObjectModel.cpp | 34 | ||||
-rw-r--r-- | src/ObjectModel/ObjectModel.h | 1 |
2 files changed, 19 insertions, 16 deletions
diff --git a/src/ObjectModel/ObjectModel.cpp b/src/ObjectModel/ObjectModel.cpp index 1dcd3eb0..418381fc 100644 --- a/src/ObjectModel/ObjectModel.cpp +++ b/src/ObjectModel/ObjectModel.cpp @@ -34,10 +34,7 @@ void ExpressionValue::AppendAsString(const StringRef& str) const noexcept break; case TypeCode::HeapString: - { - const auto p = shVal.Get(); - str.cat(p.Ptr()); - } + str.cat(shVal.Get().Ptr()); break; case TypeCode::Float: @@ -451,6 +448,10 @@ void ObjectModel::ReportArrayLengthAsJson(OutputBuffer *buf, ObjectExplorationCo buf->catf("%u", strlen(val.sVal)); break; + case TypeCode::HeapString: + buf->catf("%u", val.shVal.GetLength()); + break; + default: buf->cat("null"); break; @@ -530,10 +531,7 @@ void ObjectModel::ReportItemAsJsonFull(OutputBuffer *buf, ObjectExplorationConte break; case TypeCode::HeapString: - { - const auto p = val.shVal.Get(); - buf->catf("\"%.s\"", p.Ptr()); - } + buf->catf("\"%.s\"", val.shVal.Get().Ptr()); break; #if SUPPORT_CAN_EXPANSION @@ -951,21 +949,25 @@ ExpressionValue ObjectModel::GetObjectValue(ObjectExplorationContext& context, c case TypeCode::CanExpansionBoardDetails: if (*idString == 0) { - if (context.WantArrayLength()) - { - return GetExpansionBoardDetailLength(val); - } - return val; + return (context.WantArrayLength()) ? GetExpansionBoardDetailLength(val) : val; } break; #endif + case TypeCode::HeapString: + if (*idString == 0) + { + return (context.WantArrayLength()) ? ExpressionValue((int32_t)val.shVal.GetLength()) : val; + } + break; + case TypeCode::CString: - if (*idString == 0 && context.WantArrayLength()) + if (*idString == 0) { - return ExpressionValue((int32_t)strlen(val.sVal)); + return (context.WantArrayLength()) ? ExpressionValue((int32_t)strlen(val.sVal)) : val; } - // no break + break; + default: if (*idString == 0) { diff --git a/src/ObjectModel/ObjectModel.h b/src/ObjectModel/ObjectModel.h index 712e36ac..ddce4c62 100644 --- a/src/ObjectModel/ObjectModel.h +++ b/src/ObjectModel/ObjectModel.h @@ -135,6 +135,7 @@ struct ExpressionValue TypeCode GetType() const noexcept { return (TypeCode)type; } void SetType(TypeCode t) noexcept { type = (uint32_t)t; } + bool IsStringType() const noexcept { return type == (uint32_t)TypeCode::CString || type == (uint32_t)TypeCode::HeapString; } void Set(bool b) noexcept { Release(); type = (uint32_t)TypeCode::Bool; bVal = b; } void Set(char c) noexcept { Release(); type = (uint32_t)TypeCode::Char; cVal = c; } |