Переглянути джерело

NodesetCompiler: Correctly concatenate method calls to return correct status code

Stefan Profanter 5 роки тому
батько
коміт
8add3ae472
1 змінених файлів з 16 додано та 5 видалено
  1. 16 5
      tools/nodeset_compiler/backend_open62541.py

+ 16 - 5
tools/nodeset_compiler/backend_open62541.py

@@ -295,11 +295,22 @@ UA_StatusCode retVal = UA_STATUSCODE_GOOD;""" % (outfilebase))
         nsid = nsid.replace("\"", "\\\"")
         writec("ns[" + str(i) + "] = UA_Server_addNamespace(server, \"" + nsid + "\");")
 
-    for i in range(0, functionNumber):
-        writec("retVal |= function_" + outfilebase + "_" + str(i) + "_begin(server, ns);")
-
-    for i in reversed(range(0, functionNumber)):
-        writec("retVal |= function_" + outfilebase + "_" + str(i) + "_finish(server, ns);")
+    if functionNumber > 0:
+
+        # concatenate method calls with "&&" operator.
+        # The first method which does not return UA_STATUSCODE_GOOD (=0) will cause aborting
+        # the remaining calls and retVal will be set to that error code.
+        writec("bool dummy = (")
+        for i in range(0, functionNumber):
+            writec("!(retVal = function_{outfilebase}_{idx}_begin(server, ns)) &&".format(
+                outfilebase=outfilebase, idx=str(i)))
+
+        for i in reversed(range(0, functionNumber)):
+            writec("!(retVal = function_{outfilebase}_{idx}_finish(server, ns)) {concat}".format(
+                outfilebase=outfilebase, idx=str(i), concat= "&&" if i>0 else ""))
+
+        # use (void)(dummy) to avoid unused variable error.
+        writec("); (void)(dummy);")
 
     writec("return retVal;\n}")
     outfileh.flush()