Ok... =) Looks like this is a problem with the generated method byte
code. I still have not tracked down exactly how to fix it... but I am
closer now. Thanks for your insight... and the dump or your method...
that is what helped me find the problem.
--jason
Juozas Baliuka wrote:
>Hi,
>We use BCEL for Proxy generation and it is no problems if MethodGen is
>constructed this way :
>
> private static MethodGen toMethodGen(
> java.lang.reflect.Method mtd,
> String className,
> InstructionList il,
> ConstantPoolGen cp) {
>
> return new MethodGen(
> ACC_PUBLIC,
> toType(mtd.getReturnType()),
> toType(mtd.getParameterTypes()),
> null,
> mtd.getName(),
> className,
> il,
> cp);
> }
>
>May this problem exists in some version ?
>I tried to build it from CVS a few weeks ago and from binary distribution,
>but I don't see any problem.
>Can you tell us version of BCEL distribution you use ?
>
>
>It is output from DEBUG :
>
>public void testLong(long arg1, long arg2)
>Code(max_stack = 8, max_locals = 10, code_length = 112)
>0: iconst_2
>1: anewarray <java.lang.Object> (16)
>4: dup
>5: iconst_0
>6: new <java.lang.Long> (45)
>9: dup
>10: lload_1
>11: invokespecial java.lang.Long.<init> (J)V (48)
>14: aastore
>15: dup
>16: iconst_1
>17: new <java.lang.Long> (45)
>20: dup
>21: lload_3
>22: invokespecial java.lang.Long.<init> (J)V (48)
>25: aastore
>26: astore %5
>28: aload_0
>29: getfield
>org.apache.commons.simplestore.TestPersistentClassType$$EnhancedBySimplestor
>e$$.h Lorg/apache/commons/simplestore/tools/MethodInterceptor; (14)
>32: aload_0
>33: getstatic
>org.apache.commons.simplestore.TestPersistentClassType$$EnhancedBySimplestor
>e$$.METHOD_0 Ljava/lang/reflect/Method; (50)
>36: aload %5
>38: invokeinterface
>org.apache.commons.simplestore.tools.MethodInterceptor.beforeInvoke
>(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/
>Object; (33) 4 0
>43: astore %6
>45: aconst_null
>46: astore %7
>48: iconst_0
>49: istore %8
>51: aconst_null
>52: astore %9
>54: aload_0
>55: getfield
>org.apache.commons.simplestore.TestPersistentClassType$$EnhancedBySimplestor
>e$$.h Lorg/apache/commons/simplestore/tools/MethodInterceptor; (14)
>58: aload_0
>59: getstatic
>org.apache.commons.simplestore.TestPersistentClassType$$EnhancedBySimplestor
>e$$.METHOD_0 Ljava/lang/reflect/Method; (50)
>62: aload %5
>64: aload %6
>66: invokeinterface
>org.apache.commons.simplestore.tools.MethodInterceptor.invokeSuper
>(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/O
>bject;)Z (41) 5 0
>71: ifeq #88
>74: iconst_1
>75: istore %8
>77: aload_0
>78: lload_1
>79: lload_3
>80: invokespecial
>org.apache.commons.simplestore.TestPersistentClassType.testLong (JJ)V (54)
>83: goto #88
>86: astore %9
>88: aload_0
>89: getfield
>org.apache.commons.simplestore.TestPersistentClassType$$EnhancedBySimplestor
>e$$.h Lorg/apache/commons/simplestore/tools/MethodInterceptor; (14)
>92: aload_0
>93: getstatic
>org.apache.commons.simplestore.TestPersistentClassType$$EnhancedBySimplestor
>e$$.METHOD_0 Ljava/lang/reflect/Method; (50)
>96: aload %5
>98: aload %6
>100: iload %8
>102: aload %7
>104: aload %9
>106: invokeinterface
>org.apache.commons.simplestore.tools.MethodInterceptor.afterReturn
>(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/O
>bject;ZLjava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object; (37) 8
>0
>111: return
>Exception handler(s) =
>>From To Handler Type
>75 86 86 java.lang.Throwable(56)
>
>
>Class used for test looks like this :
>
>public abstract class TestPersistentClassType implements TestPersistent,
> org.apache.commons.simplestore.tools.Constants{
>
> /** Creates a new instance of TestPersistentClassType */
> public TestPersistentClassType() {
> }
> /***********************************/
>public void testLong(long p1,long p2){
> System.out.println("" + p1 + " " + p2);
> }
> /***********************************/
>
> public void doSomething(String arg){
> if( DEBUG ){
> this.setStrVal("done Something " + arg);
> System.out.println(getStrVal());
> }
> }
>
> public void setNuls(){
> setDateVal( null ) ;
> setStrVal1( null );
> setStrVal ( null );
> setParent ( null );
> }
>
> public abstract TestPersistentClassType getParent();
>
> public abstract void setDateVal(java.util.Date val) ;
>
> public abstract void setBoolVal(boolean val) ;
>
> public abstract java.util.Date getDateVal() ;
>
> public abstract void setIntVal(int val);
>
> public abstract void setFloatVal(float val) ;
>
> public abstract float getFloatVal() ;
>
> public abstract void setStrVal1(String strVal1);
>
> public abstract void setStrVal(String strVal1);
>
>
> public abstract String getStrVal();
>
> public abstract java.util.Collection getChildren();
>
> public abstract String getStrVal1();
>
> public abstract void setParent(TestPersistentClassType tp);
>
> public abstract int getIntVal();
>
> public abstract boolean getBoolVal();
>}
>
> ----- Original Message -----
>From: "Jason Dillon" <[EMAIL PROTECTED]>
>To: <[EMAIL PROTECTED]>
>Sent: Friday, April 05, 2002 10:04 AM
>Subject: Possible problem with MethodGen & long/double param types...
>
>
>>Hey, I am working to fix a bug in side of JBoss, which relates to our
>>dymanic proxy generation. This was recently switched over to using
>>BCEL, but it seems like there is a problem.
>>
>>Before I get into the details, let me say that I am not a VM expert or a
>>byte code whiz... I generally like to deal with higher level
>>abstractions, but this bug looked important and well all this BCEL stuff
>>looks really interesting. That said, this could simply be a problem
>>with our usage, but based on my investigation today I don't think so...
>>but who knows.
>>
>>I did try to look for some bug reports on this already, but either it is
>>getting too late and I need to go home, or I simply will never
>>understand how to use Bugzilla...
>>
>>* * *
>>
>>We use BCEL to generate proxies to interfaces and abstract classes. But
>>for simplicily I will keep things to interfaces, as this shows the
>>
>problem.
>
>>Take the given interface:
>>
>>public interface MyInterface
>>{
>> void test(long a, long b);
>>}
>>
>>The MethodGen.toString() ends up with:
>>
>>public void test(long arg0, long)
>>
>>Where it should be:
>>
>>public void test(long arg0, long arg1)
>>
>>It turns out (only did some brief testing) that when using all long or
>>double types that every other parameter will get corrupted like this.
>> If you use any other type there are no problems.
>>
>>* * *
>>
>>We have a class (called ProxyImplementationFactory... for whatever
>>reason) which contains helper methods to generate Method objects for
>>parts of the target proxy. To make sure that none of the BCEL code
>>inside was messing with this (as I don't really know that much about it
>>... yet), I took the contents of a method which generates a String
>>toString() method and used it inside of the method which exhibits this
>>problem... which it still does/did with this change.
>>
>>Based on this I am thinking that the problem is with the byte code
>>generation done under the covers inside of MethodGen and friends. I
>>spent very little time looking through this code to see if I could find
>>anything obvious... but no.
>>
>>I am thinking that the code which deals with generation of the byte code
>>for the method might not be giving enough space for the long/double...
>>but that is just a guess, I don't really know how method defs work.
>>
>>Can someone give me a hand to get this fixed... either help me to get my
>>code proper or track down a bug in BCEL... or evern better informing me
>>that this is already fixed.
>>
>>Many thanks,
>>
>>--jason
>>
>>
>>--
>>To unsubscribe, e-mail:
>>
><mailto:[EMAIL PROTECTED]>
>
>>For additional commands, e-mail:
>>
><mailto:[EMAIL PROTECTED]>
>
>
>--
>To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
>For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>