You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2018/02/14 18:45:21 UTC

asterixdb git commit: [NO ISSUE] Close resources during bytecode generation

Repository: asterixdb
Updated Branches:
  refs/heads/master 0f294d0d1 -> 86a12d5cc


[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
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2388
Sonar-Qube: Jenkins <je...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: Michael Blow <mb...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/86a12d5c
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/86a12d5c
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/86a12d5c

Branch: refs/heads/master
Commit: 86a12d5cc2e93649975c9c46268bfbc010a633b4
Parents: 0f294d0
Author: Dmitry Lychagin <dm...@couchbase.com>
Authored: Tue Feb 13 11:07:29 2018 -0800
Committer: Michael Blow <mb...@apache.org>
Committed: Wed Feb 14 10:44:58 2018 -0800

----------------------------------------------------------------------
 .../evaluators/staticcodegen/CodeGenUtil.java   | 156 ++++++++++---------
 1 file changed, 83 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/86a12d5c/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
----------------------------------------------------------------------
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 @@ public class CodeGenUtil {
          * @throws IOException
          */
         public void runAction(String targetClassName, byte[] classDefinitionBytes) throws IOException;
-    };
+    }
 
     /**
      * Generates the byte code for a scalar function descriptor.
@@ -101,29 +101,32 @@ public class CodeGenUtil {
                 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();
-
-        // 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);
-        }
+        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 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 @@ public class CodeGenUtil {
                 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();
-
-        // 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);
-        }
+        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 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 @@ public class CodeGenUtil {
         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 @@ public class CodeGenUtil {
                     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());
+            }
         }
     }