[ 
http://issues.apache.org/jira/browse/DERBY-176?page=comments#action_62388 ]
     
Daniel John Debrunner commented on DERBY-176:
---------------------------------------------

svn revision 160429

Reduce the number of constant pool entries in code generation by removing some 
uses of java fields.

In the binary operator nodes code is generated like

<left>.method(<left>, <right>)

where <left> and <right> are arbitary expressions.
In this case <left> must only be evaluated once and the existing implementation 
used Java fields.

DataValueDescriptor f34;

f34 = <left>;

f34.method(f34, <right>)

The issue is that a field is not required, really a local variable is, and a 
field and its use will create three unique constant pool entries. However local 
variables are not supported by the byte code compiler currently.

The stack based code generation allows the use of the stack through 
MethodBuilder.dup() method to evaluate <left> once and re-use the result.
E.g.

<left>
dup
<right>

leaves the stack as left,left,right which is the correct order for such a 
method call. The use of MethodBuilder.swap() allows the same pattern when 
<right> needs to be re-used in <right>.method(<left>, <right>)

<right>
dup
<left>
swap

leaves right,left,right on the stack.


> Derby throws ERROR XBCM1: Java linkage error thrown during load of generated 
> class org.apache.derby.exe.aced07c066x0102xca87x3319x00004aa5686e1 during 
> execution of large query
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>          Key: DERBY-176
>          URL: http://issues.apache.org/jira/browse/DERBY-176
>      Project: Derby
>         Type: Bug
>   Components: SQL
>     Versions: 10.0.2.0, 10.0.2.1, 10.0.2.2, 10.1.0.0
>     Reporter: Kathey Marsden
>     Assignee: Kathey Marsden
>  Attachments: largeCodeGen.java
>
> When executing a large query or oather large operations, Derby throws a java 
> linkage exception.
> This is because the generated byte code exceeds the JVM limits for method 
> sizes constant pool entries etc, the amount of code in a conditional etc.  
> The attached repro demonstrates the problem but the problem can also occur 
> for other operations that generate lots of byte code.  The repro is just a 
> new functional test,
> so should be copied to derbyTesting/functionTests/lang/largeCodeGen.java and 
> run like
>  java -Djvmflags=-Xmx512M org.apache.derbyTesting.harness.RunTest 
> lang/largeCodeGen
> When this problem is fixed additional scenarios should be added to this test.
> ERROR XBCM1: Java linkage error thrown during load of 
> generated class org.apache.derby.exe.aced07c066x0102xca87x3319x00004aa5686e1.
>       at 
> org.apache.derby.iapi.error.StandardException.newException(StandardException.java:315)
>       at 
> org.apache.derby.impl.services.reflect.DatabaseClasses.loadGeneratedClass(DatabaseClasses.java:162)
>       at 
> org.apache.derby.impl.services.bytecode.GClass.getGeneratedClass(GClass.java:59)
>       at 
> org.apache.derby.impl.sql.compile.ExpressionClassBuilder.getGeneratedClass(ExpressionClassBuilder.java:920)
>       at 
> org.apache.derby.impl.sql.compile.StatementNode.generate(StatementNode.java:270)
>       at 
> org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:432)
>       at 
> org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:107)
>       at 
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:688)
>       at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(EmbedPreparedStatement.java:118)
>       at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(EmbedPreparedStatement20.java:82)
>       at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(EmbedPreparedStatement30.java:62)
>       at 
> org.apache.derby.jdbc.Driver30.newEmbedPreparedStatement(Driver30.java:92)
>       at 
> org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:675)
>       at 
> org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:519)
>       at 
> org.apache.derbyTesting.functionTests.tests.lang.largeCodeGen.main(largeCodeGen.java:86)
> Exception in thread "main" 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira

Reply via email to