Browse Source

working on #510, fixing some memleaks, @ichrispa - help needed with arrays

Stasik0 9 years ago
parent
commit
b15aa422f9
2 changed files with 8 additions and 4 deletions
  1. 2 2
      src/server/ua_nodes.c
  2. 6 2
      tools/pyUANamespace/ua_node_types.py

+ 2 - 2
src/server/ua_nodes.c

@@ -205,9 +205,9 @@ UA_VariableNode * UA_VariableNode_new(void) {
 }
 
 void UA_VariableNode_deleteMembers(UA_VariableNode *p) {
-    UA_Node_deleteMembers((UA_Node*)p);
     if(p->valueSource == UA_VALUESOURCE_VARIANT)
         UA_Variant_deleteMembers(&p->value.variant.value);
+    UA_Node_deleteMembers((UA_Node*)p);
 }
 
 void UA_VariableNode_delete(UA_VariableNode *p) {
@@ -250,9 +250,9 @@ UA_VariableTypeNode * UA_VariableTypeNode_new(void) {
 }
 
 void UA_VariableTypeNode_deleteMembers(UA_VariableTypeNode *p) {
-    UA_Node_deleteMembers((UA_Node*)p);
     if(p->valueSource == UA_VALUESOURCE_VARIANT)
         UA_Variant_deleteMembers(&p->value.variant.value);
+    UA_Node_deleteMembers((UA_Node*)p);
 }
 
 void UA_VariableTypeNode_delete(UA_VariableTypeNode *p) {

+ 6 - 2
tools/pyUANamespace/ua_node_types.py

@@ -1070,7 +1070,8 @@ class opcua_node_variable_t(opcua_node_t):
           code = code + self.value().printOpen62541CCode(bootstrapping)
           return code
     if(bootstrapping):
-      code.append("UA_Variant *" + self.getCodePrintableID() + "_variant = UA_Variant_new();")
+      code.append("UA_Variant *" + self.getCodePrintableID() + "_variant = UA_alloca(sizeof(UA_Variant));")
+      code.append("UA_Variant_init(" + self.getCodePrintableID() + "_variant);")
     return code
   
   def printOpen62541CCode_Subtype(self, unPrintedReferences=[], bootstrapping = True):
@@ -1095,6 +1096,7 @@ class opcua_node_variable_t(opcua_node_t):
     code.append(self.getCodePrintableID() + "->valueRank = (UA_Int32) " + str(self.valueRank()) + ";")
     # The variant is guaranteed to exist by SubtypeEarly()
     code.append(self.getCodePrintableID() + "->value.variant.value = *" + self.getCodePrintableID() + "_variant;")
+    code.append(self.getCodePrintableID() + "->valueSource = UA_VALUESOURCE_VARIANT;")
     return code
 
 class opcua_node_method_t(opcua_node_t):
@@ -1325,7 +1327,8 @@ class opcua_node_variableType_t(opcua_node_t):
           code = code + self.value().printOpen62541CCode(bootstrapping)
           return code
     if(bootstrapping):
-      code.append("UA_Variant *" + self.getCodePrintableID() + "_variant = UA_Variant_new();")
+      code.append("UA_Variant *" + self.getCodePrintableID() + "_variant = UA_alloca(sizeof(UA_Variant));")
+      code.append("UA_Variant_init(" + self.getCodePrintableID() + "_variant);")
     return code
   
   def printOpen62541CCode_Subtype(self, unPrintedReferences=[], bootstrapping = True):
@@ -1348,6 +1351,7 @@ class opcua_node_variableType_t(opcua_node_t):
     
     # The variant is guaranteed to exist by SubtypeEarly()
     code.append(self.getCodePrintableID() + "->value.variant.value = *" + self.getCodePrintableID() + "_variant;")
+    code.append(self.getCodePrintableID() + "->valueSource = UA_VALUESOURCE_VARIANT;")
     return code
 
 class opcua_node_dataType_t(opcua_node_t):