[Jpeergen-cvs] dev/src/java/org/progeeks/jni JniCodelet.java,1.2,1.3 PeerBindingCodelet.java,1.2,1.3
Status: Beta
Brought to you by:
pspeed
|
From: <ps...@us...> - 2004-08-15 05:56:44
|
Update of /cvsroot/jpeergen/dev/src/java/org/progeeks/jni In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21696/src/java/org/progeeks/jni Modified Files: JniCodelet.java PeerBindingCodelet.java Log Message: Remembered why the original code was commented out. Left the comment in for posterity. Fixed the case where I needed it in a different place since it's only special cases where it works correctly. Note: type handling and conversion is one of the biggest reasons I want to start refactoring this mess. Index: JniCodelet.java =================================================================== RCS file: /cvsroot/jpeergen/dev/src/java/org/progeeks/jni/JniCodelet.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** JniCodelet.java 15 Aug 2004 05:15:02 -0000 1.2 --- JniCodelet.java 15 Aug 2004 05:56:36 -0000 1.3 *************** *** 331,338 **** // If the type is the same as ourselves, then we can in fact // auto-convert it in most cases ! if( type.qualifiedTypeName().equals( currentClass.qualifiedName() ) ) ! { ! return( true ); ! } // While the above statement may be true, it's going to take a lot // of work... nor does it allow static-only class peering which is --- 331,338 ---- // If the type is the same as ourselves, then we can in fact // auto-convert it in most cases ! //if( type.qualifiedTypeName().equals( currentClass.qualifiedName() ) ) ! // { ! // return( true ); ! // } // While the above statement may be true, it's going to take a lot // of work... nor does it allow static-only class peering which is *************** *** 345,348 **** --- 345,359 ---- // So I've put the code back in, but I'm saving the comment in case // I remember why I said it. + // Ok, now I remember why. isCastableType() is used in lots and lots + // of cases. Many of which don't need or allow for easy casting of + // the value without adding a converter for that specific type. + // For example, any method passing the peered object as a parameter + // will check to see if the type is castable. This will break because + // we don't have a converter registered for that type. Also, in a common + // use-case where the C++ code is calling back to Java (which may be the + // only case note handled, not sure about that one) the conversion is + // unnecessary anyway... so why break things. + // So, the caller is left to check for themselves if they know they can + // handle the peered type. // Short-cut Index: PeerBindingCodelet.java =================================================================== RCS file: /cvsroot/jpeergen/dev/src/java/org/progeeks/jni/PeerBindingCodelet.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** PeerBindingCodelet.java 15 Aug 2004 05:15:40 -0000 1.2 --- PeerBindingCodelet.java 15 Aug 2004 05:56:36 -0000 1.3 *************** *** 162,165 **** --- 162,166 ---- { boolean peered = false; + boolean rawReturn = false; // See if it has a "reverse" tag. *************** *** 168,176 **** { if( PeerDoclet.TAG_PEERED.equals(tags[i].name()) ) peered = true; } if( peered ) ! generateReverseBinding( m ); } } --- 169,184 ---- { if( PeerDoclet.TAG_PEERED.equals(tags[i].name()) ) + { peered = true; + } + else if( PeerDoclet.TAG_PEERED_RAW.equals(tags[i].name()) ) + { + peered = true; + rawReturn = true; + } } if( peered ) ! generateReverseBinding( m, rawReturn ); } } *************** *** 269,273 **** } ! protected void generateReverseBinding( MethodDoc m ) { Parameter[] parms = m.parameters(); --- 277,281 ---- } ! protected void generateReverseBinding( MethodDoc m, boolean rawReturn ) { Parameter[] parms = m.parameters(); *************** *** 286,290 **** printBegin( "" ); ! if( isCastableType(m.returnType()) ) printMid( getCType(m.returnType()) ); else --- 294,302 ---- printBegin( "" ); ! boolean returnTypeCastable = !rawReturn && isCastableType(m.returnType()); ! if( !rawReturn && !returnTypeCastable ) ! returnTypeCastable = m.returnType().qualifiedTypeName().equals( currentClass.qualifiedName() ); ! ! if( returnTypeCastable ) printMid( getCType(m.returnType()) ); else *************** *** 321,325 **** } - if( "void".equals(m.returnType().typeName()) ) { --- 333,336 ---- *************** *** 336,339 **** --- 347,356 ---- TypeConverter conv = getConverter( getSimpleCType(parms[i].type()), getJniType(parms[i].type()) ); + if( conv == null ) + { + throw new RuntimeException( "Converter not found for: " + + getSimpleCType(parms[i].type()) + " -> " + + getJniType(parms[i].type()) ); + } printMid( conv.getConvertedValue( parms[i].name() ) ); } *************** *** 372,376 **** printBegin( "return " ); ! if( isCastableType(m.returnType()) ) { printMid( convertValueToC(m.returnType(), returnVal.toString()) ); --- 389,393 ---- printBegin( "return " ); ! if( returnTypeCastable ) { printMid( convertValueToC(m.returnType(), returnVal.toString()) ); |