[ 
https://issues.apache.org/jira/browse/DRILL-5052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15732506#comment-15732506
 ] 

ASF GitHub Bot commented on DRILL-5052:
---------------------------------------

Github user arina-ielchiieva commented on a diff in the pull request:

    https://github.com/apache/drill/pull/660#discussion_r91533256
  
    --- Diff: 
exec/java-exec/src/main/java/org/apache/drill/exec/compile/ClassBuilder.java ---
    @@ -0,0 +1,190 @@
    +/**
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements.  See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership.  The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License.  You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +package org.apache.drill.exec.compile;
    +
    +import java.io.File;
    +import java.io.FileWriter;
    +import java.io.IOException;
    +import java.util.Map;
    +
    +import org.apache.drill.common.config.DrillConfig;
    +import org.apache.drill.exec.compile.ClassTransformer.ClassNames;
    +import org.apache.drill.exec.exception.ClassTransformationException;
    +import org.apache.drill.exec.expr.CodeGenerator;
    +import org.apache.drill.exec.server.options.OptionManager;
    +import org.codehaus.commons.compiler.CompileException;
    +
    +/**
    + * Implements the "plain-old Java" method of code generation and
    + * compilation. Given a {@link CodeGenerator}, obtains the generated
    + * source code, compiles it with the selected compiler, loads the
    + * byte-codes into a class loader and provides the resulting
    + * class. Compared with the {@link ClassTransformer} mechanism,
    + * this one requires the code generator to have generated a complete
    + * Java class that is capable of direct compilation and loading.
    + * This means the generated class must be a subclass of the template
    + * so that the JVM can use normal Java inheritance to associate the
    + * template and generated methods.
    + * <p>
    + * Here is how to use the plain-old Java technique to debug
    + * generated code:
    + * <ul>
    + * <li>Set the config option <var>drill.exec.compile.save_source</var>
    + * to <var>true</var>.</li>
    + * <li>Set the config option <var>drill.exec.compile.code_dir</var>
    + * to the location where you want to save the generated source
    + * code.</li>
    + * <li>Where you generate code (using a {@link CodeGenerator}),
    + * set the "plain-old Java" options:<pre>
    + * CodeGenerator&lt;Foo> cg = ...
    + * cg.plainOldJavaCapable(true); // Class supports plain-old Java
    + * cg.preferPlainOldJava(true); // Actually generate plain-old Java
    + * ...</pre></li>
    + * <li>In your favorite IDE, add to the code lookup path the
    + * code directory saved earlier. In Eclipse, for example, you do
    + * this in the debug configuration you will use to debug Drill.</li>
    + * <li>Set a breakpoint in template used for the generated code.</li>
    + * <li>Run Drill. The IDE will stop at your breakpoint.</li>
    + * <li>Step into the generated code. Examine class field and
    + * local variables. Have fun!</li>
    + * </ul>
    + * <p>
    + * Note: not all generated code is ready to be compiled as plain-old
    + * Java. Some classes omit from the template the proper <code>throws</code>
    + * declarations. Other minor problems may also crop up. All are easy
    + * to fix. Once you've done so, add the following to mark that you've
    + * done the clean-up:<pre>
    --- End diff --
    
    May be to create Jira to add this support?


> Option to debug generated Java code using an IDE
> ------------------------------------------------
>
>                 Key: DRILL-5052
>                 URL: https://issues.apache.org/jira/browse/DRILL-5052
>             Project: Apache Drill
>          Issue Type: Improvement
>          Components: Execution - Codegen
>    Affects Versions: 1.8.0
>            Reporter: Paul Rogers
>            Assignee: Paul Rogers
>            Priority: Minor
>
> Drill makes extensive use of Java code generation to implement its operators. 
> Drill uses sophisticated techniques to blend generated code with pre-compiled 
> template code. An unfortunate side-effect of this behavior is that it is very 
> difficult to visualize and debug the generated code.
> As it turns out, Drill's code-merge facility is, in essence, a do-it-yourself 
> version of subclassing. The Drill "template" is the parent class, the 
> generated code is the subclass. But, rather than using plain-old subclassing, 
> Drill combines the code from the two classes into a single "artificial" 
> packet of byte codes for which no source exists.
> Modify the code generation path to optionally allow "plain-old Java" 
> compilation: the generated code is a subclass of the template. Compile the 
> generated code as a plain-old Java class with no byte-code fix-up. Write the 
> code to a known location that the IDE can search when looking for source 
> files.
> With this change, developers can turn on the above feature, set a breakpoint 
> in a template, then step directly into the generated Java code called from 
> the template.
> This feature should be an option, enabled by developers when needed. The 
> existing byte-code technique should be used for production code generation.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to