Dmitry Lychagin has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2388

Change subject: [NO ISSUE] Close resources during bytecode generation
......................................................................

[NO ISSUE] Close resources during bytecode generation

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- Close resources when generating bytecode for built-in
  functions

Change-Id: I0f86b54244caee7c1864a2981fade199d1eb6615
---
M 
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
1 file changed, 79 insertions(+), 69 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/88/2388/1

diff --git 
a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
 
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
index 6d3feb7..c396358 100644
--- 
a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
+++ 
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
@@ -60,7 +60,7 @@
          * @throws IOException
          */
         public void runAction(String targetClassName, byte[] 
classDefinitionBytes) throws IOException;
-    };
+    }
 
     /**
      * Generates the byte code for a scalar function descriptor.
@@ -101,29 +101,32 @@
                 
CodeGenHelper.toJdkStandardName(targetFuncDescriptorClassName)));
 
         // Gathers evaluator factory classes that are created in the function 
descriptor.
-        ClassReader reader = new 
ClassReader(getResourceStream(internalFuncDescriptorClassName, classLoader));
-        GatherEvaluatorFactoryCreationVisitor evalFactoryCreationVisitor =
-                new 
GatherEvaluatorFactoryCreationVisitor(CodeGenHelper.toInternalClassName(packagePrefix));
-        reader.accept(evalFactoryCreationVisitor, 0);
-        Set<String> evaluatorFactoryClassNames = 
evalFactoryCreationVisitor.getCreatedEvaluatorFactoryClassNames();
+        try (InputStream internalFuncDescriptorStream =
+                getResourceStream(internalFuncDescriptorClassName, 
classLoader)) {
+            ClassReader reader = new ClassReader(internalFuncDescriptorStream);
+            GatherEvaluatorFactoryCreationVisitor evalFactoryCreationVisitor =
+                    new 
GatherEvaluatorFactoryCreationVisitor(CodeGenHelper.toInternalClassName(packagePrefix));
+            reader.accept(evalFactoryCreationVisitor, 0);
+            Set<String> evaluatorFactoryClassNames = 
evalFactoryCreationVisitor.getCreatedEvaluatorFactoryClassNames();
 
-        // Generates inner classes other than evaluator factories.
-        generateNonEvalInnerClasses(reader, evaluatorFactoryClassNames, 
nameMappings, suffixForGeneratedClass,
-                classLoader, action);
+            // Generates inner classes other than evaluator factories.
+            generateNonEvalInnerClasses(reader, evaluatorFactoryClassNames, 
nameMappings, suffixForGeneratedClass,
+                    classLoader, action);
 
-        // Generates evaluator factories that are created in the function 
descriptor.
-        int evalFactoryCounter = 0;
-        for (String evaluateFactoryClassName : evaluatorFactoryClassNames) {
-            generateEvaluatorFactoryClassBinary(packagePrefix, 
evaluateFactoryClassName, suffixForGeneratedClass,
-                    evalFactoryCounter++, nameMappings, classLoader, action);
+            // Generates evaluator factories that are created in the function 
descriptor.
+            int evalFactoryCounter = 0;
+            for (String evaluateFactoryClassName : evaluatorFactoryClassNames) 
{
+                generateEvaluatorFactoryClassBinary(packagePrefix, 
evaluateFactoryClassName, suffixForGeneratedClass,
+                        evalFactoryCounter++, nameMappings, classLoader, 
action);
+            }
+
+            // Transforms the function descriptor class and outputs the 
generated class binary.
+            ClassWriter writer = new ClassWriter(reader, 0);
+            RenameClassVisitor renamingVisitor = new 
RenameClassVisitor(writer, nameMappings);
+            reader.accept(renamingVisitor, 0);
+            action.runAction(targetFuncDescriptorClassName, 
writer.toByteArray());
+            return nameMappings;
         }
-
-        // Transforms the function descriptor class and outputs the generated 
class binary.
-        ClassWriter writer = new ClassWriter(reader, 0);
-        RenameClassVisitor renamingVisitor = new RenameClassVisitor(writer, 
nameMappings);
-        reader.accept(renamingVisitor, 0);
-        action.runAction(targetFuncDescriptorClassName, writer.toByteArray());
-        return nameMappings;
     }
 
     /**
@@ -187,28 +190,31 @@
                 
CodeGenHelper.toJdkStandardName(targetEvaluatorFactoryClassName)));
 
         // Gathers the class names of the evaluators that are created in the 
evaluator factory.
-        ClassReader reader = new 
ClassReader(getResourceStream(internalEvaluatorFactoryClassName, classLoader));
-        GatherEvaluatorCreationVisitor evalCreationVisitor =
-                new 
GatherEvaluatorCreationVisitor(CodeGenHelper.toInternalClassName(packagePrefix));
-        reader.accept(evalCreationVisitor, 0);
-        Set<String> evaluatorClassNames = 
evalCreationVisitor.getCreatedEvaluatorClassNames();
+        try (InputStream internalEvaluatorFactoryStream =
+                getResourceStream(internalEvaluatorFactoryClassName, 
classLoader)) {
+            ClassReader reader = new 
ClassReader(internalEvaluatorFactoryStream);
+            GatherEvaluatorCreationVisitor evalCreationVisitor =
+                    new 
GatherEvaluatorCreationVisitor(CodeGenHelper.toInternalClassName(packagePrefix));
+            reader.accept(evalCreationVisitor, 0);
+            Set<String> evaluatorClassNames = 
evalCreationVisitor.getCreatedEvaluatorClassNames();
 
-        // Generates inner classes other than evaluators.
-        generateNonEvalInnerClasses(reader, evaluatorClassNames, nameMappings, 
suffixForGeneratedClass, classLoader,
-                action);
+            // Generates inner classes other than evaluators.
+            generateNonEvalInnerClasses(reader, evaluatorClassNames, 
nameMappings, suffixForGeneratedClass, classLoader,
+                    action);
 
-        // Generates code for all evaluators.
-        int evalCounter = 0;
-        for (String evaluateClassName : evaluatorClassNames) {
-            generateEvaluatorClassBinary(evaluateClassName, 
suffixForGeneratedClass, evalCounter++, nameMappings,
-                    classLoader, action);
+            // Generates code for all evaluators.
+            int evalCounter = 0;
+            for (String evaluateClassName : evaluatorClassNames) {
+                generateEvaluatorClassBinary(evaluateClassName, 
suffixForGeneratedClass, evalCounter++, nameMappings,
+                        classLoader, action);
+            }
+
+            // Transforms the evaluator factory class and outputs the 
generated class binary.
+            ClassWriter writer = new ClassWriter(reader, 0);
+            RenameClassVisitor renamingVisitor = new 
RenameClassVisitor(writer, nameMappings);
+            reader.accept(renamingVisitor, 0);
+            action.runAction(targetEvaluatorFactoryClassName, 
writer.toByteArray());
         }
-
-        // Transforms the evaluator factory class and outputs the generated 
class binary.
-        ClassWriter writer = new ClassWriter(reader, 0);
-        RenameClassVisitor renamingVisitor = new RenameClassVisitor(writer, 
nameMappings);
-        reader.accept(renamingVisitor, 0);
-        action.runAction(targetEvaluatorFactoryClassName, 
writer.toByteArray());
     }
 
     /**
@@ -250,31 +256,33 @@
         
nameMappings.add(Pair.of(CodeGenHelper.toJdkStandardName(internalEvaluatorClassName),
                 CodeGenHelper.toJdkStandardName(targetEvaluatorClassName)));
 
-        ClassReader firstPassReader = new 
ClassReader(getResourceStream(internalEvaluatorClassName, classLoader));
-        // Generates inner classes other than the evaluator.
-        Set<String> excludedNames = new HashSet<>();
-        for (Pair<String, String> entry : nameMappings) {
-            excludedNames.add(entry.getKey());
+        try (InputStream internalEvaluatorStream = 
getResourceStream(internalEvaluatorClassName, classLoader)) {
+            ClassReader firstPassReader = new 
ClassReader(internalEvaluatorStream);
+            // Generates inner classes other than the evaluator.
+            Set<String> excludedNames = new HashSet<>();
+            for (Pair<String, String> entry : nameMappings) {
+                excludedNames.add(entry.getKey());
+            }
+            generateNonEvalInnerClasses(firstPassReader, excludedNames, 
nameMappings, suffixForGeneratedClass,
+                    classLoader, action);
+
+            // Injects missing-handling byte code.
+            ClassWriter firstPassWriter = new ClassWriter(firstPassReader, 0);
+            EvaluatorMissingCheckVisitor missingHandlingVisitor = new 
EvaluatorMissingCheckVisitor(firstPassWriter);
+            firstPassReader.accept(missingHandlingVisitor, 0);
+
+            ClassReader secondPassReader = new 
ClassReader(firstPassWriter.toByteArray());
+            // Injects null-handling byte code and output the class binary.
+            // Since we're going to add jump instructions, we have to let the 
ClassWriter to
+            // automatically generate frames for JVM to verify the class.
+            ClassWriter secondPassWriter =
+                    new ClassWriter(secondPassReader, 
ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
+            RenameClassVisitor renamingVisitor = new 
RenameClassVisitor(secondPassWriter, nameMappings);
+            EvaluatorNullCheckVisitor nullHandlingVisitor =
+                    new EvaluatorNullCheckVisitor(renamingVisitor, 
missingHandlingVisitor.getLastAddedLabel());
+            secondPassReader.accept(nullHandlingVisitor, 0);
+            action.runAction(targetEvaluatorClassName, 
secondPassWriter.toByteArray());
         }
-        generateNonEvalInnerClasses(firstPassReader, excludedNames, 
nameMappings, suffixForGeneratedClass, classLoader,
-                action);
-
-        // Injects missing-handling byte code.
-        ClassWriter firstPassWriter = new ClassWriter(firstPassReader, 0);
-        EvaluatorMissingCheckVisitor missingHandlingVisitor = new 
EvaluatorMissingCheckVisitor(firstPassWriter);
-        firstPassReader.accept(missingHandlingVisitor, 0);
-
-        ClassReader secondPassReader = new 
ClassReader(firstPassWriter.toByteArray());
-        // Injects null-handling byte code and output the class binary.
-        // Since we're going to add jump instructions, we have to let the 
ClassWriter to
-        // automatically generate frames for JVM to verify the class.
-        ClassWriter secondPassWriter =
-                new ClassWriter(secondPassReader, ClassWriter.COMPUTE_FRAMES | 
ClassWriter.COMPUTE_MAXS);
-        RenameClassVisitor renamingVisitor = new 
RenameClassVisitor(secondPassWriter, nameMappings);
-        EvaluatorNullCheckVisitor nullHandlingVisitor =
-                new EvaluatorNullCheckVisitor(renamingVisitor, 
missingHandlingVisitor.getLastAddedLabel());
-        secondPassReader.accept(nullHandlingVisitor, 0);
-        action.runAction(targetEvaluatorClassName, 
secondPassWriter.toByteArray());
     }
 
     /**
@@ -314,11 +322,13 @@
                     CodeGenHelper.toJdkStandardName(targetInnerClassName)));
 
             // Renaming appearances of original class names.
-            ClassReader innerClassReader = new 
ClassReader(getResourceStream(innerClassName, classLoader));
-            ClassWriter writer = new ClassWriter(innerClassReader, 0);
-            RenameClassVisitor renamingVisitor = new 
RenameClassVisitor(writer, nameMappings);
-            innerClassReader.accept(renamingVisitor, 0);
-            action.runAction(targetInnerClassName, writer.toByteArray());
+            try (InputStream innerStream = getResourceStream(innerClassName, 
classLoader)) {
+                ClassReader innerClassReader = new ClassReader(innerStream);
+                ClassWriter writer = new ClassWriter(innerClassReader, 0);
+                RenameClassVisitor renamingVisitor = new 
RenameClassVisitor(writer, nameMappings);
+                innerClassReader.accept(renamingVisitor, 0);
+                action.runAction(targetInnerClassName, writer.toByteArray());
+            }
         }
     }
 

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2388
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0f86b54244caee7c1864a2981fade199d1eb6615
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Dmitry Lychagin <dmitry.lycha...@couchbase.com>

Reply via email to