Github user eribeiro commented on a diff in the pull request:

    https://github.com/apache/zookeeper/pull/102#discussion_r87038798
  
    --- Diff: src/java/main/org/apache/jute/compiler/JRecord.java ---
    @@ -141,109 +141,128 @@ public String genCsharpWriteWrapper(String fname, 
String tag) {
     
         static HashMap<String, String> vectorStructs = new HashMap<String, 
String>();
         public void genCCode(FileWriter h, FileWriter c) throws IOException {
    -        for (JField f : mFields) {
    -            if (f.getType() instanceof JVector) {
    -                JVector jv = (JVector)f.getType();
    -                JType jvType = jv.getElementType();
    -                String struct_name = JVector.extractVectorName(jvType);
    -                if (vectorStructs.get(struct_name) == null) {
    -                    vectorStructs.put(struct_name, struct_name);
    -                    h.write("struct " + struct_name + " {\n    int32_t 
count;\n" + jv.getElementType().genCDecl("*data") + "\n};\n");
    -                    h.write("int serialize_" + struct_name + "(struct 
oarchive *out, const char *tag, struct " + struct_name + " *v);\n");
    -                    h.write("int deserialize_" + struct_name + "(struct 
iarchive *in, const char *tag, struct " + struct_name + " *v);\n");
    -                    h.write("int allocate_" + struct_name + "(struct " + 
struct_name + " *v, int32_t len);\n");
    -                    h.write("int deallocate_" + struct_name + "(struct " + 
struct_name + " *v);\n");
    -                    c.write("int allocate_" + struct_name + "(struct " + 
struct_name + " *v, int32_t len) {\n");
    -                    c.write("    if (!len) {\n");
    -                    c.write("        v->count = 0;\n");
    -                    c.write("        v->data = 0;\n");
    -                    c.write("    } else {\n");
    -                    c.write("        v->count = len;\n");
    -                    c.write("        v->data = calloc(sizeof(*v->data), 
len);\n");
    -                    c.write("    }\n");
    -                    c.write("    return 0;\n");
    -                    c.write("}\n");
    -                    c.write("int deallocate_" + struct_name + "(struct " + 
struct_name + " *v) {\n");
    -                    c.write("    if (v->data) {\n");
    -                    c.write("        int32_t i;\n");
    -                    c.write("        for(i=0;i<v->count; i++) {\n");
    -                    c.write("            
deallocate_"+JRecord.extractMethodSuffix(jvType)+"(&v->data[i]);\n");
    -                    c.write("        }\n");
    -                    c.write("        free(v->data);\n");
    -                    c.write("        v->data = 0;\n");
    -                    c.write("    }\n");
    -                    c.write("    return 0;\n");
    -                    c.write("}\n");
    -                    c.write("int serialize_" + struct_name + "(struct 
oarchive *out, const char *tag, struct " + struct_name + " *v)\n");
    -                    c.write("{\n");
    -                    c.write("    int32_t count = v->count;\n");
    -                    c.write("    int rc = 0;\n");
    -                    c.write("    int32_t i;\n");
    -                    c.write("    rc = out->start_vector(out, tag, 
&count);\n");
    -                    c.write("    for(i=0;i<v->count;i++) {\n");
    -                    genSerialize(c, jvType, "data", "data[i]");
    -                    c.write("    }\n");
    -                    c.write("    rc = rc ? rc : out->end_vector(out, 
tag);\n");
    -                    c.write("    return rc;\n");
    -                    c.write("}\n");
    -                    c.write("int deserialize_" + struct_name + "(struct 
iarchive *in, const char *tag, struct " + struct_name + " *v)\n");
    -                    c.write("{\n");
    -                    c.write("    int rc = 0;\n");
    -                    c.write("    int32_t i;\n");
    -                    c.write("    rc = in->start_vector(in, tag, 
&v->count);\n");
    -                    c.write("    v->data = calloc(v->count, 
sizeof(*v->data));\n");
    -                    c.write("    for(i=0;i<v->count;i++) {\n");
    -                    genDeserialize(c, jvType, "value", "data[i]");
    -                    c.write("    }\n");
    -                    c.write("    rc = in->end_vector(in, tag);\n");
    -                    c.write("    return rc;\n");
    -                    c.write("}\n");
    -
    +        try {
    +            for (JField f : mFields) {
    +                if (f.getType() instanceof JVector) {
    +                    JVector jv = (JVector) f.getType();
    +                    JType jvType = jv.getElementType();
    +                    String struct_name = JVector.extractVectorName(jvType);
    +                    if (vectorStructs.get(struct_name) == null) {
    +                        vectorStructs.put(struct_name, struct_name);
    +                        h.write("struct " + struct_name + " {\n    int32_t 
count;\n" + jv.getElementType().genCDecl("*data") + "\n};\n");
    +                        h.write("int serialize_" + struct_name + "(struct 
oarchive *out, const char *tag, struct " + struct_name + " *v);\n");
    +                        h.write("int deserialize_" + struct_name + 
"(struct iarchive *in, const char *tag, struct " + struct_name + " *v);\n");
    +                        h.write("int allocate_" + struct_name + "(struct " 
+ struct_name + " *v, int32_t len);\n");
    +                        h.write("int deallocate_" + struct_name + "(struct 
" + struct_name + " *v);\n");
    +                        c.write("int allocate_" + struct_name + "(struct " 
+ struct_name + " *v, int32_t len) {\n");
    +                        c.write("    if (!len) {\n");
    +                        c.write("        v->count = 0;\n");
    +                        c.write("        v->data = 0;\n");
    +                        c.write("    } else {\n");
    +                        c.write("        v->count = len;\n");
    +                        c.write("        v->data = 
calloc(sizeof(*v->data), len);\n");
    +                        c.write("    }\n");
    +                        c.write("    return 0;\n");
    +                        c.write("}\n");
    +                        c.write("int deallocate_" + struct_name + "(struct 
" + struct_name + " *v) {\n");
    +                        c.write("    if (v->data) {\n");
    +                        c.write("        int32_t i;\n");
    +                        c.write("        for(i=0;i<v->count; i++) {\n");
    +                        c.write("            deallocate_" + 
JRecord.extractMethodSuffix(jvType) + "(&v->data[i]);\n");
    +                        c.write("        }\n");
    +                        c.write("        free(v->data);\n");
    +                        c.write("        v->data = 0;\n");
    +                        c.write("    }\n");
    +                        c.write("    return 0;\n");
    +                        c.write("}\n");
    +                        c.write("int serialize_" + struct_name + "(struct 
oarchive *out, const char *tag, struct " + struct_name + " *v)\n");
    +                        c.write("{\n");
    +                        c.write("    int32_t count = v->count;\n");
    +                        c.write("    int rc = 0;\n");
    +                        c.write("    int32_t i;\n");
    +                        c.write("    rc = out->start_vector(out, tag, 
&count);\n");
    +                        c.write("    for(i=0;i<v->count;i++) {\n");
    +                        genSerialize(c, jvType, "data", "data[i]");
    +                        c.write("    }\n");
    +                        c.write("    rc = rc ? rc : out->end_vector(out, 
tag);\n");
    +                        c.write("    return rc;\n");
    +                        c.write("}\n");
    +                        c.write("int deserialize_" + struct_name + 
"(struct iarchive *in, const char *tag, struct " + struct_name + " *v)\n");
    +                        c.write("{\n");
    +                        c.write("    int rc = 0;\n");
    +                        c.write("    int32_t i;\n");
    +                        c.write("    rc = in->start_vector(in, tag, 
&v->count);\n");
    +                        c.write("    v->data = calloc(v->count, 
sizeof(*v->data));\n");
    +                        c.write("    for(i=0;i<v->count;i++) {\n");
    +                        genDeserialize(c, jvType, "value", "data[i]");
    +                        c.write("    }\n");
    +                        c.write("    rc = in->end_vector(in, tag);\n");
    +                        c.write("    return rc;\n");
    +                        c.write("}\n");
    +
    +                    }
                     }
                 }
    -        }
    -        String rec_name = getName();
    -        h.write("struct " + rec_name + " {\n");
    -        for (JField f : mFields) {
    -            h.write(f.genCDecl());
    -        }
    -        h.write("};\n");
    -        h.write("int serialize_" + rec_name + "(struct oarchive *out, 
const char *tag, struct " + rec_name + " *v);\n");
    -        h.write("int deserialize_" + rec_name + "(struct iarchive *in, 
const char *tag, struct " + rec_name + "*v);\n");
    -        h.write("void deallocate_" + rec_name + "(struct " + rec_name + 
"*);\n");
    -        c.write("int serialize_" + rec_name + "(struct oarchive *out, 
const char *tag, struct " + rec_name + " *v)");
    -        c.write("{\n");
    -        c.write("    int rc;\n");
    -        c.write("    rc = out->start_record(out, tag);\n");
    -        for(JField f : mFields) {
    -            genSerialize(c, f.getType(), f.getTag(), f.getName());
    -        }
    -        c.write("    rc = rc ? rc : out->end_record(out, tag);\n");
    -        c.write("    return rc;\n");
    -        c.write("}\n");
    -        c.write("int deserialize_" + rec_name + "(struct iarchive *in, 
const char *tag, struct " + rec_name + "*v)");
    -        c.write("{\n");
    -        c.write("    int rc;\n");
    -        c.write("    rc = in->start_record(in, tag);\n");
    -        for(JField f : mFields) {
    -            genDeserialize(c, f.getType(), f.getTag(), f.getName());
    -        }
    -        c.write("    rc = rc ? rc : in->end_record(in, tag);\n");
    -        c.write("    return rc;\n");
    -        c.write("}\n");
    -        c.write("void deallocate_" + rec_name + "(struct " + rec_name + 
"*v)");
    -        c.write("{\n");
    -        for(JField f : mFields) {
    -            if (f.getType() instanceof JRecord) {
    -                c.write("    deallocate_" + extractStructName(f.getType()) 
+ "(&v->" + f.getName() + ");\n");
    -            } else if (f.getType() instanceof JVector) {
    -                JVector vt = (JVector)f.getType();
    -                c.write("    deallocate_" + 
JVector.extractVectorName(vt.getElementType())+ "(&v->"+f.getName()+");\n");
    -            } else if (f.getType() instanceof JCompType) {
    -                c.write("    deallocate_" + 
extractMethodSuffix(f.getType()) + "(&v->"+f.getName()+");\n");
    +            String rec_name = getName();
    +            h.write("struct " + rec_name + " {\n");
    +            for (JField f : mFields) {
    +                h.write(f.genCDecl());
    +            }
    +            h.write("};\n");
    +            h.write("int serialize_" + rec_name + "(struct oarchive *out, 
const char *tag, struct " + rec_name + " *v);\n");
    +            h.write("int deserialize_" + rec_name + "(struct iarchive *in, 
const char *tag, struct " + rec_name + "*v);\n");
    +            h.write("void deallocate_" + rec_name + "(struct " + rec_name 
+ "*);\n");
    +            c.write("int serialize_" + rec_name + "(struct oarchive *out, 
const char *tag, struct " + rec_name + " *v)");
    +            c.write("{\n");
    +            c.write("    int rc;\n");
    +            c.write("    rc = out->start_record(out, tag);\n");
    +            for (JField f : mFields) {
    +                genSerialize(c, f.getType(), f.getTag(), f.getName());
    +            }
    +            c.write("    rc = rc ? rc : out->end_record(out, tag);\n");
    +            c.write("    return rc;\n");
    +            c.write("}\n");
    +            c.write("int deserialize_" + rec_name + "(struct iarchive *in, 
const char *tag, struct " + rec_name + "*v)");
    +            c.write("{\n");
    +            c.write("    int rc;\n");
    +            c.write("    rc = in->start_record(in, tag);\n");
    +            for (JField f : mFields) {
    +                genDeserialize(c, f.getType(), f.getTag(), f.getName());
    +            }
    +            c.write("    rc = rc ? rc : in->end_record(in, tag);\n");
    +            c.write("    return rc;\n");
    +            c.write("}\n");
    +            c.write("void deallocate_" + rec_name + "(struct " + rec_name 
+ "*v)");
    +            c.write("{\n");
    +            for (JField f : mFields) {
    +                if (f.getType() instanceof JRecord) {
    +                    c.write("    deallocate_" + 
extractStructName(f.getType()) + "(&v->" + f.getName() + ");\n");
    +                } else if (f.getType() instanceof JVector) {
    +                    JVector vt = (JVector) f.getType();
    +                    c.write("    deallocate_" + 
JVector.extractVectorName(vt.getElementType()) + "(&v->" + f.getName() + 
");\n");
    +                } else if (f.getType() instanceof JCompType) {
    +                    c.write("    deallocate_" + 
extractMethodSuffix(f.getType()) + "(&v->" + f.getName() + ");\n");
    +                }
    +            }
    +            c.write("}\n");
    +        } catch (IOException e) {
    +            throw e;
    +        } finally {
    +            if (h != null) {
    --- End diff --
    
    Just speculating here: couldn't we write this snippet as:
    
    ```
    private IOException maybeClose(FileWriter file) {
           IOException t = null;
           if (file != null) {
                 try {
                         file.close();
                 } catch (IOException ex) {
                       t = ex;
                 }          
         }
        return t;
    }
    
    (...)
    
    } finally {
    
        IOException e1 = maybeClose(h);
        IOException e2 = maybeClose(c);
    
        if (e1 != null) {
            throw e1;
        }
    
       if (e2 != null) {
           throw e2;
       }
    }
    
    
    ```


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

Reply via email to