You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2023/06/19 13:50:58 UTC

[plc4x] 03/05: fix(plc4go/tools): fix atomic.Pointer support

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 7089ac3b584ba7fd776905c8ed29d9eaa4a59eb4
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Jun 19 15:45:00 2023 +0200

    fix(plc4go/tools): fix atomic.Pointer support
---
 plc4go/tools/plc4xgenerator/gen.go | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/plc4go/tools/plc4xgenerator/gen.go b/plc4go/tools/plc4xgenerator/gen.go
index 3644e4ceca..54ceab6101 100644
--- a/plc4go/tools/plc4xgenerator/gen.go
+++ b/plc4go/tools/plc4xgenerator/gen.go
@@ -284,7 +284,7 @@ func (g *Generator) generate(typeName string) {
 				xIdent, xIsIdent := fieldType.X.(*ast.Ident)
 				sel := fieldType.Sel
 				if xIsIdent && xIdent.Name == "atomic" && sel.Name == "Pointer" {
-					g.Printf(serializableFieldTemplate, "(*d."+field.name+".Load())", fieldNameUntitled)
+					g.Printf(atomicPointerFieldTemplate, "d."+field.name, field.name, fieldNameUntitled)
 					continue
 				}
 			}
@@ -556,6 +556,28 @@ var serializableFieldTemplate = `
 	}
 `
 
+var atomicPointerFieldTemplate = `
+	if %[2]sLoaded :=%[1]s.Load(); %[2]sLoaded != nil && *%[2]sLoaded != nil {
+		%[2]s := *%[2]sLoaded
+		if serializableField, ok := %[2]s.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext(%[3]s); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext(%[3]s); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%%v", %[2]s)
+			if err := writeBuffer.WriteString(%[3]s, uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+`
+
 var byteFieldSerialize = `
 	if err := writeBuffer.WriteByte(%[2]s, %[1]s); err != nil {
 		return err