[glass] Fix array crash when clearing existing workspace (#5535)

This commit is contained in:
Peter Johnson
2023-08-12 15:17:43 -07:00
committed by GitHub
parent e2e1b763b2
commit b542e01a0b

View File

@@ -95,10 +95,14 @@ static inline bool ConvertString(Storage::Value* value) {
template <typename From, typename To> template <typename From, typename To>
static void ConvertArray(std::vector<To>** outPtr, std::vector<From>** inPtr) { static void ConvertArray(std::vector<To>** outPtr, std::vector<From>** inPtr) {
if (*inPtr) { if (*inPtr) {
std::vector<To>* tmp; if (*outPtr) {
tmp = new std::vector<To>{(*inPtr)->begin(), (*inPtr)->end()}; (*outPtr)->assign((*inPtr)->begin(), (*inPtr)->end());
delete *inPtr; } else {
*outPtr = tmp; std::vector<To>* tmp;
tmp = new std::vector<To>{(*inPtr)->begin(), (*inPtr)->end()};
delete *inPtr;
*outPtr = tmp;
}
} else { } else {
*outPtr = nullptr; *outPtr = nullptr;
} }
@@ -300,7 +304,7 @@ Storage& Storage::GetChild(std::string_view label_id) {
childPtr = std::make_unique<Value>(); childPtr = std::make_unique<Value>();
} }
if (childPtr->type != Value::kChild) { if (childPtr->type != Value::kChild) {
childPtr->type = Value::kChild; childPtr->Reset(Value::kChild);
childPtr->child = new Storage; childPtr->child = new Storage;
} }
return *childPtr->child; return *childPtr->child;
@@ -630,22 +634,46 @@ void Storage::ClearValues() {
value.stringVal = value.stringDefault; value.stringVal = value.stringDefault;
break; break;
case Value::kIntArray: case Value::kIntArray:
*value.intArray = *value.intArrayDefault; if (value.intArrayDefault) {
*value.intArray = *value.intArrayDefault;
} else {
value.intArray->clear();
}
break; break;
case Value::kInt64Array: case Value::kInt64Array:
*value.int64Array = *value.int64ArrayDefault; if (value.int64ArrayDefault) {
*value.int64Array = *value.int64ArrayDefault;
} else {
value.int64Array->clear();
}
break; break;
case Value::kBoolArray: case Value::kBoolArray:
*value.boolArray = *value.boolArrayDefault; if (value.boolArrayDefault) {
*value.boolArray = *value.boolArrayDefault;
} else {
value.boolArray->clear();
}
break; break;
case Value::kFloatArray: case Value::kFloatArray:
*value.floatArray = *value.floatArrayDefault; if (value.floatArrayDefault) {
*value.floatArray = *value.floatArrayDefault;
} else {
value.floatArray->clear();
}
break; break;
case Value::kDoubleArray: case Value::kDoubleArray:
*value.doubleArray = *value.doubleArrayDefault; if (value.doubleArrayDefault) {
*value.doubleArray = *value.doubleArrayDefault;
} else {
value.doubleArray->clear();
}
break; break;
case Value::kStringArray: case Value::kStringArray:
*value.stringArray = *value.stringArrayDefault; if (value.stringArrayDefault) {
*value.stringArray = *value.stringArrayDefault;
} else {
value.stringArray->clear();
}
break; break;
case Value::kChild: case Value::kChild:
value.child->Clear(); value.child->Clear();