From b53ed2d8f2f56c0d6e42f53124d8c6a7d623cd09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Mon, 24 Jul 2023 21:28:58 +0200 Subject: [PATCH] Made script deserialization more robust --- GlitchyEngine/src/World/SceneSerializer.bf | 57 +++++++++++++--------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/GlitchyEngine/src/World/SceneSerializer.bf b/GlitchyEngine/src/World/SceneSerializer.bf index 1aaab08..5ccb01a 100644 --- a/GlitchyEngine/src/World/SceneSerializer.bf +++ b/GlitchyEngine/src/World/SceneSerializer.bf @@ -613,39 +613,48 @@ class SceneSerializer // Allocate a string on the stack, because the dictionary uses a string as key String fieldNameString = scope .(fieldName); + Result fieldTypeName = reader.Type(); + + if (fieldTypeName case .Err) + { + Log.EngineLogger.Error($"Failed to read field type for field \"{fieldName}\" in script \"{component.ScriptClassName}\" of entity {entity.UUID} (\"{entity.Name}\")"); + reader.FileEntrySkip(1); + dontRemoveComma = true; + continue; + } + + Result fieldType = Enum.Parse(fieldTypeName, true); + + if ((fieldType case .Err)) + { + Log.EngineLogger.Error($"Error deserializing field type (Raw string: \"{fieldTypeName}\" of field: \"{fieldName}\" in script \"{component.ScriptClassName}\" of entity {entity.UUID} (\"{entity.Name}\")"); + reader.FileEntrySkip(1); + dontRemoveComma = true; + continue; + } + + uint8[sizeof(Matrix)] data = .(); + + if (Deserialize.Value(reader, ValueView(fieldType.Value.GetBeefType(), &data), gBonEnv) case .Err) + { + Log.EngineLogger.Error($"Failed to deserialize data for field: \"{fieldName}\" in script \"{component.ScriptClassName}\" of entity {entity.UUID} (\"{entity.Name}\")"); + reader.FileEntrySkip(1); + dontRemoveComma = true; + continue; + } + if (fields.ContainsKey(fieldNameString)) { var field = ref fields[fieldNameString]; - Result fieldTypeName = reader.Type(); - - if (fieldTypeName case .Err) - { - Log.EngineLogger.Error($"Failed to read field type for field \"{fieldName}\" in script \"{component.ScriptClassName}\" of entity {entity.UUID} (\"{entity.Name}\")"); - reader.FileEntrySkip(1); - dontRemoveComma = true; - continue; - } - - Result fieldType = Enum.Parse(fieldTypeName, true); - - if ((fieldType case .Err) || (fieldType != field.Type)) + // Make sure the type we deserialized actually is correct. + if (fieldType != field.Type) { Log.EngineLogger.Error($"Unexpected field type (\"{fieldTypeName}\" instead of \"{field.Type}\" for field: \"{fieldName}\" in script \"{component.ScriptClassName}\" of entity {entity.UUID} (\"{entity.Name}\")"); - reader.FileEntrySkip(1); - dontRemoveComma = true; continue; } - void* data = &field.[Friend]_data; - - if (Deserialize.Value(reader, ValueView(field.Type.GetBeefType(), data), gBonEnv) case .Err) - { - Log.EngineLogger.Error($"Failed to deserialize data for field: \"{fieldName}\" in script \"{component.ScriptClassName}\" of entity {entity.UUID} (\"{entity.Name}\")"); - reader.FileEntrySkip(1); - dontRemoveComma = true; - continue; - } + field.SetData(data); } else {